📄 dlgcode.c
字号:
win9x_r0->sectorstart += secs;
return uBytes;
}
int
GetAvailableFixedDisks (HWND hComboBox, char *lpszRootPath)
{
int i, n;
int line = 0;
for (i = 0; i < 64; i++)
{
BOOL drivePresent = FALSE;
for (n = 1; n <= 32; n++)
{
char szTmp[TC_MAX_PATH], item1[100]={0}, item2[100]={0};
OPEN_TEST_STRUCT driver;
sprintf (szTmp, lpszRootPath, i, n);
if (OpenDevice (szTmp, &driver) == TRUE)
{
int nDosLinkCreated;
HANDLE dev;
DWORD dwResult;
BOOL bResult;
PARTITION_INFORMATION diskInfo;
LVITEM LvItem;
char szDosDevice[TC_MAX_PATH], szCFDevice[TC_MAX_PATH];
if(!drivePresent)
{
LVITEM LvItem;
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask=LVIF_TEXT;
LvItem.iItem= line++;
sprintf(szDosDevice, " Harddisk %d:", i);
LvItem.pszText = szDosDevice;
SendMessage(hComboBox, LVM_INSERTITEM, 0, (LPARAM)&LvItem);
}
drivePresent = TRUE;
if (nCurrentOS == WIN_NT)
{
nDosLinkCreated = FakeDosNameForDevice (szTmp, szDosDevice,
szCFDevice, FALSE);
dev = CreateFile (szCFDevice, GENERIC_READ, FILE_SHARE_WRITE , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
bResult = DeviceIoControl (dev, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0,
&diskInfo, sizeof (diskInfo), &dwResult, NULL);
RemoveFakeDosName(szTmp, szDosDevice);
CloseHandle(dev);
if (bResult == TRUE)
{
char partType[100];
switch(diskInfo.PartitionType)
{
case PARTITION_ENTRY_UNUSED: strcpy(partType, "Empty"); break;
case PARTITION_EXTENDED: strcpy(partType, "Extended"); break;
case PARTITION_HUGE: strcpy(partType, "FAT"); break;
case PARTITION_FAT_12: strcpy(partType, "FAT12"); break;
case PARTITION_FAT_16: strcpy(partType, "FAT16"); break;
case PARTITION_FAT32:
case PARTITION_FAT32_XINT13: strcpy(partType, "FAT32"); break;
case 0x11:
case 0x14:
case 0x16:
case 0x1b:
case 0x1c:
case 0x1e: strcpy(partType, "Hidden FAT"); break;
case PARTITION_IFS: strcpy(partType, "NTFS"); break;
case 0x17: strcpy(partType, "Hidden NTFS"); break;
case PARTITION_LDM: strcpy(partType, "LDM"); break;
case PARTITION_UNIX: strcpy(partType, "UNIX"); break;
case 0x83: strcpy(partType, "Linux"); break;
case 0x82: strcpy(partType, "Linux Swap"); break;
default: sprintf(partType, "Unknown (0x%02x)", diskInfo.PartitionType); break;
}
if(diskInfo.PartitionLength.QuadPart > 1024I64*1024*1024)
sprintf (item1,"%.1f GB",(double)(diskInfo.PartitionLength.QuadPart/1024.0/1024/1024));
else
sprintf (item1,"%d MB", diskInfo.PartitionLength.QuadPart/1024/1024);
strcpy (item2, partType);
}
}
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask=LVIF_TEXT;
LvItem.iItem= line++;
LvItem.pszText=szTmp;
SendMessage(hComboBox,LVM_INSERTITEM,0,(LPARAM)&LvItem);
LvItem.iSubItem=1;
LvItem.pszText=item1;
SendMessage(hComboBox,LVM_SETITEM,0,(LPARAM)&LvItem);
LvItem.iSubItem=2;
LvItem.pszText=item2;
SendMessage(hComboBox,LVM_SETITEM,0,(LPARAM)&LvItem);
}
else
{
if(drivePresent)
{
LVITEM LvItem;
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask=LVIF_TEXT;
LvItem.iItem= line++;
LvItem.pszText="";
SendMessage(hComboBox,LVM_INSERTITEM,0,(LPARAM)&LvItem);
}
if (n == 1)
i = 64;
break;
}
}
}
i = SendMessage (hComboBox, LVM_GETITEMCOUNT, 0, 0);
if (i != CB_ERR)
return i;
else
return 0;
}
int
GetAvailableRemovables (HWND hComboBox, char *lpszRootPath)
{
char szTmp[TC_MAX_PATH];
int i;
LVITEM LvItem;
if (lpszRootPath); /* Remove unused parameter warning */
if (nCurrentOS != WIN_NT)
return 0;
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask = LVIF_TEXT;
LvItem.iItem = SendMessage (hComboBox, LVM_GETITEMCOUNT, 0, 0)+1;
if (QueryDosDevice ("A:", szTmp, sizeof (szTmp)) != 0)
{
LvItem.pszText="Floppy (A:)";
SendMessage(hComboBox,LVM_INSERTITEM,0,(LPARAM)&LvItem);
}
if (QueryDosDevice ("B:", szTmp, sizeof (szTmp)) != 0)
{
LvItem.pszText="Floppy (B:)";
SendMessage(hComboBox,LVM_INSERTITEM,0,(LPARAM)&LvItem);
}
i = SendMessage (hComboBox, LVM_GETITEMCOUNT, 0, 0);
if (i != CB_ERR)
return i;
else
return 0;
}
BOOL WINAPI
RawDevicesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static char *lpszFileName;
WORD lw = LOWORD (wParam);
if (lParam); /* remove warning */
switch (msg)
{
case WM_INITDIALOG:
{
int nCount;
LVCOLUMN LvCol;
HWND hList = GetDlgItem (hwndDlg, IDC_DEVICELIST);
SetDefaultUserFont (hwndDlg);
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 = "Device";
LvCol.cx =160;
LvCol.fmt = LVCFMT_LEFT;
SendMessage(hList,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol);
LvCol.pszText = "Size";
LvCol.cx = 64;
LvCol.fmt = LVCFMT_RIGHT;
SendMessage(hList,LVM_INSERTCOLUMN,1,(LPARAM)&LvCol);
LvCol.pszText = "Type";
LvCol.cx = 92;
LvCol.fmt = LVCFMT_LEFT;
SendMessage(hList,LVM_INSERTCOLUMN,2,(LPARAM)&LvCol);
nCount = GetAvailableFixedDisks (hList, "\\Device\\Harddisk%d\\Partition%d");
nCount += GetAvailableRemovables (hList, "\\Device\\Floppy%d");
if (nCount == 0)
{
handleWin32Error (hwndDlg);
MessageBox (hwndDlg, getstr (IDS_RAWDEVICES), lpszTitle, ICON_HAND);
EndDialog (hwndDlg, IDCANCEL);
}
lpszFileName = (char *) lParam;
return 1;
}
case WM_COMMAND:
case WM_NOTIFY:
// catch non-device line selected
if (msg == WM_NOTIFY && ((LPNMHDR) lParam)->code == LVN_ITEMCHANGED && (((LPNMLISTVIEW) lParam)->uNewState & LVIS_FOCUSED ))
{
LVITEM LvItem;
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask = LVIF_TEXT;
LvItem.iItem = ((LPNMLISTVIEW) lParam)->iItem;
LvItem.pszText = lpszFileName;
LvItem.cchTextMax = TC_MAX_PATH;
SendMessage (GetDlgItem (hwndDlg, IDC_DEVICELIST), LVM_GETITEMTEXT, LvItem.iItem, (LPARAM) &LvItem);
EnableWindow (GetDlgItem ((HWND) hwndDlg, IDOK), lpszFileName[0] != 0 && lpszFileName[0] != ' ');
return 1;
}
if (msg == WM_COMMAND && lw == IDOK || msg == WM_NOTIFY && ((NMHDR *)lParam)->code == LVN_ITEMACTIVATE)
{
LVITEM LvItem;
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask = LVIF_TEXT;
LvItem.iItem = SendMessage (GetDlgItem (hwndDlg, IDC_DEVICELIST), LVM_GETSELECTIONMARK, 0, 0);
LvItem.pszText = lpszFileName;
LvItem.cchTextMax = TC_MAX_PATH;
SendMessage (GetDlgItem (hwndDlg, IDC_DEVICELIST), LVM_GETITEMTEXT, LvItem.iItem, (LPARAM) &LvItem);
if(lpszFileName[0]==0 || lpszFileName[0]==' ')
break; // non-device line selected
EndDialog (hwndDlg, IDOK);
return 0;
}
if (lw == IDCANCEL)
{
EndDialog (hwndDlg, IDCANCEL);
return 0;
}
return 0;
}
return 0;
}
int
DriverAttach (void)
{
/* Try to open a handle to the device driver. It will be closed
later. */
if (nCurrentOS == WIN_NT)
hDriver = CreateFile (WIN32_ROOT_PREFIX, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
else
hDriver = CreateFile (WIN9X_DRIVER_NAME, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hDriver == INVALID_HANDLE_VALUE)
{
return ERR_OS_ERROR;
}
#ifndef SETUP // Don't check version during setup to allow removal of older version
else
{
LONG driver = 0;
DWORD dwResult;
BOOL bResult = DeviceIoControl (hDriver, DRIVER_VERSION,
&driver, 4, &driver, 4, &dwResult, NULL);
if (bResult == FALSE)
return ERR_OS_ERROR;
else if (driver != VERSION_NUM)
return ERR_DRIVER_VERSION;
}
#endif
if (nCurrentOS == WIN_98)
{
DWORD dwResult;
DeviceIoControl (hDriver, ALLOW_FAST_SHUTDOWN, NULL, 0, NULL, 0, &dwResult, NULL);
}
return 0;
}
BOOL
BrowseFiles (HWND hwndDlg, UINT nTitleID, char *lpszFileName)
{
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;
//ofn.lpstrDefExt = "tc";
if (!GetOpenFileName (&ofn))
return FALSE;
else
return TRUE;
}
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 (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 (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;
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);
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);
}
EnumChildWindows (hwnd, SetDefaultUserFontEnum, (LPARAM) hUserFont);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -