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 @@
/>