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

📄 mount.c

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