Back to index

lightning-sunbird  0.9+nobinonly
Functions | Variables
uninstall.c File Reference
#include "uninstall.h"
#include "extra.h"
#include "dialogs.h"
#include "ifuncns.h"
#include "parser.h"

Go to the source code of this file.

Functions

static BOOL CopyTo (LPCSTR file, LPCSTR destDir, LPSTR result)
static BOOL SpawnProcess (LPCSTR exePath, LPCSTR cmdLine)
static BOOL EnsureRunningAsCopy (LPCSTR cmdLine)
static void OnUninstallComplete ()
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

Variables

HINSTANCE hInst
HANDLE hAccelTable
HWND hDlgUninstall
HWND hDlgMessage
HWND hWndMain
LPSTR szEGlobalAlloc
LPSTR szEStringLoad
LPSTR szEDllLoad
LPSTR szEStringNull
LPSTR szClassName
LPSTR szUninstallDir
LPSTR szTempDir
LPSTR szOSTempDir
LPSTR szFileIniUninstall
LPSTR szFileIniDefaultsInfo
LPSTR gszSharedFilename
ULONG ulOSType
DWORD dwScreenX
DWORD dwScreenY
DWORD gdwWhatToDo
BOOL gbAllowMultipleInstalls = FALSE
uninstallGen ugUninstall
diU diUninstall
DWORD dwParentPID = 0
BOOL gbUninstallCompleted = FALSE

Function Documentation

static BOOL CopyTo ( LPCSTR  file,
LPCSTR  destDir,
LPSTR  result 
) [static]

Definition at line 86 of file uninstall.c.

{
  char leaf[MAX_BUF_TINY];

  ParsePath(file, leaf, sizeof(leaf), PP_FILENAME_ONLY);
  lstrcpy(result, destDir);
  lstrcat(result, "\\");
  lstrcat(result, leaf);

  return CopyFile(file, result, TRUE);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static BOOL EnsureRunningAsCopy ( LPCSTR  cmdLine) [static]

Definition at line 127 of file uninstall.c.

{
  char uninstExe[MAX_PATH], uninstIni[MAX_PATH];
  char tempBuf[MAX_PATH], tempDir[MAX_PATH] = ""; 
  DWORD n;

  if (dwParentPID != 0)
  {
    HANDLE hParent;
    
    /* OpenProcess may return NULL if the parent process has already gone away.
     * If not, then wait for the parent process to exit.  NOTE: The process may
     * be signaled before it releases the executable image, so we sit in a loop
     * until OpenProcess returns NULL. */
    while ((hParent = OpenProcess(SYNCHRONIZE, FALSE, dwParentPID)) != NULL)
    {
      DWORD rv = WaitForSingleObject(hParent, 5000);
      CloseHandle(hParent);
      if (rv != WAIT_OBJECT_0)
        return FALSE;
      Sleep(50);  /* prevent burning CPU while waiting */
    }

    return TRUE;
  }

  /* otherwise, copy ourselves to a temp location and execute the copy. */

  /* make unique folder under the Temp folder */
  n = GetTempPath(sizeof(tempDir)-1, tempDir);
  if (n == 0 || n > sizeof(tempDir)-1)
    return FALSE;
  lstrcat(tempDir, "nstmp");
  if (!MakeUniquePath(tempDir) || !CreateDirectory(tempDir, NULL))
    return FALSE;

  if (!GetModuleFileName(hInst, tempBuf, sizeof(tempBuf)))
    return FALSE;

  /* copy exe file into temp folder */
  if (!CopyTo(tempBuf, tempDir, uninstExe))
  {
    RemoveDirectory(tempDir);
    return FALSE;
  }

  /* copy ini file into temp folder */
  ParsePath(tempBuf, uninstIni, sizeof(uninstIni), PP_PATH_ONLY); 
  lstrcat(uninstIni, FILE_INI_UNINSTALL);

  if (!CopyTo(uninstIni, tempDir, tempBuf))
  {
    DeleteFile(uninstExe);
    RemoveDirectory(tempDir);
    return FALSE;
  }

  /* schedule temp dir and contents to be deleted on reboot */
  DeleteOnReboot(uninstExe);
  DeleteOnReboot(tempBuf);
  DeleteOnReboot(tempDir);

  /* append -ppid command line flag  */
  _snprintf(tempBuf, sizeof(tempBuf), "\"%s\" %s /ppid %lu",
            uninstExe, cmdLine, GetCurrentProcessId());

  /* call CreateProcess */
  SpawnProcess(uninstExe, tempBuf);

  return FALSE;  /* exit this process */
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void OnUninstallComplete ( ) [static]

Definition at line 200 of file uninstall.c.

{
  char exePath[MAX_PATH], buf[MAX_PATH];

  if (!(ugUninstall.szProductName && ugUninstall.szProductName[0]) ||
      !(ugUninstall.szUserAgent && ugUninstall.szUserAgent[0]))
    return;

  if (DialogBox(hInst, MAKEINTRESOURCE(DLG_MESSAGE_CHK), NULL,
      DlgProcComplete) != ID_YES_TO_ALL)
    return;

  /* find iexplore.exe.  we cannot use ShellExecute because the protocol
   * association (in HKEY_CLASSES_ROOT) may reference the app we just
   * uninstalled, which is a bug in and of itself. */
  GetWinReg(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\IE Setup\\Setup", "Path",
            exePath, sizeof(exePath));
  if (!exePath[0])
    return;
  lstrcat(exePath, "\\iexplore.exe");

  /* launch IE, and point it at the survey URL (whitespace in the product name
   * or user agent is okay) */
  _snprintf(buf, sizeof(buf),
            "\"%s\" \"https://survey.mozilla.com/1/%s/%s/exit.html\"", exePath,
            ugUninstall.szProductName, ugUninstall.szUserAgent);
  SpawnProcess(exePath, buf);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static BOOL SpawnProcess ( LPCSTR  exePath,
LPCSTR  cmdLine 
) [static]

Definition at line 99 of file uninstall.c.

{
  STARTUPINFO si = {sizeof(si), 0};
  PROCESS_INFORMATION pi = {0};

  BOOL ok = CreateProcess(exePath,
                          cmdLine,
                          NULL,  // no special security attributes
                          NULL,  // no special thread attributes
                          FALSE, // don't inherit filehandles
                          0,     // No special process creation flags
                          NULL,  // inherit my environment
                          NULL,  // use my current directory
                          &si,
                          &pi);

  if (ok) {
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  }

  return ok;
}

Here is the caller graph for this function:

int APIENTRY WinMain ( HINSTANCE  hInstance,
HINSTANCE  hPrevInstance,
LPSTR  lpszCmdLine,
int  nCmdShow 
)

Definition at line 229 of file uninstall.c.

{
  /***********************************************************************/
  /* HANDLE hInstance;       handle for this instance                    */
  /* HANDLE hPrevInstance;   handle for possible previous instances      */
  /* LPSTR  lpszCmdLine;     long pointer to exec command line           */
  /* int    nCmdShow;        Show code for main window display           */
  /***********************************************************************/

  MSG   msg;
  char  szBuf[MAX_BUF];
  int   iRv = WIZ_OK;
  HWND  hwndFW;

  if(!hPrevInstance)
  {
    hInst = GetModuleHandle(NULL);
    if(InitUninstallGeneral() || ParseCommandLine(lpszCmdLine))
    {
      PostQuitMessage(1);
    }
    else if((hwndFW = FindWindow(CLASS_NAME_UNINSTALL_DLG, NULL)) != NULL && !gbAllowMultipleInstalls)
    {
    /* Allow only one instance of setup to run.
     * Detect a previous instance of setup, bring it to the 
     * foreground, and quit current instance */

      ShowWindow(hwndFW, SW_RESTORE);
      SetForegroundWindow(hwndFW);
      iRv = WIZ_SETUP_ALREADY_RUNNING;
      PostQuitMessage(1);
    }
    else if(!EnsureRunningAsCopy(lpszCmdLine) || Initialize(hInst))
    {
      PostQuitMessage(1);
    }
    else if(!InitApplication(hInst))
    {
      char szEFailed[MAX_BUF];

      if(NS_LoadString(hInst, IDS_ERROR_FAILED, szEFailed, MAX_BUF) == WIZ_OK)
      {
        wsprintf(szBuf, szEFailed, "InitApplication().");
        PrintError(szBuf, ERROR_CODE_SHOW);
      }
      PostQuitMessage(1);
    }
    else if(ParseUninstallIni())
    {
      PostQuitMessage(1);
    }
    else if(ugUninstall.bUninstallFiles == TRUE)
    {
      if(diUninstall.bShowDialog == TRUE)
        hDlgUninstall = InstantiateDialog(hWndMain, DLG_UNINSTALL, diUninstall.szTitle, DlgProcUninstall);
      // Assumes that SHOWICONS, HIDEICONS, and SETDEFAULT never show dialogs
      else if((ugUninstall.mode == SHOWICONS) || (ugUninstall.mode == HIDEICONS))
        ParseDefaultsInfo();
      else if(ugUninstall.mode == SETDEFAULT)
        SetDefault();
      else
        ParseAllUninstallLogs();
    }
  }

  if((ugUninstall.bUninstallFiles == TRUE) && (diUninstall.bShowDialog == TRUE))
  {
    while(GetMessage(&msg, NULL, 0, 0))
    {
      if((!IsDialogMessage(hDlgUninstall, &msg)) && (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    }
  }

  if(diUninstall.bShowDialog == TRUE && gbUninstallCompleted)
  {
    OnUninstallComplete();
  }

  /* garbage collection */
  DeInitUninstallGeneral();
  if(iRv != WIZ_SETUP_ALREADY_RUNNING)
    /* Do clean up before exiting from the application */
    DeInitialize();

  return(msg.wParam);
} /*  End of WinMain */

Here is the call graph for this function:


Variable Documentation

Definition at line 78 of file uninstall.c.

Definition at line 80 of file uninstall.c.

Definition at line 70 of file uninstall.c.

Definition at line 71 of file uninstall.c.

Definition at line 75 of file uninstall.c.

Definition at line 82 of file uninstall.c.

Definition at line 73 of file uninstall.c.

Definition at line 67 of file uninstall.c.

Definition at line 50 of file uninstall.c.

Definition at line 53 of file uninstall.c.

Definition at line 52 of file uninstall.c.

Definition at line 48 of file uninstall.c.

Definition at line 54 of file uninstall.c.

Definition at line 61 of file uninstall.c.

Definition at line 58 of file uninstall.c.

Definition at line 56 of file uninstall.c.

Definition at line 57 of file uninstall.c.

Definition at line 59 of file uninstall.c.

Definition at line 66 of file uninstall.c.

Definition at line 65 of file uninstall.c.

Definition at line 64 of file uninstall.c.

Definition at line 63 of file uninstall.c.

Definition at line 62 of file uninstall.c.

Definition at line 77 of file uninstall.c.

Definition at line 69 of file uninstall.c.