📄 tcformat.c
字号:
}
else if (BootEncObj->SystemPartitionCoversWholeDrive()
&& !bWholeSysDrive)
bWholeSysDrive = (AskYesNo ("WHOLE_SYC_DEVICE_RECOM") == IDYES);
}
}
catch (Exception &e)
{
e.Show (MainDlg);
return FALSE;
}
if (!bHiddenVol)
{
// Skip SYSENC_SPAN_PAGE and SYSENC_TYPE_PAGE as the user already made the choice
LoadPage (MainDlg, bWholeSysDrive ? SYSENC_PRE_DRIVE_ANALYSIS_PAGE : SYSENC_MULTI_BOOT_MODE_PAGE);
}
else
{
// The user selected the non-sys-device wizard mode but then selected a system device.
// In addition, he selected the hidden volume mode.
if (bWholeSysDrive)
Warning ("HIDDEN_OS_PRECLUDES_SINGLE_KEY_WDE");
bWholeSysDrive = FALSE;
LoadPage (MainDlg, SYSENC_TYPE_PAGE);
}
}
else
LoadPage (MainDlg, SYSENC_TYPE_PAGE);
NormalCursor ();
return TRUE;
}
CloseSysEncMutex ();
NormalCursor ();
return FALSE;
}
void SwitchWizardToFileContainerMode (void)
{
ChangeWizardMode (WIZARD_MODE_FILE_CONTAINER);
LoadPage (MainDlg, VOLUME_LOCATION_PAGE);
NormalCursor ();
}
void SwitchWizardToNonSysDeviceMode (void)
{
ChangeWizardMode (WIZARD_MODE_NONSYS_DEVICE);
LoadPage (MainDlg, VOLUME_TYPE_PAGE);
NormalCursor ();
}
BOOL SwitchWizardToHiddenOSMode (void)
{
if (SwitchWizardToSysEncMode())
{
if (nCurPageNo != SYSENC_ENCRYPTION_PAGE) // If the user did not manually choose to resume encryption or decryption of the system partition/drive
{
bHiddenOS = TRUE;
bHiddenVol = TRUE;
bHiddenVolHost = TRUE;
bHiddenVolDirect = FALSE;
bWholeSysDrive = FALSE;
bInPlaceEncNonSys = FALSE;
if (bDirectSysEncModeCommand == SYSENC_COMMAND_CREATE_HIDDEN_OS_ELEV)
{
// Some of the requirements for hidden OS should have already been checked by the wizard process
// that launched us (in order to elevate), but we must recheck them. Otherwise, an advanced user
// could bypass the checks by using the undocumented CLI switch. Moreover, some requirements
// can be checked only at this point (when we are elevated).
try
{
BootEncObj->CheckRequirementsHiddenOS ();
BootEncObj->InitialSecurityChecksForHiddenOS ();
}
catch (Exception &e)
{
e.Show (MainDlg);
return FALSE;
}
LoadPage (MainDlg, SYSENC_MULTI_BOOT_MODE_PAGE);
}
else
LoadPage (MainDlg, SYSENC_HIDDEN_OS_REQ_CHECK_PAGE);
NormalCursor ();
}
else
return TRUE;
}
else
return FALSE;
return TRUE;
}
void SwitchWizardToNonSysInplaceEncResumeMode (void)
{
if (!IsAdmin() && IsUacSupported())
{
if (!ElevateWholeWizardProcess ("/zinplace"))
AbortProcessSilent ();
}
if (!IsAdmin())
AbortProcess("ADMIN_PRIVILEGES_WARN_DEVICES");
CreateNonSysInplaceEncMutex ();
bInPlaceEncNonSys = TRUE;
bInPlaceEncNonSysResumed = TRUE;
ChangeWizardMode (WIZARD_MODE_NONSYS_DEVICE);
LoadPage (MainDlg, NONSYS_INPLACE_ENC_RESUME_PASSWORD_PAGE);
}
// Use this function e.g. if the config file with the system encryption settings was lost or not written
// correctly, and we don't know whether to encrypt or decrypt (but we know that encryption or decryption
// is required). Returns FALSE if failed or cancelled.
static BOOL ResolveUnknownSysEncDirection (void)
{
if (CreateSysEncMutex ())
{
if (SystemEncryptionStatus != SYSENC_STATUS_ENCRYPTING
&& SystemEncryptionStatus != SYSENC_STATUS_DECRYPTING)
{
try
{
BootEncStatus = BootEncObj->GetStatus();
}
catch (Exception &e)
{
e.Show (MainDlg);
Error ("ERR_GETTING_SYSTEM_ENCRYPTION_STATUS");
return FALSE;
}
if (BootEncStatus.SetupInProgress)
{
return ChangeSystemEncryptionStatus (
(BootEncStatus.SetupMode != SetupDecryption) ? SYSENC_STATUS_ENCRYPTING : SYSENC_STATUS_DECRYPTING);
}
else
{
// Ask the user to select encryption, decryption, or cancel
char *tmpStr[] = {0,
!BootEncStatus.DriveEncrypted ? "CHOOSE_ENCRYPT_OR_DECRYPT_FINALIZE_DECRYPT_NOTE" : "CHOOSE_ENCRYPT_OR_DECRYPT",
"ENCRYPT",
"DECRYPT",
"IDCANCEL",
0};
switch (AskMultiChoice ((void **) tmpStr, FALSE))
{
case 1:
return ChangeSystemEncryptionStatus (SYSENC_STATUS_ENCRYPTING);
case 2:
return ChangeSystemEncryptionStatus (SYSENC_STATUS_DECRYPTING);
default:
return FALSE;
}
}
}
else
return TRUE;
}
else
{
Error ("SYSTEM_ENCRYPTION_IN_PROGRESS_ELSEWHERE");
return FALSE;
}
}
// This function should be used to resolve inconsistencies that might lead to a deadlock (inability to encrypt or
// decrypt the system partition/drive and to uninstall TrueCrypt). The function removes the system encryption key
// data ("volume header"), the TrueCrypt boot loader, restores the original system loader (if available),
// unregisters the boot driver, etc. Note that if the system partition/drive is encrypted, it will start decrypting
// it in the background (therefore, it should be used when the system partition/drive is not encrypted, ideally).
// Exceptions are handled and errors are reported within the function. Returns TRUE if successful.
static BOOL ForceRemoveSysEnc (void)
{
if (CreateSysEncMutex ()) // If no other instance is currently taking care of system encryption
{
BootEncryptionStatus locBootEncStatus;
try
{
locBootEncStatus = BootEncObj->GetStatus();
if (locBootEncStatus.SetupInProgress)
BootEncObj->AbortSetupWait ();
locBootEncStatus = BootEncObj->GetStatus();
if (locBootEncStatus.DriveMounted)
{
// Remove the header
BootEncObj->StartDecryption ();
locBootEncStatus = BootEncObj->GetStatus();
while (locBootEncStatus.SetupInProgress)
{
Sleep (100);
locBootEncStatus = BootEncObj->GetStatus();
}
BootEncObj->CheckEncryptionSetupResult ();
}
Sleep (50);
}
catch (Exception &e)
{
e.Show (MainDlg);
return FALSE;
}
try
{
locBootEncStatus = BootEncObj->GetStatus();
if (!locBootEncStatus.DriveMounted)
BootEncObj->Deinstall ();
}
catch (Exception &e)
{
e.Show (MainDlg);
return FALSE;
}
return TRUE;
}
else
return FALSE;
}
// Returns 0 if there's an error.
__int64 GetSystemPartitionSize (void)
{
try
{
return BootEncObj->GetSystemDriveConfiguration().SystemPartition.Info.PartitionLength.QuadPart;
}
catch (Exception &e)
{
e.Show (MainDlg);
return 0;
}
}
void ComboSelChangeEA (HWND hwndDlg)
{
LPARAM nIndex = SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_GETCURSEL, 0, 0);
if (nIndex == CB_ERR)
{
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), "");
}
else
{
char name[100];
wchar_t auxLine[4096];
wchar_t hyperLink[256] = { 0 };
char cipherIDs[5];
int i, cnt = 0;
nIndex = SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_GETITEMDATA, nIndex, 0);
EAGetName (name, nIndex);
if (strcmp (name, "AES") == 0)
{
swprintf_s (hyperLink, sizeof(hyperLink) / 2, GetString ("MORE_INFO_ABOUT"), name);
SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("AES_HELP"));
}
else if (strcmp (name, "Serpent") == 0)
{
swprintf_s (hyperLink, sizeof(hyperLink) / 2, GetString ("MORE_INFO_ABOUT"), name);
SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("SERPENT_HELP"));
}
else if (strcmp (name, "Twofish") == 0)
{
swprintf_s (hyperLink, sizeof(hyperLink) / 2, GetString ("MORE_INFO_ABOUT"), name);
SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("TWOFISH_HELP"));
}
else if (EAGetCipherCount (nIndex) > 1)
{
// Cascade
cipherIDs[cnt++] = i = EAGetLastCipher(nIndex);
while (i = EAGetPreviousCipher(nIndex, i))
{
cipherIDs[cnt] = i;
cnt++;
}
switch (cnt) // Number of ciphers in the cascade
{
case 2:
swprintf (auxLine, GetString ("TWO_LAYER_CASCADE_HELP"),
CipherGetName (cipherIDs[1]),
CipherGetKeySize (cipherIDs[1])*8,
CipherGetName (cipherIDs[0]),
CipherGetKeySize (cipherIDs[0])*8);
break;
case 3:
swprintf (auxLine, GetString ("THREE_LAYER_CASCADE_HELP"),
CipherGetName (cipherIDs[2]),
CipherGetKeySize (cipherIDs[2])*8,
CipherGetName (cipherIDs[1]),
CipherGetKeySize (cipherIDs[1])*8,
CipherGetName (cipherIDs[0]),
CipherGetKeySize (cipherIDs[0])*8);
break;
}
wcscpy_s (hyperLink, sizeof(hyperLink) / 2, GetString ("IDC_LINK_MORE_INFO_ABOUT_CIPHER"));
SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), auxLine);
}
else
{
// No info available for this encryption algorithm
SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), L"");
}
// Update hyperlink
SetWindowTextW (GetDlgItem (hwndDlg, IDC_LINK_MORE_INFO_ABOUT_CIPHER), hyperLink);
AccommodateTextField (hwndDlg, IDC_LINK_MORE_INFO_ABOUT_CIPHER, FALSE);
}
}
static void VerifySizeAndUpdate (HWND hwndDlg, BOOL bUpdate)
{
BOOL bEnable = TRUE;
char szTmp[50];
__int64 lTmp;
size_t i;
static unsigned __int64 nLastVolumeSize = 0;
GetWindowText (GetDlgItem (hwndDlg, IDC_SIZEBOX), szTmp, sizeof (szTmp));
for (i = 0; i < strlen (szTmp); i++)
{
if (szTmp[i] >= '0' && szTmp[i] <= '9')
continue;
else
{
bEnable = FALSE;
break;
}
}
if (IsButtonChecked (GetDlgItem (hwndDlg, IDC_KB)))
nMultiplier = BYTES_PER_KB;
else if (IsButtonChecked (GetDlgItem (hwndDlg, IDC_MB)))
nMultiplier = BYTES_PER_MB;
else
nMultiplier = BYTES_PER_GB;
if (bDevice && !(bHiddenVol && !bHiddenVolHost)) // If raw device but not a hidden volume
{
lTmp = nVolumeSize;
i = 1;
}
else
{
i = nMultiplier;
lTmp = _atoi64 (szTmp);
}
if (bEnable)
{
if (lTmp * i < (bHiddenVolHost ? TC_MIN_HIDDEN_VOLUME_HOST_SIZE : (bHiddenVol ? TC_MIN_HIDDEN_VOLUME_SIZE : TC_MIN_VOLUME_SIZE)))
bEnable = FALSE;
if (!bHiddenVolHost && bHiddenVol)
{
if (lTmp * i > nMaximumHiddenVolSize)
bEnable = FALSE;
}
else
{
if (lTmp * i > (bHiddenVolHost ? TC_MAX_HIDDEN_VOLUME_HOST_SIZE : TC_MAX_VOLUME_SIZE))
bEnable = FALSE;
}
if (lTmp * i % SECTOR_SIZE != 0)
bEnable = FALSE;
}
if (bUpdate)
{
nUIVolumeSize = lTmp;
if (!bDevice || (bHiddenVol && !bHiddenVolHost)) // Update only if it's not a raw device or if it's a hidden volume
nVolumeSize = i * lTmp;
}
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), bEnable);
if (nVolumeSize != nLastVolumeSize)
{
// Change of volume size may make some file systems allowed or disallowed, so the default filesystem must
// be reselected.
fileSystem = FILESYS_NONE;
nLastVolumeSize = nVolumeSize;
}
}
static void UpdateWizardModeControls (HWND hwndDlg, int setWizardMode)
{
SendMessage (GetDlgItem (hwndDlg, IDC_FILE_CONTAINER),
BM_SETCHECK,
setWizardMode == WIZARD_MODE_FILE_CONTAINER ? BST_CHECKED : BST_UNCHECKED,
0);
SendMessage (GetDlgItem (hwndDlg, IDC_NONSYS_DEVICE),
BM_SETCHECK,
setWizardMode == WIZARD_MODE_NONSYS_DEVICE ? BST_CHECKED : BST_UNCHECKED,
0);
SendMessage (GetDlgItem (hwndDlg, IDC_SYS_DEVICE),
BM_SETCHECK,
setWizardMode == WIZARD_MODE_SYS_DEVICE ? BST_CHECKED : BST_UNCHECKED,
0);
}
static int GetSelectedWizardMode (HWND hwndDlg)
{
if (IsButtonChecked (GetDlgItem (hwndDlg, IDC_FILE_CONTAINER)))
return WIZARD_MODE_FILE_CONTAINER;
if (IsButtonChecked (GetDlgItem (hwndDlg, IDC_NONSYS_DEVICE)))
return WIZARD_MODE_NONSYS_DEVICE;
if (IsButtonChecked (GetDlgItem (hwndDlg, IDC_SYS_DEVICE)))
return WIZARD_MODE_SYS_DEVICE;
return DEFAULT_VOL_CREATION_WIZARD_MODE;
}
static void RefreshMultiBootControls (HWND hwndDlg)
{
SendMessage (GetDlgItem (hwndDlg, IDC_SINGLE_BOOT),
BM_SETCHECK,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -