📄 tcformat.c
字号:
case SYSENC_RESCUE_DISK_CREATION_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_RESCUE_DISK_CREATION_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_RESCUE_DISK_BURN_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_RESCUE_DISK_BURN_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_RESCUE_DISK_VERIFIED_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_WIPE_MODE_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_WIPE_MODE_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_PRETEST_INFO_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_PRETEST_RESULT_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case SYSENC_ENCRYPTION_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_SYSENC_ENCRYPTION_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case FORMAT_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW (IDD_FORMAT_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
case FORMAT_FINISHED_PAGE:
hCurPage = CreateDialogW (hInst, MAKEINTRESOURCEW ((bHiddenVol && !bHiddenVolHost && !bHiddenVolFinished) ? IDD_HIDVOL_HOST_FILL_PAGE_DLG : IDD_INFO_PAGE_DLG), hwndDlg,
(DLGPROC) PageDialogProc);
break;
}
rD.left = 162;
rD.top = 25;
rD.right = 0;
rD.bottom = 0;
MapDialogRect (hwndDlg, &rD);
if (hCurPage != NULL)
{
MoveWindow (hCurPage, rD.left, rD.top, rW.right - rW.left, rW.bottom - rW.top, TRUE);
ShowWindow (hCurPage, SW_SHOWNORMAL);
// Place here any message boxes that need to be displayed as soon as a new page is displayed. This
// ensures that the page is fully rendered (otherwise it would remain blank, until the message box
// is closed).
switch (nPageNo)
{
case PASSWORD_PAGE:
CheckCapsLock (hwndDlg, FALSE);
break;
}
}
}
int PrintFreeSpace (HWND hwndTextBox, char *lpszDrive, PLARGE_INTEGER lDiskFree)
{
char *nResourceString;
int nMultiplier;
wchar_t szTmp2[256];
if (lDiskFree->QuadPart < BYTES_PER_KB)
nMultiplier = 1;
else if (lDiskFree->QuadPart < BYTES_PER_MB)
nMultiplier = BYTES_PER_KB;
else
nMultiplier = BYTES_PER_MB;
if (nMultiplier == 1)
{
if (bHiddenVol && !bHiddenVolHost) // If it's a hidden volume
nResourceString = "MAX_HIDVOL_SIZE_BYTES";
else if (bDevice)
nResourceString = "DEVICE_FREE_BYTES";
else
nResourceString = "DISK_FREE_BYTES";
}
else if (nMultiplier == BYTES_PER_KB)
{
if (bHiddenVol && !bHiddenVolHost) // If it's a hidden volume
nResourceString = "MAX_HIDVOL_SIZE_KB";
else if (bDevice)
nResourceString = "DEVICE_FREE_KB";
else
nResourceString = "DISK_FREE_KB";
}
else
{
if (bHiddenVol && !bHiddenVolHost) // If it's a hidden volume
nResourceString = "MAX_HIDVOL_SIZE_MB";
else if (bDevice)
nResourceString = "DEVICE_FREE_MB";
else
nResourceString = "DISK_FREE_MB";
}
if (bHiddenVol && !bHiddenVolHost) // If it's a hidden volume
{
_snwprintf (szTmp2, sizeof szTmp2 / 2, GetString (nResourceString), ((double) lDiskFree->QuadPart) / nMultiplier);
SetWindowTextW (GetDlgItem (hwndTextBox, IDC_SIZEBOX), szTmp2);
}
else
_snwprintf (szTmp2, sizeof szTmp2 / 2, GetString (nResourceString), lpszDrive, ((double) lDiskFree->QuadPart) / nMultiplier);
SetWindowTextW (hwndTextBox, szTmp2);
if (lDiskFree->QuadPart % (__int64) BYTES_PER_MB != 0)
nMultiplier = BYTES_PER_KB;
return nMultiplier;
}
void DisplaySizingErrorText (HWND hwndTextBox)
{
wchar_t szTmp[1024];
if (translateWin32Error (szTmp, sizeof (szTmp) / sizeof(szTmp[0])))
{
wchar_t szTmp2[1024];
wsprintfW (szTmp2, L"%s\n%s", GetString ("CANNOT_CALC_SPACE"), szTmp);
SetWindowTextW (hwndTextBox, szTmp2);
}
else
{
SetWindowText (hwndTextBox, "");
}
}
void EnableDisableFileNext (HWND hComboBox, HWND hMainButton)
{
LPARAM nIndex = SendMessage (hComboBox, CB_GETCURSEL, 0, 0);
if (bHistory && nIndex == CB_ERR)
{
EnableWindow (hMainButton, FALSE);
SetFocus (hComboBox);
}
else
{
EnableWindow (hMainButton, TRUE);
SetFocus (hMainButton);
}
}
// Returns TRUE if the file is a sparse file. If it's not a sparse file or in case of any error, returns FALSE.
BOOL IsSparseFile (HWND hwndDlg)
{
HANDLE hFile;
BY_HANDLE_FILE_INFORMATION bhFileInfo;
FILETIME ftLastAccessTime;
BOOL bTimeStampValid = FALSE;
BOOL retCode = FALSE;
hFile = CreateFile (szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBoxW (hwndDlg, GetString ("CANT_ACCESS_VOL"), lpszTitle, ICON_HAND);
return FALSE;
}
if (bPreserveTimestamp)
{
/* Remember the container timestamp (used to reset file date and time of file-hosted
containers to preserve plausible deniability of hidden volumes) */
if (GetFileTime (hFile, NULL, &ftLastAccessTime, NULL) == 0)
{
bTimeStampValid = FALSE;
MessageBoxW (hwndDlg, GetString ("GETFILETIME_FAILED_IMPLANT"), lpszTitle, MB_OK | MB_ICONEXCLAMATION);
}
else
bTimeStampValid = TRUE;
}
bhFileInfo.dwFileAttributes = 0;
GetFileInformationByHandle(hFile, &bhFileInfo);
retCode = bhFileInfo.dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE;
if (bTimeStampValid)
{
// Restore the container timestamp (to preserve plausible deniability).
if (SetFileTime (hFile, NULL, &ftLastAccessTime, NULL) == 0)
MessageBoxW (hwndDlg, GetString ("SETFILETIME_FAILED_PREP_IMPLANT"), lpszTitle, MB_OK | MB_ICONEXCLAMATION);
}
CloseHandle (hFile);
return retCode;
}
// Note: GetFileVolSize is not to be used for devices (only for file-hosted volumes)
BOOL GetFileVolSize (HWND hwndDlg, unsigned __int64 *size)
{
LARGE_INTEGER fileSize;
HANDLE hFile;
FILETIME ftLastAccessTime;
BOOL bTimeStampValid = FALSE;
hFile = CreateFile (szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBoxW (hwndDlg, GetString ("CANT_ACCESS_VOL"), lpszTitle, ICON_HAND);
return FALSE;
}
if (bPreserveTimestamp)
{
/* Remember the container timestamp (used to reset file date and time of file-hosted
containers to preserve plausible deniability of hidden volumes) */
if (GetFileTime (hFile, NULL, &ftLastAccessTime, NULL) == 0)
{
bTimeStampValid = FALSE;
MessageBoxW (hwndDlg, GetString ("GETFILETIME_FAILED_IMPLANT"), lpszTitle, MB_OK | MB_ICONEXCLAMATION);
}
else
bTimeStampValid = TRUE;
}
if (GetFileSizeEx(hFile, &fileSize) == 0)
{
MessageBoxW (hwndDlg, GetString ("CANT_GET_VOLSIZE"), lpszTitle, ICON_HAND);
if (bTimeStampValid)
{
// Restore the container timestamp (to preserve plausible deniability).
if (SetFileTime (hFile, NULL, &ftLastAccessTime, NULL) == 0)
MessageBoxW (hwndDlg, GetString ("SETFILETIME_FAILED_PREP_IMPLANT"), lpszTitle, MB_OK | MB_ICONEXCLAMATION);
}
CloseHandle (hFile);
return FALSE;
}
if (bTimeStampValid)
{
// Restore the container timestamp (to preserve plausible deniability).
if (SetFileTime (hFile, NULL, &ftLastAccessTime, NULL) == 0)
MessageBoxW (hwndDlg, GetString ("SETFILETIME_FAILED_PREP_IMPLANT"), lpszTitle, MB_OK | MB_ICONEXCLAMATION);
}
CloseHandle (hFile);
*size = fileSize.QuadPart;
return TRUE;
}
BOOL
QueryFreeSpace (HWND hwndDlg, HWND hwndTextBox, BOOL display)
{
if (bHiddenVol && !bHiddenVolHost) // If it's a hidden volume
{
LARGE_INTEGER lDiskFree;
char szTmp[TC_MAX_PATH];
lDiskFree.QuadPart = nMaximumHiddenVolSize;
if (display)
PrintFreeSpace (hwndTextBox, szTmp, &lDiskFree);
return TRUE;
}
else if (bDevice == FALSE)
{
char root[TC_MAX_PATH];
ULARGE_INTEGER free;
if (!GetVolumePathName (szFileName, root, sizeof (root)))
{
handleWin32Error (hwndDlg);
return FALSE;
}
if (!GetDiskFreeSpaceEx (root, &free, 0, 0))
{
if (display)
DisplaySizingErrorText (hwndTextBox);
return FALSE;
}
else
{
LARGE_INTEGER lDiskFree;
lDiskFree.QuadPart = free.QuadPart;
if (display)
PrintFreeSpace (hwndTextBox, root, &lDiskFree);
return TRUE;
}
}
else
{
DISK_GEOMETRY driveInfo;
PARTITION_INFORMATION diskInfo;
BOOL piValid = FALSE;
BOOL gValid = FALSE;
// Query partition size
piValid = GetPartitionInfo (szDiskFile, &diskInfo);
gValid = GetDriveGeometry (szDiskFile, &driveInfo);
if (!piValid && !gValid)
{
if (display)
DisplaySizingErrorText (hwndTextBox);
return FALSE;
}
if (gValid && driveInfo.BytesPerSector != 512)
{
Error ("LARGE_SECTOR_UNSUPPORTED");
return FALSE;
}
if (piValid)
{
nVolumeSize = diskInfo.PartitionLength.QuadPart;
if(display)
nMultiplier = PrintFreeSpace (hwndTextBox, szDiskFile, &diskInfo.PartitionLength);
nUIVolumeSize = diskInfo.PartitionLength.QuadPart / nMultiplier;
if (nVolumeSize == 0)
{
if (display)
SetWindowTextW (hwndTextBox, GetString ("EXT_PARTITION"));
return FALSE;
}
}
else
{
LARGE_INTEGER lDiskFree;
// Drive geometry info is used only when GetPartitionInfo() fails
lDiskFree.QuadPart = driveInfo.Cylinders.QuadPart * driveInfo.BytesPerSector *
driveInfo.SectorsPerTrack * driveInfo.TracksPerCylinder;
nVolumeSize = lDiskFree.QuadPart;
if (display)
nMultiplier = PrintFreeSpace (hwndTextBox, szDiskFile, &lDiskFree);
nUIVolumeSize = lDiskFree.QuadPart / nMultiplier;
}
return TRUE;
}
}
/* Except in response to the WM_INITDIALOG message, the dialog box procedure
should return nonzero if it processes the message, and zero if it does
not. - see DialogProc */
BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static char PageDebugId[128];
WORD lw = LOWORD (wParam);
WORD hw = HIWORD (wParam);
hCurPage = hwndDlg;
switch (uMsg)
{
case WM_INITDIALOG:
LocalizeDialog (hwndDlg, "IDD_VOL_CREATION_WIZARD_DLG");
sprintf (PageDebugId, "FORMAT_PAGE_%d", nCurPageNo);
LastDialogId = PageDebugId;
switch (nCurPageNo)
{
case INTRO_PAGE:
SendMessage (GetDlgItem (hwndDlg, IDC_FILE_CONTAINER), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SendMessage (GetDlgItem (hwndDlg, IDC_NONSYS_DEVICE), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SendMessage (GetDlgItem (hwndDlg, IDC_SYS_DEVICE), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), GetString ("INTRO_TITLE"));
ToHyperlink (hwndDlg, IDC_MORE_INFO_ON_CONTAINERS);
ToHyperlink (hwndDlg, IDC_MORE_INFO_ON_SYS_ENCRYPTION);
EnableWindow (GetDlgItem (hwndDlg, IDC_STD_VOL), TRUE);
EnableWindow (GetDlgItem (hwndDlg, IDC_HIDDEN_VOL), TRUE);
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), GetString ("NEXT"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_PREV), GetString ("PREV"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDCANCEL), GetString ("CANCEL"));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE);
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), FALSE);
UpdateWizardModeControls (hwndDlg, WizardMode);
break;
case SYSENC_SPAN_PAGE:
SendMessage (GetDlgItem (hwndDlg, IDC_WHOLE_SYS_DRIVE), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SendMessage (GetDlgItem (hwndDlg, IDC_SYS_PARTITION), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), GetString ("SYS_ENCRYPTION_SPAN_TITLE"));
SetWindowTextW (GetDlgItem (hwndDlg, IDT_WHOLE_SYS_DRIVE), GetString ("SYS_ENCRYPTION_SPAN_WHOLE_SYS_DRIVE_HELP"));
CheckButton (GetDlgItem (hwndDlg, bWholeSysDrive ? IDC_WHOLE_SYS_DRIVE : IDC_SYS_PARTITION));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), GetString ("NEXT"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_PREV), GetString ("PREV"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDCANCEL), GetString ("CANCEL"));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE);
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), !bDirectSysEncMode);
break;
case SYSENC_DRIVE_ANALYSIS_PAGE:
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), GetString ("SYSENC_DRIVE_ANALYSIS_TITLE"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), GetString ("NEXT"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_PREV), GetString ("PREV"));
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDCANCEL), GetString ("CANCEL"));
EnableWindow (GetDlgItem (MainDlg, IDC_NEXT), FALSE);
EnableWindow (GetDlgItem (MainDlg, IDC_PREV), FALSE);
EnableWindow (GetDlgItem (MainDlg, IDCANCEL), FALSE);
SetTimer (MainDlg, TIMER_ID_SYSENC_DRIVE_ANALYSIS_PROGRESS, TIMER_INTERVAL_SYSENC_DRIVE_ANALYSIS_PROGRESS, NULL);
bSysEncDriveAnalysisInProgress = TRUE;
ArrowWaitCursor ();
SysEncDriveAnalysisStart = GetTickCount ();
InitProgressBar (SYSENC_DRIVE_ANALYSIS_ETA, 0, FALSE, FALSE, FALSE, TRUE);
_beginthread (sysEncDriveAnalysisThread, 4096, hwndDlg);
break;
case SYSENC_MULTI_BOOT_MODE_PAGE:
SendMessage (GetDlgItem (hwndDlg, IDC_SINGLE_BOOT), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SendMessage (GetDlgItem (hwndDlg, IDC_MULTI_BOOT), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE);
SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -