📄 setup.c
字号:
goto error;
GetWindowsDirectory (szDir, sizeof (szDir));
x = strlen (szDir);
if (szDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szDir, "\\");
sprintf (szTmp, "%sTrueCrypt Setup.exe /u", szDir);
if (RegSetValueEx (hkey, "UninstallString", 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;
}
bOK = TRUE;
error:
if (hkey != 0)
RegCloseKey (hkey);
if (bOK == FALSE)
{
handleWin32Error (hwndDlg);
MessageBox (hwndDlg, "The installation of the registry entries has failed", lpszTitle, MB_ICONHAND);
}
return bOK;
}
BOOL
DoRegUninstall (HWND hwndDlg)
{
BOOL bOK = FALSE;
StatusMessage (hwndDlg, "%s", "Removing registry entries");
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 (RegDeleteKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Classes\\.tc") != ERROR_SUCCESS)
goto error;
bOK = TRUE;
error:
if (bOK == FALSE && GetLastError ()!= ERROR_NO_TOKEN && GetLastError ()!= ERROR_FILE_NOT_FOUND
&& GetLastError ()!= ERROR_PATH_NOT_FOUND)
{
handleWin32Error (hwndDlg);
MessageBox (hwndDlg, "The uninstallation of the registry entries has failed", lpszTitle, MB_ICONHAND);
}
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;
char szTmp[128];
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;
sprintf (szTmp, "stopping %s", lpszService);
ServiceMessage (hwndDlg, szTmp);
#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:
sprintf (szTmp, "deleting %s", lpszService);
ServiceMessage (hwndDlg, szTmp);
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);
MessageBox (hwndDlg, "The uninstallation of the device driver has 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 (IDS_NODRIVER);
}
if (status != ERR_OS_ERROR)
{
handleError (NULL, status);
AbortProcess (IDS_NODRIVER);
}
}
if (hDriver != INVALID_HANDLE_VALUE)
{
MOUNT_LIST_STRUCT driver;
int refCount;
DWORD dwResult;
BOOL bResult;
bResult = DeviceIoControl (hDriver, MOUNT_LIST, &driver, sizeof (driver), &driver,
sizeof (driver), &dwResult, NULL);
if (bResult == TRUE)
{
if (driver.ulMountedDrives != 0)
{
bOK = FALSE;
MessageBox (hwndDlg, "Volumes are still mounted. All volumes must be dismounted before installation can continue.", lpszTitle, MB_ICONHAND);
}
}
else
{
bOK = FALSE;
handleWin32Error (hwndDlg);
}
// Test for any applications attached to driver
bResult = DeviceIoControl (hDriver, DEVICE_REFCOUNT, &refCount, sizeof (refCount), &refCount,
sizeof (refCount), &dwResult, NULL);
if (bOK && bResult == TRUE && refCount > 1)
{
MessageBox (hwndDlg, "Please close all open TrueCrypt windows first.", lpszTitle, MB_ICONSTOP);
bOK = FALSE;
}
CloseHandle (hDriver);
hDriver = INVALID_HANDLE_VALUE;
}
return bOK;
}
BOOL
DoDriverInstall (HWND hwndDlg)
{
SC_HANDLE hManager, hService = NULL;
BOOL bOK = FALSE, bRet, bSlash;
char szDir[TC_MAX_PATH];
int x;
if (nCurrentOS != WIN_NT)
return TRUE;
hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hManager == NULL)
goto error;
GetSystemDirectory (szDir, sizeof (szDir));
x = strlen (szDir);
if (szDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szDir, "\\");
strcat (szDir, "Drivers\\truecrypt.sys");
ServiceMessage (hwndDlg, "installing TrueCrypt driver service");
hService = CreateService (hManager, "truecrypt", "truecrypt",
SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
szDir, NULL, NULL, NULL, NULL, NULL
);
if (hService == NULL)
goto error;
else
CloseServiceHandle (hService);
hService = OpenService (hManager, "truecrypt", SERVICE_ALL_ACCESS);
if (hService == NULL)
goto error;
ServiceMessage (hwndDlg, "starting TrueCrypt driver service");
bRet = StartService (hService, 0, NULL);
if (bRet == FALSE)
goto error;
bOK = TRUE;
error:
if (bOK == FALSE && GetLastError ()!= ERROR_SERVICE_ALREADY_RUNNING)
{
handleWin32Error (hwndDlg);
MessageBox (hwndDlg, "The installation of the device driver has failed", lpszTitle, MB_ICONHAND);
}
else
bOK = TRUE;
if (hService != NULL)
CloseServiceHandle (hService);
if (hManager != NULL)
CloseServiceHandle (hManager);
return bOK;
}
BOOL
DoShortcutsUninstall (HWND hwndDlg, char *szDestDir)
{
char szLinkDir[TC_MAX_PATH], szDir[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
if (nCurrentOS == WIN_NT)
{
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 User's Guide.lnk");
RemoveMessage (hwndDlg, szTmp2);
if (StatDeleteFile (szTmp2) == FALSE)
goto error;
GetWindowsDirectory (szDir, sizeof (szDir));
sprintf (szTmp2, "%s%s", szLinkDir, "\\Uninstall TrueCrypt.lnk");
RemoveMessage (hwndDlg, szTmp2);
if (StatDeleteFile (szTmp2) == FALSE)
goto error;
// Start menu group
RemoveMessage ((HWND) hwndDlg, szLinkDir);
if (StatRemoveDirectory (szLinkDir) == FALSE)
{
handleWin32Error ((HWND) hwndDlg);
goto error;
}
// 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];
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)
{
if (mkfulldir (szLinkDir, TRUE) != 0)
{
char szTmp[TC_MAX_PATH];
// int x;
//sprintf (szTmp, "The program folder '%s' does not exist. Do you want to create this folder?", szLinkDir);
//x = MessageBox (hwndDlg, szTmp, lpszTitle, MB_ICONQUESTION | MB_YESNO);
//if (x == IDNO)
//{
// goto error;
//}
if (mkfulldir (szLinkDir, FALSE) != 0)
{
handleWin32Error (hwndDlg);
sprintf (szTmp, "The folder '%s' could not be created", szLinkDir);
MessageBox (hwndDlg, szTmp, lpszTitle, MB_ICONHAND);
goto error;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -