?? setup.c
字號:
{
// Split the string in order to prevent some antivirus packages from falsely reporting
// TrueCrypt.exe to contain a possible Trojan horse because of this string (heuristic scan).
sprintf (regk, "%s%s", "Software\\Microsoft\\Windows\\Curren", "tVersion\\Run");
DeleteRegistryValue (regk, "TrueCrypt");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Classes\\.tc");
}
bOK = TRUE;
if (bOK == FALSE && GetLastError ()!= ERROR_NO_TOKEN && GetLastError ()!= ERROR_FILE_NOT_FOUND
&& GetLastError ()!= ERROR_PATH_NOT_FOUND)
{
handleWin32Error (hwndDlg);
}
else
bOK = TRUE;
return bOK;
}
BOOL
DoServiceUninstall (HWND hwndDlg, char *lpszService)
{
SC_HANDLE hManager, hService = NULL;
BOOL bOK = FALSE, bRet;
SERVICE_STATUS status;
BOOL firstTry = TRUE;
int x;
memset (&status, 0, sizeof (status)); /* Keep VC6 quiet */
retry:
hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hManager == NULL)
goto error;
hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS);
if (hService == NULL)
goto error;
if (strcmp ("truecrypt", lpszService) == 0)
StatusMessage (hwndDlg, "STOPPING_DRIVER");
else
StatusMessageParam (hwndDlg, "STOPPING", lpszService);
#define WAIT_PERIOD 3
for (x = 0; x < WAIT_PERIOD; x++)
{
bRet = QueryServiceStatus (hService, &status);
if (bRet != TRUE)
goto error;
if (status.dwCurrentState != SERVICE_START_PENDING &&
status.dwCurrentState != SERVICE_STOP_PENDING &&
status.dwCurrentState != SERVICE_CONTINUE_PENDING)
break;
Sleep (1000);
}
if (status.dwCurrentState != SERVICE_STOPPED)
{
bRet = ControlService (hService, SERVICE_CONTROL_STOP, &status);
if (bRet == FALSE)
goto try_delete;
for (x = 0; x < WAIT_PERIOD; x++)
{
bRet = QueryServiceStatus (hService, &status);
if (bRet != TRUE)
goto error;
if (status.dwCurrentState != SERVICE_START_PENDING &&
status.dwCurrentState != SERVICE_STOP_PENDING &&
status.dwCurrentState != SERVICE_CONTINUE_PENDING)
break;
Sleep (1000);
}
if (status.dwCurrentState != SERVICE_STOPPED && status.dwCurrentState != SERVICE_STOP_PENDING)
goto error;
}
try_delete:
if (strcmp ("truecrypt", lpszService) == 0)
StatusMessage (hwndDlg, "REMOVING_DRIVER");
else
StatusMessageParam (hwndDlg, "REMOVING", lpszService);
if (hService != NULL)
CloseServiceHandle (hService);
if (hManager != NULL)
CloseServiceHandle (hManager);
hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hManager == NULL)
goto error;
hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS);
if (hService == NULL)
goto error;
bRet = DeleteService (hService);
if (bRet == FALSE)
{
if (firstTry && GetLastError () == ERROR_SERVICE_MARKED_FOR_DELETE)
{
// Second try for an eventual no-install driver instance
CloseServiceHandle (hService);
CloseServiceHandle (hManager);
Sleep(1000);
firstTry = FALSE;
goto retry;
}
goto error;
}
bOK = TRUE;
error:
if (bOK == FALSE && GetLastError ()!= ERROR_SERVICE_DOES_NOT_EXIST)
{
handleWin32Error (hwndDlg);
MessageBoxW (hwndDlg, GetString ("DRIVER_UINSTALL_FAILED"), lpszTitle, MB_ICONHAND);
}
else
bOK = TRUE;
if (hService != NULL)
CloseServiceHandle (hService);
if (hManager != NULL)
CloseServiceHandle (hManager);
return bOK;
}
BOOL DoDriverUnload (HWND hwndDlg)
{
BOOL bOK = TRUE;
int status;
status = DriverAttach ();
if (status != 0)
{
if (status == ERR_OS_ERROR && GetLastError () != ERROR_FILE_NOT_FOUND)
{
handleWin32Error (hwndDlg);
AbortProcess ("NODRIVER");
}
if (status != ERR_OS_ERROR)
{
handleError (NULL, status);
AbortProcess ("NODRIVER");
}
}
if (hDriver != INVALID_HANDLE_VALUE)
{
MOUNT_LIST_STRUCT driver;
LONG driverVersion = VERSION_NUM;
int refCount;
DWORD dwResult;
BOOL bResult;
int volumesMounted;
// Try to determine if it's upgrade (and not reinstall, downgrade, or first-time install).
bResult = DeviceIoControl (hDriver, TC_IOCTL_GET_DRIVER_VERSION, NULL, 0, &driverVersion, sizeof (driverVersion), &dwResult, NULL);
if (!bResult)
bResult = DeviceIoControl (hDriver, TC_IOCTL_LEGACY_GET_DRIVER_VERSION, NULL, 0, &driverVersion, sizeof (driverVersion), &dwResult, NULL);
bUpgrade = bResult && driverVersion < VERSION_NUM;
// Test for encrypted boot drive
try
{
BootEncryption bootEnc (hwndDlg);
if (bootEnc.GetDriverServiceStartType() == SERVICE_BOOT_START)
{
try
{
// Check hidden OS update consistency
if (IsHiddenOSRunning())
{
if (bootEnc.GetInstalledBootLoaderVersion() != VERSION_NUM)
{
if (AskWarnNoYes ("UPDATE_TC_IN_DECOY_OS_FIRST") == IDNO)
AbortProcessSilent ();
}
}
}
catch (...) { }
if (bUninstallInProgress && driverVersion >= 0x500 && !bootEnc.GetStatus().DeviceFilterActive)
{
bootEnc.RegisterFilterDriver (false, false);
bootEnc.RegisterFilterDriver (false, true);
bootEnc.SetDriverServiceStartType (SERVICE_SYSTEM_START);
}
#ifndef DEBUG
else if (!bUpgrade || driverVersion < 0x500)
{
Error ("SETUP_FAILED_BOOT_DRIVE_ENCRYPTED");
return FALSE;
}
#endif
else
{
SystemEncryptionUpgrade = TRUE;
}
}
}
catch (...) { }
if (!SystemEncryptionUpgrade)
{
// Check mounted volumes
bResult = DeviceIoControl (hDriver, TC_IOCTL_IS_ANY_VOLUME_MOUNTED, NULL, 0, &volumesMounted, sizeof (volumesMounted), &dwResult, NULL);
if (!bResult)
{
bResult = DeviceIoControl (hDriver, TC_IOCTL_LEGACY_GET_MOUNTED_VOLUMES, NULL, 0, &driver, sizeof (driver), &dwResult, NULL);
if (bResult)
volumesMounted = driver.ulMountedDrives;
}
if (bResult)
{
if (volumesMounted != 0)
{
bOK = FALSE;
MessageBoxW (hwndDlg, GetString ("DISMOUNT_ALL_FIRST"), lpszTitle, MB_ICONHAND);
}
}
else
{
bOK = FALSE;
handleWin32Error (hwndDlg);
}
}
// Try to close all open TC windows
if (bOK)
{
BOOL TCWindowClosed = FALSE;
EnumWindows (CloseTCWindowsEnum, (LPARAM) &TCWindowClosed);
if (TCWindowClosed)
Sleep (2000);
}
// Test for any applications attached to driver
bResult = DeviceIoControl (hDriver, TC_IOCTL_GET_DEVICE_REFCOUNT, &refCount, sizeof (refCount), &refCount,
sizeof (refCount), &dwResult, NULL);
if (bOK && bResult && refCount > 1)
{
MessageBoxW (hwndDlg, GetString ("CLOSE_TC_FIRST"), lpszTitle, MB_ICONSTOP);
bOK = FALSE;
}
if (!bOK || !SystemEncryptionUpgrade)
{
CloseHandle (hDriver);
hDriver = INVALID_HANDLE_VALUE;
}
}
else
{
bFirstTimeInstall = TRUE;
}
return bOK;
}
BOOL UpgradeBootLoader (HWND hwndDlg)
{
if (!SystemEncryptionUpgrade)
return TRUE;
try
{
BootEncryption bootEnc (hwndDlg);
if (bootEnc.GetInstalledBootLoaderVersion() < VERSION_NUM)
{
StatusMessage (hwndDlg, "INSTALLER_UPDATING_BOOT_LOADER");
bootEnc.InstallBootLoader ();
Info (IsHiddenOSRunning () ? "BOOT_LOADER_UPGRADE_OK_HIDDEN_OS" : "BOOT_LOADER_UPGRADE_OK");
}
return TRUE;
}
catch (Exception &e)
{
e.Show (hwndDlg);
}
catch (...) { }
Error ("BOOT_LOADER_UPGRADE_FAILED");
return FALSE;
}
BOOL DoShortcutsUninstall (HWND hwndDlg, char *szDestDir)
{
char szLinkDir[TC_MAX_PATH];
char szTmp2[TC_MAX_PATH];
BOOL bSlash, bOK = FALSE;
HRESULT hOle;
int x;
BOOL allUsers = FALSE;
hOle = OleInitialize (NULL);
// User start menu
SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_PROGRAMS, 0);
x = strlen (szLinkDir);
if (szLinkDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szLinkDir, "\\");
strcat (szLinkDir, "TrueCrypt");
// Global start menu
{
struct _stat st;
char path[TC_MAX_PATH];
SHGetSpecialFolderPath (hwndDlg, path, CSIDL_COMMON_PROGRAMS, 0);
strcat (path, "\\TrueCrypt");
if (_stat (path, &st) == 0)
{
strcpy (szLinkDir, path);
allUsers = TRUE;
}
}
// Start menu entries
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk");
RemoveMessage (hwndDlg, szTmp2);
if (StatDeleteFile (szTmp2) == FALSE)
goto error;
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt Website.url");
RemoveMessage (hwndDlg, szTmp2);
if (StatDeleteFile (szTmp2) == FALSE)
goto error;
sprintf (szTmp2, "%s%s", szLinkDir, "\\Uninstall TrueCrypt.lnk");
RemoveMessage (hwndDlg, szTmp2);
if (StatDeleteFile (szTmp2) == FALSE)
goto error;
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt User's Guide.lnk");
DeleteFile (szTmp2);
// Start menu group
RemoveMessage ((HWND) hwndDlg, szLinkDir);
if (StatRemoveDirectory (szLinkDir) == FALSE)
handleWin32Error ((HWND) hwndDlg);
// Desktop icon
if (allUsers)
SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
else
SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_DESKTOPDIRECTORY, 0);
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk");
RemoveMessage (hwndDlg, szTmp2);
if (StatDeleteFile (szTmp2) == FALSE)
goto error;
bOK = TRUE;
error:
OleUninitialize ();
return bOK;
}
BOOL
DoShortcutsInstall (HWND hwndDlg, char *szDestDir, BOOL bProgGroup, BOOL bDesktopIcon)
{
char szLinkDir[TC_MAX_PATH], szDir[TC_MAX_PATH];
char szTmp[TC_MAX_PATH], szTmp2[TC_MAX_PATH], szTmp3[TC_MAX_PATH];
BOOL bSlash, bOK = FALSE;
HRESULT hOle;
int x;
if (bProgGroup == FALSE && bDesktopIcon == FALSE)
return TRUE;
hOle = OleInitialize (NULL);
GetProgramPath (hwndDlg, szLinkDir);
x = strlen (szLinkDir);
if (szLinkDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szLinkDir, "\\");
strcat (szLinkDir, "TrueCrypt");
strcpy (szDir, szDestDir);
x = strlen (szDestDir);
if (szDestDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szDir, "\\");
if (bProgGroup)
{
FILE *f;
if (mkfulldir (szLinkDir, TRUE) != 0)
{
if (mkfulldir (szLinkDir, FALSE) != 0)
{
wchar_t szTmp[TC_MAX_PATH];
handleWin32Error (hwndDlg);
wsprintfW (szTmp, GetString ("CANT_CREATE_FOLDER"), szLinkDir);
MessageBoxW (hwndDlg, szTmp, lpszTitle, MB_ICONHAND);
goto error;
}
}
sprintf (szTmp, "%s%s", szDir, "TrueCrypt.exe");
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk");
IconMessage (hwndDlg, szTmp2);
if (CreateLink (szTmp, "", szTmp2) != S_OK)
goto error;
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt Website.url");
IconMessage (hwndDlg, szTmp2);
f = fopen (szTmp2, "w");
if (f)
{
fprintf (f, "[InternetShortcut]\nURL=%s&dest=index\n", TC_APPLINK);
fclose (f);
}
else
goto error;
sprintf (szTmp, "%s%s", szDir, "TrueCrypt Setup.exe");
sprintf (szTmp2, "%s%s", szLinkDir, "\\Uninstall TrueCrypt.lnk");
strcpy (szTmp3, "/u");
IconMessage (hwndDlg, szTmp2);
if (CreateLink (szTmp, szTmp3, szTmp2) != S_OK)
goto error;
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt User's Guide.lnk");
DeleteFile (szTmp2);
}
if (bDesktopIcon)
{
strcpy (szDir, szDestDir);
x = strlen (szDestDir);
if (szDestDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szDir, "\\");
if (bForAllUsers)
SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
else
SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_DESKTOPDIRECTORY, 0);
sprintf (szTmp, "%s%s", szDir, "TrueCrypt.exe");
sprintf (szTmp2, "%s%s", szLinkDir, "\\TrueCrypt.lnk");
IconMessage (hwndDlg, szTmp2);
if (CreateLink (szTmp, "", szTmp2) != S_OK)
goto error;
}
bOK = TRUE;
error:
OleUninitialize ();
return bOK;
}
void
OutcomePrompt (HWND hwndDlg, BOOL bOK)
{
if (bOK)
{
EnableWindow (GetDlgItem ((HWND) hwndDlg, IDCANCEL), FALSE);
bDone = TRUE;
if (bUninstall == FALSE)
{
if (bDevm)
PostMessage (MainDlg, WM_CLOSE, 0, 0);
else if (!SystemEncryptionUpgrade)
Info ("INSTALL_OK");
}
else
{
wchar_t str[4096];
swprintf (str, GetString ("UNINSTALL_OK"), InstallationPath);
MessageBoxW (hwndDlg, str, lpszTitle, MB_ICONASTERISK);
}
}
else
{
if (bUninstall == FALSE)
Error ("INSTALL_FAILED");
else
Error ("UNINSTALL_FAILED");
}
}
static void SetSystemRestorePoint (HWND hwndDlg, BOOL finalize)
{
static RESTOREPOINTINFO RestPtInfo;
static STATEMGRSTATUS SMgrStatus;
static BOOL failed = FALSE;
static BOOL (__stdcall *_SRSetRestorePoint)(PRESTOREPOINTINFO, PSTATEMGRSTATUS);
if (!SystemRestoreDll) return;
_SRSetRestorePoint = (BOOL (__stdcall *)(PRESTOREPOINTINFO, PSTATEMGRSTATUS))GetProcAddress (SystemRestoreDll,"SRSetRestorePointA");
if (_SRSetRestorePoint == 0)
{
FreeLibrary (SystemRestoreDll);
SystemRestoreDll = 0;
return;
}
if (!finalize)
{
StatusMessage (hwndDlg, "CREATING_SYS_RESTORE");
RestPtInfo.dwEventType = BEGIN_SYSTEM_CHANGE;
RestPtInfo.dwRestorePtType = APPLICATION_INSTALL;
RestPtInfo.llSequenceNumber = 0;
strcpy (RestPtInfo.szDescription, bUninstall ? "TrueCrypt uninstallation" : "TrueCrypt installation");
if(!_SRSetRestorePoint (&RestPtInfo, &SMgrStatus))
{
StatusMessage (hwndDlg, "FAILED_SYS_RESTORE");
failed = TRUE;
}
}
else if (!failed)
{
RestPtInfo.dwEventType = END_SYSTEM_CHANGE;
RestPtInfo.llSequenceNumber = SMgrStatus.llSequenceNumber;
if(!_SRSetRestorePoint(&RestPtInfo, &SMgrStatus))
{
StatusMessage (hwndDlg, "FAILED_SYS_RESTORE");
}
else
StatusMessage (hwndDlg, "SYS_RESTORE_CREATED");
}
}
void
DoUninstall (void *arg)
{
HWND hwndDlg = (HWND) arg;
BOOL bOK = TRUE;
BOOL bTempSkipSysRestore = FALSE;
if (!Rollback)
EnableWindow (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL), FALSE);
WaitCursor ();
if (!Rollback)
{
ClearLogWindow (hwndDlg);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -