📄 tcformat.c
字号:
{
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)
{
MessageBox (hwndDlg, "Error: Cannot access the volume!\n\nMake sure that the selected volume exists, that it is\nnot being used by the system or an application, and\nthat it is not write-protected.", lpszTitle, ICON_HAND);
return FALSE;
}
/* 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;
MessageBox (hwndDlg, getstr (IDS_GETFILETIME_FAILED_IMPLANT), "TrueCrypt", MB_OK | MB_ICONEXCLAMATION);
}
else
bTimeStampValid = TRUE;
if (GetFileSizeEx(hFile, &fileSize) == 0)
{
MessageBox (hwndDlg, "Error: Cannot get volume size!\n\nMake sure the selected volume is not being used\nby the system or an application.", lpszTitle, ICON_HAND);
if (bTimeStampValid)
{
// Restore the container timestamp (to preserve plausible deniability).
if (SetFileTime (hFile, NULL, &ftLastAccessTime, NULL) == 0)
MessageBox (hwndDlg, getstr (IDS_SETFILETIME_FAILED_PREP_IMPLANT), "TrueCrypt", 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)
MessageBox (hwndDlg, getstr (IDS_SETFILETIME_FAILED_PREP_IMPLANT), "TrueCrypt", 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 szTmp[TC_MAX_PATH];
ULARGE_INTEGER free;
BOOL bResult;
bResult = GetDiskFreeSpaceEx (MakeRootName (szTmp, szFileName), &free, 0, 0);
if (bResult == FALSE)
{
if (display)
DisplaySizingErrorText (hwndTextBox);
return FALSE;
}
else
{
LARGE_INTEGER lDiskFree;
lDiskFree.QuadPart = free.QuadPart;
if (display)
PrintFreeSpace (hwndTextBox, szTmp, &lDiskFree);
return TRUE;
}
}
else if (nCurrentOS == WIN_NT)
{
char szDosDevice[TC_MAX_PATH], szCFDevice[TC_MAX_PATH];
int nDosLinkCreated;
HANDLE dev;
nDosLinkCreated = FakeDosNameForDevice (szDiskFile, szDosDevice,
szCFDevice, FALSE);
if (nDosLinkCreated != 0)
{
if (display)
DisplaySizingErrorText (hwndTextBox);
return FALSE;
}
dev = CreateFile (szCFDevice, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (dev == INVALID_HANDLE_VALUE)
{
int nStatus;
if (display)
DisplaySizingErrorText (hwndTextBox);
nStatus = RemoveFakeDosName (szDiskFile, szDosDevice);
if (nStatus != 0)
handleWin32Error (hwndDlg);
return FALSE;
}
else
{
DISK_GEOMETRY driveInfo;
PARTITION_INFORMATION diskInfo;
DWORD dwResult;
int nStatus;
BOOL bResult;
nStatus = RemoveFakeDosName (szDiskFile, szDosDevice);
if (nStatus != 0)
handleWin32Error (hwndDlg);
// Query partition size
bResult = DeviceIoControl (dev, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0,
&diskInfo, sizeof (diskInfo), &dwResult, NULL);
if (bResult == TRUE)
{
if (bResult == TRUE)
{
nVolumeSize = diskInfo.PartitionLength.QuadPart;
if(display)
nMultiplier = PrintFreeSpace (hwndTextBox, szDiskFile, &diskInfo.PartitionLength);
nUIVolumeSize = diskInfo.PartitionLength.QuadPart / nMultiplier;
if (nVolumeSize == 0)
{
if (display)
SetWindowText (hwndTextBox, getstr (IDS_EXT_PARTITION));
CloseHandle (dev);
return FALSE;
}
}
}
else
{
LARGE_INTEGER lDiskFree;
// Drive geometry info is used only when IOCTL_DISK_GET_PARTITION_INFO fails
bResult = DeviceIoControl (dev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0,
&driveInfo, sizeof (driveInfo), &dwResult, NULL);
if (!bResult)
{
if (display)
DisplaySizingErrorText (hwndTextBox);
CloseHandle (dev);
return FALSE;
}
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;
}
CloseHandle (dev);
return TRUE;
}
}
else
{
OPEN_TEST_STRUCT driver;
BOOL bResult;
bResult = OpenDevice (szDiskFile, &driver);
if (bResult == TRUE)
{
LARGE_INTEGER lDiskFree;
lDiskFree.QuadPart = (__int64) (driver.seclast - driver.secstart) * SECTOR_SIZE;
nVolumeSize = lDiskFree.QuadPart;
if (display)
nMultiplier = PrintFreeSpace (hwndTextBox, szDiskFile, &lDiskFree);
nUIVolumeSize = lDiskFree.QuadPart / nMultiplier;
}
else
{
if (display)
DisplaySizingErrorText (hwndTextBox);
return FALSE;
}
return TRUE;
}
}
void
AddComboPair (HWND hComboBox, char *lpszItem, int value)
{
LPARAM nIndex;
nIndex = SendMessage (hComboBox, CB_ADDSTRING, 0, (LPARAM) lpszItem);
nIndex = SendMessage (hComboBox, CB_SETITEMDATA, nIndex, (LPARAM) value);
}
void
SelectEA (HWND hComboBox, int *ea)
{
LPARAM nCount = SendMessage (hComboBox, CB_GETCOUNT, 0, 0);
LPARAM x, i;
for (i = 0; i < nCount; i++)
{
x = SendMessage (hComboBox, CB_GETITEMDATA, i, 0);
if (x == (LPARAM) * ea)
{
SendMessage (hComboBox, CB_SETCURSEL, i, 0);
return;
}
}
/* Something went wrong ; couldn't find the old ea so we drop
back to a default */
*ea = SendMessage (hComboBox, CB_GETITEMDATA, 0, 0);
SendMessage (hComboBox, CB_SETCURSEL, 0, 0);
}
/* 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)
{
WORD lw = LOWORD (wParam);
WORD hw = HIWORD (wParam);
switch (uMsg)
{
case WM_INITDIALOG:
SetDefaultUserFont (hwndDlg);
switch (nCurPageNo)
{
case INTRO_PAGE:
{
UINT nID[4];
nID[0] = IDS_INTRO_HELP0;
nID[1] = IDS_INTRO_HELP1;
nID[2] = IDS_INTRO_HELP2;
nID[3] = IDS_INTRO_HELP3;
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (IDS_INTRO_TITLE));
CheckButton (GetDlgItem (hwndDlg, bHiddenVol ? IDC_HIDDEN_VOL : IDC_STD_VOL));
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
EnableWindow (GetDlgItem (hwndDlg, IDC_STD_VOL), TRUE);
EnableWindow (GetDlgItem (hwndDlg, IDC_HIDDEN_VOL), TRUE);
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), getstr (IDS_NEXT));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_PREV), getstr (IDS_PREV));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDCANCEL), getstr (IDS_CANCEL));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE);
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), FALSE);
}
break;
case HIDDEN_VOL_WIZARD_MODE_PAGE:
{
UINT nID[4];
nID[0] = IDS_HIDDEN_VOL_WIZARD_MODE_HELP0;
nID[1] = IDS_HIDDEN_VOL_WIZARD_MODE_HELP1;
nID[2] = IDS_HIDDEN_VOL_WIZARD_MODE_HELP2;
nID[3] = IDS_HIDDEN_VOL_WIZARD_MODE_HELP3;
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (IDS_HIDDEN_VOL_WIZARD_MODE_TITLE));
CheckButton (GetDlgItem (hwndDlg, bHiddenVolDirect ? IDC_HIDVOL_WIZ_MODE_DIRECT : IDC_HIDVOL_WIZ_MODE_FULL));
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
EnableWindow (GetDlgItem (hwndDlg, IDC_HIDVOL_WIZ_MODE_DIRECT), TRUE);
EnableWindow (GetDlgItem (hwndDlg, IDC_HIDVOL_WIZ_MODE_FULL), TRUE);
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), getstr (IDS_NEXT));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_PREV), getstr (IDS_PREV));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDCANCEL), getstr (IDS_CANCEL));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE);
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), TRUE);
}
break;
case FILE_PAGE:
{
UINT nID[4] = { 0,0,0,0 };
if (bHiddenVolDirect && bHiddenVolHost)
{
nID[0] = IDS_FILE_HELP0_HIDDEN_HOST_VOL_DIRECT;
nID[1] = 0;
}
else
{
nID[0] = bHiddenVolHost ? IDS_FILE_HELP0_HIDDEN_HOST_VOL : IDS_FILE_HELP0;
nID[1] = bHiddenVolHost ? IDS_FILE_HELP1_HIDDEN_HOST_VOL : IDS_FILE_HELP1;
}
SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_RESETCONTENT, 0, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_LIMITTEXT, TC_MAX_PATH, 0);
LoadSettings (hwndDlg);
SendMessage (GetDlgItem (hwndDlg, IDC_NO_HISTORY), BM_SETCHECK, bHistory ? BST_UNCHECKED : BST_CHECKED, 0);
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (IDS_FILE_TITLE));
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
SetFocus (GetDlgItem (hwndDlg, IDC_COMBO_BOX));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), getstr (IDS_NEXT));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_PREV), getstr (IDS_PREV));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), TRUE);
AddComboItem (GetDlgItem (hwndDlg, IDC_COMBO_BOX), szFileName);
EnableDisableFileNext (GetDlgItem (hwndDlg, IDC_COMBO_BOX),
GetDlgItem (GetParent (hwndDlg), IDC_NEXT));
}
break;
case HIDDEN_VOL_HOST_PRE_CIPHER_PAGE:
{
UINT nID[4];
nID[0] = IDS_HIDVOL_HOST_PRE_CIPHER_HELP0;
nID[1] = IDS_HIDVOL_HOST_PRE_CIPHER_HELP1;
nID[2] = IDS_HIDVOL_HOST_PRE_CIPHER_HELP2;
nID[3] = IDS_HIDVOL_HOST_PRE_CIPHER_HELP3;
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (IDS_HIDVOL_HOST_PRE_CIPHER_TITLE));
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), getstr (IDS_NEXT));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_PREV), getstr (IDS_PREV));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE);
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), TRUE);
}
break;
case HIDDEN_VOL_PRE_CIPHER_PAGE:
{
UINT nID[4];
nID[0] = IDS_HIDVOL_PRE_CIPHER_HELP0;
nID[1] = 0;
nID[2] = 0;
nID[3] = 0;
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (IDS_HIDVOL_PRE_CIPHER_TITLE));
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), getstr (IDS_NEXT));
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_PREV), getstr (IDS_PREV));
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE);
EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), FALSE);
}
break;
case CIPHER_PAGE:
{
int ea;
char buf[100];
SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_RESETCONTENT, 0, 0);
if (bHiddenVol)
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (bHiddenVolHost ? IDS_CIPHER_HIDVOL_HOST_TITLE : IDS_CIPHER_HIDVOL_TITLE));
else
SetWindowText (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), getstr (IDS_CIPHER_TITLE));
for (ea = EAGetFirst (); ea != 0; ea = EAGetNext (ea))
{
AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX), EAGetName (buf, ea), ea);
}
SelectEA (GetDlgItem (hwndDlg, IDC_COMBO_BOX), &nVolumeEA);
ComboSelChangeEA (hwndDlg);
SetFocus (GetDlgItem (hwndDlg, IDC_COMBO_BOX));
switch (pkcs5)
{
case SHA1: CheckButton (GetDlgItem (hwndDlg, IDC_SHA1)); break;
case RIPEMD160: CheckButton (GetDlgItem (hwndDlg, IDC_RIPEMD160)); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -