📄 setup.c
字号:
DWORD typeClassSize = sizeof (typeClass);
if (ReadLocalMachineRegistryString (key, "", typeClass, &typeClassSize) && typeClassSize > 0 && strcmp (typeClass, "TrueCryptVolume") == 0)
typeClassChanged = FALSE;
RegMessage (hwndDlg, key);
if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
key,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
goto error;
strcpy (szTmp, "TrueCryptVolume");
if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
RegCloseKey (hkey);
hkey = 0;
if (typeClassChanged)
SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
}
key = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\TrueCrypt";
RegMessage (hwndDlg, key);
if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
key,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
goto error;
/* IMPORTANT: IF YOU CHANGE THIS IN ANY WAY, REVISE AND UPDATE SetInstallationPath() ACCORDINGLY! */
sprintf (szTmp, "\"%sTrueCrypt Setup.exe\" /u", szDir);
if (RegSetValueEx (hkey, "UninstallString", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
sprintf (szTmp, "\"%sTrueCrypt Setup.exe\" /c", szDir);
if (RegSetValueEx (hkey, "ModifyPath", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
sprintf (szTmp, "\"%sTrueCrypt Setup.exe\"", szDir);
if (RegSetValueEx (hkey, "DisplayIcon", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
strcpy (szTmp, VERSION_STRING);
if (RegSetValueEx (hkey, "DisplayVersion", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
strcpy (szTmp, "TrueCrypt");
if (RegSetValueEx (hkey, "DisplayName", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
strcpy (szTmp, "TrueCrypt Foundation");
if (RegSetValueEx (hkey, "Publisher", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
sprintf (szTmp, "%s&dest=index", TC_APPLINK);
if (RegSetValueEx (hkey, "URLInfoAbout", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
bOK = TRUE;
error:
if (hkey != 0)
RegCloseKey (hkey);
if (bOK == FALSE)
{
handleWin32Error (hwndDlg);
Error ("REG_INSTALL_FAILED");
}
// Register COM servers for UAC
if (IsOSAtLeast (WIN_VISTA))
{
if (!RegisterComServers (szDir))
{
Error ("COM_REG_FAILED");
return FALSE;
}
}
return bOK;
}
BOOL DoApplicationDataUninstall (HWND hwndDlg)
{
char path[MAX_PATH];
char path2[MAX_PATH];
BOOL bOK = TRUE;
StatusMessage (hwndDlg, "REMOVING_APPDATA");
SHGetFolderPath (NULL, CSIDL_APPDATA, NULL, 0, path);
strcat (path, "\\TrueCrypt\\");
// Delete favorite volumes file
sprintf (path2, "%s%s", path, TC_APPD_FILENAME_FAVORITE_VOLUMES);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete keyfile defaults
sprintf (path2, "%s%s", path, TC_APPD_FILENAME_DEFAULT_KEYFILES);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete history file
sprintf (path2, "%s%s", path, TC_APPD_FILENAME_HISTORY);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete configuration file
sprintf (path2, "%s%s", path, TC_APPD_FILENAME_CONFIGURATION);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete system encryption configuration file
sprintf (path2, "%s%s", path, TC_APPD_FILENAME_SYSTEM_ENCRYPTION);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
SHGetFolderPath (NULL, CSIDL_APPDATA, NULL, 0, path);
strcat (path, "\\TrueCrypt");
RemoveMessage (hwndDlg, path);
if (!StatRemoveDirectory (path))
{
handleWin32Error (hwndDlg);
bOK = FALSE;
}
return bOK;
}
BOOL DoRegUninstall (HWND hwndDlg, BOOL bRemoveDeprecated)
{
BOOL bOK = FALSE;
char regk [64];
// Unregister COM servers
if (!bRemoveDeprecated && IsOSAtLeast (WIN_VISTA))
{
if (!UnregisterComServers (InstallationPath))
StatusMessage (hwndDlg, "COM_DEREG_FAILED");
}
if (!bRemoveDeprecated)
StatusMessage (hwndDlg, "REMOVING_REG");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\TrueCrypt");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Classes\\TrueCryptVolume\\Shell\\open\\command");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Classes\\TrueCryptVolume\\Shell\\open");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Classes\\TrueCryptVolume\\Shell");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Classes\\TrueCryptVolume\\DefaultIcon");
RegDeleteKey (HKEY_LOCAL_MACHINE, "Software\\Classes\\TrueCryptVolume");
RegDeleteKey (HKEY_CURRENT_USER, "Software\\TrueCrypt");
if (!bRemoveDeprecated)
{
// 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");
SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
}
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)
{
try
{
BootEncryption bootEnc (hwndDlg);
if (bootEnc.GetDriverServiceStartType() == SERVICE_BOOT_START)
{
bootEnc.RegisterFilterDriver (false, false);
bootEnc.RegisterFilterDriver (false, true);
}
}
catch (...) { }
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;
// 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;
bDowngrade = 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().DriveMounted)
{
bootEnc.RegisterFilterDriver (false, false);
bootEnc.RegisterFilterDriver (false, true);
bootEnc.SetDriverServiceStartType (SERVICE_SYSTEM_START);
}
else if (bUninstallInProgress || bDowngrade)
{
Error ("SETUP_FAILED_BOOT_DRIVE_ENCRYPTED");
return FALSE;
}
else
{
if (CurrentOSMajor == 6 && CurrentOSMinor == 0 && CurrentOSServicePack < 1
&& AskWarnNoYes ("SYS_ENCRYPTION_VISTA_SP1_RECOMMENDED") == IDNO)
{
AbortProcessSilent();
}
SystemEncryptionUpgrade = TRUE;
}
}
}
catch (...) { }
if (!SystemEncryptionUpgrade)
{
int volumesMounted = 0;
// 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
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -