From 99de8a6dcdc81bbeb70296704b8c82029e363de2 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Thu, 28 Apr 2016 10:36:04 +0200 Subject: Windows: Only use A: and B: for mounting when no other free drive letter available or when explicitly chosen by user. This avoid side effects when mounting volumes as removable media and automatic drive selection (e.g. A: become invisible in explorer after closing all explorer instances although it is still mounted). --- src/Common/Dlgcode.c | 8 +++++--- src/Mount/Mount.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 77210029..6958afe9 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -6760,11 +6760,13 @@ DWORD GetUsedLogicalDrives (void) int GetFirstAvailableDrive () { DWORD dwUsedDrives = GetUsedLogicalDrives(); - int i; + int i, drive; - for (i = 0; i < 26; i++) + /* let A: and B: be used as last resort since they can introduce side effects */ + for (i = 2; i < 28; i++) { - if (!(dwUsedDrives & 1 << i)) + drive = (i < 26) ? i : (i - 26); + if (!(dwUsedDrives & 1 << drive)) return i; } diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index 9619a9f6..1851af06 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -5075,6 +5075,7 @@ static BOOL MountAllDevicesThreadCode (HWND hwndDlg, BOOL bPasswordPrompt) if (!mounted) { int nDosDriveNo; + int driveAItem = -1, driveBItem = -1; while (LOWORD (GetItemLong (driveList, selDrive)) != 0xffff) { @@ -5084,11 +5085,39 @@ static BOOL MountAllDevicesThreadCode (HWND hwndDlg, BOOL bPasswordPrompt) continue; } nDosDriveNo = HIWORD(GetItemLong (driveList, selDrive)) - L'A'; + + /* don't use drives A: and B: for now until no other free drive found */ + if (nDosDriveNo == 0) + { + driveAItem = selDrive; + selDrive++; + continue; + } + if (nDosDriveNo == 1) + { + driveBItem = selDrive; + selDrive++; + continue; + } break; } if (LOWORD (GetItemLong (driveList, selDrive)) == 0xffff) - goto ret; + { + /* use A: or B: if available as a last resort */ + if (driveAItem >= 0) + { + nDosDriveNo = 0; + selDrive = driveAItem; + } + else if (driveBItem >= 0) + { + nDosDriveNo = 1; + selDrive = driveBItem; + } + else + goto ret; + } // First try user password then cached passwords if ((mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, &VolumePassword, VolumePkcs5, VolumePim, VolumeTrueCryptMode, bCacheInDriver, bIncludePimInCache, bForceMount, &mountOptions, TRUE, FALSE)) > 0 -- cgit v1.2.3