📄 dlgcode.c
字号:
{
// Partition/device
offset.QuadPart = volSize - HIDDEN_VOL_HEADER_OFFSET;
if (SetFilePointerEx ((HANDLE) dev, offset, &offsetNew, FILE_BEGIN) == 0)
return FALSE;
if (offsetNew.QuadPart != offset.QuadPart)
return FALSE;
}
else
{
// File-hosted volume
offset.QuadPart = - HIDDEN_VOL_HEADER_OFFSET;
if (SetFilePointerEx ((HANDLE) dev, offset, &offsetNew, FILE_END) == 0)
return FALSE;
}
return TRUE;
}
BOOL
BrowseFiles (HWND hwndDlg, UINT nTitleID, char *lpszFileName, BOOL keepHistory)
{
OPENFILENAME ofn;
char szFileTitle[TC_MAX_PATH];
ZeroMemory (&ofn, sizeof (OPENFILENAME));
*szFileTitle = *lpszFileName = 0;
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; //sizeof (OPENFILENAME);
ofn.hwndOwner = hwndDlg;
ofn.lpstrFilter = "All Files (*.*)\0*.*\0TrueCrypt Volumes (*.tc)\0*.tc\0";
ofn.lpstrCustomFilter = NULL;
ofn.nFilterIndex = 1;
ofn.lpstrFile = lpszFileName;
ofn.nMaxFile = TC_MAX_PATH;
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = TC_MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = getstr (nTitleID);
ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | (keepHistory ? 0 : OFN_DONTADDTORECENT);
//ofn.lpstrDefExt = "tc";
if (!GetOpenFileName (&ofn))
return FALSE;
else
return TRUE;
}
static int CALLBACK
BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData)
{
switch(uMsg) {
case BFFM_INITIALIZED:
{
/* WParam is TRUE since we are passing a path.
It would be FALSE if we were passing a pidl. */
SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)pData);
break;
}
case BFFM_SELCHANGED:
{
char szDir[TC_MAX_PATH];
/* Set the status window to the currently selected path. */
if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir))
{
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
}
break;
}
default:
break;
}
return 0;
}
BOOL
BrowseDirectories (HWND hwndDlg, char *lpszTitle, char *dirName)
{
BROWSEINFO bi;
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
BOOL bOK = FALSE;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = hwndDlg;
bi.pszDisplayName = 0;
bi.lpszTitle = lpszTitle;
bi.pidlRoot = 0;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT /*| BIF_EDITBOX*/;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)dirName;
pidl = SHBrowseForFolder(&bi);
if (pidl!=NULL)
{
if (SHGetPathFromIDList(pidl, dirName)==TRUE)
{
bOK = TRUE;
}
pMalloc->lpVtbl->Free(pMalloc,pidl);
pMalloc->lpVtbl->Release(pMalloc);
}
}
return bOK;
}
void
handleError (HWND hwndDlg, int code)
{
char szTmp[512];
switch (code)
{
case ERR_OS_ERROR:
handleWin32Error (hwndDlg);
break;
case ERR_OUTOFMEMORY:
MessageBox (hwndDlg, getstr (IDS_OUTOFMEMORY), lpszTitle, ICON_HAND);
break;
case ERR_PASSWORD_WRONG:
MessageBox (hwndDlg, getstr (CheckCapsLock (NULL, TRUE) ? IDS_PASSWORD_WRONG_CAPSLOCK_ON : IDS_PASSWORD_WRONG), lpszTitle, MB_ICONEXCLAMATION);
break;
case ERR_VOL_FORMAT_BAD:
MessageBox (hwndDlg, getstr (IDS_VOL_FORMAT_BAD), lpszTitle, ICON_HAND);
break;
case ERR_BAD_DRIVE_LETTER:
MessageBox (hwndDlg, getstr (IDS_BAD_DRIVE_LETTER), lpszTitle, ICON_HAND);
break;
case ERR_DRIVE_NOT_FOUND:
MessageBox (hwndDlg, getstr (IDS_NOT_FOUND), lpszTitle, ICON_HAND);
break;
case ERR_FILES_OPEN:
MessageBox (hwndDlg, getstr (IDS_OPENFILES_DRIVER), lpszTitle, ICON_HAND);
break;
case ERR_FILES_OPEN_LOCK:
MessageBox (hwndDlg, getstr (IDS_OPENFILES_LOCK), lpszTitle, ICON_HAND);
break;
case ERR_VOL_SIZE_WRONG:
MessageBox (hwndDlg, getstr (IDS_VOL_SIZE_WRONG), lpszTitle, ICON_HAND);
break;
case ERR_COMPRESSION_NOT_SUPPORTED:
MessageBox (hwndDlg, getstr (IDS_COMPRESSION_NOT_SUPPORTED), lpszTitle, ICON_HAND);
break;
case ERR_PASSWORD_CHANGE_VOL_TYPE:
MessageBox (hwndDlg, getstr (IDS_WRONG_VOL_TYPE), lpszTitle, ICON_HAND);
break;
case ERR_PASSWORD_CHANGE_VOL_VERSION:
MessageBox (hwndDlg, getstr (IDS_WRONG_VOL_VERSION), lpszTitle, ICON_HAND);
break;
case ERR_VOL_SEEKING:
MessageBox (hwndDlg, getstr (IDS_VOL_SEEKING), lpszTitle, ICON_HAND);
break;
case ERR_VOL_WRITING:
MessageBox (hwndDlg, getstr (IDS_VOL_WRITING), lpszTitle, ICON_HAND);
break;
case ERR_VOL_READING:
MessageBox (hwndDlg, getstr (IDS_VOL_READING), lpszTitle, ICON_HAND);
break;
case ERR_VOL_ALREADY_MOUNTED:
MessageBox (hwndDlg, getstr (IDS_VOL_ALREADY_MOUNTED), lpszTitle, ICON_HAND);
break;
case ERR_FILE_OPEN_FAILED:
MessageBox (hwndDlg, getstr (IDS_FILE_OPEN_FAILED), lpszTitle, ICON_HAND);
break;
case ERR_VOL_MOUNT_FAILED:
MessageBox (hwndDlg, getstr (CheckCapsLock (NULL, TRUE) ? IDS_VOL_MOUNT_FAILED_CAPSLOCK_ON : IDS_VOL_MOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
break;
case ERR_NO_FREE_SLOTS:
MessageBox (hwndDlg, getstr (IDS_NO_FREE_SLOTS), lpszTitle, ICON_HAND);
break;
case ERR_NO_FREE_DRIVES:
MessageBox (hwndDlg, getstr (IDS_NO_FREE_DRIVES), lpszTitle, ICON_HAND);
break;
case ERR_INVALID_DEVICE:
MessageBox (hwndDlg, getstr (IDS_INVALID_DEVICE), lpszTitle, ICON_HAND);
break;
case ERR_ACCESS_DENIED:
MessageBox (hwndDlg, getstr (IDS_ACCESS_DENIED), lpszTitle, ICON_HAND);
break;
case ERR_DRIVER_VERSION:
sprintf (szTmp, getstr (IDS_DRIVER_VERSION), VERSION_STRING);
MessageBox (hwndDlg, szTmp, lpszTitle, ICON_HAND);
break;
case ERR_NEW_VERSION_REQUIRED:
MessageBox (hwndDlg, getstr (IDS_NEW_VERSION_REQUIRED), lpszTitle, ICON_HAND);
break;
case ERR_DONT_REPORT:
break;
default:
sprintf (szTmp, getstr (IDS_UNKNOWN), code);
MessageBox (hwndDlg, szTmp, lpszTitle, ICON_HAND);
}
}
static BOOL CALLBACK SetDefaultUserFontEnum( HWND hwnd, LPARAM font)
{
SendMessage (hwnd, WM_SETFONT, (WPARAM) font, 0);
return TRUE;
}
void SetDefaultUserFont (HWND hwnd)
{
NONCLIENTMETRICS metric;
if (hUserFont == 0)
{
metric.cbSize = sizeof (NONCLIENTMETRICS);
SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &metric, 0);
metric.lfMessageFont.lfHeight = -11;
metric.lfMessageFont.lfWidth = 0;
hUserFont = CreateFontIndirect (&metric.lfMessageFont);
metric.lfMessageFont.lfUnderline = TRUE;
hUserUnderlineFont = CreateFontIndirect (&metric.lfMessageFont);
metric.lfMessageFont.lfUnderline = FALSE;
metric.lfMessageFont.lfWeight = FW_BOLD;
hUserBoldFont = CreateFontIndirect (&metric.lfMessageFont);
metric.lfMessageFont.lfUnderline = TRUE;
metric.lfMessageFont.lfWeight = FW_BOLD;
hUserUnderlineBoldFont = CreateFontIndirect (&metric.lfMessageFont);
}
EnumChildWindows (hwnd, SetDefaultUserFontEnum, (LPARAM) hUserFont);
}
void OpenVolumeExplorerWindow (int driveNo)
{
char dosName[5];
SHFILEINFO fInfo;
sprintf (dosName, "%c:\\", (char) driveNo + 'A');
// Force explorer to discover the drive
SHGetFileInfo (dosName, 0, &fInfo, sizeof (fInfo), 0);
ShellExecute (NULL, "open", dosName, NULL, NULL, SW_SHOWNORMAL);
}
static BOOL explorerCloseSent;
static BOOL CALLBACK CloseVolumeExplorerWindowsEnum( HWND hwnd, LPARAM driveNo)
{
char get[128], driveStr[10];
HWND h;
GetClassName (hwnd, get, sizeof get);
if (strcmp (get, "CabinetWClass") == 0)
{
sprintf (driveStr, "%c:\\", driveNo + 'A');
// Title bar
GetWindowText (hwnd, get, sizeof get);
if (strstr (get, driveStr) == get)
{
PostMessage (hwnd, WM_CLOSE, 0, 0);
explorerCloseSent = TRUE;
return TRUE;
}
// URL edit box
h = FindWindowEx (hwnd, 0, "WorkerW", 0);
if (!h) return TRUE;
h = FindWindowEx (h, 0, "ReBarWindow32", 0);
if (!h) return TRUE;
h = FindWindowEx (h, 0, "ComboBoxEx32", 0);
if (h)
{
SendMessage (h, WM_GETTEXT, sizeof get, (LPARAM) get);
if (strstr (get, driveStr) == get)
{
PostMessage (hwnd, WM_CLOSE, 0, 0);
explorerCloseSent = TRUE;
}
}
}
return TRUE;
}
BOOL CloseVolumeExplorerWindows (HWND hwnd, int driveNo)
{
explorerCloseSent = FALSE;
EnumWindows (CloseVolumeExplorerWindowsEnum, (LPARAM) driveNo);
return explorerCloseSent;
}
#ifndef SETUP
void GetSpeedString (unsigned __int64 speed, char *str)
{
if (speed > 1024I64*1024*1024*1024*1024*99)
sprintf (str,"%d PB/s", speed/1024/1024/1024/1024/1024);
else if (speed > 1024I64*1024*1024*1024*1024)
sprintf (str,"%.1f PB/s",(double)(speed/1024.0/1024/1024/1024/1024));
else if (speed > 1024I64*1024*1024*1024*99)
sprintf (str,"%d TB/s",speed/1024/1024/1024/1024);
else if (speed > 1024I64*1024*1024*1024)
sprintf (str,"%.1f TB/s",(double)(speed/1024.0/1024/1024/1024));
else if (speed > 1024I64*1024*1024*99)
sprintf (str,"%d GB/s",speed/1024/1024/1024);
else if (speed > 1024I64*1024*1024)
sprintf (str,"%.1f GB/s",(double)(speed/1024.0/1024/1024));
else if (speed > 1024I64*1024*99)
sprintf (str,"%d MB/s", speed/1024/1024);
else if (speed > 1024I64*1024)
sprintf (str,"%.1f MB/s",(double)(speed/1024.0/1024));
else
sprintf (str,"%d KB/s", speed/1024);
}
static void DisplayBenchmarkResults (HWND hwndDlg)
{
BENCHMARK_REC tmp_line;
char item1[100]={0};
int line = 0;
LVITEM LvItem;
HWND hList = GetDlgItem (hwndDlg, IDC_RESULTS);
int ea, i;
BOOL unsorted = TRUE;
/* Sort the list */
switch (benchmarkSortMethod)
{
case BENCHMARK_SORT_BY_SPEED:
while (unsorted)
{
unsorted = FALSE;
for (i = 0; i < benchmarkTotalItems - 1; i++)
{
if (benchmarkTable[i].meanBytesPerSec < benchmarkTable[i+1].meanBytesPerSec)
{
unsorted = TRUE;
memcpy (&tmp_line, &benchmarkTable[i], sizeof(BENCHMARK_REC));
memcpy (&benchmarkTable[i], &benchmarkTable[i+1], sizeof(BENCHMARK_REC));
memcpy (&benchmarkTable[i+1], &tmp_line, sizeof(BENCHMARK_REC));
}
}
}
break;
case BENCHMARK_SORT_BY_NAME:
while (unsorted)
{
unsorted = FALSE;
for (i = 0; i < benchmarkTotalItems - 1; i++)
{
if (benchmarkTable[i].id > benchmarkTable[i+1].id)
{
unsorted = TRUE;
memcpy (&tmp_line, &benchmarkTable[i], sizeof(BENCHMARK_REC));
memcpy (&benchmarkTable[i], &benchmarkTable[i+1], sizeof(BENCHMARK_REC));
memcpy (&benchmarkTable[i+1], &tmp_line, sizeof(BENCHMARK_REC));
}
}
}
break;
}
/* Render the results */
SendMessage (hList,LVM_DELETEALLITEMS,0,(LPARAM)&LvItem);
for (i = 0; i < benchmarkTotalItems; i++)
{
ea = benchmarkTable[i].id;
memset (&LvItem,0,sizeof(LvItem));
LvItem.mask = LVIF_TEXT;
LvItem.iItem = line++;
LvItem.iSubItem = 0;
LvItem.pszText = benchmarkTable[i].name;
SendMessage (hList,LVM_INSERTITEM,0,(LPARAM)&LvItem);
GetSpeedString((unsigned __int64) (benchmarkLastBufferSize / ((float) benchmarkTable[i].encSpeed / benchmarkPerformanceFrequency.QuadPart)), item1);
LvItem.iSubItem = 1;
LvItem.pszText = item1;
SendMessage (hList,LVM_SETITEM,0,(LPARAM)&LvItem);
GetSpeedString((unsigned __int64) (benchmarkLastBufferSize / ((float) benchmarkTable[i].decSpeed / benchmarkPerformanceFrequency.QuadPart)), item1);
LvItem.iSubItem = 2;
LvItem.pszText = item1;
SendMessage (hList,LVM_SETITEM,0,(LPARAM)&LvItem);
GetSpeedString(benchmarkTable[i].meanBytesPerSec, item1);
LvItem.iSubItem = 3;
LvItem.pszText = item1;
SendMessage (hList,LVM_SETITEM,0,(LPARAM)&LvItem);
}
}
static BOOL PerformBenchmark(HWND hwndDlg)
{
LARGE_INTEGER performanceCountStart, performanceCountEnd;
BYTE *lpTestBuffer;
HWND hList = GetDlgItem (hwndDlg, IDC_RESULTS);
int ea;
unsigned char iv[DISK_IV_SIZE];
unsigned char ks[MAX_EXPANDED_KEY];
unsigned char key[DISKKEY_SIZE];
if (QueryPerformanceFrequency (&benchmarkPerformanceFrequency) == 0)
{
MessageBox (hwndDlg, "Error: Your hardware does not support a high-resolution performance counter.", lpszTitle, ICON_HAND);
return FALSE;
}
ArrowWaitCursor ();
lpTestBuffer = malloc(benchmarkBufferSize - (benchmarkBufferSize % 16));
if (lpTestBuffer == NULL)
{
NormalCursor ();
MessageBox (hwndDlg, "Error: Cannot allocate memory.", lpszTitle, ICON_HAND);
return FALSE;
}
VirtualLock (lpTestBuffer, benchmarkBufferSize - (benchmarkBufferSize % 16));
benchmarkTotalItems = 0;
for (ea = EAGetFirst(); ea != 0; ea = EAGetNext(ea))
{
EAInit (ea, key, ks);
if (QueryPerformanceCounter (&performanceCountStart) == 0)
goto counter_error;
EncryptBuffer ((unsigned long *) lpTestBuffer, (unsigned __int64) benchmarkBufferSize, ks, iv, iv, ea);
if (QueryPerformanceCounter (&performanceCountEnd) == 0)
goto counter_error;
benchmarkTable[benchmarkTotalItems].encSpeed = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
if (QueryPerformanceCounter (&performanceCountStart) == 0)
goto counter_error;
DecryptBuffer ((unsigned long *) lpTestBuffer, (unsigned __int64) benchmarkBufferSize, ks, iv, iv, ea);
if (QueryPerformanceCounter (&performanceCountEnd) == 0)
goto counter_error;
benchmarkTable[benchmarkTotalItems].decSpeed = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
benchmarkTable[benchmarkTotalItems].id = ea;
benchmarkTable[benchmarkTotalItems].meanBytesPerSec = ((unsigned __int64) (benchmarkBufferSize / ((float) benchmarkTable[benchmarkTotalItems].encSpeed / benchmarkPerformanceFrequency.QuadPart)) + (unsigned __int64) (benchmarkBufferSize / ((float) benchmarkTable[benchmarkTotalItems].decSpeed / benchmarkPerformanceFrequency.QuadPart))) / 2;
EAGetName (benchmarkTable[benchmarkTotalItems].name, ea);
benchmarkTotalItems++;
}
VirtualUnlock (lpTestBuffer, benchmarkBufferSize - (benchmarkBufferSize % 16));
free(lpTestBuffer);
benchmarkLastBufferSize = benchmarkBufferSize;
DisplayBenchmarkResults(hwndDlg);
EnableWindow (GetDlgItem (hwndDlg, ID_PERFORM_BENCHMARK), TRUE);
EnableWindow (GetDlgItem (hwndDlg, IDCLOSE), TRUE);
NormalCursor ();
return TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -