📄 tcformat.c
字号:
{
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");
}
BOOL RegisterBootDriver (void)
{
try
{
BootEncObj->RegisterBootDriver();
}
catch (Exception &e)
{
e.Show (NULL);
return FALSE;
}
return TRUE;
}
void DisplayRandPool (HWND hPoolDisplay, BOOL bShow)
{
unsigned char tmp[4];
unsigned char tmpByte;
int col, row;
static BOOL bRandPoolDispAscii = FALSE;
if (!bShow)
{
SetWindowText (hPoolDisplay, "");
return;
}
RandpeekBytes (randPool, sizeof (randPool));
if (memcmp (lastRandPool, randPool, sizeof(lastRandPool)) != 0)
{
outRandPoolDispBuffer[0] = 0;
for (row = 0; row < RANDPOOL_DISPLAY_ROWS; row++)
{
for (col = 0; col < RANDPOOL_DISPLAY_COLUMNS; col++)
{
tmpByte = randPool[row * RANDPOOL_DISPLAY_COLUMNS + col];
sprintf ((char *) tmp, bRandPoolDispAscii ? ((tmpByte >= 32 && tmpByte < 255 && tmpByte != '&') ? " %c " : " . ") : "%02X ", tmpByte);
strcat ((char *) outRandPoolDispBuffer, (char *) tmp);
}
strcat ((char *) outRandPoolDispBuffer, "\n");
}
SetWindowText (hPoolDisplay, (char *) outRandPoolDispBuffer);
memcpy (lastRandPool, randPool, sizeof(lastRandPool));
}
}
static void __cdecl sysEncDriveAnalysisThread (void *hwndDlgArg)
{
try
{
BootEncObj->ProbeRealSystemDriveSize ();
bSysEncDriveAnalysisTimeOutOccurred = FALSE;
}
catch (TimeOut &)
{
bSysEncDriveAnalysisTimeOutOccurred = TRUE;
}
catch (Exception &e)
{
e.Show (NULL);
EndMainDlg (MainDlg);
exit(0);
}
// This artificial delay prevents user confusion on systems where the analysis ends almost instantly
Sleep (4000);
bSysEncDriveAnalysisInProgress = FALSE;
}
static void __cdecl formatThreadFunction (void *hwndDlgArg)
{
int nStatus;
DWORD dwWin32FormatError;
BOOL bHidden;
HWND hwndDlg = (HWND) hwndDlgArg;
// Check administrator privileges
if (!IsAdmin () && !IsUacSupported ())
{
if (fileSystem == FILESYS_NTFS)
{
if (MessageBoxW (hwndDlg, GetString ("ADMIN_PRIVILEGES_WARN_NTFS"), lpszTitle, MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2) == IDCANCEL)
goto cancel;
}
if (bDevice)
{
if (MessageBoxW (hwndDlg, GetString ("ADMIN_PRIVILEGES_WARN_DEVICES"), lpszTitle, MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2) == IDCANCEL)
goto cancel;
}
}
if (bDevice == FALSE)
{
int x = _access (szDiskFile, 06);
if (x == 0 || errno != ENOENT)
{
wchar_t szTmp[512];
if (! ((bHiddenVol && !bHiddenVolHost) && errno != EACCES)) // Only ask ask for permission to overwrite an existing volume if we're not creating a hidden volume
{
_snwprintf (szTmp, sizeof szTmp / 2,
GetString (errno == EACCES ? "READONLYPROMPT" : "OVERWRITEPROMPT"),
szDiskFile);
x = MessageBoxW (hwndDlg, szTmp, lpszTitle, YES_NO|MB_ICONWARNING|MB_DEFBUTTON2);
if (x != IDYES)
goto cancel;
}
}
if (_access (szDiskFile, 06) != 0)
{
if (errno == EACCES)
{
if (_chmod (szDiskFile, _S_IREAD | _S_IWRITE) != 0)
{
MessageBoxW (hwndDlg, GetString ("ACCESSMODEFAIL"), lpszTitle, ICON_HAND);
goto cancel;
}
}
}
}
else
{
int x;
wchar_t szTmp[4096];
int driveNo;
WCHAR deviceName[MAX_PATH];
strcpy ((char *)deviceName, szFileName);
ToUNICODE ((char *)deviceName);
driveNo = GetDiskDeviceDriveLetter (deviceName);
if (!(bHiddenVol && !bHiddenVolHost)) // Do not ask for permission to overwrite an existing volume if we're creating a hidden volume within it
{
wchar_t drive[128];
wchar_t *type;
if (strstr (szFileName, "Partition"))
type = GetString ( strstr (szFileName, "Partition0") == NULL ? "PARTITION_UPPER_CASE" : "DEVICE_UPPER_CASE");
else
type = GetString ("DEVICE_UPPER_CASE");
if (driveNo != -1)
{
wchar_t name[128];
if (!GetDriveLabel (driveNo, name, sizeof (name)))
name[0] = 0;
swprintf_s (drive, sizeof (drive)/2, name[0] ? L" (%hc: '%s')" : L" (%hc:%s)", 'A' + driveNo, name[0] ? name : L"");
}
else
drive[0] = 0;
swprintf (szTmp, GetString ("OVERWRITEPROMPT_DEVICE"), type, szFileName, drive);
x = MessageBoxW (hwndDlg, szTmp, lpszTitle, YES_NO|MB_ICONWARNING|MB_DEFBUTTON2);
if (x != IDYES)
goto cancel;
}
}
bHidden = bHiddenVol && !bHiddenVolHost;
InitProgressBar ((nVolumeSize - (bHidden ? 0 : HEADER_SIZE)) / SECTOR_SIZE, 0, FALSE, FALSE, FALSE, TRUE);
nStatus = FormatVolume (szDiskFile,
bDevice,
nVolumeSize,
nHiddenVolHostSize,
&volumePassword,
nVolumeEA,
hash_algo,
quickFormat,
bSparseFileSwitch,
fileSystem,
clusterSize,
hwndDlg,
bHidden,
&realClusterSize,
FALSE);
if (nStatus == ERR_OUTOFMEMORY)
{
AbortProcess ("OUTOFMEMORY");
}
dwWin32FormatError = GetLastError ();
RestoreDefaultKeyFilesParam ();
if (bHiddenVolHost && !bThreadCancel && nStatus == 0)
{
/* Auto mount the newly created hidden volume host */
switch (MountHiddenVolHost (hwndDlg, szDiskFile, &hiddenVolHostDriveNo, &volumePassword, FALSE))
{
case ERR_NO_FREE_DRIVES:
MessageBoxW (hwndDlg, GetString ("NO_FREE_DRIVE_FOR_OUTER_VOL"), lpszTitle, ICON_HAND);
bThreadCancel = TRUE;
break;
case ERR_VOL_MOUNT_FAILED:
case ERR_PASSWORD_WRONG:
MessageBoxW (hwndDlg, GetString ("CANT_MOUNT_OUTER_VOL"), lpszTitle, ICON_HAND);
bThreadCancel = TRUE;
break;
}
}
SetLastError (dwWin32FormatError);
if (bThreadCancel)
{
if (!bDevice && !(bHiddenVol && !bHiddenVolHost)) // If we're not creating a hidden volume and if it's a file container
{
remove (szDiskFile); // Delete the container
}
goto cancel;
}
if (nStatus != 0)
{
wchar_t szMsg[1024];
handleError (hwndDlg, nStatus);
if (!(bHiddenVolHost && hiddenVolHostDriveNo < 0)) // If the error was not that the hidden volume host could not be mounted (this error has already been reported to the user)
{
swprintf (szMsg, GetString ("CREATE_FAILED"), szDiskFile);
MessageBoxW (hwndDlg, szMsg, lpszTitle, ICON_HAND);
}
if (!bDevice && !(bHiddenVol && !bHiddenVolHost)) // If we're not creating a hidden volume and if it's a file container
{
remove (szDiskFile); // Delete the container
}
goto cancel;
}
else
{
/* Volume successfully created */
if (bDevice)
{
// Handle assigned drive letter (if any)
WCHAR deviceName[MAX_PATH];
int driveLetter = -1;
strcpy ((char *)deviceName, szDiskFile);
ToUNICODE ((char *)deviceName);
driveLetter = GetDiskDeviceDriveLetter (deviceName);
if (!bHiddenVolHost
&& driveLetter > 1) // If a drive letter is assigned to the device, but not A: or B:
{
char rootPath[] = { driveLetter + 'A', ':', '\\', 0 };
wchar_t szTmp[8192];
swprintf (szTmp, GetString ("AFTER_FORMAT_DRIVE_LETTER_WARN"), rootPath[0], rootPath[0], rootPath[0], rootPath[0]);
MessageBoxW (hwndDlg, szTmp, lpszTitle, MB_ICONWARNING);
}
}
if (!bHiddenVolHost)
{
if (bHiddenVol)
{
bHiddenVolFinished = TRUE;
Warning ("HIDVOL_FORMAT_FINISHED_HELP");
}
else
{
Info("FORMAT_FINISHED_INFO");
if (bSparseFileSwitch && quickFormat)
Warning("SPARSE_FILE_SIZE_NOTE");
}
}
else
{
/* We've just created an outer volume (to host a hidden volume within) */
bHiddenVolHost = FALSE;
bHiddenVolFinished = FALSE;
nHiddenVolHostSize = nVolumeSize;
// Clear the outer volume password
memset(&szVerify[0], 0, sizeof (szVerify));
memset(&szRawPassword[0], 0, sizeof (szRawPassword));
MessageBeep (MB_OK);
}
SetTimer (hwndDlg, TIMER_ID_RANDVIEW, TIMER_INTERVAL_RANDVIEW, NULL);
PostMessage (hwndDlg, TC_APPMSG_FORMAT_FINISHED, 0, 0);
bThreadRunning = FALSE;
LastDialogId = "FORMAT_FINISHED";
_endthread ();
}
cancel:
LastDialogId = "FORMAT_CANCELED";
SetTimer (hwndDlg, TIMER_ID_RANDVIEW, TIMER_INTERVAL_RANDVIEW, NULL);
PostMessage (hwndDlg, TC_APPMSG_FORMAT_THREAD_ENDED, 0, 0);
bThreadRunning = FALSE;
if (bHiddenVolHost && hiddenVolHostDriveNo < -1 && !bThreadCancel) // If hidden volume host could not be mounted
AbortProcessSilent ();
_endthread ();
}
static void LoadPage (HWND hwndDlg, int nPageNo)
{
RECT rD, rW;
if (hCurPage != NULL)
{
DestroyWindow (hCurPage);
}
// This prevents the mouse pointer from remaining as the "hand" cursor when the user presses Enter
// while hovering over a hyperlink.
bHyperLinkBeingTracked = FALSE;
NormalCursor();
GetWindowRect (GetDlgItem (hwndDlg, IDC_POS_BOX), &rW);
nCurPageNo = nPageNo;
switch (nPageNo)
{
case INTRO_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INTRO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_SPAN_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_SPAN_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_DRIVE_ANALYSIS_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_DRIVE_ANALYSIS_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_MULTI_BOOT_MODE_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_MULTI_BOOT_MODE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_MULTI_BOOT_SYS_EQ_BOOT_PAGE:
case SYSENC_MULTI_BOOT_NBR_SYS_DRIVES_PAGE:
case SYSENC_MULTI_BOOT_ADJACENT_SYS_PAGE:
case SYSENC_MULTI_BOOT_NONWIN_BOOT_LOADER_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_UNIVERSAL_DUAL_CHOICE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_MULTI_BOOT_OUTCOME_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case VOLUME_TYPE_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_VOLUME_TYPE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case HIDDEN_VOL_WIZARD_MODE_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_HIDDEN_VOL_WIZARD_MODE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case FILE_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_FILE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
EnableWindow (GetDlgItem(hCurPage, IDC_NO_HISTORY), !bHistoryCmdLine);
EnableWindow (GetDlgItem (hwndDlg, IDC_NEXT),
GetWindowTextLength (GetDlgItem (hCurPage, IDC_COMBO_BOX)) > 0);
break;
case HIDDEN_VOL_HOST_PRE_CIPHER_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case HIDDEN_VOL_PRE_CIPHER_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case CIPHER_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_CIPHER_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SIZE_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SIZE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case HIDDEN_VOL_HOST_PASSWORD_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_HIDVOL_HOST_PASSWORD_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case PASSWORD_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_PASSWORD_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_COLLECTING_RANDOM_DATA_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_COLLECTING_RANDOM_DATA_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_KEYS_GEN_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_KEYS_GEN_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -