|
|
1.1 ! root 1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org ! 2: This product uses components written by Paul Le Roux <[email protected]> */ ! 3: ! 4: #include "TCdefs.h" ! 5: #include <SrRestorePtApi.h> ! 6: ! 7: #define MAX_PASSWORD ! 8: ! 9: #include "apidrvr.h" ! 10: #include "dlgcode.h" ! 11: #include "dismount.h" ! 12: #include "../common/resource.h" ! 13: ! 14: #include "resource.h" ! 15: ! 16: #include "dir.h" ! 17: #include "setup.h" ! 18: ! 19: #include <sys\types.h> ! 20: #include <sys\stat.h> ! 21: ! 22: #pragma warning( disable : 4201 ) ! 23: #pragma warning( disable : 4115 ) ! 24: ! 25: #include <shlobj.h> ! 26: ! 27: #pragma warning( default : 4201 ) ! 28: #pragma warning( default : 4115 ) ! 29: ! 30: char dlg_file_name[TC_MAX_PATH]; ! 31: BOOL bUninstall = FALSE; ! 32: BOOL bDone = FALSE; ! 33: ! 34: HMODULE SystemRestoreDll = 0; ! 35: ! 36: BOOL ! 37: StatDeleteFile (char *lpszFile) ! 38: { ! 39: struct __stat64 st; ! 40: ! 41: if (_stat64 (lpszFile, &st) == 0) ! 42: return DeleteFile (lpszFile); ! 43: else ! 44: return TRUE; ! 45: } ! 46: ! 47: BOOL ! 48: StatRemoveDirectory (char *lpszDir) ! 49: { ! 50: struct __stat64 st; ! 51: ! 52: if (_stat64 (lpszDir, &st) == 0) ! 53: return RemoveDirectory (lpszDir); ! 54: else ! 55: return TRUE; ! 56: } ! 57: ! 58: HRESULT ! 59: CreateLink (char *lpszPathObj, char *lpszArguments, ! 60: char *lpszPathLink) ! 61: { ! 62: HRESULT hres; ! 63: IShellLink *psl; ! 64: ! 65: /* Get a pointer to the IShellLink interface. */ ! 66: hres = CoCreateInstance (&CLSID_ShellLink, NULL, ! 67: CLSCTX_INPROC_SERVER, &IID_IShellLink, &psl); ! 68: if (SUCCEEDED (hres)) ! 69: { ! 70: IPersistFile *ppf; ! 71: ! 72: /* Set the path to the shortcut target, and add the ! 73: description. */ ! 74: psl->lpVtbl->SetPath (psl, lpszPathObj); ! 75: psl->lpVtbl->SetArguments (psl, lpszArguments); ! 76: ! 77: /* Query IShellLink for the IPersistFile interface for saving ! 78: the shortcut in persistent storage. */ ! 79: hres = psl->lpVtbl->QueryInterface (psl, &IID_IPersistFile, ! 80: &ppf); ! 81: ! 82: if (SUCCEEDED (hres)) ! 83: { ! 84: WORD wsz[TC_MAX_PATH]; ! 85: ! 86: /* Ensure that the string is ANSI. */ ! 87: MultiByteToWideChar (CP_ACP, 0, lpszPathLink, -1, ! 88: wsz, TC_MAX_PATH); ! 89: ! 90: /* Save the link by calling IPersistFile::Save. */ ! 91: hres = ppf->lpVtbl->Save (ppf, wsz, TRUE); ! 92: ppf->lpVtbl->Release (ppf); ! 93: } ! 94: psl->lpVtbl->Release (psl); ! 95: } ! 96: return hres; ! 97: } ! 98: ! 99: void ! 100: GetProgramPath (HWND hwndDlg, char *path) ! 101: { ! 102: ITEMIDLIST *i; ! 103: HRESULT res; ! 104: ! 105: if (nCurrentOS == WIN_NT && IsDlgButtonChecked (hwndDlg, IDC_ALL_USERS)) ! 106: res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_COMMON_PROGRAMS, &i); ! 107: else ! 108: res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_PROGRAMS, &i); ! 109: ! 110: SHGetPathFromIDList (i, path); ! 111: } ! 112: ! 113: ! 114: void ! 115: StatusMessage (HWND hwndDlg, char *head, char *txt) ! 116: { ! 117: char szTmp[TC_MAX_PATH]; ! 118: sprintf (szTmp, head, txt); ! 119: SendMessage (GetDlgItem (hwndDlg, IDC_FILES), LB_ADDSTRING, 0, (LPARAM) szTmp); ! 120: ! 121: SendDlgItemMessage (hwndDlg, IDC_FILES, LB_SETTOPINDEX, ! 122: SendDlgItemMessage (hwndDlg, IDC_FILES, LB_GETCOUNT, 0, 0) - 1, 0); ! 123: } ! 124: ! 125: void ! 126: RegMessage (HWND hwndDlg, char *txt) ! 127: { ! 128: StatusMessage (hwndDlg, "Adding registry entry %s", txt); ! 129: } ! 130: ! 131: void ! 132: CopyMessage (HWND hwndDlg, char *txt) ! 133: { ! 134: StatusMessage (hwndDlg, "Copying %s", txt); ! 135: } ! 136: ! 137: void ! 138: RemoveMessage (HWND hwndDlg, char *txt) ! 139: { ! 140: StatusMessage (hwndDlg, "Removing %s", txt); ! 141: } ! 142: ! 143: void ! 144: ServiceMessage (HWND hwndDlg, char *txt) ! 145: { ! 146: StatusMessage (hwndDlg, "Service %s", txt); ! 147: } ! 148: ! 149: void ! 150: IconMessage (HWND hwndDlg, char *txt) ! 151: { ! 152: StatusMessage (hwndDlg, "Adding icon %s", txt); ! 153: } ! 154: ! 155: int CALLBACK ! 156: BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData) ! 157: { ! 158: switch(uMsg) { ! 159: case BFFM_INITIALIZED: ! 160: { ! 161: /* WParam is TRUE since we are passing a path. ! 162: It would be FALSE if we were passing a pidl. */ ! 163: SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)pData); ! 164: break; ! 165: } ! 166: ! 167: case BFFM_SELCHANGED: ! 168: { ! 169: char szDir[TC_MAX_PATH]; ! 170: ! 171: /* Set the status window to the currently selected path. */ ! 172: if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir)) ! 173: { ! 174: SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir); ! 175: } ! 176: break; ! 177: } ! 178: ! 179: default: ! 180: break; ! 181: } ! 182: ! 183: return 0; ! 184: } ! 185: ! 186: BOOL ! 187: BrowseFiles2 (HWND hwndDlg, char* lpszTitle, char* lpszFileName) ! 188: { ! 189: BROWSEINFO bi; ! 190: LPITEMIDLIST pidl; ! 191: LPMALLOC pMalloc; ! 192: BOOL bOK = FALSE; ! 193: ! 194: if (SUCCEEDED(SHGetMalloc(&pMalloc))) ! 195: { ! 196: ZeroMemory(&bi,sizeof(bi)); ! 197: bi.hwndOwner = hwndDlg; ! 198: bi.pszDisplayName = 0; ! 199: bi.lpszTitle = lpszTitle; ! 200: bi.pidlRoot = 0; ! 201: bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT /*| BIF_EDITBOX*/; ! 202: bi.lpfn = BrowseCallbackProc; ! 203: bi.lParam = (LPARAM)lpszFileName; ! 204: ! 205: pidl = SHBrowseForFolder(&bi); ! 206: if (pidl!=NULL) ! 207: { ! 208: if (SHGetPathFromIDList(pidl,lpszFileName)==TRUE) ! 209: { ! 210: bOK = TRUE; ! 211: } ! 212: ! 213: pMalloc->lpVtbl->Free(pMalloc,pidl); ! 214: pMalloc->lpVtbl->Release(pMalloc); ! 215: } ! 216: } ! 217: ! 218: return bOK; ! 219: } ! 220: ! 221: ! 222: void ! 223: LoadLicense (HWND hwndDlg) ! 224: { ! 225: FILE *fp; ! 226: ! 227: fp = fopen ("Setup Files\\license.txt", "rb"); ! 228: ! 229: if (fp == NULL) ! 230: return; ! 231: else ! 232: { ! 233: long x; ! 234: ! 235: fseek (fp, 0, SEEK_END); ! 236: x = ftell (fp); ! 237: rewind (fp); ! 238: ! 239: if (x > 0) ! 240: { ! 241: char *tmp = malloc (x + 1); ! 242: long z; ! 243: ! 244: if (tmp == NULL) ! 245: goto exit; ! 246: z = (long) fread (tmp, 1, x, fp); ! 247: if (z != x) ! 248: { ! 249: free (tmp); ! 250: goto exit; ! 251: } ! 252: else ! 253: { ! 254: int i; ! 255: tmp[x] = 0; ! 256: ! 257: //// Remove single CRLFs ! 258: //for (i = 0; i < x - 3; i++) ! 259: //{ ! 260: // if (tmp[i] == 0xd && tmp[i+2] == 0xd) ! 261: // i += 4; ! 262: ! 263: // if (tmp[i] == 0xd && tmp[i+2] != 0xd) ! 264: // { ! 265: // tmp[i] = tmp[i+1] = ' '; ! 266: // } ! 267: //} ! 268: ! 269: SendMessage (GetDlgItem (hwndDlg, IDC_LICENSE), WM_SETFONT, (WPARAM) hFixedFont, (LPARAM) 0); ! 270: SetWindowText (GetDlgItem (hwndDlg, IDC_LICENSE), tmp); ! 271: ! 272: free (tmp); ! 273: } ! 274: } ! 275: } ! 276: ! 277: exit: ! 278: fclose (fp); ! 279: } ! 280: ! 281: BOOL ! 282: DoFilesInstall (HWND hwndDlg, char *szDestDir, BOOL bUninstallSupport) ! 283: { ! 284: ! 285: ! 286: char *szFiles[]= ! 287: { ! 288: "ATrueCrypt.exe", "ATrueCrypt Format.exe", ! 289: "Alicense.txt", "ATrueCrypt User Guide.pdf", ! 290: "WTrueCrypt Setup.exe", "STrueCryptService.exe", "Dtruecrypt.sys", ! 291: "Itruecrypt.vxd" ! 292: }; ! 293: ! 294: char szTmp[TC_MAX_PATH]; ! 295: BOOL bOK = TRUE; ! 296: int i; ! 297: ! 298: if (bUninstall == TRUE) ! 299: bUninstallSupport = FALSE; ! 300: ! 301: for (i = 0; i < sizeof (szFiles) / sizeof (szFiles[0]); i++) ! 302: { ! 303: BOOL bResult, bSlash; ! 304: char szDir[TC_MAX_PATH]; ! 305: int x; ! 306: ! 307: if (bUninstallSupport == FALSE && strstr (szFiles[i], "TrueCrypt Setup") != 0) ! 308: continue; ! 309: ! 310: if (*szFiles[i] == 'A') ! 311: strcpy (szDir, szDestDir); ! 312: else if (*szFiles[i] == 'S') ! 313: GetSystemDirectory (szDir, sizeof (szDir)); ! 314: else if (*szFiles[i] == 'I') ! 315: { ! 316: GetSystemDirectory (szDir, sizeof (szDir)); ! 317: ! 318: x = strlen (szDestDir); ! 319: if (szDestDir[x - 1] == '\\') ! 320: bSlash = TRUE; ! 321: else ! 322: bSlash = FALSE; ! 323: ! 324: if (bSlash == FALSE) ! 325: strcat (szDir, "\\"); ! 326: ! 327: strcat (szDir, "IOSUBSYS"); ! 328: } ! 329: else if (*szFiles[i] == 'D') ! 330: { ! 331: GetSystemDirectory (szDir, sizeof (szDir)); ! 332: ! 333: x = strlen (szDestDir); ! 334: if (szDestDir[x - 1] == '\\') ! 335: bSlash = TRUE; ! 336: else ! 337: bSlash = FALSE; ! 338: ! 339: if (bSlash == FALSE) ! 340: strcat (szDir, "\\"); ! 341: ! 342: strcat (szDir, "Drivers"); ! 343: } ! 344: else if (*szFiles[i] == 'W') ! 345: GetWindowsDirectory (szDir, sizeof (szDir)); ! 346: ! 347: x = strlen (szDestDir); ! 348: if (szDestDir[x - 1] == '\\') ! 349: bSlash = TRUE; ! 350: else ! 351: bSlash = FALSE; ! 352: ! 353: if (bSlash == FALSE) ! 354: strcat (szDir, "\\"); ! 355: ! 356: if ((*szFiles[i] == 'D' || *szFiles[i] == 'S') && nCurrentOS != WIN_NT) ! 357: continue; ! 358: ! 359: if (*szFiles[i] == 'I' && nCurrentOS == WIN_NT) ! 360: continue; ! 361: ! 362: sprintf (szTmp, "%s%s", szDir, szFiles[i] + 1); ! 363: ! 364: if (bUninstall == FALSE) ! 365: CopyMessage (hwndDlg, szTmp); ! 366: else ! 367: RemoveMessage (hwndDlg, szTmp); ! 368: ! 369: if (bUninstall == FALSE) ! 370: { ! 371: bResult = CopyFile (szFiles[i] + 1, szTmp, FALSE); ! 372: if (!bResult) ! 373: { ! 374: char s[256]; ! 375: sprintf (s, "Setup Files\\%s", szFiles[i] + 1); ! 376: bResult = CopyFile (s, szTmp, FALSE); ! 377: } ! 378: } ! 379: else ! 380: { ! 381: bResult = StatDeleteFile (szTmp); ! 382: } ! 383: ! 384: if (bResult == FALSE) ! 385: { ! 386: LPVOID lpMsgBuf; ! 387: DWORD dwError = GetLastError (); ! 388: char szTmp2[700]; ! 389: ! 390: FormatMessage ( ! 391: FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, ! 392: NULL, ! 393: dwError, ! 394: MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ ! 395: (char *) &lpMsgBuf, ! 396: 0, ! 397: NULL ! 398: ); ! 399: ! 400: ! 401: if (bUninstall == FALSE) ! 402: sprintf (szTmp2, "The installation of '%s' has failed. %s Do you want to continue with the Install?", ! 403: szTmp, lpMsgBuf); ! 404: else ! 405: sprintf (szTmp2, "The uninstallation of '%s' has failed. %s Do you want to continue with the Uninstall?", ! 406: szTmp, lpMsgBuf); ! 407: ! 408: LocalFree (lpMsgBuf); ! 409: ! 410: if (MessageBox (hwndDlg, szTmp2, lpszTitle, MB_YESNO | MB_ICONHAND) != IDYES) ! 411: return FALSE; ! 412: } ! 413: ! 414: } ! 415: ! 416: return bOK; ! 417: } ! 418: ! 419: BOOL ! 420: DoRegInstall (HWND hwndDlg, char *szDestDir, BOOL bInstallType, BOOL bUninstallSupport) ! 421: { ! 422: char szDir[TC_MAX_PATH], *key; ! 423: HKEY hkey = 0; ! 424: BOOL bSlash, bOK = FALSE; ! 425: DWORD dw; ! 426: int x; ! 427: ! 428: strcpy (szDir, szDestDir); ! 429: x = strlen (szDestDir); ! 430: if (szDestDir[x - 1] == '\\') ! 431: bSlash = TRUE; ! 432: else ! 433: bSlash = FALSE; ! 434: ! 435: if (bSlash == FALSE) ! 436: strcat (szDir, "\\"); ! 437: ! 438: if (nCurrentOS == WIN_NT) ! 439: { ! 440: /* 9/9/99 FIX This code should no longer be needed as we use ! 441: the "services" api to install the driver now, rather than ! 442: setting the registry by hand */ ! 443: ! 444: /* Install device driver */ ! 445: key = "SYSTEM\\CurrentControlSet\\Services\\truecrypt"; ! 446: RegMessage (hwndDlg, key); ! 447: if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, ! 448: key, ! 449: 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS) ! 450: goto error; ! 451: ! 452: dw = 1; ! 453: if (RegSetValueEx (hkey, "Type", 0, REG_DWORD, (BYTE *) & dw, 4) != ERROR_SUCCESS) ! 454: goto error; ! 455: ! 456: dw = 1; ! 457: if (RegSetValueEx (hkey, "Start", 0, REG_DWORD, (BYTE *) & dw, 4) != ERROR_SUCCESS) ! 458: goto error; ! 459: ! 460: dw = 1; ! 461: if (RegSetValueEx (hkey, "ErrorControl", 0, REG_DWORD, (BYTE *) & dw, 4) != ERROR_SUCCESS) ! 462: goto error; ! 463: ! 464: if (RegSetValueEx (hkey, "Group", 0, REG_SZ, (BYTE *) "Primary disk", 13) != ERROR_SUCCESS) ! 465: goto error; ! 466: ! 467: RegCloseKey (hkey); ! 468: hkey = 0; ! 469: } ! 470: ! 471: if (bInstallType == TRUE) ! 472: { ! 473: char szTmp[TC_MAX_PATH]; ! 474: ! 475: key = "SOFTWARE\\Classes\\TrueCryptVolume"; ! 476: RegMessage (hwndDlg, key); ! 477: if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, ! 478: key, ! 479: 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS) ! 480: goto error; ! 481: ! 482: sprintf (szTmp, "TrueCrypt Volume", szDir); ! 483: if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS) ! 484: goto error; ! 485: ! 486: RegCloseKey (hkey); ! 487: hkey = 0; ! 488: ! 489: key = "SOFTWARE\\Classes\\TrueCryptVolume\\DefaultIcon"; ! 490: RegMessage (hwndDlg, key); ! 491: if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, ! 492: key, ! 493: 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS) ! 494: goto error; ! 495: ! 496: sprintf (szTmp, "%sTrueCrypt.exe,1", szDir); ! 497: if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS) ! 498: goto error; ! 499: ! 500: RegCloseKey (hkey); ! 501: hkey = 0; ! 502: ! 503: key = "SOFTWARE\\Classes\\TrueCryptVolume\\Shell\\open\\command"; ! 504: RegMessage (hwndDlg, key); ! 505: if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, ! 506: key, ! 507: 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS) ! 508: goto error; ! 509: ! 510: sprintf (szTmp, "\"%sTrueCrypt.exe\" /v \"%%1\"", szDir ); ! 511: if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS) ! 512: goto error; ! 513: ! 514: RegCloseKey (hkey); ! 515: hkey = 0; ! 516: ! 517: key = "SOFTWARE\\Classes\\.tc"; ! 518: RegMessage (hwndDlg, key); ! 519: if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, ! 520: key, ! 521: 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS) ! 522: goto error; ! 523: ! 524: strcpy (szTmp, "TrueCryptVolume"); ! 525: if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS) ! 526: goto error; ! 527: } ! 528: ! 529: ! 530: if (bUninstallSupport == TRUE) ! 531: { ! 532: char szTmp[TC_MAX_PATH]; ! 533: ! 534: key = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\TrueCrypt"; ! 535: RegMessage (hwndDlg, key); ! 536: if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, ! 537: key, ! 538: 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS) ! 539: goto error; ! 540: ! 541: GetWindowsDirectory (szDir, sizeof (szDir)); ! 542: ! 543: x = strlen (szDir); ! 544: if (szDir[x - 1] == '\\') ! 545: bSlash = TRUE; ! 546: else ! 547: bSlash = FALSE; ! 548: ! 549: if (bSlash == FALSE) ! 550: strcat (szDir, "\\"); ! 551: ! 552: sprintf (szTmp, "%sTrueCrypt Setup.exe /u", szDir); ! 553: if (RegSetValueEx (hkey, "UninstallString", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS) ! 554: goto error; ! 555: ! 556: strcpy (szTmp, "TrueCrypt"); ! 557: if (RegSetValueEx (hkey, "DisplayName", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS) ! 558: goto error; ! 559: } ! 560: ! 561: bOK = TRUE; ! 562: ! 563: error: ! 564: if (hkey != 0) ! 565: RegCloseKey (hkey); ! 566: ! 567: if (bOK == FALSE) ! 568: { ! 569: handleWin32Error (hwndDlg); ! 570: MessageBox (hwndDlg, "The installation of the registry entries has failed", lpszTitle, MB_ICONHAND); ! 571: } ! 572: ! 573: return bOK; ! 574: } ! 575: ! 576: BOOL ! 577: DoRegUninstall (HWND hwndDlg) ! 578: { ! 579: BOOL bOK = FALSE; ! 580: ! 581: StatusMessage (hwndDlg, "%s", "Removing registry entries"); ! 582: ! 583: RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\TrueCrypt"); ! 584: RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\TrueCryptVolume\\Shell\\open\\command"); ! 585: RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\TrueCryptVolume\\Shell\\open"); ! 586: RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\TrueCryptVolume\\Shell"); ! 587: RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\TrueCryptVolume\\DefaultIcon"); ! 588: RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\TrueCryptVolume"); ! 589: RegDeleteKey (HKEY_CURRENT_USER, "SOFTWARE\\TrueCrypt"); ! 590: if (RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\.tc") != ERROR_SUCCESS) ! 591: goto error; ! 592: ! 593: bOK = TRUE; ! 594: ! 595: error: ! 596: ! 597: if (bOK == FALSE && GetLastError ()!= ERROR_NO_TOKEN && GetLastError ()!= ERROR_FILE_NOT_FOUND ! 598: && GetLastError ()!= ERROR_PATH_NOT_FOUND) ! 599: { ! 600: handleWin32Error (hwndDlg); ! 601: MessageBox (hwndDlg, "The uninstallation of the registry entries has failed", lpszTitle, MB_ICONHAND); ! 602: } ! 603: else ! 604: bOK = TRUE; ! 605: ! 606: return bOK; ! 607: ! 608: } ! 609: ! 610: BOOL ! 611: DoServiceUninstall (HWND hwndDlg, char *lpszService) ! 612: { ! 613: SC_HANDLE hManager, hService = NULL; ! 614: BOOL bOK = FALSE, bRet; ! 615: SERVICE_STATUS status; ! 616: char szTmp[128]; ! 617: int x; ! 618: ! 619: if (nCurrentOS != WIN_NT) ! 620: return TRUE; ! 621: else ! 622: memset (&status, 0, sizeof (status)); /* Keep VC6 quiet */ ! 623: ! 624: hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); ! 625: if (hManager == NULL) ! 626: goto error; ! 627: ! 628: hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS); ! 629: if (hService == NULL) ! 630: goto error; ! 631: ! 632: sprintf (szTmp, "stopping %s", lpszService); ! 633: ServiceMessage (hwndDlg, szTmp); ! 634: ! 635: #define WAIT_PERIOD 3 ! 636: ! 637: for (x = 0; x < WAIT_PERIOD; x++) ! 638: { ! 639: bRet = QueryServiceStatus (hService, &status); ! 640: if (bRet != TRUE) ! 641: goto error; ! 642: ! 643: if (status.dwCurrentState != SERVICE_START_PENDING && ! 644: status.dwCurrentState != SERVICE_STOP_PENDING && ! 645: status.dwCurrentState != SERVICE_CONTINUE_PENDING) ! 646: break; ! 647: ! 648: Sleep (1000); ! 649: } ! 650: ! 651: if (status.dwCurrentState != SERVICE_STOPPED) ! 652: { ! 653: bRet = ControlService (hService, SERVICE_CONTROL_STOP, &status); ! 654: if (bRet == FALSE) ! 655: goto try_delete; ! 656: ! 657: for (x = 0; x < WAIT_PERIOD; x++) ! 658: { ! 659: bRet = QueryServiceStatus (hService, &status); ! 660: if (bRet != TRUE) ! 661: goto error; ! 662: ! 663: if (status.dwCurrentState != SERVICE_START_PENDING && ! 664: status.dwCurrentState != SERVICE_STOP_PENDING && ! 665: status.dwCurrentState != SERVICE_CONTINUE_PENDING) ! 666: break; ! 667: ! 668: Sleep (1000); ! 669: } ! 670: ! 671: if (status.dwCurrentState != SERVICE_STOPPED && status.dwCurrentState != SERVICE_STOP_PENDING) ! 672: goto error; ! 673: } ! 674: ! 675: try_delete: ! 676: sprintf (szTmp, "deleting %s", lpszService); ! 677: ServiceMessage (hwndDlg, szTmp); ! 678: ! 679: if (hService != NULL) ! 680: CloseServiceHandle (hService); ! 681: ! 682: if (hManager != NULL) ! 683: CloseServiceHandle (hManager); ! 684: ! 685: hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); ! 686: if (hManager == NULL) ! 687: goto error; ! 688: ! 689: hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS); ! 690: if (hService == NULL) ! 691: goto error; ! 692: ! 693: bRet = DeleteService (hService); ! 694: if (bRet == FALSE) ! 695: goto error; ! 696: ! 697: bOK = TRUE; ! 698: ! 699: error: ! 700: if (bOK == FALSE && GetLastError ()!= ERROR_SERVICE_DOES_NOT_EXIST) ! 701: { ! 702: handleWin32Error (hwndDlg); ! 703: MessageBox (hwndDlg, "The uninstallation of the device driver has failed", lpszTitle, MB_ICONHAND); ! 704: } ! 705: else ! 706: bOK = TRUE; ! 707: ! 708: if (hService != NULL) ! 709: CloseServiceHandle (hService); ! 710: ! 711: if (hManager != NULL) ! 712: CloseServiceHandle (hManager); ! 713: ! 714: return bOK; ! 715: } ! 716: ! 717: BOOL ! 718: DoDriverUnload (HWND hwndDlg) ! 719: { ! 720: BOOL bOK = TRUE; ! 721: int status; ! 722: ! 723: status = DriverAttach (); ! 724: if (status != 0) ! 725: { ! 726: if (status == ERR_OS_ERROR && GetLastError ()!= ERROR_FILE_NOT_FOUND) ! 727: { ! 728: handleWin32Error (hwndDlg); ! 729: AbortProcess (IDS_NODRIVER); ! 730: } ! 731: ! 732: if (status != ERR_OS_ERROR) ! 733: { ! 734: handleError (NULL, status); ! 735: AbortProcess (IDS_NODRIVER); ! 736: } ! 737: } ! 738: ! 739: if (hDriver != INVALID_HANDLE_VALUE) ! 740: { ! 741: DWORD dwError; ! 742: int x; ! 743: ! 744: ! 745: if (nCurrentOS == WIN_NT) ! 746: { ! 747: ServiceMessage (hwndDlg, "dismounting any mounted volumes"); ! 748: ! 749: if (UnmountAllVolumes (hwndDlg, &dwError, &x) == FALSE) ! 750: { ! 751: bOK = FALSE; ! 752: MessageBox (hwndDlg, "Volumes are still mounted; all volumes must be dismounted before uninstallation can continue", lpszTitle, MB_ICONHAND); ! 753: } ! 754: } ! 755: else ! 756: { ! 757: ! 758: MOUNT_LIST_STRUCT driver; ! 759: DWORD dwResult; ! 760: BOOL bResult; ! 761: ! 762: bResult = DeviceIoControl (hDriver, MOUNT_LIST, &driver, sizeof (driver), &driver, ! 763: sizeof (driver), &dwResult, NULL); ! 764: ! 765: if (bResult == TRUE) ! 766: { ! 767: if (driver.ulMountedDrives != 0) ! 768: { ! 769: bOK = FALSE; ! 770: MessageBox (hwndDlg, "Volumes are still mounted; all volumes must be dismounted before uninstallation can continue", lpszTitle, MB_ICONHAND); ! 771: } ! 772: } ! 773: else ! 774: { ! 775: bOK = FALSE; ! 776: handleWin32Error (hwndDlg); ! 777: } ! 778: } ! 779: ! 780: CloseHandle (hDriver); ! 781: hDriver = INVALID_HANDLE_VALUE; ! 782: ! 783: } ! 784: ! 785: return bOK; ! 786: } ! 787: ! 788: BOOL ! 789: DoServiceInstall (HWND hwndDlg) ! 790: { ! 791: BOOL bOK = FALSE; ! 792: ! 793: if (nCurrentOS != WIN_NT) ! 794: return TRUE; ! 795: ! 796: ServiceMessage (hwndDlg, "installing TrueCryptService"); ! 797: ServiceMessage (hwndDlg, "starting TrueCryptService"); ! 798: ! 799: if (CheckService ()== FALSE) ! 800: goto error; ! 801: ! 802: bOK = TRUE; ! 803: ! 804: error: ! 805: if (bOK == FALSE) ! 806: { ! 807: MessageBox ((HWND) hwndDlg, "The installation of the service has failed", lpszTitle, MB_ICONHAND); ! 808: } ! 809: ! 810: return bOK; ! 811: } ! 812: ! 813: BOOL ! 814: DoDriverInstall (HWND hwndDlg) ! 815: { ! 816: SC_HANDLE hManager, hService = NULL; ! 817: BOOL bOK = FALSE, bRet, bSlash; ! 818: char szDir[TC_MAX_PATH]; ! 819: int x; ! 820: ! 821: if (nCurrentOS != WIN_NT) ! 822: return TRUE; ! 823: ! 824: hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); ! 825: if (hManager == NULL) ! 826: goto error; ! 827: ! 828: GetSystemDirectory (szDir, sizeof (szDir)); ! 829: ! 830: x = strlen (szDir); ! 831: if (szDir[x - 1] == '\\') ! 832: bSlash = TRUE; ! 833: else ! 834: bSlash = FALSE; ! 835: ! 836: if (bSlash == FALSE) ! 837: strcat (szDir, "\\"); ! 838: ! 839: strcat (szDir, "Drivers\\truecrypt.sys"); ! 840: ! 841: ServiceMessage (hwndDlg, "installing TrueCrypt driver service"); ! 842: ! 843: hService = CreateService (hManager, "truecrypt", "truecrypt", ! 844: SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, ! 845: szDir, NULL, NULL, NULL, NULL, NULL ! 846: ); ! 847: if (hService == NULL) ! 848: goto error; ! 849: else ! 850: CloseServiceHandle (hService); ! 851: ! 852: hService = OpenService (hManager, "truecrypt", SERVICE_ALL_ACCESS); ! 853: if (hService == NULL) ! 854: goto error; ! 855: ! 856: ServiceMessage (hwndDlg, "starting TrueCrypt driver service"); ! 857: ! 858: bRet = StartService (hService, 0, NULL); ! 859: if (bRet == FALSE) ! 860: goto error; ! 861: ! 862: bOK = TRUE; ! 863: ! 864: error: ! 865: if (bOK == FALSE && GetLastError ()!= ERROR_SERVICE_ALREADY_RUNNING) ! 866: { ! 867: handleWin32Error (hwndDlg); ! 868: MessageBox (hwndDlg, "The installation of the device driver has failed", lpszTitle, MB_ICONHAND); ! 869: } ! 870: else ! 871: bOK = TRUE; ! 872: ! 873: if (hService != NULL) ! 874: CloseServiceHandle (hService); ! 875: ! 876: if (hManager != NULL) ! 877: CloseServiceHandle (hManager); ! 878: ! 879: return bOK; ! 880: } ! 881: ! 882: BOOL ! 883: DoShortcutsUninstall (HWND hwndDlg, char *szDestDir) ! 884: { ! 885: char szLinkDir[TC_MAX_PATH], szDir[TC_MAX_PATH]; ! 886: char szTmp[TC_MAX_PATH], szTmp2[TC_MAX_PATH]; ! 887: BOOL bSlash, bOK = FALSE; ! 888: HRESULT hOle; ! 889: int x; ! 890: BOOL allUsers = FALSE; ! 891: ! 892: hOle = OleInitialize (NULL); ! 893: ! 894: // User start menu ! 895: SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_PROGRAMS, 0); ! 896: x = strlen (szLinkDir); ! 897: if (szLinkDir[x - 1] == '\\') ! 898: bSlash = TRUE; ! 899: else ! 900: bSlash = FALSE; ! 901: ! 902: if (bSlash == FALSE) ! 903: strcat (szLinkDir, "\\"); ! 904: ! 905: strcat (szLinkDir, "TrueCrypt"); ! 906: ! 907: // Global start menu ! 908: if (nCurrentOS == WIN_NT) ! 909: { ! 910: struct _stat st; ! 911: char path[TC_MAX_PATH]; ! 912: ! 913: SHGetSpecialFolderPath (hwndDlg, path, CSIDL_COMMON_PROGRAMS, 0); ! 914: strcat (path, "\\TrueCrypt"); ! 915: ! 916: if (_stat (path, &st) == 0) ! 917: { ! 918: strcpy (szLinkDir, path); ! 919: allUsers = TRUE; ! 920: } ! 921: } ! 922: ! 923: // Start menu entries ! 924: sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk"); ! 925: RemoveMessage (hwndDlg, szTmp2); ! 926: if (StatDeleteFile (szTmp2) == FALSE) ! 927: goto error; ! 928: ! 929: sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt User's Guide.lnk"); ! 930: RemoveMessage (hwndDlg, szTmp2); ! 931: if (StatDeleteFile (szTmp2) == FALSE) ! 932: goto error; ! 933: ! 934: GetWindowsDirectory (szDir, sizeof (szDir)); ! 935: sprintf (szTmp2, "%s%s", szLinkDir, "\\Uninstall TrueCrypt.lnk"); ! 936: RemoveMessage (hwndDlg, szTmp2); ! 937: if (StatDeleteFile (szTmp2) == FALSE) ! 938: goto error; ! 939: ! 940: // Start menu group ! 941: RemoveMessage ((HWND) hwndDlg, szLinkDir); ! 942: if (StatRemoveDirectory (szLinkDir) == FALSE) ! 943: { ! 944: handleWin32Error ((HWND) hwndDlg); ! 945: goto error; ! 946: } ! 947: ! 948: // Desktop icon ! 949: ! 950: if (allUsers) ! 951: SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_COMMON_DESKTOPDIRECTORY, 0); ! 952: else ! 953: SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_DESKTOPDIRECTORY, 0); ! 954: ! 955: sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk"); ! 956: ! 957: RemoveMessage (hwndDlg, szTmp2); ! 958: if (StatDeleteFile (szTmp2) == FALSE) ! 959: goto error; ! 960: ! 961: bOK = TRUE; ! 962: ! 963: error: ! 964: OleUninitialize (); ! 965: ! 966: return bOK; ! 967: } ! 968: ! 969: BOOL ! 970: DoShortcutsInstall (HWND hwndDlg, char *szDestDir, BOOL bProgGroup, BOOL bDesktopIcon) ! 971: { ! 972: char szLinkDir[TC_MAX_PATH], szDir[TC_MAX_PATH]; ! 973: char szTmp[TC_MAX_PATH], szTmp2[TC_MAX_PATH]; ! 974: BOOL bSlash, bOK = FALSE; ! 975: HRESULT hOle; ! 976: int x; ! 977: ! 978: if (bProgGroup == FALSE && bDesktopIcon == FALSE) ! 979: return TRUE; ! 980: ! 981: hOle = OleInitialize (NULL); ! 982: ! 983: GetProgramPath (hwndDlg, szLinkDir); ! 984: ! 985: x = strlen (szLinkDir); ! 986: if (szLinkDir[x - 1] == '\\') ! 987: bSlash = TRUE; ! 988: else ! 989: bSlash = FALSE; ! 990: ! 991: if (bSlash == FALSE) ! 992: strcat (szLinkDir, "\\"); ! 993: ! 994: strcat (szLinkDir, "TrueCrypt"); ! 995: ! 996: strcpy (szDir, szDestDir); ! 997: x = strlen (szDestDir); ! 998: if (szDestDir[x - 1] == '\\') ! 999: bSlash = TRUE; ! 1000: else ! 1001: bSlash = FALSE; ! 1002: ! 1003: if (bSlash == FALSE) ! 1004: strcat (szDir, "\\"); ! 1005: ! 1006: if (bProgGroup) ! 1007: { ! 1008: if (mkfulldir (szLinkDir, TRUE) != 0) ! 1009: { ! 1010: char szTmp[TC_MAX_PATH]; ! 1011: int x; ! 1012: ! 1013: //sprintf (szTmp, "The program folder '%s' does not exist. Do you want to create this folder?", szLinkDir); ! 1014: //x = MessageBox (hwndDlg, szTmp, lpszTitle, MB_ICONQUESTION | MB_YESNO); ! 1015: //if (x == IDNO) ! 1016: //{ ! 1017: // goto error; ! 1018: //} ! 1019: ! 1020: if (mkfulldir (szLinkDir, FALSE) != 0) ! 1021: { ! 1022: handleWin32Error (hwndDlg); ! 1023: sprintf (szTmp, "The folder '%s' could not be created", szLinkDir); ! 1024: MessageBox (hwndDlg, szTmp, lpszTitle, MB_ICONHAND); ! 1025: goto error; ! 1026: } ! 1027: } ! 1028: ! 1029: sprintf (szTmp, "%s%s", szDir, "TrueCrypt.exe"); ! 1030: sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk"); ! 1031: ! 1032: IconMessage (hwndDlg, szTmp2); ! 1033: if (CreateLink (szTmp, "", szTmp2) != S_OK) ! 1034: goto error; ! 1035: ! 1036: ! 1037: sprintf (szTmp, "%s%s", szDir, "TrueCrypt User Guide.pdf"); ! 1038: sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt User's Guide.lnk"); ! 1039: ! 1040: IconMessage (hwndDlg, szTmp2); ! 1041: if (CreateLink (szTmp, "", szTmp2) != S_OK) ! 1042: goto error; ! 1043: ! 1044: GetWindowsDirectory (szDir, sizeof (szDir)); ! 1045: x = strlen (szDir); ! 1046: if (szDir[x - 1] == '\\') ! 1047: bSlash = TRUE; ! 1048: else ! 1049: bSlash = FALSE; ! 1050: ! 1051: if (bSlash == FALSE) ! 1052: strcat (szDir, "\\"); ! 1053: ! 1054: sprintf (szTmp, "%s%s", szDir, "TrueCrypt Setup.exe"); ! 1055: sprintf (szTmp2, "%s%s", szLinkDir, "\\Uninstall TrueCrypt.lnk"); ! 1056: ! 1057: IconMessage (hwndDlg, szTmp2); ! 1058: if (CreateLink (szTmp, "/u", szTmp2) != S_OK) ! 1059: goto error; ! 1060: ! 1061: } ! 1062: ! 1063: if (bDesktopIcon) ! 1064: { ! 1065: strcpy (szDir, szDestDir); ! 1066: x = strlen (szDestDir); ! 1067: if (szDestDir[x - 1] == '\\') ! 1068: bSlash = TRUE; ! 1069: else ! 1070: bSlash = FALSE; ! 1071: ! 1072: if (bSlash == FALSE) ! 1073: strcat (szDir, "\\"); ! 1074: ! 1075: if (nCurrentOS == WIN_NT && IsDlgButtonChecked (hwndDlg, IDC_ALL_USERS)) ! 1076: SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_COMMON_DESKTOPDIRECTORY, 0); ! 1077: else ! 1078: SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_DESKTOPDIRECTORY, 0); ! 1079: ! 1080: sprintf (szTmp, "%s%s", szDir, "TrueCrypt.exe"); ! 1081: sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk"); ! 1082: ! 1083: IconMessage (hwndDlg, szTmp2); ! 1084: ! 1085: if (CreateLink (szTmp, "", szTmp2) != S_OK) ! 1086: goto error; ! 1087: } ! 1088: ! 1089: bOK = TRUE; ! 1090: ! 1091: error: ! 1092: OleUninitialize (); ! 1093: ! 1094: return bOK; ! 1095: } ! 1096: ! 1097: ! 1098: void ! 1099: RebootPrompt (HWND hwndDlg, BOOL bOK) ! 1100: { ! 1101: if (bOK == TRUE) ! 1102: { ! 1103: SetWindowText (GetDlgItem ((HWND) hwndDlg, IDOK), "E&xit"); ! 1104: ! 1105: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDCANCEL), FALSE); ! 1106: ! 1107: bDone = TRUE; ! 1108: ! 1109: if (nCurrentOS == WIN_NT) ! 1110: { ! 1111: if (bUninstall == FALSE) ! 1112: MessageBox ((HWND) hwndDlg, "TrueCrypt has been successfuly installed.", lpszTitle, MB_ICONINFORMATION); ! 1113: else ! 1114: MessageBox ((HWND) hwndDlg, "TrueCrypt has been successfuly uninstalled.", lpszTitle, MB_ICONINFORMATION); ! 1115: } ! 1116: else ! 1117: { ! 1118: int x; ! 1119: ! 1120: if (bUninstall == FALSE) ! 1121: x = MessageBox ((HWND) hwndDlg, "TrueCrypt has been successfuly installed.\nTo use TrueCrypt your system must be restarted.", lpszTitle, MB_ICONINFORMATION); ! 1122: else ! 1123: x = MessageBox ((HWND) hwndDlg, "TrueCrypt has been successfuly uninstalled.\nYour system must be restarted.", lpszTitle, MB_ICONINFORMATION); ! 1124: } ! 1125: } ! 1126: else ! 1127: { ! 1128: if (bUninstall == FALSE) ! 1129: MessageBox ((HWND) hwndDlg, "The installation has failed!", lpszTitle, MB_ICONHAND); ! 1130: else ! 1131: MessageBox ((HWND) hwndDlg, "The uninstall has failed!", lpszTitle, MB_ICONHAND); ! 1132: } ! 1133: } ! 1134: ! 1135: static void SetSystemRestorePoint (void *hwndDlg, BOOL finalize) ! 1136: { ! 1137: static RESTOREPOINTINFO RestPtInfo; ! 1138: static STATEMGRSTATUS SMgrStatus; ! 1139: static BOOL failed = FALSE; ! 1140: static BOOL (__stdcall *_SRSetRestorePoint)(PRESTOREPOINTINFO, PSTATEMGRSTATUS); ! 1141: ! 1142: if (!SystemRestoreDll) return; ! 1143: ! 1144: _SRSetRestorePoint = (BOOL (__stdcall *)(PRESTOREPOINTINFO, PSTATEMGRSTATUS))GetProcAddress (SystemRestoreDll,"SRSetRestorePointA"); ! 1145: if (_SRSetRestorePoint == 0) ! 1146: { ! 1147: FreeLibrary (SystemRestoreDll); ! 1148: SystemRestoreDll = 0; ! 1149: return; ! 1150: } ! 1151: ! 1152: if (!finalize) ! 1153: { ! 1154: StatusMessage (hwndDlg, "%s", "Creating system restore point"); ! 1155: ! 1156: // Initialize the RESTOREPOINTINFO structure ! 1157: RestPtInfo.dwEventType = BEGIN_SYSTEM_CHANGE; ! 1158: ! 1159: // Notify the system that changes are about to be made. ! 1160: // An application is to be installed. ! 1161: RestPtInfo.dwRestorePtType = APPLICATION_INSTALL; ! 1162: ! 1163: // Set RestPtInfo.llSequenceNumber. ! 1164: RestPtInfo.llSequenceNumber = 0; ! 1165: ! 1166: // String to be displayed by System Restore for this restore point. ! 1167: strcpy(RestPtInfo.szDescription, "TrueCrypt installation"); ! 1168: ! 1169: // Notify the system that changes are to be made and that ! 1170: // the beginning of the restore point should be marked. ! 1171: if(!_SRSetRestorePoint(&RestPtInfo, &SMgrStatus)) ! 1172: { ! 1173: StatusMessage (hwndDlg, "%s", "Failed to create System Restore point!"); ! 1174: failed = TRUE; ! 1175: } ! 1176: ! 1177: return; ! 1178: } ! 1179: ! 1180: if (failed) return; ! 1181: ! 1182: StatusMessage (hwndDlg, "%s", "Closing system restore point"); ! 1183: ! 1184: // The application performs some installation operations here. ! 1185: ! 1186: // Re-initialize the RESTOREPOINTINFO structure to notify the ! 1187: // system that the operation is finished. ! 1188: RestPtInfo.dwEventType = END_SYSTEM_CHANGE; ! 1189: ! 1190: // End the system change by returning the sequence number ! 1191: // received from the first call to SRSetRestorePoint. ! 1192: RestPtInfo.llSequenceNumber = SMgrStatus.llSequenceNumber; ! 1193: ! 1194: // Notify the system that the operation is done and that this ! 1195: // is the end of the restore point. ! 1196: if(!_SRSetRestorePoint(&RestPtInfo, &SMgrStatus)) ! 1197: { ! 1198: StatusMessage (hwndDlg, "%s", "Closing system restore point failed!"); ! 1199: } ! 1200: else ! 1201: StatusMessage (hwndDlg, "%s", "System restore point created"); ! 1202: ! 1203: } ! 1204: ! 1205: void ! 1206: DoUninstall (void *hwndDlg) ! 1207: { ! 1208: BOOL bOK = TRUE; ! 1209: ! 1210: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDOK), FALSE); ! 1211: ! 1212: WaitCursor (); ! 1213: ! 1214: SendMessage (GetDlgItem ((HWND) hwndDlg, IDC_FILES), LB_RESETCONTENT, 0, 0); ! 1215: ! 1216: if (DoDriverUnload (hwndDlg) == FALSE) ! 1217: { ! 1218: bOK = FALSE; ! 1219: } ! 1220: else if (DoServiceUninstall (hwndDlg, "TrueCryptService") == FALSE) ! 1221: { ! 1222: bOK = FALSE; ! 1223: } ! 1224: else if (DoServiceUninstall (hwndDlg, "truecrypt") == FALSE) ! 1225: { ! 1226: bOK = FALSE; ! 1227: } ! 1228: else if (DoFilesInstall ((HWND) hwndDlg, dlg_file_name, FALSE) == FALSE) ! 1229: { ! 1230: bOK = FALSE; ! 1231: } ! 1232: else if (DoRegUninstall ((HWND) hwndDlg) == FALSE) ! 1233: { ! 1234: bOK = FALSE; ! 1235: } ! 1236: else if (DoShortcutsUninstall (hwndDlg, dlg_file_name) == FALSE) ! 1237: { ! 1238: bOK = FALSE; ! 1239: } ! 1240: else ! 1241: { ! 1242: RemoveMessage ((HWND) hwndDlg, dlg_file_name); ! 1243: if (StatRemoveDirectory (dlg_file_name) == FALSE) ! 1244: { ! 1245: handleWin32Error ((HWND) hwndDlg); ! 1246: bOK = FALSE; ! 1247: } ! 1248: } ! 1249: ! 1250: NormalCursor (); ! 1251: ! 1252: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDOK), TRUE); ! 1253: ! 1254: RebootPrompt (hwndDlg, bOK); ! 1255: ! 1256: } ! 1257: ! 1258: void ! 1259: DoInstall (void *hwndDlg) ! 1260: { ! 1261: BOOL bOK = TRUE; ! 1262: ! 1263: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDOK), FALSE); ! 1264: ! 1265: WaitCursor (); ! 1266: ! 1267: SendMessage (GetDlgItem ((HWND) hwndDlg, IDC_FILES), LB_RESETCONTENT, 0, 0); ! 1268: ! 1269: if (IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_SYSTEM_RESTORE))) ! 1270: SetSystemRestorePoint (hwndDlg, FALSE); ! 1271: ! 1272: if (DoDriverUnload (hwndDlg) == FALSE) ! 1273: { ! 1274: bOK = FALSE; ! 1275: } ! 1276: else if (DoServiceUninstall (hwndDlg, "TrueCryptService") == FALSE) ! 1277: { ! 1278: bOK = FALSE; ! 1279: } ! 1280: else if (DoServiceUninstall (hwndDlg, "truecrypt") == FALSE) ! 1281: { ! 1282: bOK = FALSE; ! 1283: } ! 1284: else if (DoFilesInstall ((HWND) hwndDlg, dlg_file_name, IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL))) == FALSE) ! 1285: { ! 1286: bOK = FALSE; ! 1287: } ! 1288: else if (DoRegInstall ((HWND) hwndDlg, dlg_file_name, ! 1289: IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_FILE_TYPE)), ! 1290: IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL))) == FALSE) ! 1291: { ! 1292: bOK = FALSE; ! 1293: } ! 1294: else if (DoDriverInstall (hwndDlg) == FALSE) ! 1295: { ! 1296: bOK = FALSE; ! 1297: } ! 1298: else if (DoServiceInstall (hwndDlg) == FALSE) ! 1299: { ! 1300: bOK = FALSE; ! 1301: } ! 1302: else if (DoShortcutsInstall (hwndDlg, dlg_file_name, ! 1303: IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_PROG_GROUP)), ! 1304: IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_DESKTOP_ICON))) == FALSE) ! 1305: { ! 1306: bOK = FALSE; ! 1307: } ! 1308: ! 1309: if (IsButtonChecked (GetDlgItem ((HWND) hwndDlg, IDC_SYSTEM_RESTORE))) ! 1310: SetSystemRestorePoint (hwndDlg, TRUE); ! 1311: ! 1312: if (bOK) ! 1313: StatusMessage (hwndDlg, "%s", "Installation completed."); ! 1314: ! 1315: NormalCursor (); ! 1316: ! 1317: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDOK), TRUE); ! 1318: ! 1319: RebootPrompt (hwndDlg, bOK); ! 1320: } ! 1321: ! 1322: BOOL ! 1323: IsAdmin (void) ! 1324: { ! 1325: HANDLE hAccessToken; ! 1326: UCHAR InfoBuffer[1024]; ! 1327: PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS) InfoBuffer; ! 1328: DWORD dwInfoBufferSize; ! 1329: PSID psidAdministrators; ! 1330: SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; ! 1331: BOOL bSuccess; ! 1332: UINT x; ! 1333: ! 1334: if (!OpenThreadToken (GetCurrentThread (), TOKEN_QUERY, TRUE, ! 1335: &hAccessToken)) ! 1336: { ! 1337: if (GetLastError ()!= ERROR_NO_TOKEN) ! 1338: return FALSE; ! 1339: ! 1340: /* Retry against process token if no thread token exists */ ! 1341: if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, ! 1342: &hAccessToken)) ! 1343: return FALSE; ! 1344: } ! 1345: ! 1346: bSuccess = GetTokenInformation (hAccessToken, TokenGroups, InfoBuffer, ! 1347: 1024, &dwInfoBufferSize); ! 1348: ! 1349: CloseHandle (hAccessToken); ! 1350: ! 1351: if (!bSuccess) ! 1352: return FALSE; ! 1353: ! 1354: if (!AllocateAndInitializeSid (&siaNtAuthority, 2, ! 1355: SECURITY_BUILTIN_DOMAIN_RID, ! 1356: DOMAIN_ALIAS_RID_ADMINS, ! 1357: 0, 0, 0, 0, 0, 0, ! 1358: &psidAdministrators)) ! 1359: return FALSE; ! 1360: ! 1361: /* Assume that we don't find the admin SID. */ ! 1362: bSuccess = FALSE; ! 1363: ! 1364: for (x = 0; x < ptgGroups->GroupCount; x++) ! 1365: { ! 1366: if (EqualSid (psidAdministrators, ptgGroups->Groups[x].Sid)) ! 1367: { ! 1368: bSuccess = TRUE; ! 1369: break; ! 1370: } ! 1371: ! 1372: } ! 1373: ! 1374: FreeSid (psidAdministrators); ! 1375: return bSuccess; ! 1376: } ! 1377: ! 1378: BOOL WINAPI ! 1379: InstallDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) ! 1380: { ! 1381: WORD lw = LOWORD (wParam); ! 1382: if (lParam); /* remove warning */ ! 1383: ! 1384: switch (msg) ! 1385: { ! 1386: case WM_INITDIALOG: ! 1387: SetDefaultUserFont (hwndDlg); ! 1388: InitDialog (hwndDlg); ! 1389: ! 1390: SetWindowText (GetDlgItem (hwndDlg, IDC_DESTINATION), "C:\\Program Files\\TrueCrypt"); ! 1391: ! 1392: if (bUninstall == FALSE) ! 1393: { ! 1394: SendMessage (GetDlgItem (hwndDlg, IDC_FILES), LB_ADDSTRING, 0, (LPARAM) "By clicking 'Install', you accept the license agreement."); ! 1395: ! 1396: LoadLicense (hwndDlg); ! 1397: } ! 1398: ! 1399: SendMessage (GetDlgItem (hwndDlg, IDC_ALL_USERS), BM_SETCHECK, BST_CHECKED, 0); ! 1400: if (nCurrentOS != WIN_NT) ! 1401: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDC_ALL_USERS), FALSE); ! 1402: ! 1403: SendMessage (GetDlgItem (hwndDlg, IDC_FILE_TYPE), BM_SETCHECK, BST_CHECKED, 0); ! 1404: SendMessage (GetDlgItem (hwndDlg, IDC_UNINSTALL), BM_SETCHECK, BST_CHECKED, 0); ! 1405: SendMessage (GetDlgItem (hwndDlg, IDC_PROG_GROUP), BM_SETCHECK, BST_CHECKED, 0); ! 1406: SendMessage (GetDlgItem (hwndDlg, IDC_DESKTOP_ICON), BM_SETCHECK, BST_CHECKED, 0); ! 1407: ! 1408: // System Restore ! 1409: SystemRestoreDll = LoadLibrary("srclient.dll"); ! 1410: ! 1411: if (SystemRestoreDll != 0) ! 1412: SendMessage (GetDlgItem (hwndDlg, IDC_SYSTEM_RESTORE), BM_SETCHECK, BST_CHECKED, 0); ! 1413: else ! 1414: EnableWindow (GetDlgItem ((HWND) hwndDlg, IDC_SYSTEM_RESTORE), FALSE); ! 1415: ! 1416: SetWindowText (hwndDlg, lpszTitle); ! 1417: return 1; ! 1418: ! 1419: case WM_SYSCOMMAND: ! 1420: if (lw == IDC_ABOUT) ! 1421: { ! 1422: DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUT_DLG), hwndDlg, (DLGPROC) AboutDlgProc); ! 1423: return 1; ! 1424: } ! 1425: return 0; ! 1426: ! 1427: case WM_COMMAND: ! 1428: if (lw == IDOK) ! 1429: { ! 1430: char szDirname[TC_MAX_PATH]; ! 1431: ! 1432: if (bDone == TRUE) ! 1433: { ! 1434: EndDialog (hwndDlg, IDOK); ! 1435: return 1; ! 1436: } ! 1437: ! 1438: GetWindowText (GetDlgItem (hwndDlg, IDC_DESTINATION), szDirname, sizeof (szDirname)); ! 1439: ! 1440: if (bUninstall == FALSE) ! 1441: { ! 1442: if (mkfulldir (szDirname, TRUE) != 0) ! 1443: { ! 1444: char szTmp[TC_MAX_PATH]; ! 1445: int x; ! 1446: ! 1447: //sprintf (szTmp, "The directory '%s' does not exist. Do you want to create this directory?", szDirname); ! 1448: //x = MessageBox (hwndDlg, szTmp, lpszTitle, MB_ICONQUESTION | MB_YESNO); ! 1449: //if (x == IDNO) ! 1450: //{ ! 1451: // SetFocus (GetDlgItem (hwndDlg, IDC_DESTINATION)); ! 1452: // return 1; ! 1453: //} ! 1454: ! 1455: if (mkfulldir (szDirname, FALSE) != 0) ! 1456: { ! 1457: handleWin32Error (hwndDlg); ! 1458: sprintf (szTmp, "The directory '%s' could not be created", szDirname); ! 1459: MessageBox (hwndDlg, szTmp, lpszTitle, MB_ICONHAND); ! 1460: return 1; ! 1461: } ! 1462: ! 1463: } ! 1464: } ! 1465: ! 1466: strcpy (dlg_file_name, szDirname); ! 1467: ! 1468: if (bUninstall == FALSE) ! 1469: _beginthread (DoInstall, 16384, (void *) hwndDlg); ! 1470: else ! 1471: _beginthread (DoUninstall, 16384, (void *) hwndDlg); ! 1472: ! 1473: return 1; ! 1474: } ! 1475: ! 1476: if (lw == IDCANCEL) ! 1477: { ! 1478: EndDialog (hwndDlg, IDCANCEL); ! 1479: return 1; ! 1480: } ! 1481: ! 1482: if (lw == IDC_BROWSE) ! 1483: { ! 1484: char szDirname[TC_MAX_PATH]; ! 1485: ! 1486: GetWindowText (GetDlgItem (hwndDlg, IDC_DESTINATION), szDirname, sizeof (szDirname)); ! 1487: ! 1488: if (BrowseFiles2 (hwndDlg, "Please select a folder", szDirname) == TRUE) ! 1489: SetWindowText (GetDlgItem (hwndDlg, IDC_DESTINATION), szDirname); ! 1490: ! 1491: return 1; ! 1492: } ! 1493: ! 1494: if (lw == IDC_DESTINATION && HIWORD (wParam) == EN_CHANGE && bDone == FALSE) ! 1495: { ! 1496: if (GetWindowTextLength (GetDlgItem (hwndDlg, IDC_DESTINATION)) <= 0) ! 1497: EnableWindow (GetDlgItem (hwndDlg, IDOK), FALSE); ! 1498: else ! 1499: EnableWindow (GetDlgItem (hwndDlg, IDOK), TRUE); ! 1500: return 1; ! 1501: } ! 1502: ! 1503: return 0; ! 1504: ! 1505: case WM_CLOSE: ! 1506: EndDialog (hwndDlg, IDCANCEL); ! 1507: return 1; ! 1508: } ! 1509: ! 1510: return 0; ! 1511: } ! 1512: ! 1513: ! 1514: int WINAPI ! 1515: WINMAIN (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpszCommandLine, ! 1516: int nCmdShow) ! 1517: { ! 1518: if (nCmdShow && hPrevInstance); /* Remove unused parameter warning */ ! 1519: ! 1520: lpszTitle = "TrueCrypt Setup"; ! 1521: ! 1522: /* Call InitApp to initialize the common code */ ! 1523: InitApp (hInstance); ! 1524: ! 1525: if (nCurrentOS == WIN_NT && IsAdmin ()!= TRUE) ! 1526: if (MessageBox (NULL, "To successfully install/uninstall TrueCrypt under Windows NT you must be running as an Administrator, " ! 1527: "do you still want to continue?", lpszTitle, MB_YESNO | MB_ICONQUESTION) != IDYES) ! 1528: return 0; ! 1529: ! 1530: if (lpszCommandLine[0] == '/' && (lpszCommandLine[1] == 'u' || lpszCommandLine[1] == 'U')) ! 1531: { ! 1532: bUninstall = TRUE; ! 1533: } ! 1534: ! 1535: if (bUninstall == FALSE) ! 1536: { ! 1537: /* Create the main dialog box */ ! 1538: DialogBox (hInstance, MAKEINTRESOURCE (IDD_INSTALL), NULL, (DLGPROC) InstallDlgProc); ! 1539: } ! 1540: else ! 1541: { ! 1542: /* Create the main dialog box */ ! 1543: DialogBox (hInstance, MAKEINTRESOURCE (IDD_UNINSTALL), NULL, (DLGPROC) InstallDlgProc); ! 1544: } ! 1545: ! 1546: /* Terminate */ ! 1547: return 0; ! 1548: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.