From fb430c403b2e0deb3f34328d3b65bd39c10b14ba Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sun, 10 Jan 2016 19:35:57 +0100 Subject: Windows: Don't show disconnected network drives in the list of available drives. Add option to make them available for mounting if needed. --- src/Common/Dlgcode.c | 46 ++++++++++++++++++++++++++++++++--- src/Common/Dlgcode.h | 2 ++ src/Common/Language.xml | 1 + src/ExpandVolume/ExpandVolume.vcproj | 12 ++++++--- src/ExpandVolume/WinMain.cpp | 2 ++ src/Format/Format.vcproj | 12 ++++++--- src/Format/Tcformat.c | Bin 633832 -> 634120 bytes src/Mount/Mount.c | 16 +++++++++--- src/Mount/Mount.rc | 38 +++++++++++++++-------------- src/Mount/Mount.vcproj | 12 ++++++--- src/Mount/Resource.h | 3 ++- src/Setup/Setup.vcproj | 7 +++--- 12 files changed, 109 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 6d86449c..cc7f0e74 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -101,6 +101,7 @@ wchar_t *lpszTitle = NULL; BOOL Silent = FALSE; BOOL bPreserveTimestamp = TRUE; +BOOL bShowDisconnectedNetworkDrives = FALSE; BOOL bStartOnLogon = FALSE; BOOL bMountDevicesOnLogon = FALSE; BOOL bMountFavoritesOnLogon = FALSE; @@ -225,6 +226,7 @@ HMODULE hbcryptdll = NULL; HMODULE hbcryptprimitivesdll = NULL; HMODULE hMsls31 = NULL; HMODULE hntmartadll = NULL; +HMODULE hwinscarddll = NULL; #define FREE_DLL(h) if (h) { FreeLibrary (h); h = NULL;} @@ -572,6 +574,7 @@ void AbortProcessDirect (wchar_t *abortMsg) FREE_DLL (hbcryptprimitivesdll); FREE_DLL (hMsls31); FREE_DLL (hntmartadll); + FREE_DLL (hwinscarddll); exit (1); } @@ -620,6 +623,7 @@ void AbortProcessSilent (void) FREE_DLL (hbcryptprimitivesdll); FREE_DLL (hMsls31); FREE_DLL (hntmartadll); + FREE_DLL (hwinscarddll); // Note that this function also causes localcleanup() to be called (see atexit()) exit (1); @@ -2492,6 +2496,7 @@ void InitApp (HINSTANCE hInstance, wchar_t *lpszCommandLine) InitOSVersionInfo(); LoadSystemDll (L"ntmarta.dll", &hntmartadll, TRUE, SRC_POS); + LoadSystemDll (L"MPR.DLL", &hmprdll, TRUE, SRC_POS); #ifdef SETUP if (IsOSAtLeast (WIN_7)) { @@ -2529,7 +2534,6 @@ void InitApp (HINSTANCE hInstance, wchar_t *lpszCommandLine) LoadSystemDll (L"netapi32.dll", &hnetapi32dll, TRUE, SRC_POS); LoadSystemDll (L"authz.dll", &hauthzdll, TRUE, SRC_POS); LoadSystemDll (L"xmllite.dll", &hxmllitedll, TRUE, SRC_POS); - LoadSystemDll (L"mpr.dll", &hmprdll, TRUE, SRC_POS); } } @@ -2555,6 +2559,8 @@ void InitApp (HINSTANCE hInstance, wchar_t *lpszCommandLine) LoadSystemDll (L"bcryptprimitives.dll", &hbcryptprimitivesdll, TRUE, SRC_POS); } } +#else + LoadSystemDll (L"WINSCARD.DLL", &hwinscarddll, TRUE, SRC_POS); #endif LoadSystemDll (L"COMCTL32.DLL", &hComctl32Dll, FALSE, SRC_POS); @@ -2804,6 +2810,7 @@ void InitApp (HINSTANCE hInstance, wchar_t *lpszCommandLine) FREE_DLL (hbcryptprimitivesdll); FREE_DLL (hMsls31); FREE_DLL (hntmartadll); + FREE_DLL (hwinscarddll); exit (1); } #endif @@ -2847,6 +2854,7 @@ void FinalizeApp (void) FREE_DLL (hbcryptprimitivesdll); FREE_DLL (hMsls31); FREE_DLL (hntmartadll); + FREE_DLL (hwinscarddll); } void InitHelpFileName (void) @@ -6506,10 +6514,40 @@ BOOL WrongPwdRetryCountOverLimit (void) return (WrongPwdRetryCounter > TC_TRY_HEADER_BAK_AFTER_NBR_WRONG_PWD_TRIES); } +DWORD GetUsedLogicalDrives (void) +{ + DWORD dwUsedDrives = GetLogicalDrives(); + if (!bShowDisconnectedNetworkDrives) + { + /* detect disconnected mapped network shares and removed + * their associated drives from the list + */ + WCHAR remotePath[512]; + WCHAR drive[3] = {L'A', L':', 0}; + DWORD dwLen, status; + for (WCHAR i = 0; i <= MAX_MOUNTED_VOLUME_DRIVE_NUMBER; i++) + { + if ((dwUsedDrives & (1 << i)) == 0) + { + drive[0] = L'A' + i; + dwLen = ARRAYSIZE (remotePath); + status = WNetGetConnection (drive, remotePath, &dwLen); + if ((NO_ERROR == status) || (status == ERROR_CONNECTION_UNAVAIL)) + { + /* this is a mapped network share, mark it as used */ + dwUsedDrives |= (1 << i); + } + } + } + } + + return dwUsedDrives; +} + int GetFirstAvailableDrive () { - DWORD dwUsedDrives = GetLogicalDrives(); + DWORD dwUsedDrives = GetUsedLogicalDrives(); int i; for (i = 0; i < 26; i++) @@ -6524,7 +6562,7 @@ int GetFirstAvailableDrive () int GetLastAvailableDrive () { - DWORD dwUsedDrives = GetLogicalDrives(); + DWORD dwUsedDrives = GetUsedLogicalDrives(); int i; for (i = 25; i >= 0; i--) @@ -6539,7 +6577,7 @@ int GetLastAvailableDrive () BOOL IsDriveAvailable (int driveNo) { - return (GetLogicalDrives() & (1 << driveNo)) == 0; + return (GetUsedLogicalDrives() & (1 << driveNo)) == 0; } diff --git a/src/Common/Dlgcode.h b/src/Common/Dlgcode.h index 7ab74c08..601f7ac7 100644 --- a/src/Common/Dlgcode.h +++ b/src/Common/Dlgcode.h @@ -115,6 +115,7 @@ extern HWND MainDlg; extern BOOL Silent; extern BOOL bHistory; extern BOOL bPreserveTimestamp; +extern BOOL bShowDisconnectedNetworkDrives; extern BOOL bStartOnLogon; extern BOOL bMountDevicesOnLogon; extern BOOL bMountFavoritesOnLogon; @@ -330,6 +331,7 @@ void CorrectFileName (wchar_t* fileName); void IncreaseWrongPwdRetryCount (int count); void ResetWrongPwdRetryCount (void); BOOL WrongPwdRetryCountOverLimit (void); +DWORD GetUsedLogicalDrives (void); int GetFirstAvailableDrive (); int GetLastAvailableDrive (); BOOL IsDriveAvailable (int driveNo); diff --git a/src/Common/Language.xml b/src/Common/Language.xml index 1fbed144..16821359 100644 --- a/src/Common/Language.xml +++ b/src/Common/Language.xml @@ -181,6 +181,7 @@ Select D&evice... Select &File... Select &Library... + Make disconnected network drives available for mounting Display password Display password Open &Explorer window for mounted volume diff --git a/src/ExpandVolume/ExpandVolume.vcproj b/src/ExpandVolume/ExpandVolume.vcproj index 544104f4..4ca6c9d9 100644 --- a/src/ExpandVolume/ExpandVolume.vcproj +++ b/src/ExpandVolume/ExpandVolume.vcproj @@ -75,11 +75,12 @@ /> dbcv_unitmask & (1 << i)) && !(GetLogicalDrives() & (1 << i))) + if ((vol->dbcv_unitmask & (1 << i)) && !(GetUsedLogicalDrives() & (1 << i))) { for (m = 0; m < 26; m++) { @@ -7891,7 +7899,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa if (lw == IDM_REFRESH_DRIVE_LETTERS) { - DWORD driveMap = GetLogicalDrives (); + DWORD driveMap = GetUsedLogicalDrives (); WaitCursor (); diff --git a/src/Mount/Mount.rc b/src/Mount/Mount.rc index 9e34d6bb..76cae781 100644 --- a/src/Mount/Mount.rc +++ b/src/Mount/Mount.rc @@ -41,7 +41,7 @@ IDR_MOUNT_TLB TYPELIB "Mount.tlb" // Dialog // -IDD_PREFERENCES_DLG DIALOGEX 0, 0, 336, 305 +IDD_PREFERENCES_DLG DIALOGEX 0, 0, 336, 316 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "VeraCrypt - Preferences" FONT 8, "MS Shell Dlg", 400, 0, 0x1 @@ -58,10 +58,12 @@ BEGIN CONTROL "Mount all device-hosted VeraCrypt volumes",IDC_PREF_LOGON_MOUNT_DEVICES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,75,188,10 CONTROL "User logs off",IDC_PREF_DISMOUNT_LOGOFF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,81,104,114,11 - CONTROL "Entering power saving mode",IDC_PREF_DISMOUNT_POWERSAVING, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,115,130,11 + CONTROL "User session locked",IDC_PREF_DISMOUNT_SESSION_LOCKED, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,105,130,11 CONTROL "Screen saver is launched",IDC_PREF_DISMOUNT_SCREENSAVER, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,81,116,114,10 + CONTROL "Entering power saving mode",IDC_PREF_DISMOUNT_POWERSAVING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,115,130,11 CONTROL "Auto-dismount volume after no data has been read/written to it for",IDC_PREF_DISMOUNT_INACTIVE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,128,246,11 EDITTEXT IDC_PREF_DISMOUNT_INACTIVE_TIME,258,127,27,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT @@ -73,29 +75,29 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,184,314,10 CONTROL "Preserve modification timestamp of file containers",IDC_PRESERVE_TIMESTAMPS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,196,316,10 + CONTROL "Make disconnected network drives available for mounting",IDC_SHOW_DISCONNECTED_NETWORK_DRIVES, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,208,316,10 CONTROL "Cache passwords in driver memory",IDC_PREF_CACHE_PASSWORDS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,227,146,11 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,238,146,11 CONTROL "Wipe cached passwords on exit",IDC_PREF_WIPE_CACHE_ON_EXIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,162,227,165,11 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,162,238,165,11 + CONTROL "Temporary Cache password during ""Mount Favorite Volumes"" operations",IDC_PREF_TEMP_CACHE_ON_MULTIPLE_MOUNT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,252,294,11 CONTROL "Wipe cached passwords on auto-dismount",IDC_PREF_WIPE_CACHE_ON_AUTODISMOUNT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,255,296,11 - PUSHBUTTON "More Settings...",IDC_MORE_SETTINGS,5,289,85,14 - DEFPUSHBUTTON "OK",IDOK,225,289,50,14 - PUSHBUTTON "Cancel",IDCANCEL,281,289,50,14 - GROUPBOX "Windows",IDT_WINDOWS_RELATED_SETTING,4,160,328,52 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,266,296,11 + CONTROL "Include PIM when caching a password",IDC_PREF_CACHE_PIM, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,280,296,10 + PUSHBUTTON "More Settings...",IDC_MORE_SETTINGS,5,300,85,14 + DEFPUSHBUTTON "OK",IDOK,225,300,50,14 + PUSHBUTTON "Cancel",IDCANCEL,281,300,50,14 + GROUPBOX "Windows",IDT_WINDOWS_RELATED_SETTING,4,160,328,62 GROUPBOX "Default Mount Options",IDT_DEFAULT_MOUNT_OPTIONS,4,3,328,26 GROUPBOX "VeraCrypt Background Task",IDT_TASKBAR_ICON,4,33,328,26 GROUPBOX "Auto-Dismount",IDT_AUTO_DISMOUNT,4,94,328,62 LTEXT "minutes",IDT_MINUTES,289,129,39,10 LTEXT "Dismount all when:",IDT_AUTO_DISMOUNT_ON,9,110,71,17 - GROUPBOX "Password Cache",IDT_PW_CACHE_OPTIONS,4,216,328,68 + GROUPBOX "Password Cache",IDT_PW_CACHE_OPTIONS,4,227,328,68 GROUPBOX "Actions to perform upon logon to Windows",IDT_LOGON,4,63,328,28 - CONTROL "User session locked",IDC_PREF_DISMOUNT_SESSION_LOCKED, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,105,130,11 - CONTROL "Temporary Cache password during ""Mount Favorite Volumes"" operations",IDC_PREF_TEMP_CACHE_ON_MULTIPLE_MOUNT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,241,294,11 - CONTROL "Include PIM when caching a password",IDC_PREF_CACHE_PIM, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,269,296,10 END IDD_VOLUME_PROPERTIES DIALOGEX 60, 30, 284, 224 @@ -390,7 +392,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 329 TOPMARGIN, 7 - BOTTOMMARGIN, 303 + BOTTOMMARGIN, 314 END IDD_VOLUME_PROPERTIES, DIALOG diff --git a/src/Mount/Mount.vcproj b/src/Mount/Mount.vcproj index 260e3041..64163c7c 100644 --- a/src/Mount/Mount.vcproj +++ b/src/Mount/Mount.vcproj @@ -74,11 +74,12 @@ />