📄 dlgcode.c
字号:
counter_error:
VirtualUnlock (lpTestBuffer, benchmarkBufferSize - (benchmarkBufferSize % 16));
free(lpTestBuffer);
NormalCursor ();
EnableWindow (GetDlgItem (hwndDlg, ID_PERFORM_BENCHMARK), TRUE);
EnableWindow (GetDlgItem (hwndDlg, IDCLOSE), TRUE);
MessageBox (hwndDlg, "Error: Could not retrieve value of performance counter.", lpszTitle, ICON_HAND);
return FALSE;
}
BOOL WINAPI BenchmarkDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
LPARAM nIndex;
HWND hCboxSortMethod = GetDlgItem (hwndDlg, IDC_BENCHMARK_SORT_METHOD);
HWND hCboxBufferSize = GetDlgItem (hwndDlg, IDC_BENCHMARK_BUFFER_SIZE);
switch (msg)
{
case WM_INITDIALOG:
{
LVCOLUMN LvCol;
HWND hList = GetDlgItem (hwndDlg, IDC_RESULTS);
SetDefaultUserFont (hwndDlg);
benchmarkBufferSize = BENCHMARK_DEFAULT_BUF_SIZE;
benchmarkSortMethod = BENCHMARK_SORT_BY_SPEED;
SendMessage (hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,
LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_TWOCLICKACTIVATE
);
memset (&LvCol,0,sizeof(LvCol));
LvCol.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVCF_FMT;
LvCol.pszText = "Algorithm";
LvCol.cx =114;
LvCol.fmt = LVCFMT_LEFT;
SendMessage (hList,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol);
LvCol.pszText = "Encryption";
LvCol.cx = 80;
LvCol.fmt = LVCFMT_RIGHT;
SendMessage (hList,LVM_INSERTCOLUMN,1,(LPARAM)&LvCol);
LvCol.pszText = "Decryption";
LvCol.cx = 80;
LvCol.fmt = LVCFMT_RIGHT;
SendMessage (hList,LVM_INSERTCOLUMN,2,(LPARAM)&LvCol);
LvCol.pszText = "Mean";
LvCol.cx = 80;
LvCol.fmt = LVCFMT_RIGHT;
SendMessage (hList,LVM_INSERTCOLUMN,3,(LPARAM)&LvCol);
/* Combo boxes */
// Sort method
SendMessage (hCboxSortMethod, CB_RESETCONTENT, 0, 0);
nIndex = SendMessage (hCboxSortMethod, CB_ADDSTRING, 0, (LPARAM) "Alphabetical/Categorized");
SendMessage (hCboxSortMethod, CB_SETITEMDATA, nIndex, (LPARAM) 0);
nIndex = SendMessage (hCboxSortMethod, CB_ADDSTRING, 0, (LPARAM) "Mean Speed (Descending)");
SendMessage (hCboxSortMethod, CB_SETITEMDATA, nIndex, (LPARAM) 0);
SendMessage (hCboxSortMethod, CB_SETCURSEL, 1, 0); // Default sort method
// Buffer size
SendMessage (hCboxBufferSize, CB_RESETCONTENT, 0, 0);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "5 KB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 5 * BYTES_PER_KB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "100 KB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 100 * BYTES_PER_KB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "500 KB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 500 * BYTES_PER_KB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "1 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 1 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "5 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 5 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "10 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 10 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "50 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 50 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "100 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 100 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "200 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 200 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "500 MB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 500 * BYTES_PER_MB);
nIndex = SendMessage (hCboxBufferSize, CB_ADDSTRING, 0, (LPARAM) "1 GB");
SendMessage (hCboxBufferSize, CB_SETITEMDATA, nIndex, (LPARAM) 1 * BYTES_PER_GB);
SendMessage (hCboxBufferSize, CB_SETCURSEL, 3, 0); // Default size
return 1;
}
break;
case WM_COMMAND:
case WM_NOTIFY:
if (lw == IDC_BENCHMARK_SORT_METHOD)
{
nIndex = SendMessage (hCboxSortMethod, CB_GETCURSEL, 0, 0);
if (nIndex != benchmarkSortMethod)
{
benchmarkSortMethod = nIndex;
DisplayBenchmarkResults (hwndDlg);
}
}
if (lw == ID_PERFORM_BENCHMARK)
{
nIndex = SendMessage (hCboxBufferSize, CB_GETCURSEL, 0, 0);
benchmarkBufferSize = SendMessage (hCboxBufferSize, CB_GETITEMDATA, nIndex, 0);
if (PerformBenchmark(hwndDlg) == FALSE)
{
EndDialog (hwndDlg, IDCLOSE);
}
return 0;
}
if (lw == IDCLOSE)
{
EndDialog (hwndDlg, IDCLOSE);
return 0;
}
return 0;
break;
case WM_CLOSE:
EndDialog (hwndDlg, IDCLOSE);
return 0;
break;
}
return 0;
}
#endif // #ifndef SETUP
BOOL CheckCapsLock (HWND hwnd, BOOL quiet)
{
if ((GetKeyState(VK_CAPITAL) & 1) != 0)
{
if (!quiet)
{
MessageBox (hwnd, getstr (IDS_CAPSLOCK_ON), lpszTitle, MB_ICONEXCLAMATION);
}
return TRUE;
}
return FALSE;
}
BOOL CheckPasswordLength (HWND hwndDlg, HWND hwndItem)
{
if (GetWindowTextLength (hwndItem) < PASSWORD_LEN_WARNING)
{
if (MessageBox (hwndDlg, getstr (IDS_PASSWORD_LENGTH_WARNING), lpszTitle, MB_YESNO|MB_ICONWARNING|MB_DEFBUTTON2) != IDYES)
return FALSE;
}
return TRUE;
}
int GetFirstAvailableDrive ()
{
DWORD dwUsedDrives = GetLogicalDrives();
int i;
for (i = 3; i < 26; i++)
{
if (!(dwUsedDrives & 1 << i))
return i;
}
return -1;
}
int GetLastAvailableDrive ()
{
DWORD dwUsedDrives = GetLogicalDrives();
int i;
for (i = 25; i > 2; i--)
{
if (!(dwUsedDrives & 1 << i))
return i;
}
return -1;
}
BOOL IsDriveAvailable (int driveNo)
{
return (GetLogicalDrives() & (1 << driveNo)) == 0;
}
int DriverUnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forced)
{
UNMOUNT_STRUCT unmount;
DWORD dwResult;
BOOL bResult;
unmount.nDosDriveNo = nDosDriveNo;
unmount.ignoreOpenFiles = forced;
bResult = DeviceIoControl (hDriver, UNMOUNT, &unmount,
sizeof (unmount), &unmount, sizeof (unmount), &dwResult, NULL);
if (bResult == FALSE)
{
handleWin32Error (hwndDlg);
return 1;
}
return unmount.nReturnCode;
}
void BroadcastDeviceChange (WPARAM message, int nDosDriveNo, DWORD driveMap)
{
DEV_BROADCAST_VOLUME dbv;
char root[] = {0, ':', '\\', 0 };
DWORD dwResult;
LONG event = 0;
int i;
if (message == DBT_DEVICEARRIVAL) event = SHCNE_DRIVEADD;
if (message == DBT_DEVICEREMOVECOMPLETE) event = SHCNE_DRIVEREMOVED;
if (driveMap == 0)
{
root[0] = nDosDriveNo + 'A';
SHChangeNotify(event, SHCNF_PATH, root, NULL);
}
else
{
for (i = 0; i < 26; i++)
{
if (driveMap & (1 << i))
{
root[0] = i + 'A';
SHChangeNotify(event, SHCNF_PATH, root, NULL);
}
}
}
dbv.dbcv_size = sizeof(dbv);
dbv.dbcv_devicetype = DBT_DEVTYP_VOLUME;
dbv.dbcv_reserved = 0;
dbv.dbcv_unitmask = (driveMap != 0) ? driveMap : (1 << nDosDriveNo);
dbv.dbcv_flags = 0;
SendMessageTimeout (HWND_BROADCAST, WM_DEVICECHANGE, message, (LPARAM)(&dbv), 0, 500, &dwResult);
}
// Returns:
// -1 = user aborted mount / error
// 0 = mount failed
// 1 = mount OK
// 2 = mount OK in shared mode
int MountVolume (HWND hwndDlg,
int driveNo,
char *volumePath,
char *szPassword,
BOOL cachePassword,
BOOL sharedAccess,
MountOptions *mountOptions,
BOOL quiet)
{
MOUNT_STRUCT driver;
DWORD dwResult;
BOOL bResult, bDevice;
if (IsMountedVolume (volumePath))
{
if (!quiet)
MessageBox(0, getstr (IDS_ALREADY_MOUNTED), lpszTitle, MB_ICONASTERISK);
return -1;
}
if (!IsDriveAvailable (driveNo))
return -1;
// If using cached passwords, check cache status first
if (szPassword[0] == 0 && IsPasswordCacheEmpty ())
return 0;
ZeroMemory (&driver, sizeof (driver));
driver.bExclusiveAccess = sharedAccess ? FALSE : TRUE;
retry:
driver.nDosDriveNo = driveNo;
driver.bCache = cachePassword;
driver.time = time (NULL);
driver.nPasswordLen = strlen (szPassword);
strcpy (driver.szPassword, szPassword);
driver.bMountReadOnly = mountOptions->ReadOnly;
driver.bMountRemovable = mountOptions->Removable;
driver.bMountManager = TRUE;
// Windows 2000 mount manager causes problems with remounted volumes
if (CurrentOSMajor == 5 && CurrentOSMinor == 0)
driver.bMountManager = FALSE;
CreateFullVolumePath ((char *) driver.wszVolume, volumePath, &bDevice);
if (nCurrentOS == WIN_NT)
ToUNICODE ((char *) driver.wszVolume);
bResult = DeviceIoControl (hDriver, MOUNT, &driver,
sizeof (driver), &driver, sizeof (driver), &dwResult, NULL);
burn (&driver.szPassword, sizeof (driver.szPassword));
if (bResult == FALSE)
{
// Volume already open by another process
if (GetLastError() == ERROR_SHARING_VIOLATION)
{
if (driver.bExclusiveAccess == FALSE)
{
if (!quiet)
MessageBox (hwndDlg, getstr (bDevice ? IDS_DEVICE_IN_USE_FAILED : IDS_FILE_IN_USE_FAILED),
lpszTitle, MB_ICONSTOP);
return -1;
}
else
{
if (quiet)
{
driver.bExclusiveAccess = FALSE;
goto retry;
}
// Ask user
if (IDYES == MessageBox (hwndDlg, getstr (bDevice ? IDS_DEVICE_IN_USE : IDS_FILE_IN_USE),
lpszTitle, MB_YESNO | MB_DEFBUTTON2 | MB_ICONEXCLAMATION))
{
driver.bExclusiveAccess = FALSE;
goto retry;
}
}
return -1;
}
if (!quiet)
handleWin32Error (hwndDlg);
return -1;
}
if (driver.nReturnCode != 0)
{
// If using cached passwords, do not report wrong password
if (szPassword[0] == 0 && driver.nReturnCode == ERR_PASSWORD_WRONG)
return 0;
if (!quiet) handleError (hwndDlg, driver.nReturnCode);
return 0;
}
BroadcastDeviceChange (DBT_DEVICEARRIVAL, driveNo, 0);
if (driver.bExclusiveAccess == FALSE)
return 2;
return 1;
}
BOOL UnmountVolume (HWND hwndDlg , int nDosDriveNo, BOOL forceUnmount)
{
int result;
BOOL forced = forceUnmount;
int dismountMaxRetries = UNMOUNT_MAX_AUTO_RETRIES;
//BroadcastDeviceChange (DBT_DEVICEREMOVEPENDING, nDosDriveNo);
retry:
do
{
result = DriverUnmountVolume (hwndDlg, nDosDriveNo, forced);
if (result == ERR_FILES_OPEN)
Sleep (UNMOUNT_AUTO_RETRY_DELAY);
else
break;
} while (--dismountMaxRetries > 0);
if (result != 0)
{
if (result == ERR_FILES_OPEN)
{
if (IDYES == MessageBox (hwndDlg, getstr (IDS_UNMOUNT_LOCK_FAILED),
lpszTitle, MB_YESNO | MB_DEFBUTTON2 | MB_ICONEXCLAMATION))
{
forced = TRUE;
goto retry;
}
return FALSE;
}
MessageBox (hwndDlg, getstr (IDS_UNMOUNT_FAILED),
lpszTitle, MB_ICONERROR);
return FALSE;
}
BroadcastDeviceChange (DBT_DEVICEREMOVECOMPLETE, nDosDriveNo, 0);
return TRUE;
}
BOOL IsPasswordCacheEmpty (void)
{
DWORD dw;
return !DeviceIoControl (hDriver, CACHE_STATUS, 0, 0, 0, 0, &dw, 0);
}
BOOL IsMountedVolume (char *volname)
{
MOUNT_LIST_STRUCT mlist;
DWORD dwResult;
int i;
char volume[TC_MAX_PATH*2+16];
strcpy (volume, volname);
if (nCurrentOS == WIN_NT)
{
if (strstr (volname, "\\Device\\") != volname)
sprintf(volume, "\\??\\%s", volname);
ToUNICODE (volume);
}
memset (&mlist, 0, sizeof (mlist));
DeviceIoControl (hDriver, MOUNT_LIST, &mlist,
sizeof (mlist), &mlist, sizeof (mlist), &dwResult,
NULL);
for (i=0 ; i<26; i++)
if (nCurrentOS != WIN_NT && 0 == strcmp ((char *)mlist.wszVolume[i], volume)
|| nCurrentOS == WIN_NT && 0 == wcscmp (mlist.wszVolume[i], (WCHAR *)volume))
return TRUE;
return FALSE;
}
BOOL IsAdmin (void)
{
HANDLE hAccessToken;
UCHAR InfoBuffer[1024];
PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS) InfoBuffer;
DWORD dwInfoBufferSize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -