RetroZilla/xpinstall/wizard/os2/uninstall/extra.c
2015-10-20 23:03:22 -04:00

1428 lines
38 KiB
C

/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Sean Su <ssu@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "extern.h"
#include "extra.h"
#include "parser.h"
#include "dialogs.h"
#include "ifuncns.h"
#define INDEX_STR_LEN 10
#define PN_PROCESS TEXT("Process")
#define PN_THREAD TEXT("Thread")
BOOL InitApplication(HMODULE hInstance)
{
CLASSINFO classinfo;
ulScreenX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
ulScreenY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
ulDlgFrameX = WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME);
ulDlgFrameY = WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME);
ulTitleBarY = WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR);
WinQueryClassInfo((HAB)0, WC_FRAME, &classinfo);
return (WinRegisterClass((HAB)0, szClassName, WinDefDlgProc,
CS_SAVEBITS, classinfo.cbWindowData));
}
void PrintError(PSZ szMsg, ULONG ulErrorCodeSH)
{
ERRORID erridErrorCode;
char szErrorString[MAX_BUF];
if(ulErrorCodeSH == ERROR_CODE_SHOW)
{
erridErrorCode = WinGetLastError((HAB)0);
sprintf(szErrorString, "%d : %s", erridErrorCode, szMsg);
}
else
sprintf(szErrorString, "%s", szMsg);
if((ugUninstall.ulMode != SILENT) && (ugUninstall.ulMode != AUTO))
{
WinMessageBox(HWND_DESKTOP, hWndMain, szErrorString, NULL, 0, MB_ICONEXCLAMATION);
}
else if(ugUninstall.ulMode == AUTO)
{
ShowMessage(szErrorString, TRUE);
DosSleep(5000);
ShowMessage(szErrorString, FALSE);
}
}
void *NS_GlobalAlloc(ULONG ulMaxBuf)
{
PSZ szBuf = NULL;
if((szBuf = calloc(1, ulMaxBuf)) == NULL)
{
if((szEGlobalAlloc == NULL) || (*szEGlobalAlloc == '\0'))
PrintError("Memory allocation error.", ERROR_CODE_HIDE);
else
PrintError(szEGlobalAlloc, ERROR_CODE_SHOW);
return(NULL);
}
else
return(szBuf);
}
void FreeMemory(void **vPointer)
{
if(*vPointer != NULL)
free(*vPointer);
*vPointer = NULL;
}
HRESULT NS_LoadStringAlloc(HMODULE hInstance, ULONG ulID, PSZ *szStringBuf, ULONG ulStringBuf)
{
char szBuf[MAX_BUF];
if((*szStringBuf = NS_GlobalAlloc(MAX_BUF)) == NULL)
exit(1);
if(!WinLoadString((HAB)0, hInstance, ulID, ulStringBuf, *szStringBuf))
{
if((szEStringLoad == NULL) ||(*szEStringLoad == '\0'))
sprintf(szBuf, "Could not load string resource ID %d", ulID);
else
sprintf(szBuf, szEStringLoad, ulID);
PrintError(szBuf, ERROR_CODE_SHOW);
return(1);
}
return(0);
}
HRESULT NS_LoadString(HMODULE hInstance, ULONG ulID, PSZ szStringBuf, ULONG ulStringBuf)
{
char szBuf[MAX_BUF];
if(!WinLoadString((HAB)0, hInstance, ulID, ulStringBuf, szStringBuf))
{
if((szEStringLoad == NULL) ||(*szEStringLoad == '\0'))
sprintf(szBuf, "Could not load string resource ID %d", ulID);
else
sprintf(szBuf, szEStringLoad, ulID);
PrintError(szBuf, ERROR_CODE_SHOW);
return(1);
}
return(WIZ_OK);
}
HRESULT Initialize(HMODULE hInstance, PSZ szAppName)
{
char szBuf[MAX_BUF];
HWND hwndFW;
char *tempEnvVar = NULL;
hDlgMessage = NULL;
gulWhatToDo = WTD_ASK;
/* load strings from setup.exe */
if(NS_LoadStringAlloc(0, IDS_ERROR_GLOBALALLOC, &szEGlobalAlloc, MAX_BUF))
return(1);
if(NS_LoadStringAlloc(0, IDS_ERROR_STRING_LOAD, &szEStringLoad, MAX_BUF))
return(1);
if(NS_LoadStringAlloc(0, IDS_ERROR_DLL_LOAD, &szEDllLoad, MAX_BUF))
return(1);
if(NS_LoadStringAlloc(0, IDS_ERROR_STRING_NULL, &szEStringNull, MAX_BUF))
return(1);
memset(szBuf, 0, sizeof(MAX_BUF));
if((szClassName = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
strcpy(szClassName, CLASS_NAME);
#ifdef OLDCODE
/* Allow only one instance of setup to run.
* Detect a previous instance of setup, bring it to the
* foreground, and quit current instance */
if((hwndFW = FindWindow(szClassName, szClassName)) != NULL)
{
ShowWindow(hwndFW, SW_RESTORE);
SetForegroundWindow(hwndFW);
return(1);
}
#endif
if((szUninstallDir = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
ParsePath(szAppName, szUninstallDir, MAX_BUF, PP_PATH_ONLY);
if((szTempDir = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((szOSTempDir = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((szFileIniUninstall = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
strcpy(szFileIniUninstall, szUninstallDir);
AppendBackSlash(szFileIniUninstall, MAX_BUF);
strcat(szFileIniUninstall, FILE_INI_UNINSTALL);
if((szFileIniDefaultsInfo = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
strcpy(szFileIniDefaultsInfo, szUninstallDir);
AppendBackSlash(szFileIniDefaultsInfo, MAX_BUF);
GetPrivateProfileString("General", "Defaults Info Filename", "", szBuf, MAX_BUF, szFileIniUninstall);
strcat(szFileIniDefaultsInfo, szBuf);
// determine the system's TEMP path
tempEnvVar = getenv("TMP");
if ((tempEnvVar) && (!(isFAT(tempEnvVar)))) {
strcpy(szTempDir, tempEnvVar);
}
else
{
tempEnvVar = getenv("TEMP");
if (tempEnvVar)
strcpy(szTempDir, tempEnvVar);
}
if ((!tempEnvVar) || (isFAT(tempEnvVar)))
{
ULONG ulBootDrive = 0;
APIRET rc;
char buffer[] = " :\\OS2\\";
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
&ulBootDrive, sizeof(ulBootDrive));
buffer[0] = 'A' - 1 + ulBootDrive;
if (isFAT(buffer)) {
/* Try current disk if boot drive is FAT */
ULONG ulDriveNum;
ULONG ulDriveMap;
strcpy(buffer, " :\\");
DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap);
buffer[0] = 'A' - 1 + ulDriveNum;
if (isFAT(buffer)) {
int i;
for (i = 2; i < 26; i++) {
if ((ulDriveMap<<(31-i)) >> 31) {
buffer[0] = 'A' + i;
if (!(isFAT(buffer))) {
break;
}
}
}
if (i == 26) {
char szBuf[MAX_BUF];
WinLoadString(0, NULLHANDLE, IDS_ERROR_NO_LONG_FILENAMES, sizeof(szBuf), szBuf);
WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szBuf, NULL, 0, MB_ICONEXCLAMATION);
return(1);
}
}
}
strcpy(szTempDir, buffer);
strcat(szTempDir, "TEMP");
}
strcpy(szOSTempDir, szTempDir);
AppendBackSlash(szTempDir, MAX_BUF);
strcat(szTempDir, WIZ_TEMP_DIR);
if(!FileExists(szTempDir))
{
AppendBackSlash(szTempDir, MAX_BUF);
CreateDirectoriesAll(szTempDir);
RemoveBackSlash(szTempDir);
if(!FileExists(szTempDir))
{
char szECreateTempDir[MAX_BUF];
if(GetPrivateProfileString("Messages", "ERROR_CREATE_TEMP_DIR", "",
szECreateTempDir, sizeof(szECreateTempDir),
szFileIniUninstall))
{
sprintf(szBuf, szECreateTempDir, szTempDir);
PrintError(szBuf, ERROR_CODE_HIDE);
}
return(1);
}
}
ugUninstall.bVerbose = FALSE;
ugUninstall.bUninstallFiles = TRUE;
return(0);
}
/* Function to remove quotes from a string */
void RemoveQuotes(PSZ szSrc, PSZ szDest, int iDestSize)
{
char *szBegin;
if(strlen(szSrc) > iDestSize)
return;
if(*szSrc == '\"')
szBegin = &szSrc[1];
else
szBegin = szSrc;
strcpy(szDest, szBegin);
if(szDest[strlen(szDest) - 1] == '\"')
szDest[strlen(szDest) - 1] = '\0';
}
/* Function to locate the first non space character in a string,
* and return a pointer to it. */
PSZ GetFirstNonSpace(PSZ szString)
{
int i;
int iStrLength;
iStrLength = strlen(szString);
for(i = 0; i < iStrLength; i++)
{
if(!isspace(szString[i]))
return(&szString[i]);
}
return(NULL);
}
void SetUninstallRunMode(PSZ szMode)
{
if(stricmp(szMode, "NORMAL") == 0)
ugUninstall.ulMode = NORMAL;
if(stricmp(szMode, "AUTO") == 0)
ugUninstall.ulMode = AUTO;
if(stricmp(szMode, "SILENT") == 0)
ugUninstall.ulMode = SILENT;
}
void RemoveBackSlash(PSZ szInput)
{
char *ptrChar = NULL;
if(!szInput)
return;
ptrChar = WinPrevChar(0, 0, 0, szInput, szInput + strlen(szInput));
if (*ptrChar == '\\') {
*ptrChar = '\0';
}
}
void AppendBackSlash(PSZ szInput, ULONG ulInputSize)
{
if(szInput != NULL)
{
if(*szInput == '\0')
{
if(((ULONG)strlen(szInput) + 1) < ulInputSize)
{
strcat(szInput, "\\");
}
}
else if(szInput[strlen(szInput) - 1] != '\\')
{
if(((ULONG)strlen(szInput) + 1) < ulInputSize)
{
strcat(szInput, "\\");
}
}
}
}
void RemoveSlash(PSZ szInput)
{
int iCounter;
ULONG ulInputLen;
if(szInput != NULL)
{
ulInputLen = strlen(szInput);
for(iCounter = ulInputLen -1; iCounter >= 0 ; iCounter--)
{
if(szInput[iCounter] == '/')
szInput[iCounter] = '\0';
else
break;
}
}
}
void AppendSlash(PSZ szInput, ULONG ulInputSize)
{
if(szInput != NULL)
{
if(*szInput == '\0')
{
if(((ULONG)strlen(szInput) + 1) < ulInputSize)
{
strcat(szInput, "/");
}
}
else if(szInput[strlen(szInput) - 1] != '/')
{
if(((ULONG)strlen(szInput) + 1) < ulInputSize)
{
strcat(szInput, "/");
}
}
}
}
void ParsePath(PSZ szInput, PSZ szOutput, ULONG ulOutputSize, ULONG ulType)
{
int iCounter;
ULONG ulCounter;
ULONG ulInputLen;
BOOL bFound;
if((szInput != NULL) && (szOutput != NULL))
{
bFound = TRUE;
ulInputLen = strlen(szInput);
memset(szOutput, 0, ulOutputSize);
if(ulInputLen < ulOutputSize)
{
switch(ulType)
{
case PP_FILENAME_ONLY:
for(iCounter = ulInputLen - 1; iCounter >= 0; iCounter--)
{
if(szInput[iCounter] == '\\')
{
strcpy(szOutput, &szInput[iCounter + 1]);
bFound = TRUE;
break;
}
}
if(bFound == FALSE)
strcpy(szOutput, szInput);
break;
case PP_PATH_ONLY:
for(iCounter = ulInputLen - 1; iCounter >= 0; iCounter--)
{
if(szInput[iCounter] == '\\')
{
strcpy(szOutput, szInput);
szOutput[iCounter + 1] = '\0';
bFound = TRUE;
break;
}
}
if(bFound == FALSE)
strcpy(szOutput, szInput);
break;
case PP_ROOT_ONLY:
if(szInput[1] == ':')
{
szOutput[0] = szInput[0];
szOutput[1] = szInput[1];
AppendBackSlash(szOutput, ulOutputSize);
}
else if(szInput[1] == '\\')
{
int iFoundBackSlash = 0;
for(ulCounter = 0; ulCounter < ulInputLen; ulCounter++)
{
if(szInput[ulCounter] == '\\')
{
szOutput[ulCounter] = szInput[ulCounter];
++iFoundBackSlash;
}
if(iFoundBackSlash == 3)
break;
}
if(iFoundBackSlash != 0)
AppendBackSlash(szOutput, ulOutputSize);
}
break;
}
}
}
}
HRESULT WinSpawn(PSZ szClientName, PSZ szParameters, PSZ szCurrentDir, BOOL bWait)
{
STARTDATA startdata;
PID pid, endpid;
ULONG ulSessID;
APIRET rc;
RESULTCODES resultcodes;
ULONG ulFlags;
rc = DosQueryAppType(szClientName, &ulFlags);
if (rc == NO_ERROR) {
memset(&startdata, 0, sizeof(STARTDATA));
startdata.Length = sizeof(STARTDATA);
startdata.PgmName = szClientName;
startdata.PgmInputs = szParameters;
rc = DosStartSession(&startdata, &ulSessID, &pid);
if (rc == NO_ERROR) {
if (bWait) {
DosWaitChild(DCWA_PROCESS, DCWW_NOWAIT, &resultcodes, &endpid, pid);
}
return (TRUE);
}
} else {
CHAR szBuf[CCHMAXPATH];
HOBJECT hobject;
strcpy(szBuf, szCurrentDir);
strcat(szBuf, szClientName);
hobject = WinQueryObject(szBuf);
WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
WinOpenObject(hobject, 0, TRUE); // 0 = OPEN_DEFAULT
}
return(FALSE);
}
HRESULT InitDlgUninstall(diU *diDialog)
{
diDialog->bShowDialog = FALSE;
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
return(0);
}
void DeInitDlgUninstall(diU *diDialog)
{
FreeMemory(&(diDialog->szTitle));
FreeMemory(&(diDialog->szMessage0));
}
HRESULT InitUninstallGeneral()
{
ugUninstall.ulMode = NORMAL;
if((ugUninstall.szAppPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szLogPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szLogFilename = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szCompanyName = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szProductName = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szOIKey = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szUserAgent = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szDefaultComponent = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szOIMainApp = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szUninstallKeyDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szUninstallFilename = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
if((ugUninstall.szAppID = NS_GlobalAlloc(MAX_BUF)) == NULL)
return(1);
return(0);
}
void DeInitUninstallGeneral()
{
FreeMemory(&(ugUninstall.szAppPath));
FreeMemory(&(ugUninstall.szLogPath));
FreeMemory(&(ugUninstall.szLogFilename));
FreeMemory(&(ugUninstall.szDescription));
FreeMemory(&(ugUninstall.szUninstallKeyDescription));
FreeMemory(&(ugUninstall.szUninstallFilename));
FreeMemory(&(ugUninstall.szUserAgent));
FreeMemory(&(ugUninstall.szDefaultComponent));
FreeMemory(&(ugUninstall.szOIKey));
FreeMemory(&(ugUninstall.szCompanyName));
FreeMemory(&(ugUninstall.szProductName));
FreeMemory(&(ugUninstall.szOIMainApp));
FreeMemory(&(ugUninstall.szAppID));
}
sil *CreateSilNode()
{
sil *silNode;
if((silNode = NS_GlobalAlloc(sizeof(struct sInfoLine))) == NULL)
exit(1);
if((silNode->szLine = NS_GlobalAlloc(MAX_BUF)) == NULL)
exit(1);
silNode->ullLineNumber = 0;
silNode->Next = silNode;
silNode->Prev = silNode;
return(silNode);
}
void SilNodeInsert(sil *silHead, sil *silTemp)
{
if(silHead == NULL)
{
silHead = silTemp;
silHead->Next = silHead;
silHead->Prev = silHead;
}
else
{
silTemp->Next = silHead;
silTemp->Prev = silHead->Prev;
silHead->Prev->Next = silTemp;
silHead->Prev = silTemp;
}
}
void SilNodeDelete(sil *silTemp)
{
if(silTemp != NULL)
{
silTemp->Next->Prev = silTemp->Prev;
silTemp->Prev->Next = silTemp->Next;
silTemp->Next = NULL;
silTemp->Prev = NULL;
FreeMemory(&(silTemp->szLine));
FreeMemory(&silTemp);
}
}
ULONG ParseCommandLine(int argc, char *argv[])
{
int i;
i = 0;
while(i < argc)
{
if((stricmp(argv[i], "-ma") == 0) || (stricmp(argv[i], "/ma") == 0))
{
SetUninstallRunMode("AUTO");
}
else if((stricmp(argv[i], "-ms") == 0) || (stricmp(argv[i], "/ms") == 0))
{
SetUninstallRunMode("SILENT");
}
else if((stricmp(argv[i], "-ua") == 0) || (stricmp(argv[i], "/ua") == 0))
{
if((i + 1) < argc) {
i++;
strcpy(ugUninstall.szUserAgent, argv[i]);
}
}
else if((stricmp(argv[i], "-app") == 0) || (stricmp(argv[i], "/app") == 0))
// Set the App ID
{
if((i + 1) < argc) {
i++;
strcpy(ugUninstall.szAppID, argv[i]);
}
}
else if((stricmp(argv[i], "-reg_path") == 0) || (stricmp(argv[i], "/reg_path") == 0))
// Set the alternative Windows registry path
{
if((i + 1) < argc) {
i++;
strcpy(ugUninstall.szOIMainApp, argv[i]);
}
}
else if((stricmp(argv[i], "-v") == 0) || (stricmp(argv[i], "/v") == 0))
// Set Verbose
{
ugUninstall.bVerbose = TRUE;
}
++i;
}
}
#define BUFMIN 8*1024
#define BUFMAX 256*1024
#define BUFDEFAULT 32*1024
BOOL CheckForProcess(PID pid, PSZ szProcessName, ULONG ulProcessName, PSZ szFQProcessName, ULONG ulFQProcessName)
{
/* Only compile this code if we have the new toolkit */
#ifdef QS_PROCESS
ULONG bufsize = BUFDEFAULT;
QSPTRREC* pbh;
APIRET rc = 0;
CHAR szUpperAppName[CCHMAXPATH] = {0};
/* Can't call with both - only one or the other */
if (pid && szProcessName) {
return FALSE;
}
if (szProcessName) {
strcpy(szUpperAppName, szProcessName);
strupr(szUpperAppName);
}
do {
pbh = (QSPTRREC*) malloc(bufsize);
if(!pbh) {
if(bufsize <= BUFMIN)
rc = ERROR_NOT_ENOUGH_MEMORY;
else if(rc != ERROR_BUFFER_OVERFLOW)
bufsize /= 2;
} else {
rc = DosQuerySysState(QS_PROCESS | QS_MTE, 0, 0, 0, pbh, bufsize);
if(rc == ERROR_BUFFER_OVERFLOW) {
if(bufsize < BUFMAX) {
free(pbh);
bufsize *= 2;
} else {
rc = ERROR_TOO_MANY_NAMES; // give up.
}
}
}
} while(rc == ERROR_BUFFER_OVERFLOW);
if(rc == NO_ERROR) {
QSPREC* ppiLocal = pbh->pProcRec;
while(ppiLocal->RecType == QS_PROCESS) {
QSLREC* pmi = pbh->pLibRec;
while (pmi && pmi->hmte != ppiLocal->hMte)
pmi = (QSLREC*)pmi->pNextRec;
if(pmi) {
if ((szUpperAppName[0] && strstr((char*)pmi->pName, szUpperAppName)) ||
(ppiLocal->pid == pid)) {
if (szFQProcessName)
strcpy(szFQProcessName, (char*)pmi->pName);
if (pbh)
free(pbh);
return TRUE;
}
}
ppiLocal=(QSPREC*)(ppiLocal->pThrdRec+ppiLocal->cTCB);
}
}
if(pbh)
free(pbh);
#endif
return FALSE;
}
int PreCheckInstance(char *szSection, char *szIniFile, char *szFQProcessName)
{
char szParameter[MAX_BUF];
char szPath[MAX_BUF];
ULONG ulCounter = 0;
BOOL bContinue = TRUE;
char szExtraCmd[] = "Extra Cmd";
char szExtraCmdParameter[MAX_BUF];
do
{
/* Read the win reg key path */
sprintf(szExtraCmdParameter, "%s%d Parameter", szExtraCmd, ulCounter);
GetPrivateProfileString(szSection,
szExtraCmdParameter,
"",
szParameter,
sizeof(szParameter),
szIniFile);
if(*szParameter == '\0')
{
bContinue = FALSE;
continue;
}
ParsePath(szFQProcessName, szPath, sizeof(szPath), PP_PATH_ONLY);
// we've found a file, so let's execute it and stop. No need to look
// for other keys to parse. We only want to do that if the file is
// _not_ found. This is for when we change the name of the browser
// app file and still need to deal with locating it and calling
// -kill on it. ie.
// previous name: netscp6.exe
// new name: netscp.exe
// We only need to call one of them, not both.
bContinue = FALSE;
/* Run the file */
WinSpawn(szFQProcessName, szParameter, szPath, TRUE);
/* Even though WinSpawn is suppose to wait for the app to finish, this
* does not really work that way for trying to quit the browser when
* it's in turbo mode, so we wait 2 secs for it to complete. */
DosSleep(2000);
++ulCounter;
} while(bContinue);
return(WIZ_OK);
}
HRESULT CheckInstances()
{
char szFQProcessName[CCHMAXPATH];
char szProcessName[CCHMAXPATH];
char szSection[MAX_BUF];
char szClassName[MAX_BUF];
char szWindowName[MAX_BUF];
char szMessage[MAX_BUF];
char szIndex[MAX_BUF];
int iIndex;
BOOL bContinue;
HWND hwndFW;
PSZ szWN;
PSZ szCN;
ULONG ulRv0;
ULONG ulRv1;
bContinue = TRUE;
iIndex = -1;
while(bContinue)
{
memset(szClassName, 0, sizeof(szClassName));
memset(szWindowName, 0, sizeof(szWindowName));
memset(szMessage, 0, sizeof(szMessage));
++iIndex;
_itoa(iIndex, szIndex, 10);
strcpy(szSection, "Check Instance");
strcat(szSection, szIndex);
GetPrivateProfileString(szSection, "Message", "", szMessage, MAX_BUF, szFileIniUninstall);
if(GetPrivateProfileString(szSection, "Process Name", "", szProcessName, sizeof(szProcessName), szFileIniUninstall) != 0L)
{
if(*szProcessName != '\0')
{
/* If an instance is found, call PreCheckInstance first */
if(CheckForProcess(0, szProcessName, sizeof(szProcessName), szFQProcessName, sizeof(szFQProcessName)) == TRUE)
PreCheckInstance(szSection, szFileIniUninstall, szFQProcessName);
if(CheckForProcess(0, szProcessName, sizeof(szProcessName), NULL, 0) == TRUE)
{
if(*szMessage != '\0')
{
switch(ugUninstall.ulMode)
{
case NORMAL:
switch(WinMessageBox(HWND_DESKTOP, hWndMain, szMessage, NULL, 0, MB_ICONEXCLAMATION | MB_OKCANCEL))
{
case MBID_CANCEL:
/* User selected to cancel Setup */
return(TRUE);
case MBID_RETRY:
case MBID_OK:
/* User selected to retry. Reset counter */
iIndex = -1;
break;
}
break;
case AUTO:
ShowMessage(szMessage, TRUE);
DosSleep(5000);
ShowMessage(szMessage, FALSE);
/* Setup mode is AUTO. Show message, timeout, then cancel because we can't allow user to continue */
return(TRUE);
case SILENT:
return(TRUE);
}
}
else
{
/* No message to display. Assume cancel because we can't allow user to continue */
return(TRUE);
}
}
}
/* Process Name= key existed, and has been processed, so continue looking for more */
continue;
}
/* Process Name= key did not exist, so look for other keys */
ulRv0 = GetPrivateProfileString(szSection, "Class Name", "", szClassName, MAX_BUF, szFileIniUninstall);
ulRv1 = GetPrivateProfileString(szSection, "Window Name", "", szWindowName, MAX_BUF, szFileIniUninstall);
if((ulRv0 == 0L) &&
(ulRv1 == 0L))
{
bContinue = FALSE;
}
else if((*szClassName != '\0') || (*szWindowName != '\0'))
{
if(*szClassName == '\0')
szCN = NULL;
else
szCN = szClassName;
if(*szWindowName == '\0')
szWN = NULL;
else
szWN = szWindowName;
/* If an instance is found, call PreCheckInstance first. */
if((hwndFW = FindWindow(szCN)) != NULL) {
PID pid;
TID tid;
WinQueryWindowProcess(hwndFW, &pid, &tid);
CheckForProcess(pid, NULL, 0, szFQProcessName, sizeof(szFQProcessName));
PreCheckInstance(szSection, szFileIniUninstall, szFQProcessName);
}
if((hwndFW = FindWindow(szCN)) != NULL)
{
if(*szMessage != '\0')
{
switch(ugUninstall.ulMode)
{
case NORMAL:
switch(WinMessageBox(HWND_DESKTOP, hWndMain, szMessage, NULL, 0, MB_ICONEXCLAMATION | MB_RETRYCANCEL))
{
case MBID_CANCEL:
/* User selected to cancel Setup */
return(TRUE);
case MBID_RETRY:
/* User selected to retry. Reset counter */
iIndex = -1;
break;
}
break;
case AUTO:
ShowMessage(szMessage, TRUE);
DosSleep(5000);
ShowMessage(szMessage, FALSE);
/* Setup mode is AUTO. Show message, timeout, then cancel because we can't allow user to continue */
return(TRUE);
case SILENT:
return(TRUE);
}
}
else
{
/* No message to display. Assume cancel because we can't allow user to continue */
return(TRUE);
}
}
}
}
return(FALSE);
}
HRESULT GetAppPath()
{
char szTmpAppPath[MAX_BUF];
char szApp[MAX_BUF];
if(*ugUninstall.szUserAgent != '\0')
{
sprintf(szApp, "%s %s", ugUninstall.szOIMainApp, ugUninstall.szUserAgent);
}
else
{
strcpy(szApp, ugUninstall.szOIKey);
}
PrfQueryProfileString(HINI_USERPROFILE, szApp, "PathToExe", "", szTmpAppPath, sizeof(szTmpAppPath));
if(FileExists(szTmpAppPath))
{
strcpy(ugUninstall.szAppPath, szTmpAppPath);
}
return(0);
}
HRESULT GetUninstallLogPath()
{
char szBuf[MAX_BUF];
char szLogFolder[MAX_BUF];
char szApp[MAX_BUF];
char szWindowsUninstallKey[MAX_BUF];
char szErrorMsg[MAX_BUF];
char szEUninstallLogFolder[MAX_BUF];
BOOL bRestrictedAccess;
if(*ugUninstall.szUserAgent != '\0')
{
sprintf(szApp, "%s %s", ugUninstall.szOIMainApp, ugUninstall.szUserAgent);
}
else
{
strcpy(szApp, ugUninstall.szOIKey);
}
PrfQueryProfileString(HINI_USERPROFILE, szApp, "Uninstall Log Folder", "", szLogFolder, sizeof(szLogFolder));
strcpy(ugUninstall.szDescription, ugUninstall.szOIMainApp);
if(FileExists(szLogFolder) == FALSE)
{
if(GetPrivateProfileString("Messages", "ERROR_UNINSTALL_LOG_FOLDER", "",
szEUninstallLogFolder, sizeof(szEUninstallLogFolder),
szFileIniUninstall))
{
strcpy(szBuf, "\n\n ");
strcat(szBuf, szLogFolder);
strcat(szBuf, "\n");
sprintf(szErrorMsg, szEUninstallLogFolder, szBuf);
PrintError(szErrorMsg, ERROR_CODE_SHOW);
}
return(1);
}
strcpy(ugUninstall.szLogPath, szLogFolder);
return(0);
}
HRESULT ParseUninstallIni(int argc, char *argv[])
{
char szBuf[MAX_BUF];
char szAppCrypted[MAX_BUF];
char szKeyCrypted[MAX_BUF];
char szShowDialog[MAX_BUF];
char fontName[MAX_BUF];
char fontSize[MAX_BUF];
char charSet[MAX_BUF];
if(InitUninstallGeneral())
return(1);
strcpy(ugUninstall.szLogFilename, FILE_LOG_INSTALL);
/* get install Mode information */
GetPrivateProfileString("General", "Run Mode", "", szBuf, MAX_BUF, szFileIniUninstall);
SetUninstallRunMode(szBuf);
ParseCommandLine(argc, argv);
if(CheckInstances())
return(1);
if(InitDlgUninstall(&diUninstall))
return(1);
/* get product name description */
GetPrivateProfileString("General", "Company Name", "", ugUninstall.szCompanyName, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("General", "Product Name", "", ugUninstall.szProductName, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("General", "App", "", szKeyCrypted, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("General", "Decrypt App", "", szBuf, MAX_BUF, szFileIniUninstall);
if(stricmp(szBuf, "TRUE") == 0)
{
DecryptString(ugUninstall.szOIKey, szKeyCrypted);
}
else
strcpy(ugUninstall.szOIKey, szKeyCrypted);
GetPrivateProfileString("General", "Main App", "", szAppCrypted, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("General", "Decrypt Main App", "", szBuf, MAX_BUF, szFileIniUninstall);
// If szOIMainApp is not null then it was set on the command-line and that is
// what we want to use.
if(*ugUninstall.szOIMainApp == '\0')
{
if(stricmp(szBuf, "TRUE") == 0)
{
DecryptString(ugUninstall.szOIMainApp, szAppCrypted);
}
else
strcpy(ugUninstall.szOIMainApp, szAppCrypted);
}
GetPrivateProfileString("General", "Uninstall Filename", "", ugUninstall.szUninstallFilename, MAX_BUF, szFileIniUninstall);
/* Uninstall dialog */
GetPrivateProfileString("Dialog Uninstall", "Show Dialog", "", szShowDialog, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("Dialog Uninstall", "Title", "", diUninstall.szTitle, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("Dialog Uninstall", "Message0", "", diUninstall.szMessage0, MAX_BUF, szFileIniUninstall);
if(stricmp(szShowDialog, "TRUE") == 0)
diUninstall.bShowDialog = TRUE;
switch(ugUninstall.ulMode)
{
case AUTO:
case SILENT:
gulWhatToDo = WTD_NO_TO_ALL;
diUninstall.bShowDialog = FALSE;
break;
}
/* get defined font */
GetPrivateProfileString("Dialog Uninstall", "FONTNAME", "", fontName, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("Dialog Uninstall", "FONTSIZE", "", fontSize, MAX_BUF, szFileIniUninstall);
GetPrivateProfileString("Dialog Uninstall", "CHARSET", "", charSet, MAX_BUF, szFileIniUninstall);
strcpy(ugUninstall.szDefinedFont, fontSize);
strcat(ugUninstall.szDefinedFont, ".");
strcat(ugUninstall.szDefinedFont, fontName);
GetAppPath();
ugUninstall.bUninstallFiles = TRUE;
return(GetUninstallLogPath());
}
HRESULT DecryptVariable(PSZ szVariable, ULONG ulVariableSize)
{
char szBuf[MAX_BUF];
char szKey[MAX_BUF];
char szName[MAX_BUF];
char szValue[MAX_BUF];
/* zero out the memory allocations */
memset(szBuf, 0, sizeof(szBuf));
memset(szKey, 0, sizeof(szKey));
memset(szName, 0, sizeof(szName));
memset(szValue, 0, sizeof(szValue));
if(stricmp(szVariable, "PROGRAMFILESDIR") == 0)
{
/* @MAK Needed for install */
}
else if(stricmp(szVariable, "STARTUP") == 0)
{
HOBJECT hobj;
hobj = WinQueryObject("<WP_STARTUP>");
WinQueryObjectPath(hobj, szVariable, ulVariableSize);
}
else if(stricmp(szVariable, "DESKTOP") == 0)
{
HOBJECT hobj;
hobj = WinQueryObject("<WP_DESKTOP>");
WinQueryObjectPath(hobj, szVariable, ulVariableSize);
}
else if(stricmp(szVariable, "WARPCENTER") == 0)
{
HOBJECT hobj;
hobj = WinQueryObject("<WP_WARPCENTER????>");
WinQueryObjectPath(hobj, szVariable, ulVariableSize);
}
else if(stricmp(szVariable, "WIZTEMP") == 0)
{
/* parse for the "c:\Temp" path */
strcpy(szVariable, szTempDir);
if(szVariable[strlen(szVariable) - 1] == '\\')
szVariable[strlen(szVariable) - 1] = '\0';
}
else if(stricmp(szVariable, "TEMP") == 0)
{
/* parse for the "c:\Temp" path */
strcpy(szVariable, szOSTempDir);
if(szVariable[strlen(szVariable) - 1] == '\\')
szVariable[strlen(szVariable) - 1] = '\0';
}
else if(stricmp(szVariable, "OS2DISK") == 0)
{
/* Locate the drive that OS/2 is installed on, and only use the drive letter and the ':' character (C:). */
ULONG ulBootDrive = 0;
memset(szVariable, '\0', MAX_BUF);
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
&ulBootDrive, sizeof(ulBootDrive));
szVariable[0] = 'A' - 1 + ulBootDrive;
szVariable[1] = ':';
}
else if(stricmp(szVariable, "OS2DIR") == 0)
{
/* Locate the "OS2" directory */
ULONG ulBootDrive = 0;
APIRET rc;
char buffer[] = " :\\OS2\\";
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
&ulBootDrive, sizeof(ulBootDrive));
buffer[0] = 'A' - 1 + ulBootDrive;
strcpy(szVariable, buffer);
}
else if(stricmp(szVariable, "JRE BIN PATH") == 0)
{
}
else if(stricmp(szVariable, "JRE PATH") == 0)
{
}
else if(stricmp(szVariable, "UNINSTALL STARTUP PATH") == 0)
{
strcpy(szVariable, szUninstallDir);
}
else if(stricmp(szVariable, "Product CurrentVersion") == 0)
{
char szApp[MAX_BUF];
sprintf(szApp, "%s", ugUninstall.szProductName);
/* parse for the current Netscape INI entry */
PrfQueryProfileString(HINI_USERPROFILE, szApp, "CurrentVersion", "",
szBuf, sizeof(szBuf));
if(*szBuf == '\0')
return(FALSE);
strcpy(szVariable, szBuf);
}
else if(stricmp(szVariable, "Product OS2INIApp") == 0)
{
sprintf(szVariable, "%s", ugUninstall.szProductName);
}
else
return(FALSE);
return(TRUE);
}
HRESULT DecryptString(PSZ szOutputStr, PSZ szInputStr)
{
ULONG ulLenInputStr;
ULONG ulCounter;
ULONG ulVar;
ULONG ulPrepend;
char szBuf[MAX_BUF];
char szVariable[MAX_BUF];
char szPrepend[MAX_BUF];
char szAppend[MAX_BUF];
char szResultStr[MAX_BUF];
BOOL bFoundVar;
BOOL bBeginParse;
BOOL bDecrypted;
/* zero out the memory addresses */
memset(szBuf, '\0', MAX_BUF);
memset(szVariable, '\0', MAX_BUF);
memset(szPrepend, '\0', MAX_BUF);
memset(szAppend, '\0', MAX_BUF);
memset(szResultStr, '\0', MAX_BUF);
strcpy(szPrepend, szInputStr);
ulLenInputStr = strlen(szInputStr);
bBeginParse = FALSE;
bFoundVar = FALSE;
for(ulCounter = 0; ulCounter < ulLenInputStr; ulCounter++)
{
if((szInputStr[ulCounter] == ']') && bBeginParse)
break;
if(bBeginParse)
szVariable[ulVar++] = szInputStr[ulCounter];
if((szInputStr[ulCounter] == '[') && !bBeginParse)
{
ulVar = 0;
ulPrepend = ulCounter;
bBeginParse = TRUE;
}
}
if(ulCounter == ulLenInputStr)
/* did not find anything to expand. */
ulCounter = 0;
else
{
bFoundVar = TRUE;
++ulCounter;
}
if(bFoundVar)
{
strcpy(szAppend, &szInputStr[ulCounter]);
szPrepend[ulPrepend] = '\0';
bDecrypted = DecryptVariable(szVariable, MAX_BUF);
if(!bDecrypted)
{
/* Variable was not able to be decrypted. */
/* Leave the variable as it was read in by adding the '[' and ']' */
/* characters back to the variable. */
strcpy(szBuf, "[");
strcat(szBuf, szVariable);
strcat(szBuf, "]");
strcpy(szVariable, szBuf);
}
strcpy(szOutputStr, szPrepend);
strcat(szOutputStr, szVariable);
strcat(szOutputStr, szAppend);
if(bDecrypted)
{
DecryptString(szResultStr, szOutputStr);
strcpy(szOutputStr, szResultStr);
}
}
else
strcpy(szOutputStr, szInputStr);
return(TRUE);
}
#define S_IFMT (S_IFDIR | S_IFREG)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
HRESULT FileExists(PSZ szFile)
{
struct stat st;
int statrv;
statrv = stat(szFile, &st);
if (statrv == 0)
if (S_ISDIR(st.st_mode))
return FILE_DIRECTORY;
else
return(TRUE);
else if ((strlen(szFile) == 2) && (szFile[1] == ':'))
{
char temp[4] = {0};
strcpy(temp, szFile);
strcat(temp, "\\");
statrv = stat(temp, &st);
if (statrv == 0)
return FILE_DIRECTORY;
}
return (FALSE);
}
BOOL isFAT(char* szPath)
{
APIRET rc;
ULONG ulSize;
PFSQBUFFER2 pfsqbuf2;
CHAR szDrive[3];
ulSize = sizeof(FSQBUFFER2) + 3 * CCHMAXPATH;
pfsqbuf2 = (PFSQBUFFER2)malloc(ulSize);
strncpy(szDrive, szPath, 2);
szDrive[2] = '\0';
DosError(FERR_DISABLEHARDERR);
rc = DosQueryFSAttach(szDrive, 0, FSAIL_QUERYNAME,
pfsqbuf2, &ulSize);
DosError(FERR_ENABLEHARDERR);
if (rc == NO_ERROR) {
if (strcmp(pfsqbuf2->szFSDName + pfsqbuf2->cbName, "FAT") != 0)
return FALSE;
}
return TRUE;
}
void DeInitialize()
{
DeInitDlgUninstall(&diUninstall);
DeInitUninstallGeneral();
FreeMemory(&szTempDir);
FreeMemory(&szOSTempDir);
FreeMemory(&szUninstallDir);
FreeMemory(&szEGlobalAlloc);
FreeMemory(&szEDllLoad);
FreeMemory(&szEStringLoad);
FreeMemory(&szEStringNull);
FreeMemory(&szFileIniUninstall);
FreeMemory(&szFileIniDefaultsInfo);
}
HWND FindWindow(PCSZ pszAtomString)
{
ATOM atom;
HENUM henum;
HWND hwndClient, hwnd = NULLHANDLE;
atom = WinFindAtom(WinQuerySystemAtomTable(), pszAtomString);
if (atom) {
henum = WinBeginEnumWindows(HWND_DESKTOP);
while ((hwnd = WinGetNextWindow(henum)) != NULLHANDLE)
{
ULONG ulWindowWord;
ulWindowWord = WinQueryWindowULong(hwnd, QWL_USER);
if (ulWindowWord == atom) {
break;
} else {
/* Try the class name method to support older browsers */
HWND hwndClient;
CHAR szClassName[MAX_BUF];
hwndClient = WinWindowFromID(hwnd, FID_CLIENT);
WinQueryClassName(hwndClient ? hwndClient : hwnd, MAX_BUF, szClassName);
if (strcmp(szClassName, pszAtomString) == 0) {
break;
}
}
}
WinEndEnumWindows(henum);
}
if (!hwnd) {
/* Try the object windows just in case, but only for the classname */
henum = WinBeginEnumWindows(HWND_OBJECT);
while ((hwnd = WinGetNextWindow(henum)) != NULLHANDLE)
{
/* Try the class name method to support older browsers */
HWND hwndClient;
CHAR szClassName[MAX_BUF];
hwndClient = WinWindowFromID(hwnd, FID_CLIENT);
WinQueryClassName(hwndClient ? hwndClient : hwnd, MAX_BUF, szClassName);
if (strcmp(szClassName, pszAtomString) == 0) {
break;
}
}
}
return hwnd;
}