📄 setup.c
字号:
/*
Legal Notice: Some portions of the source code contained in this file were
derived from the source code of Encryption for the Masses 2.02a, which is
Copyright (c) 1998-2000 Paul Le Roux and which is governed by the 'License
Agreement for Encryption for the Masses'. Modifications and additions to
the original source code (contained in this file) and all other portions of
this file are Copyright (c) 2003-2009 TrueCrypt Foundation and are governed
by the TrueCrypt License 2.6 the full text of which is contained in the
file License.txt included in TrueCrypt binary and source code distribution
packages. */
#include "Tcdefs.h"
#include <SrRestorePtApi.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "Apidrvr.h"
#include "BootEncryption.h"
#include "Combo.h"
#include "ComSetup.h"
#include "Dlgcode.h"
#include "Language.h"
#include "Registry.h"
#include "Resource.h"
#include "Dir.h"
#include "Setup.h"
#include "SelfExtract.h"
#include "Wizard.h"
#include "../Common/Resource.h"
#include "../Mount/Mount.h"
using namespace TrueCrypt;
#pragma warning( disable : 4201 )
#pragma warning( disable : 4115 )
#include <shlobj.h>
#pragma warning( default : 4201 )
#pragma warning( default : 4115 )
char InstallationPath[TC_MAX_PATH];
char SetupFilesDir[TC_MAX_PATH];
char UninstallBatch[MAX_PATH];
BOOL bUninstall = FALSE;
BOOL bRestartRequired = FALSE; // If TRUE, the installer does not allow the user to exit it until he restarts the computer. This blocks the app setup mutex and the user cannot run TrueCrypt until he restarts.
BOOL bMakePackage = FALSE;
BOOL bDone = FALSE;
BOOL Rollback = FALSE;
BOOL bUpgrade = FALSE;
BOOL bDowngrade = FALSE;
BOOL SystemEncryptionUpgrade = FALSE;
BOOL bRepairMode = FALSE;
BOOL bChangeMode = FALSE;
BOOL bDevm = FALSE;
BOOL bFirstTimeInstall = FALSE;
BOOL bUninstallInProgress = FALSE;
BOOL bSystemRestore = TRUE;
BOOL bDisableSwapFiles = FALSE;
BOOL bForAllUsers = TRUE;
BOOL bRegisterFileExt = TRUE;
BOOL bAddToStartMenu = TRUE;
BOOL bDesktopIcon = TRUE;
HMODULE volatile SystemRestoreDll = 0;
void localcleanup (void)
{
localcleanupwiz ();
cleanup ();
CloseAppSetupMutex ();
}
BOOL StatDeleteFile (char *lpszFile)
{
struct __stat64 st;
if (_stat64 (lpszFile, &st) == 0)
return DeleteFile (lpszFile);
else
return TRUE;
}
BOOL StatRemoveDirectory (char *lpszDir)
{
struct __stat64 st;
if (_stat64 (lpszDir, &st) == 0)
return RemoveDirectory (lpszDir);
else
return TRUE;
}
HRESULT CreateLink (char *lpszPathObj, char *lpszArguments,
char *lpszPathLink)
{
HRESULT hres;
IShellLink *psl;
/* Get a pointer to the IShellLink interface. */
hres = CoCreateInstance (CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl);
if (SUCCEEDED (hres))
{
IPersistFile *ppf;
/* Set the path to the shortcut target, and add the
description. */
psl->SetPath (lpszPathObj);
psl->SetArguments (lpszArguments);
/* Query IShellLink for the IPersistFile interface for saving
the shortcut in persistent storage. */
hres = psl->QueryInterface (IID_IPersistFile,
(void **) &ppf);
if (SUCCEEDED (hres))
{
wchar_t wsz[TC_MAX_PATH];
/* Ensure that the string is ANSI. */
MultiByteToWideChar (CP_ACP, 0, lpszPathLink, -1,
wsz, sizeof(wsz) / sizeof(wsz[0]));
/* Save the link by calling IPersistFile::Save. */
hres = ppf->Save (wsz, TRUE);
ppf->Release ();
}
psl->Release ();
}
return hres;
}
void GetProgramPath (HWND hwndDlg, char *path)
{
ITEMIDLIST *i;
HRESULT res;
if (bForAllUsers)
res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_COMMON_PROGRAMS, &i);
else
res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_PROGRAMS, &i);
SHGetPathFromIDList (i, path);
}
void StatusMessage (HWND hwndDlg, char *stringId)
{
if (Rollback)
return;
SendMessageW (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_ADDSTRING, 0, (LPARAM) GetString (stringId));
SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_SETTOPINDEX,
SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_GETCOUNT, 0, 0) - 1, 0);
}
void StatusMessageParam (HWND hwndDlg, char *stringId, char *param)
{
wchar_t szTmp[1024];
if (Rollback)
return;
wsprintfW (szTmp, L"%s %hs", GetString (stringId), param);
SendMessageW (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_ADDSTRING, 0, (LPARAM) szTmp);
SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_SETTOPINDEX,
SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_GETCOUNT, 0, 0) - 1, 0);
}
void ClearLogWindow (HWND hwndDlg)
{
SendMessage (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_RESETCONTENT, 0, 0);
}
void RegMessage (HWND hwndDlg, char *txt)
{
StatusMessageParam (hwndDlg, "ADDING_REG", txt);
}
void CopyMessage (HWND hwndDlg, char *txt)
{
StatusMessageParam (hwndDlg, "INSTALLING", txt);
}
void RemoveMessage (HWND hwndDlg, char *txt)
{
if (!Rollback)
StatusMessageParam (hwndDlg, "REMOVING", txt);
}
void IconMessage (HWND hwndDlg, char *txt)
{
StatusMessageParam (hwndDlg, "ADDING_ICON", txt);
}
BOOL DoFilesInstall (HWND hwndDlg, char *szDestDir)
{
/* WARNING: Note that, despite its name, this function is used during UNinstallation as well. */
char szTmp[TC_MAX_PATH];
BOOL bOK = TRUE;
int i, x, fileNo;
char curFileName [TC_MAX_PATH] = {0};
if (!bUninstall && !bDevm)
{
// Self-extract all files to memory
GetModuleFileName (NULL, szTmp, sizeof (szTmp));
if (!SelfExtractInMemory (szTmp))
return FALSE;
}
x = strlen (szDestDir);
if (x < 2)
return FALSE;
if (szDestDir[x - 1] != '\\')
strcat (szDestDir, "\\");
for (i = 0; i < sizeof (szFiles) / sizeof (szFiles[0]); i++)
{
BOOL bResult;
char szDir[TC_MAX_PATH];
if (strstr (szFiles[i], "TrueCrypt Setup") != 0)
{
if (bUninstall)
continue; // Prevent 'access denied' error
if (bRepairMode)
continue; // Destination = target
}
if (*szFiles[i] == 'A')
strcpy (szDir, szDestDir);
else if (*szFiles[i] == 'D')
{
GetSystemDirectory (szDir, sizeof (szDir));
x = strlen (szDir);
if (szDir[x - 1] != '\\')
strcat (szDir, "\\");
strcat (szDir, "Drivers\\");
}
else if (*szFiles[i] == 'W')
GetWindowsDirectory (szDir, sizeof (szDir));
if (*szFiles[i] == 'I')
continue;
sprintf (szTmp, "%s%s", szDir, szFiles[i] + 1);
if (bUninstall == FALSE)
CopyMessage (hwndDlg, szTmp);
else
RemoveMessage (hwndDlg, szTmp);
if (bUninstall == FALSE)
{
SetCurrentDirectory (SetupFilesDir);
if (strstr (szFiles[i], "TrueCrypt Setup") != 0)
{
// Copy ourselves (the distribution package) to the destination location as 'TrueCrypt Setup.exe'
char mp[MAX_PATH];
GetModuleFileName (NULL, mp, sizeof (mp));
bResult = TCCopyFile (mp, szTmp);
}
else
{
strncpy (curFileName, szFiles[i] + 1, strlen (szFiles[i]) - 1);
curFileName [strlen (szFiles[i]) - 1] = 0;
if (Is64BitOs ()
&& strcmp (szFiles[i], "Dtruecrypt.sys") == 0)
{
strncpy (curFileName, FILENAME_64BIT_DRIVER, sizeof (FILENAME_64BIT_DRIVER));
}
if (!bDevm)
{
bResult = FALSE;
// Find the correct decompressed file in memory
for (fileNo = 0; fileNo < NBR_COMPRESSED_FILES; fileNo++)
{
// Write the file (stored in memory) directly to the destination location
// (there will be no temporary files).
if (memcmp (
curFileName,
Decompressed_Files[fileNo].fileName,
min (strlen (curFileName), (size_t) Decompressed_Files[fileNo].fileNameLength)) == 0)
{
bResult = SaveBufferToFile (
(char *) Decompressed_Files[fileNo].fileContent,
szTmp,
Decompressed_Files[fileNo].fileLength,
FALSE);
break;
}
}
}
else
{
bResult = TCCopyFile (curFileName, szTmp);
}
}
}
else
{
bResult = StatDeleteFile (szTmp);
}
if (bResult == FALSE)
{
LPVOID lpMsgBuf;
DWORD dwError = GetLastError ();
wchar_t szTmp2[700];
FormatMessage (
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwError,
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
(char *) &lpMsgBuf,
0,
NULL
);
if (bUninstall == FALSE)
wsprintfW (szTmp2, GetString ("INSTALL_OF_FAILED"), szTmp, lpMsgBuf);
else
wsprintfW (szTmp2, GetString ("UNINSTALL_OF_FAILED"), szTmp, lpMsgBuf);
LocalFree (lpMsgBuf);
if (!Silent && MessageBoxW (hwndDlg, szTmp2, lpszTitle, MB_YESNO | MB_ICONHAND) != IDYES)
return FALSE;
}
}
// Language pack
if (bUninstall == FALSE)
{
WIN32_FIND_DATA f;
HANDLE h;
SetCurrentDirectory (SetupFilesDir);
h = FindFirstFile ("Language.*.xml", &f);
if (h != INVALID_HANDLE_VALUE)
{
char d[MAX_PATH*2];
sprintf (d, "%s%s", szDestDir, f.cFileName);
CopyMessage (hwndDlg, d);
TCCopyFile (f.cFileName, d);
FindClose (h);
}
SetCurrentDirectory (SetupFilesDir);
SetCurrentDirectory ("Setup files");
h = FindFirstFile ("TrueCrypt User Guide.*.pdf", &f);
if (h != INVALID_HANDLE_VALUE)
{
char d[MAX_PATH*2];
sprintf (d, "%s%s", szDestDir, f.cFileName);
CopyMessage (hwndDlg, d);
TCCopyFile (f.cFileName, d);
FindClose (h);
}
SetCurrentDirectory (SetupFilesDir);
}
return bOK;
}
BOOL DoRegInstall (HWND hwndDlg, char *szDestDir, BOOL bInstallType)
{
char szDir[TC_MAX_PATH], *key;
char szTmp[TC_MAX_PATH*4];
HKEY hkey = 0;
BOOL bSlash, bOK = FALSE;
DWORD dw;
int x;
if (SystemEncryptionUpgrade)
{
if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\TrueCrypt",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) == ERROR_SUCCESS)
{
strcpy (szTmp, VERSION_STRING);
RegSetValueEx (hkey, "DisplayVersion", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1);
RegCloseKey (hkey);
}
return TRUE;
}
strcpy (szDir, szDestDir);
x = strlen (szDestDir);
if (szDestDir[x - 1] == '\\')
bSlash = TRUE;
else
bSlash = FALSE;
if (bSlash == FALSE)
strcat (szDir, "\\");
if (bInstallType)
{
key = "Software\\Classes\\TrueCryptVolume";
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, "TrueCrypt Volume");
if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
RegCloseKey (hkey);
hkey = 0;
key = "Software\\Classes\\TrueCryptVolume\\DefaultIcon";
RegMessage (hwndDlg, key);
if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
key,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
goto error;
sprintf (szTmp, "%sTrueCrypt.exe,1", szDir);
if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
RegCloseKey (hkey);
hkey = 0;
key = "Software\\Classes\\TrueCryptVolume\\Shell\\open\\command";
RegMessage (hwndDlg, key);
if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
key,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
goto error;
sprintf (szTmp, "\"%sTrueCrypt.exe\" /v \"%%1\"", szDir );
if (RegSetValueEx (hkey, "", 0, REG_SZ, (BYTE *) szTmp, strlen (szTmp) + 1) != ERROR_SUCCESS)
goto error;
RegCloseKey (hkey);
hkey = 0;
key = "Software\\Classes\\.tc";
BOOL typeClassChanged = TRUE;
char typeClass[256];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -