📄 mount.c
字号:
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem(list, &listItem);
listItem.iSubItem++;
listItem.pszText = (LPSTR)prop.wszVolume;
if (nCurrentOS == WIN_NT)
{
ToSBCS (prop.wszVolume);
if (prop.wszVolume[0] == '?\\')
listItem.pszText = (LPSTR)prop.wszVolume + 4;
}
ListView_SetItem(list, &listItem);
listItem.pszText = "Volume Size";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem(list, &listItem);
listItem.iSubItem++;
sprintf (szTmp, "%I64d bytes", prop.diskLength);
listItem.pszText = szTmp;
ListView_SetItem (list, &listItem);
listItem.pszText = "Cipher";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem(list, &listItem);
listItem.iSubItem++;
listItem.pszText = get_cipher_name (prop.cipher);
ListView_SetItem (list, &listItem);
listItem.pszText = "Key Size";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem(list, &listItem);
listItem.iSubItem++;
sprintf (szTmp, "%d bits", get_key_size (prop.cipher)*8);
listItem.pszText = szTmp;
ListView_SetItem (list, &listItem);
listItem.pszText = "PKCS5 PRF";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem(list, &listItem);
listItem.iSubItem++;
listItem.pszText = get_hash_name (prop.pkcs5);
ListView_SetItem (list, &listItem);
listItem.pszText = "PKCS5 Iterations";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem(list, &listItem);
listItem.iSubItem++;
sprintf (szTmp, "%d", prop.pkcs5Iterations);
listItem.pszText = szTmp;
ListView_SetItem (list, &listItem);
{
FILETIME ft, curFt;
SYSTEMTIME st;
char date[128];
memset (date, 0, sizeof (date));
listItem.pszText = "Volume Created";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem (list, &listItem);
listItem.iSubItem++;
*(unsigned __int64 *)(&ft) = prop.volumeCreationTime;
FileTimeToSystemTime (&ft, &st);
GetDateFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
sprintf (date, "%s ", szTmp);
GetTimeFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
strcat (date, szTmp);
listItem.pszText = date;
ListView_SetItem (list, &listItem);
listItem.pszText = "Password Changed";
listItem.iItem++;
listItem.iSubItem = 0;
ListView_InsertItem (list, &listItem);
listItem.iSubItem++;
*(unsigned __int64 *)(&ft) = prop.headerCreationTime;
FileTimeToSystemTime (&ft, &st);
GetDateFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
sprintf (date, "%s ", szTmp);
GetTimeFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
strcat (date, szTmp);
GetLocalTime (&st);
SystemTimeToFileTime (&st, &curFt);
sprintf (date + strlen (date), " (%I64d days ago)"
, (*(__int64 *)&curFt - *(__int64 *)&ft)/1000000000000 );
listItem.pszText = date;
ListView_SetItem (list, &listItem);
}
return 1;
}
case WM_COMMAND:
if (lw == IDCANCEL)
{
EndDialog (hwndDlg, lw);
return 1;
}
if (lw == IDOK)
{
EndDialog (hwndDlg, lw);
return 1;
}
return 0;
}
return 0;
}
void
BuildTree (HWND hTree)
{
HIMAGELIST hList;
HBITMAP hBitmap, hBitmapMask;
LVCOLUMN lvCol;
SendMessage(hTree,LVM_SETEXTENDEDLISTVIEWSTYLE,0,
LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
//|LVS_EX_GRIDLINES
//|LVS_EX_TWOCLICKACTIVATE
);
memset(&lvCol,0,sizeof(lvCol));
lvCol.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVCF_FMT;
lvCol.pszText="Drive";
lvCol.cx=40;
lvCol.fmt = LVCFMT_COL_HAS_IMAGES|LVCFMT_LEFT ;
SendMessage (hTree,LVM_INSERTCOLUMN,0,(LPARAM)&lvCol);
lvCol.pszText="Volume";
lvCol.cx=290;
lvCol.fmt = LVCFMT_LEFT;
SendMessage (hTree,LVM_INSERTCOLUMN,1,(LPARAM)&lvCol);
lvCol.pszText="Size";
lvCol.cx=80;
lvCol.fmt = LVCFMT_RIGHT;
SendMessage (hTree,LVM_INSERTCOLUMN,2,(LPARAM)&lvCol);
lvCol.pszText="Cipher";
lvCol.cx=110;
lvCol.fmt = LVCFMT_LEFT;
SendMessage (hTree,LVM_INSERTCOLUMN,3,(LPARAM)&lvCol);
hBitmap = LoadBitmap (hInst, MAKEINTRESOURCE (IDB_DRIVEICON));
if (hBitmap == NULL)
return;
hBitmapMask = LoadBitmap (hInst, MAKEINTRESOURCE (IDB_DRIVEICON_MASK));
hList = ImageList_Create (16, 12, ILC_COLOR8|ILC_MASK, 2, 2);
if (ImageList_Add (hList, hBitmap, hBitmapMask) == -1)
{
DeleteObject (hBitmap);
return;
}
else
DeleteObject (hBitmap);
ListView_SetImageList (hTree, hList, LVSIL_NORMAL);
ListView_SetImageList (hTree, hList, LVSIL_SMALL);
LoadDriveLetters (hTree, 0);
}
LPARAM
GetSelectedLong (HWND hTree)
{
int hItem = ListView_GetSelectionMark (hTree);
LVITEM item;
if (nSelectedDriveIndex != 0)
hItem = nSelectedDriveIndex;
memset(&item, 0, sizeof(LVITEM));
item.mask = LVIF_PARAM;
item.iItem = hItem;
if (ListView_GetItem (hTree, &item) == FALSE)
return MAKELONG (0xffff, 0xffff);
else
return item.lParam;
}
LPARAM
GetItemLong (HWND hTree, int itemNo)
{
LVITEM item;
memset(&item, 0, sizeof(LVITEM));
item.mask = LVIF_PARAM;
item.iItem = itemNo;
if (ListView_GetItem (hTree, &item) == FALSE)
return MAKELONG (0xffff, 0xffff);
else
return item.lParam;
}
static BOOL MountVolume (HWND hwndDlg, int driveNo, char *volumePath, char *szPassword, int quiet)
{
MOUNT_STRUCT driver;
DWORD dwResult;
BOOL bResult, bDevice;
if (IsMountedVolume (volumePath))
{
if (!quiet)
MessageBox(0, getstr (IDS_ALREADY_MOUNTED), lpszTitle, MB_ICONASTERISK);
return FALSE;
}
driver.nDosDriveNo = driveNo;
driver.bCache = bCacheInDriver;
driver.time = time (NULL);
driver.nPasswordLen = strlen (szPassword);
strcpy (driver.szPassword, szPassword);
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)
{
if (!quiet)
handleWin32Error (hwndDlg);
return bResult;
}
else
{
if (driver.nReturnCode == 0)
{
if (nCurrentOS == WIN_NT)
{
char *lpszPipeName = "\\\\.\\pipe\\truecryptservice";
DWORD bytesRead;
char inbuf[80];
char outbuf[80];
sprintf (outbuf, "mount %d", driver.nDosDriveNo);
bResult = CallNamedPipe (lpszPipeName,
outbuf, sizeof (outbuf),
inbuf, sizeof (inbuf),
&bytesRead, NMPWAIT_WAIT_FOREVER);
if (bResult == FALSE)
{
handleWin32Error (hwndDlg);
}
else
{
DWORD os_err = 0;
int err = 0;
sscanf (inbuf, "%s %d %lu", outbuf, &err, &os_err);
if (*inbuf == '-' && !quiet)
{
if (err == ERR_OS_ERROR)
{
SetLastError (os_err);
handleWin32Error (hwndDlg);
}
else
{
handleError (hwndDlg, err);
}
bResult = 0;
}
}
if (bResult == FALSE && !quiet)
{
if (bQuiet == FALSE)
MessageBox (hwndDlg, getstr (IDS_SYMLINK), lpszTitle, ICON_HAND);
return FALSE;
}
}
else
{
EjectStop ((char)toupper(szFileName[0]), TRUE);
}
}
else
{
if (bQuiet == FALSE)
{
if (!quiet) handleError (hwndDlg, driver.nReturnCode);
}
else
EndMainDlg (hwndDlg);
return FALSE;
}
}
return TRUE;
}
static BOOL IsPasswordCacheEmpty (void)
{
DWORD dw;
return !DeviceIoControl (hDriver, CACHE_STATUS, 0, 0, 0, 0, &dw, 0);
}
static 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;
}
static int AskUserPassword (HWND hwndDlg, char *password)
{
int result = DialogBoxParam (hInst,
MAKEINTRESOURCE (IDD_PASSWORD_DLG), hwndDlg,
(DLGPROC) PasswordDlgProc, (LPARAM) password);
if (result != IDOK)
*password = 0;
return result == IDOK;
}
// GUI actions
static void Mount (HWND hwndDlg)
{
char szPassword[MAX_PASSWORD + 1];
int mounted = 0;
int nDosDriveNo = HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) - 'A';
burn (szPassword, sizeof (szPassword));
GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName,
sizeof (szFileName));
if (strlen(szFileName) == 0)
return;
if (IsMountedVolume (szFileName))
{
MessageBox(0, getstr (IDS_ALREADY_MOUNTED), lpszTitle, MB_ICONASTERISK);
return;
}
// First try cached passwords and if they fail ask user for a new one
ArrowWaitCursor ();
mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, "", TRUE);
NormalCursor ();
while (!mounted)
{
if (!AskUserPassword (hwndDlg, szPassword))
return;
ArrowWaitCursor ();
mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, szPassword, FALSE);
NormalCursor ();
}
if (mounted)
{
if (bBeep == TRUE)
MessageBeep (MB_OK);
RefreshMainDlg(hwndDlg);
if (bExplore == TRUE)
{
ArrowWaitCursor();
OpenVolumeExplorerWindow (nDosDriveNo);
NormalCursor();
}
}
burn (szPassword, sizeof (szPassword));
return;
}
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 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);
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);
}
}
return TRUE;
}
void CloseVolumeExplorerWindows (HWND hwnd, int driveNo)
{
EnumWindows (CloseVolumeExplorerWindowsEnum, (LPARAM) driveNo);
}
static void Dismount (HWND hwndDlg)
{
char *lpszPipeName = "\\\\.\\pipe\\truecryptservice";
DWORD bytesRead;
BOOL bResult;
int nDosDriveNo;
char inbuf[80];
char outbuf[80];
nDosDriveNo = (char) (HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) - 'A');
if (nCurrentOS == WIN_NT)
{
if (bCloseDismountedWindows)
CloseVolumeExplorerWindows (hwndDlg, nDosDriveNo);
/* Unmount the volume using the TrueCryptService,
this is done to allow non-administrators
to unmount volumes */
sprintf (outbuf, "unmount %d", nDosDriveNo);
ArrowWaitCursor ();
bResult = CallNamedPipe (lpszPipeName,
outbuf, sizeof (outbuf),
inbuf, sizeof (inbuf),
&bytesRead, NMPWAIT_WAIT_FOREVER);
NormalCursor ();
if (bResult == FALSE)
{
handleWin32Error (hwndDlg);
}
else
{
DWORD os_err = 0;
int err = 0;
sscanf (inbuf, "%s %d %lu", outbuf, &err, &os_err);
if (*inbuf == '-')
{
//if (err == ERR_OS_ERROR)
//{
// SetLastError (os_err);
// handleWin32Error (hwndDlg);
//}
//else
//{
// handleError (hwndDlg, err);
//}
MessageBox(0, getstr (IDS_UNMOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
}
else
{
//if (bBeep == TRUE)
// MessageBeep (MB_OK);
RefreshMainDlg(hwndDlg);
}
}
}
else
{
int err = 0;
bResult = CloseSlot (nDosDriveNo, 0, &err);
if (bResult == FALSE)
{
handleWin32Error (hwndDlg);
}
else
{
if (err != 0)
{
//handleError (hwndDlg, err);
MessageBox(0, getstr (IDS_UNMOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
}
else
{
//if (bBeep == TRUE)
// MessageBeep (MB_OK);
RefreshMainDlg(hwndDlg);
}
}
}
return;
}
static void DismountAll (HWND hwndDlg)
{
char *lpszPipeName = "\\\\.\\pipe\\truecryptservice";
DWORD bytesRead;
BOOL bResult;
int nDosDriveNo;
char inbuf[80];
char outbuf[80];
nDosDriveNo = (char) (HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) -
'A');
ArrowWaitCursor();
if (nCurrentOS == WIN_NT)
{
if (bCloseDismountedWindows)
{
MOUNT_LIST_STRUCT driver;
DWORD dwResult;
if (DeviceIoControl (hDriver, MOUNT_LIST, &driver, sizeof (driver), &driver, sizeof (driver), &dwResult, NULL))
{
int i;
for (i = 0; i < 26; i++)
if ((driver.ulMountedDrives & 1 << i))
CloseVolumeExplorerWindows (hwndDlg, i);
}
}
/* Unmount the volume using the TrueCryptService,
this is done to allow non-administrators
to unmount volumes */
strcpy (outbuf, "unmountall");
ArrowWaitCursor ();
bResult = CallNamedPipe (lpszPipeName,
outbuf, sizeof (outbuf),
inbuf, sizeof (inbuf),
&bytesRead, NMPWAIT_WAIT_FOREVER);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -