📄 tcformat.c
字号:
nMultiBoot == 1 ? BST_CHECKED : BST_UNCHECKED,
0);
SendMessage (GetDlgItem (hwndDlg, IDC_MULTI_BOOT),
BM_SETCHECK,
nMultiBoot > 1 ? BST_CHECKED : BST_UNCHECKED,
0);
}
// -1 = Undecided or error, 0 = No, 1 = Yes
static int Get2RadButtonPageAnswer (void)
{
if (IsButtonChecked (GetDlgItem (hCurPage, IDC_CHOICE1)))
return 1;
if (IsButtonChecked (GetDlgItem (hCurPage, IDC_CHOICE2)))
return 0;
return -1;
}
// 0 = No, 1 = Yes
static void Update2RadButtonPage (int answer)
{
SendMessage (GetDlgItem (hCurPage, IDC_CHOICE1),
BM_SETCHECK,
answer == 1 ? BST_CHECKED : BST_UNCHECKED,
0);
SendMessage (GetDlgItem (hCurPage, IDC_CHOICE2),
BM_SETCHECK,
answer == 0 ? BST_CHECKED : BST_UNCHECKED,
0);
}
// -1 = Undecided, 0 = No, 1 = Yes
static void Init2RadButtonPageYesNo (int answer)
{
SetWindowTextW (GetDlgItem (hCurPage, IDC_CHOICE1), GetString ("UISTR_YES"));
SetWindowTextW (GetDlgItem (hCurPage, IDC_CHOICE2), GetString ("UISTR_NO"));
SetWindowTextW (GetDlgItem (MainDlg, IDC_NEXT), GetString ("NEXT"));
SetWindowTextW (GetDlgItem (MainDlg, IDC_PREV), GetString ("PREV"));
SetWindowTextW (GetDlgItem (MainDlg, IDCANCEL), GetString ("CANCEL"));
EnableWindow (GetDlgItem (MainDlg, IDC_NEXT), answer >= 0);
EnableWindow (GetDlgItem (MainDlg, IDC_PREV), TRUE);
Update2RadButtonPage (answer);
}
static void UpdateSysEncProgressBar (void)
{
BootEncryptionStatus locBootEncStatus;
static BOOL lastTransformWaitingForIdle = FALSE;
try
{
locBootEncStatus = BootEncObj->GetStatus();
}
catch (...)
{
return;
}
if (locBootEncStatus.EncryptedAreaEnd == -1
|| locBootEncStatus.EncryptedAreaStart == -1)
{
UpdateProgressBarProc (0);
}
else
{
UpdateProgressBarProc ((locBootEncStatus.EncryptedAreaEnd - locBootEncStatus.EncryptedAreaStart + 1) / SECTOR_SIZE);
if (locBootEncStatus.SetupInProgress)
{
wchar_t tmpStr[100];
// Status
if (locBootEncStatus.TransformWaitingForIdle)
wcscpy (tmpStr, GetString ("PROGRESS_STATUS_WAITING"));
else
wcscpy (tmpStr, GetString (SystemEncryptionStatus == SYSENC_STATUS_DECRYPTING ? "PROGRESS_STATUS_DECRYPTING" : "PROGRESS_STATUS_ENCRYPTING"));
wcscat (tmpStr, L" ");
SetWindowTextW (GetDlgItem (hCurPage, IDC_WRITESPEED), tmpStr);
// Remainining time
if (locBootEncStatus.TransformWaitingForIdle)
{
// The estimate cannot be computed correctly when speed is zero
SetWindowTextW (GetDlgItem (hCurPage, IDC_TIMEREMAIN), GetString ("NOT_APPLICABLE_OR_NOT_AVAILABLE"));
}
if (locBootEncStatus.TransformWaitingForIdle != lastTransformWaitingForIdle)
{
if (lastTransformWaitingForIdle)
{
// Estimate of remaining time and other values may have been heavily distorted as the speed
// was zero. Therefore, we're going to reinitialize the progress bar and all related variables.
InitSysEncProgressBar ();
}
lastTransformWaitingForIdle = locBootEncStatus.TransformWaitingForIdle;
}
}
}
}
static void InitSysEncProgressBar (void)
{
BootEncryptionStatus locBootEncStatus;
try
{
locBootEncStatus = BootEncObj->GetStatus();
}
catch (...)
{
return;
}
if (locBootEncStatus.ConfiguredEncryptedAreaEnd == -1
|| locBootEncStatus.ConfiguredEncryptedAreaStart == -1)
return;
InitProgressBar ((locBootEncStatus.ConfiguredEncryptedAreaEnd
- locBootEncStatus.ConfiguredEncryptedAreaStart + 1) / SECTOR_SIZE,
(locBootEncStatus.EncryptedAreaEnd == locBootEncStatus.EncryptedAreaStart || locBootEncStatus.EncryptedAreaEnd == -1) ?
0 : locBootEncStatus.EncryptedAreaEnd - locBootEncStatus.EncryptedAreaStart + 1,
SystemEncryptionStatus == SYSENC_STATUS_DECRYPTING,
TRUE,
TRUE,
TRUE);
}
static void UpdateSysEncControls (void)
{
BootEncryptionStatus locBootEncStatus;
try
{
locBootEncStatus = BootEncObj->GetStatus();
}
catch (...)
{
return;
}
EnableWindow (GetDlgItem (hCurPage, IDC_WIPE_MODE),
!locBootEncStatus.SetupInProgress
&& SystemEncryptionStatus == SYSENC_STATUS_ENCRYPTING);
SetWindowTextW (GetDlgItem (hCurPage, IDC_PAUSE),
GetString (locBootEncStatus.SetupInProgress ? "IDC_PAUSE" : "RESUME"));
EnableWindow (GetDlgItem (MainDlg, IDC_NEXT), !locBootEncStatus.SetupInProgress && !bFirstSysEncResumeDone);
if (!locBootEncStatus.SetupInProgress)
{
wchar_t tmpStr[100];
wcscpy (tmpStr, GetString ((SysDriveOrPartitionFullyEncrypted (TRUE) || !locBootEncStatus.DriveMounted) ?
"PROGRESS_STATUS_FINISHED" : "PROGRESS_STATUS_PAUSED"));
wcscat (tmpStr, L" ");
// Status
SetWindowTextW (GetDlgItem (hCurPage, IDC_WRITESPEED), tmpStr);
if (SysDriveOrPartitionFullyEncrypted (TRUE) || SystemEncryptionStatus == SYSENC_STATUS_NONE)
{
wcscpy (tmpStr, GetString ("PROCESSED_PORTION_100_PERCENT"));
wcscat (tmpStr, L" ");
SetWindowTextW (GetDlgItem (hCurPage, IDC_BYTESWRITTEN), tmpStr);
}
SetWindowText (GetDlgItem (hCurPage, IDC_TIMEREMAIN), " ");
}
}
static void SysEncPause (void)
{
BootEncryptionStatus locBootEncStatus;
if (CreateSysEncMutex ())
{
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), FALSE);
try
{
locBootEncStatus = BootEncObj->GetStatus();
}
catch (Exception &e)
{
e.Show (MainDlg);
Error ("ERR_GETTING_SYSTEM_ENCRYPTION_STATUS");
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
return;
}
if (!locBootEncStatus.SetupInProgress)
{
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
return;
}
WaitCursor ();
try
{
int attempts = SYSENC_PAUSE_RETRIES;
BootEncObj->AbortSetup ();
locBootEncStatus = BootEncObj->GetStatus();
while (locBootEncStatus.SetupInProgress && attempts > 0)
{
Sleep (SYSENC_PAUSE_RETRY_INTERVAL);
attempts--;
locBootEncStatus = BootEncObj->GetStatus();
}
if (!locBootEncStatus.SetupInProgress)
BootEncObj->CheckEncryptionSetupResult ();
}
catch (Exception &e)
{
e.Show (MainDlg);
}
NormalCursor ();
if (locBootEncStatus.SetupInProgress)
{
SetTimer (MainDlg, TIMER_ID_SYSENC_PROGRESS, TIMER_INTERVAL_SYSENC_PROGRESS, NULL);
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
Error ("FAILED_TO_INTERRUPT_SYSTEM_ENCRYPTION");
return;
}
UpdateSysEncControls ();
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
}
else
Error ("SYSTEM_ENCRYPTION_IN_PROGRESS_ELSEWHERE");
}
static void SysEncResume (void)
{
BootEncryptionStatus locBootEncStatus;
if (CreateSysEncMutex ())
{
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), FALSE);
try
{
locBootEncStatus = BootEncObj->GetStatus();
}
catch (Exception &e)
{
e.Show (MainDlg);
Error ("ERR_GETTING_SYSTEM_ENCRYPTION_STATUS");
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
return;
}
if (locBootEncStatus.SetupInProgress)
{
bSystemEncryptionInProgress = TRUE;
UpdateSysEncControls ();
SetTimer (MainDlg, TIMER_ID_SYSENC_PROGRESS, TIMER_INTERVAL_SYSENC_PROGRESS, NULL);
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
return;
}
bSystemEncryptionInProgress = FALSE;
WaitCursor ();
try
{
switch (SystemEncryptionStatus)
{
case SYSENC_STATUS_ENCRYPTING:
BootEncObj->StartEncryption (nWipeMode, bTryToCorrectReadErrors ? true : false);
break;
case SYSENC_STATUS_DECRYPTING:
if (locBootEncStatus.DriveMounted) // If the drive is not encrypted we will just deinstall
BootEncObj->StartDecryption ();
break;
}
bSystemEncryptionInProgress = TRUE;
}
catch (Exception &e)
{
e.Show (MainDlg);
}
NormalCursor ();
if (!bSystemEncryptionInProgress)
{
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
Error ("FAILED_TO_RESUME_SYSTEM_ENCRYPTION");
return;
}
bFirstSysEncResumeDone = TRUE;
InitSysEncProgressBar ();
UpdateSysEncProgressBar ();
UpdateSysEncControls ();
EnableWindow (GetDlgItem (hCurPage, IDC_PAUSE), TRUE);
SetTimer (MainDlg, TIMER_ID_SYSENC_PROGRESS, TIMER_INTERVAL_SYSENC_PROGRESS, NULL);
}
else
Error ("SYSTEM_ENCRYPTION_IN_PROGRESS_ELSEWHERE");
}
static BOOL GetDevicePathForHiddenOS (void)
{
BOOL tmpbDevice = FALSE;
try
{
strncpy (szFileName, BootEncObj->GetPartitionForHiddenOS().DevicePath.c_str(), sizeof(szFileName));
CreateFullVolumePath (szDiskFile, szFileName, &tmpbDevice);
}
catch (Exception &e)
{
e.Show (MainDlg);
return FALSE;
}
return (szFileName[0] != 0
&& szDiskFile[0] != 0
&& tmpbDevice);
}
// Returns TRUE if there is unallocated space greater than 64 MB (max possible slack space size) between the
// boot partition and the first partition behind it. If there's none or if an error occurs, returns FALSE.
static BOOL CheckGapBetweenSysAndHiddenOS (void)
{
try
{
SystemDriveConfiguration sysDriveCfg = BootEncObj->GetSystemDriveConfiguration();
return (sysDriveCfg.SystemPartition.Info.StartingOffset.QuadPart
+ sysDriveCfg.SystemPartition.Info.PartitionLength.QuadPart
+ 64 * BYTES_PER_MB
+ 128 * BYTES_PER_KB
<= BootEncObj->GetPartitionForHiddenOS().Info.StartingOffset.QuadPart);
}
catch (Exception &e)
{
e.Show (MainDlg);
}
return FALSE;
}
static void NonSysInplaceEncPause (void)
{
bVolTransformThreadCancel = TRUE;
WaitCursor ();
int waitThreshold = 100; // Do not block GUI events for more than 10 seconds. IMPORTANT: This prevents deadlocks when the thread calls us back e.g. to update GUI!
while (bVolTransformThreadRunning || bVolTransformThreadToRun)
{
MSG guiMsg;
bVolTransformThreadCancel = TRUE;
if (waitThreshold <= 0)
{
while (PeekMessage (&guiMsg, NULL, 0, 0, PM_REMOVE) != 0)
{
DispatchMessage (&guiMsg);
}
}
else
waitThreshold--;
Sleep (100);
}
}
static void NonSysInplaceEncResume (void)
{
if (bVolTransformThreadRunning || bVolTransformThreadToRun || bVolTransformThreadCancel)
return;
if (!bInPlaceEncNonSysResumed
&& !FinalPreTransformPrompts ())
{
return;
}
CreateNonSysInplaceEncMutex ();
bFirstNonSysInPlaceEncResumeDone = TRUE;
SetTimer (MainDlg, TIMER_ID_NONSYS_INPLACE_ENC_PROGRESS, TIMER_INTERVAL_NONSYS_INPLACE_ENC_PROGRESS, NULL);
bVolTransformThreadCancel = FALSE;
bVolTransformThreadToRun = TRUE;
UpdateNonSysInPlaceEncControls ();
LastDialogId = "NONSYS_INPLACE_ENC_IN_PROGRESS";
_beginthread (volTransformThreadFunction, 0, MainDlg);
return;
}
void ShowNonSysInPlaceEncUIStatus (void)
{
wchar_t nonSysInplaceEncUIStatus [300] = {0};
switch (NonSysInplaceEncStatus)
{
case NONSYS_INPLACE_ENC_STATUS_PAUSED:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_PAUSED"));
break;
case NONSYS_INPLACE_ENC_STATUS_PREPARING:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_PREPARING"));
break;
case NONSYS_INPLACE_ENC_STATUS_RESIZING:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_RESIZING"));
break;
case NONSYS_INPLACE_ENC_STATUS_ENCRYPTING:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_ENCRYPTING"));
break;
case NONSYS_INPLACE_ENC_STATUS_FINALIZING:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_FINALIZING"));
break;
case NONSYS_INPLACE_ENC_STATUS_FINISHED:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_FINISHED"));
break;
case NONSYS_INPLACE_ENC_STATUS_ERROR:
wcscpy (nonSysInplaceEncUIStatus, GetString ("PROGRESS_STATUS_ERROR"));
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -