📄 mount.c
字号:
/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
This product uses components written by Paul Le Roux <pleroux@swprofessionals.com> */
#include "TCdefs.h"
#include "crypto.h"
#include "apidrvr.h"
#include "dlgcode.h"
#include "combo.h"
#include "registry.h"
#include "../common/resource.h"
#include "resource.h"
#include "cmdline.h"
#include "Mount.h"
#include "dismount.h"
#include "Password.h"
#include <time.h>
BOOL bExplore = FALSE; /* Display explorer window after mount */
BOOL bBeep = FALSE; /* Donot beep after mount */
char szFileName[TC_MAX_PATH]; /* Volume to mount */
char szDriveLetter[3]; /* Drive Letter to mount */
BOOL bCacheInDriver = FALSE; /* Cache any passwords we see */
BOOL bHistory = FALSE; /* Don't save history */
BOOL bHistoryCmdLine = FALSE; /* History control is always disabled */
BOOL bCloseDismountedWindows=TRUE; /* Close all open explorer windows of dismounted volume */
BOOL bWipeCacheOnExit = FALSE; /* Wipe password from chace on exit */
BOOL bWipe = FALSE; /* Wipe driver passwords */
BOOL bAuto = FALSE; /* Do everything without user input */
BOOL bQuiet = FALSE; /* No dialogs/messages */
#define VMOUNTED 1
#define VFREE 0
int nCurrentShowType = 0; /* current display mode, mount, unmount etc */
int nSelectedDriveIndex = 0; /* Item number of selected drive */
void
localcleanup (void)
{
/* Free the application title */
if (lpszTitle != NULL)
free (lpszTitle);
/* Cleanup common code resources */
cleanup ();
}
void
RefreshMainDlg (HWND hwndDlg)
{
int drive = (char) (HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))));
MoveEditToCombo (GetDlgItem (hwndDlg, IDC_VOLUME));
LoadDriveLetters (GetDlgItem (hwndDlg, IDC_DRIVELIST), drive);
EnableDisableButtons (hwndDlg);
}
void
EndMainDlg (HWND hwndDlg)
{
MoveEditToCombo (GetDlgItem (hwndDlg, IDC_VOLUME));
SaveSettings (hwndDlg);
if (bWipeCacheOnExit)
{
DWORD dwResult;
DeviceIoControl (hDriver, WIPE_CACHE, NULL, 0, NULL, 0, &dwResult, NULL);
}
EndDialog (hwndDlg, 0);
}
void
EnableDisableButtons (HWND hwndDlg)
{
HWND hOKButton = GetDlgItem (hwndDlg, IDOK);
HWND hChangeButton = GetDlgItem (hwndDlg, IDC_CHANGE_PASSWORD);
HWND hVolume = GetDlgItem (hwndDlg, IDC_VOLUME);
BOOL bEnable = TRUE;
WORD x;
x = LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST)));
if (GetWindowTextLength (GetDlgItem (hwndDlg, IDC_VOLUME)) > 0)
{
EnableWindow (hOKButton, TRUE);
EnableMenuItem (GetMenu (hwndDlg), ID_MOUNT_VOLUME, MF_ENABLED);
EnableWindow (hChangeButton, TRUE);
EnableMenuItem (GetMenu (hwndDlg), IDC_CHANGE_PASSWORD, MF_ENABLED);
}
else
{
EnableWindow (hOKButton, FALSE);
EnableMenuItem (GetMenu (hwndDlg), ID_MOUNT_VOLUME, MF_GRAYED);
EnableWindow (hChangeButton, FALSE);
EnableMenuItem (GetMenu (hwndDlg), IDC_CHANGE_PASSWORD, MF_GRAYED);
}
if (x == VFREE)
{
SetWindowText (hOKButton, getstr (IDS_MOUNT_BUTTON));
EnableMenuItem (GetMenu (hwndDlg), ID_UNMOUNT_VOLUME, MF_GRAYED);
}
if (x == VMOUNTED)
{
SetWindowText (hOKButton, getstr (IDS_UNMOUNT_BUTTON));
EnableWindow (hOKButton, TRUE);
EnableMenuItem (GetMenu (hwndDlg), ID_MOUNT_VOLUME, MF_GRAYED);
EnableMenuItem (GetMenu (hwndDlg), ID_UNMOUNT_VOLUME, MF_ENABLED);
EnableWindow (GetDlgItem (hwndDlg, IDC_VOLUME_PROPERTIES), TRUE);
EnableMenuItem (GetMenu (hwndDlg), IDC_VOLUME_PROPERTIES, MF_ENABLED);
}
else
{
EnableWindow (GetDlgItem (hwndDlg, IDC_VOLUME_PROPERTIES), FALSE);
EnableMenuItem (GetMenu (hwndDlg), IDC_VOLUME_PROPERTIES, MF_GRAYED);
}
EnableWindow (GetDlgItem (hwndDlg, IDC_WIPE_CACHE), !IsPasswordCacheEmpty());
EnableMenuItem (GetMenu (hwndDlg), IDC_WIPE_CACHE, IsPasswordCacheEmpty() ? MF_GRAYED:MF_ENABLED);
EnableMenuItem (GetMenu (hwndDlg), IDC_CLEAR_HISTORY, IsComboEmpty (GetDlgItem (hwndDlg, IDC_VOLUME)) ? MF_GRAYED:MF_ENABLED);
}
void
OpenPageHelp (HWND hwndDlg)
{
int r = (int)ShellExecute (NULL, "open", szHelpFile, NULL, NULL, SW_SHOWNORMAL);
if (r == ERROR_FILE_NOT_FOUND)
MessageBox (hwndDlg, getstr (IDS_HELP_ERROR), lpszTitle, MB_ICONERROR);
if (r == SE_ERR_NOASSOC)
MessageBox (hwndDlg, getstr (IDS_HELP_READER_ERROR), lpszTitle, MB_ICONERROR);
}
void
LoadSettings (HWND hwndDlg)
{
// Options
bCacheInDriver = ReadRegistryInt ("CachePasswordsInDriver", FALSE);
bExplore = ReadRegistryInt ("OpenExplorerWindowAfterMount", FALSE);
bCloseDismountedWindows = ReadRegistryInt ("CloseExplorerWindowsOnDismount", TRUE);
bHistory = ReadRegistryInt ("SaveMountedVolumesHistory", FALSE);
bWipeCacheOnExit = ReadRegistryInt ("WipePasswordCacheOnExit", FALSE);
// Drive Letter
ReadRegistryString ("LastSelectedDrive", "", szDriveLetter, sizeof (szDriveLetter));
// History
if (bHistoryCmdLine != TRUE)
LoadCombo (GetDlgItem (hwndDlg, IDC_VOLUME), "LastMountedVolume");
}
void
SaveSettings (HWND hwndDlg)
{
char szTmp[32] = {0};
LPARAM lLetter;
// Options
WriteRegistryInt ("CachePasswordsInDriver", bCacheInDriver);
WriteRegistryInt ("OpenExplorerWindowAfterMount", bExplore);
WriteRegistryInt ("CloseExplorerWindowsOnDismount", bCloseDismountedWindows);
WriteRegistryInt ("SaveMountedVolumesHistory", !IsButtonChecked (GetDlgItem (hwndDlg, IDC_NO_HISTORY)));
WriteRegistryInt ("WipePasswordCacheOnExit", bWipeCacheOnExit);
// Drive Letter
lLetter = GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST));
if (LOWORD (lLetter) != 0xffff)
sprintf (szTmp, "%c:", (char) HIWORD (lLetter));
WriteRegistryString ("LastSelectedDrive", szTmp);
// History
DumpCombo (GetDlgItem (hwndDlg, IDC_VOLUME), "LastMountedVolume", IsButtonChecked (GetDlgItem (hwndDlg, IDC_NO_HISTORY)));
}
BOOL
SelectItem (HWND hTree, char nLetter)
{
int i;
LVITEM item;
for (i = 0; i < ListView_GetItemCount(hTree); i++)
{
memset(&item, 0, sizeof(LVITEM));
item.mask = LVIF_PARAM;
item.iItem = i;
if (ListView_GetItem (hTree, &item) == FALSE)
return FALSE;
else
{
if (HIWORD (item.lParam) == nLetter)
{
memset(&item, 0, sizeof(LVITEM));
item.state = LVIS_FOCUSED|LVIS_SELECTED;
item.stateMask = LVIS_FOCUSED|LVIS_SELECTED;
item.mask = LVIF_STATE;
item.iItem = i;
SendMessage(hTree, LVM_SETITEMSTATE, i, (LPARAM) &item);
return TRUE;
}
}
}
return TRUE;
}
// Fills drive list
// drive>0 = update only the corresponding drive subitems
void
LoadDriveLetters (HWND hTree, int drive)
{
char *szDriveLetters[]=
{"A:", "B:", "C:", "D:",
"E:", "F:", "G:", "H:", "I:", "J:", "K:",
"L:", "M:", "N:", "O:", "P:", "Q:", "R:",
"S:", "T:", "U:", "V:", "W:", "X:", "Y:",
"Z:"};
DWORD dwResult;
BOOL bResult;
DWORD dwUsedDrives;
MOUNT_LIST_STRUCT driver;
LVITEM listItem;
int item = 0;
char i;
bResult = DeviceIoControl (hDriver, MOUNT_LIST, &driver,
sizeof (driver), &driver, sizeof (driver), &dwResult,
NULL);
if (bResult == FALSE)
{
handleWin32Error (hTree);
driver.ulMountedDrives = 0;
}
dwUsedDrives = GetLogicalDrives();
if (dwUsedDrives == 0 && bQuiet == FALSE)
MessageBox (hTree, getstr (IDS_DRIVELETTERS), lpszTitle, ICON_HAND);
if(drive == 0)
ListView_DeleteAllItems(hTree);
for (i = 2; i < 26; i++)
{
int curDrive = 0;
if(drive > 0)
{
LVITEM tmp;
memset(&tmp, 0, sizeof(LVITEM));
tmp.mask = LVIF_PARAM;
tmp.iItem = item;
if (ListView_GetItem (hTree, &tmp) != FALSE)
curDrive = HIWORD(tmp.lParam);
}
if ( driver.ulMountedDrives & (1 << i) )
{
char szTmp[256];
memset(&listItem, 0, sizeof(listItem));
listItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
listItem.iImage = 1;
listItem.iItem = item++;
if(drive > 0 && drive != curDrive)
continue;
if (nCurrentOS == WIN_NT)
ToSBCS ((void *) driver.wszVolume[i]);
if (memcmp (driver.wszVolume[i], "\\Device", 7) == 0)
sprintf (szTmp, "%s", ((char *) driver.wszVolume[i]));
else
{
if (nCurrentOS == WIN_NT)
sprintf (szTmp, "%s", ((char *) driver.wszVolume[i]) + 4);
else
sprintf (szTmp, "%s", (char *) driver.wszVolume[i]);
}
listItem.pszText = szDriveLetters[i];
listItem.lParam = MAKELONG (VMOUNTED, i + 'A');
if(drive == 0)
ListView_InsertItem (hTree, &listItem);
else
ListView_SetItem (hTree, &listItem);
listItem.mask=LVIF_TEXT;
listItem.pszText = szTmp;
listItem.iSubItem = 1;
ListView_SetItem(hTree, &listItem);
if(driver.diskLength[i] > 1024I64*1024*1024)
sprintf (szTmp,"%.1f GB",(double)(driver.diskLength[i]/1024.0/1024/1024));
else if(driver.diskLength[i] > 1024I64*1024)
sprintf (szTmp, "%I64d MB", driver.diskLength[i]/1024/1024);
else if(driver.diskLength[i] > 0)
sprintf (szTmp, "%I64d KB", driver.diskLength[i]/1024);
else
szTmp[0] = 0;
listItem.iSubItem = 2;
ListView_SetItem(hTree, &listItem);
sprintf (szTmp, "%s", get_cipher_name (driver.cipher[i]));
listItem.iSubItem = 3;
ListView_SetItem(hTree, &listItem);
}
else
{
if (!(dwUsedDrives & 1 << i))
{
if(drive > 0 && drive != HIWORD (GetSelectedLong (hTree)))
{
item++;
continue;
}
memset(&listItem,0,sizeof(listItem));
listItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
listItem.iImage = 0;
listItem.iItem = item++;
listItem.pszText = szDriveLetters[i];
listItem.lParam = MAKELONG (VFREE, i + 'A');
if(drive == 0)
ListView_InsertItem (hTree, &listItem);
else
ListView_SetItem (hTree, &listItem);
listItem.mask=LVIF_TEXT;
listItem.pszText = "";
listItem.iSubItem = 1;
ListView_SetItem(hTree, &listItem);
listItem.iSubItem = 2;
ListView_SetItem(hTree, &listItem);
listItem.iSubItem = 3;
ListView_SetItem(hTree, &listItem);
}
}
}
}
/* 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 WINAPI
PasswordChangeDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
WORD hw = HIWORD (wParam);
if (lParam); /* remove warning */
if (hw); /* remove warning */
switch (msg)
{
case WM_INITDIALOG:
{
UINT nID[4];
nID[0] = IDS_PASSWORD_HELP0;
nID[1] = IDS_PASSWORD_HELP1;
nID[2] = IDS_PASSWORD_HELP2;
nID[3] = IDS_PASSWORD_HELP3;
SetDefaultUserFont (hwndDlg);
SendMessage (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), EM_LIMITTEXT, MAX_PASSWORD, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_PASSWORD), EM_LIMITTEXT, MAX_PASSWORD, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_VERIFY), EM_LIMITTEXT, MAX_PASSWORD, 0);
SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
EnableWindow (GetDlgItem (hwndDlg, IDOK), FALSE);
return 1;
}
case WM_COMMAND:
if (lw == IDCANCEL)
{
// Attempt to wipe passwords stored in the input field buffers
char tmp[MAX_PASSWORD+1];
memset (tmp, 'X', MAX_PASSWORD);
tmp[MAX_PASSWORD] = 0;
SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), tmp);
SetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), tmp);
SetWindowText (GetDlgItem (hwndDlg, IDC_VERIFY), tmp);
EndDialog (hwndDlg, IDCANCEL);
return 1;
}
if (hw == EN_CHANGE)
{
VerifyPasswordAndUpdate (hwndDlg, GetDlgItem (hwndDlg, IDOK), GetDlgItem (hwndDlg, IDC_PASSWORD),
GetDlgItem (hwndDlg, IDC_VERIFY), NULL, NULL);
return 1;
}
if (lw == IDOK)
{
HWND hParent = GetParent (hwndDlg);
char szOldPassword[MAX_PASSWORD + 1];
char szPassword[MAX_PASSWORD + 1];
int nStatus;
GetWindowText (GetDlgItem (hParent, IDC_VOLUME), szFileName, sizeof (szFileName));
GetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), szOldPassword, sizeof (szOldPassword));
GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), szPassword, sizeof (szPassword));
nStatus = ChangePwd (szFileName, szOldPassword, szPassword);
burn (szOldPassword, sizeof (szOldPassword));
burn (szPassword, sizeof (szPassword));
if (nStatus != 0)
handleError (hwndDlg, nStatus);
else
{
// Attempt to wipe passwords stored in the input field buffers
char tmp[MAX_PASSWORD+1];
memset (tmp, 'X', MAX_PASSWORD);
tmp[MAX_PASSWORD] = 0;
SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), tmp);
SetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), tmp);
SetWindowText (GetDlgItem (hwndDlg, IDC_VERIFY), tmp);
EndDialog (hwndDlg, IDOK);
}
return 1;
}
return 0;
}
return 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 WINAPI
PasswordDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
static char* szXPwd;
switch (msg)
{
case WM_INITDIALOG:
{
szXPwd = (char*) lParam;
SetDefaultUserFont (hwndDlg);
SendMessage (GetDlgItem (hwndDlg, IDC_PASSWORD), EM_LIMITTEXT, MAX_PASSWORD, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_CACHE), BM_SETCHECK, bCacheInDriver ? BST_CHECKED:BST_UNCHECKED, 0);
return 1;
}
case WM_COMMAND:
if (lw == IDCANCEL || lw == IDOK)
{
char tmp[MAX_PASSWORD+1];
if (lw == IDOK)
{
GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), szXPwd, MAX_PASSWORD + 1);
bCacheInDriver = IsButtonChecked (GetDlgItem (hwndDlg, IDC_CACHE));
}
// Attempt to wipe password stored in the input field buffer
memset (tmp, 'X', MAX_PASSWORD);
tmp[MAX_PASSWORD] = 0;
SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), tmp);
SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), 0);
EndDialog (hwndDlg, lw);
return 1;
}
return 0;
}
return 0;
}
BOOL WINAPI
PreferencesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
switch (msg)
{
case WM_INITDIALOG:
{
SetDefaultUserFont (hwndDlg);
SendMessage (GetDlgItem (hwndDlg, IDC_PREF_OPEN_EXPLORER), BM_SETCHECK,
bExplore ? BST_CHECKED:BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_PREF_CLOSE_DISMOUNTED_WINDOWS), BM_SETCHECK,
bCloseDismountedWindows ? BST_CHECKED:BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_PREF_WIPE_CACHE_ON_EXIT), BM_SETCHECK,
bWipeCacheOnExit ? BST_CHECKED:BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_PREF_CACHE_PASSWORDS), BM_SETCHECK,
bCacheInDriver ? BST_CHECKED:BST_UNCHECKED, 0);
return 1;
}
case WM_COMMAND:
if (lw == IDCANCEL)
{
EndDialog (hwndDlg, lw);
return 1;
}
if (lw == IDOK)
{
bExplore = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_OPEN_EXPLORER));
bCloseDismountedWindows = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_CLOSE_DISMOUNTED_WINDOWS));
bWipeCacheOnExit = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_WIPE_CACHE_ON_EXIT));
bCacheInDriver = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_CACHE_PASSWORDS));
EndDialog (hwndDlg, lw);
return 1;
}
return 0;
}
return 0;
}
BOOL WINAPI
VolumePropertiesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
switch (msg)
{
case WM_INITDIALOG:
{
VOLUME_PROPERTIES_STRUCT prop;
DWORD dwResult;
BOOL bResult;
LVCOLUMN lvCol;
LVITEM listItem;
HWND list = GetDlgItem (hwndDlg, IDC_VOLUME_PROPERTIES_LIST);
char szTmp[128];
SetDefaultUserFont (hwndDlg);
SendMessage (list,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 = "Value";
lvCol.cx = 220;
lvCol.fmt = LVCFMT_LEFT ;
SendMessage (list,LVM_INSERTCOLUMN,0,(LPARAM)&lvCol);
lvCol.pszText = "Property";
lvCol.cx = 100;
lvCol.fmt = LVCFMT_LEFT;
SendMessage (list,LVM_INSERTCOLUMN,0,(LPARAM)&lvCol);
memset (&prop, 0, sizeof(prop));
prop.driveNo = HIWORD (GetSelectedLong (GetDlgItem (GetParent(hwndDlg), IDC_DRIVELIST))) - 'A';
bResult = DeviceIoControl (hDriver, VOLUME_PROPERTIES, &prop,
sizeof (prop), &prop, sizeof (prop), &dwResult,
NULL);
memset (&listItem, 0, sizeof(listItem));
listItem.mask = LVIF_TEXT;
listItem.iItem = -1;
listItem.pszText = "Volume Location";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -