⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mount.c

📁 加密硬盘、分区、虚拟盘的程序源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 + -