?? 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-2008 TrueCrypt Foundation and are governed
by the TrueCrypt License 2.5 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;
BOOL bMakePackage = FALSE;
BOOL bDone = FALSE;
BOOL Rollback = FALSE;
BOOL bUpgrade = FALSE;
BOOL SystemEncryptionUpgrade = FALSE;
BOOL bRepairMode = FALSE;
BOOL bChangeMode = FALSE;
BOOL bDevm = FALSE;
BOOL bFirstTimeInstall = FALSE;
BOOL bUninstallInProgress = FALSE;
BOOL bSystemRestore = TRUE;
BOOL bDisableSwapFiles = TRUE;
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;
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";
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;
}
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 (nCurrentOS == WIN_VISTA_OR_LATER)
{
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, FILE_FAVORITE_VOLUMES);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete keyfile defaults
sprintf (path2, "%s%s", path, FILE_DEFAULT_KEYFILES);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete history file
sprintf (path2, "%s%s", path, FILE_HISTORY);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete configuration file
sprintf (path2, "%s%s", path, FILE_CONFIGURATION);
RemoveMessage (hwndDlg, path2);
StatDeleteFile (path2);
// Delete system encryption configuration file
sprintf (path2, "%s%s", path, FILE_SYSTEM_ENCRYPTION_CFG);
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 && nCurrentOS == WIN_VISTA_OR_LATER)
{
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)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -