From d3db2548b52b07481185dd966f4819c23d02c0e0 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Thu, 19 Mar 2015 00:13:56 +0100 Subject: Windows: correctly handle WIN32 LastError when mounting. Harmonize file access checks between GUI and console. Skip ERROR_SHARING_VIOLATION in primary check in order to let the driver handle it more thoroughly. --- src/Common/Dlgcode.c | 21 +++++++++- src/Mount/Mount.c | 109 +++++++++++++++++++++++++++------------------------ 2 files changed, 77 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 6ae4062f..5f5d2216 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -6317,6 +6317,7 @@ typedef struct MOUNT_STRUCT* pmount; BOOL* pbResult; DWORD* pdwResult; + DWORD dwLastError; } MountThreadParam; void CALLBACK MountWaitThreadProc(void* pArg, HWND ) @@ -6325,6 +6326,8 @@ void CALLBACK MountWaitThreadProc(void* pArg, HWND ) *(pThreadParam->pbResult) = DeviceIoControl (hDriver, TC_IOCTL_MOUNT_VOLUME, pThreadParam->pmount, sizeof (MOUNT_STRUCT),pThreadParam->pmount, sizeof (MOUNT_STRUCT), pThreadParam->pdwResult, NULL); + + pThreadParam->dwLastError = GetLastError (); } /************************************************************************/ @@ -6353,7 +6356,7 @@ int MountVolume (HWND hwndDlg, BOOL bReportWrongPassword) { MOUNT_STRUCT mount; - DWORD dwResult; + DWORD dwResult, dwLastError = ERROR_SUCCESS; BOOL bResult, bDevice; char root[MAX_PATH]; int favoriteMountOnArrivalRetryCount = 0; @@ -6484,13 +6487,17 @@ retry: mountThreadParam.pmount = &mount; mountThreadParam.pbResult = &bResult; mountThreadParam.pdwResult = &dwResult; + mountThreadParam.dwLastError = ERROR_SUCCESS; ShowWaitDialog (hwndDlg, FALSE, MountWaitThreadProc, &mountThreadParam); + + dwLastError = mountThreadParam.dwLastError; } else { bResult = DeviceIoControl (hDriver, TC_IOCTL_MOUNT_VOLUME, &mount, sizeof (mount), &mount, sizeof (mount), &dwResult, NULL); + dwLastError = GetLastError (); } burn (&mount.VolumePassword, sizeof (mount.VolumePassword)); @@ -6499,6 +6506,7 @@ retry: burn (&mount.bTrueCryptMode, sizeof (mount.bTrueCryptMode)); burn (&mount.ProtectedHidVolPkcs5Prf, sizeof (mount.ProtectedHidVolPkcs5Prf)); + SetLastError (dwLastError); if (bResult == FALSE) { // Volume already open by another process @@ -10270,7 +10278,16 @@ BOOL VolumePathExists (const char *volumePath) return TRUE; } - return _access (volumePath, 0) == 0; + if (_access (volumePath, 0) == 0) + return TRUE; + else + { + DWORD dwResult = GetLastError (); + if (dwResult == ERROR_SHARING_VIOLATION) + return TRUE; + else + return FALSE; + } } diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index 61bc5adb..3e567541 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -5182,74 +5182,81 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa if (szFileName[0] != 0 && !IsMountedVolume (szFileName)) { - BOOL mounted; + BOOL mounted = FALSE; int EffectiveVolumePkcs5 = CmdVolumePkcs5; BOOL EffectiveVolumeTrueCryptMode = CmdVolumeTrueCryptMode; - /* Priority is given to command line parameters - * Default values used only when nothing specified in command line - */ - if (EffectiveVolumePkcs5 == 0) - EffectiveVolumePkcs5 = DefaultVolumePkcs5; - if (!EffectiveVolumeTrueCryptMode) - EffectiveVolumeTrueCryptMode = DefaultVolumeTrueCryptMode; - - // Cached password - mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', szFileName, NULL, EffectiveVolumePkcs5, EffectiveVolumeTrueCryptMode, bCacheInDriver, bForceMount, &mountOptions, Silent, FALSE); - - // Command line password or keyfiles - if (!mounted && (CmdVolumePassword.Length != 0 || FirstCmdKeyFile)) + if (!VolumePathExists (szFileName)) + { + handleWin32Error (hwndDlg); + } + else { - BOOL reportBadPasswd = CmdVolumePassword.Length > 0; + /* Priority is given to command line parameters + * Default values used only when nothing specified in command line + */ + if (EffectiveVolumePkcs5 == 0) + EffectiveVolumePkcs5 = DefaultVolumePkcs5; + if (!EffectiveVolumeTrueCryptMode) + EffectiveVolumeTrueCryptMode = DefaultVolumeTrueCryptMode; - if (FirstCmdKeyFile) - KeyFilesApply (hwndDlg, &CmdVolumePassword, FirstCmdKeyFile); + // Cached password + mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', szFileName, NULL, EffectiveVolumePkcs5, EffectiveVolumeTrueCryptMode, bCacheInDriver, bForceMount, &mountOptions, Silent, FALSE); - mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', - szFileName, &CmdVolumePassword, EffectiveVolumePkcs5, EffectiveVolumeTrueCryptMode, bCacheInDriver, bForceMount, - &mountOptions, Silent, reportBadPasswd); + // Command line password or keyfiles + if (!mounted && (CmdVolumePassword.Length != 0 || FirstCmdKeyFile)) + { + BOOL reportBadPasswd = CmdVolumePassword.Length > 0; - burn (&CmdVolumePassword, sizeof (CmdVolumePassword)); - } + if (FirstCmdKeyFile) + KeyFilesApply (hwndDlg, &CmdVolumePassword, FirstCmdKeyFile); - if (FirstCmdKeyFile) - { - FirstKeyFile = FirstCmdKeyFile; - KeyFilesEnable = TRUE; - } + mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', + szFileName, &CmdVolumePassword, EffectiveVolumePkcs5, EffectiveVolumeTrueCryptMode, bCacheInDriver, bForceMount, + &mountOptions, Silent, reportBadPasswd); - // Ask user for password - while (!mounted && !Silent) - { - int GuiPkcs5 = EffectiveVolumePkcs5; - BOOL GuiTrueCryptMode = EffectiveVolumeTrueCryptMode; - VolumePassword.Length = 0; + burn (&CmdVolumePassword, sizeof (CmdVolumePassword)); + } - StringCbCopyA (PasswordDlgVolume, sizeof(PasswordDlgVolume),szFileName); - if (!AskVolumePassword (hwndDlg, &VolumePassword, &GuiPkcs5, &GuiTrueCryptMode, NULL, TRUE)) - break; - else + if (FirstCmdKeyFile) { - VolumePkcs5 = GuiPkcs5; - VolumeTrueCryptMode = GuiTrueCryptMode; - burn (&GuiPkcs5, sizeof(GuiPkcs5)); - burn (&GuiTrueCryptMode, sizeof(GuiTrueCryptMode)); + FirstKeyFile = FirstCmdKeyFile; + KeyFilesEnable = TRUE; } - WaitCursor (); + // Ask user for password + while (!mounted && !Silent) + { + int GuiPkcs5 = EffectiveVolumePkcs5; + BOOL GuiTrueCryptMode = EffectiveVolumeTrueCryptMode; + VolumePassword.Length = 0; + + StringCbCopyA (PasswordDlgVolume, sizeof(PasswordDlgVolume),szFileName); + if (!AskVolumePassword (hwndDlg, &VolumePassword, &GuiPkcs5, &GuiTrueCryptMode, NULL, TRUE)) + break; + else + { + VolumePkcs5 = GuiPkcs5; + VolumeTrueCryptMode = GuiTrueCryptMode; + burn (&GuiPkcs5, sizeof(GuiPkcs5)); + burn (&GuiTrueCryptMode, sizeof(GuiTrueCryptMode)); + } - if (KeyFilesEnable && FirstKeyFile) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + WaitCursor (); - mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', szFileName, &VolumePassword, VolumePkcs5, VolumeTrueCryptMode, bCacheInDriver, bForceMount, &mountOptions, FALSE, TRUE); + if (KeyFilesEnable && FirstKeyFile) + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); - burn (&VolumePassword, sizeof (VolumePassword)); - burn (&VolumePkcs5, sizeof (VolumePkcs5)); - burn (&VolumeTrueCryptMode, sizeof (VolumeTrueCryptMode)); - burn (&mountOptions.ProtectedHidVolPassword, sizeof (mountOptions.ProtectedHidVolPassword)); - burn (&mountOptions.ProtectedHidVolPkcs5Prf, sizeof (mountOptions.ProtectedHidVolPkcs5Prf)); + mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', szFileName, &VolumePassword, VolumePkcs5, VolumeTrueCryptMode, bCacheInDriver, bForceMount, &mountOptions, FALSE, TRUE); - NormalCursor (); + burn (&VolumePassword, sizeof (VolumePassword)); + burn (&VolumePkcs5, sizeof (VolumePkcs5)); + burn (&VolumeTrueCryptMode, sizeof (VolumeTrueCryptMode)); + burn (&mountOptions.ProtectedHidVolPassword, sizeof (mountOptions.ProtectedHidVolPassword)); + burn (&mountOptions.ProtectedHidVolPkcs5Prf, sizeof (mountOptions.ProtectedHidVolPkcs5Prf)); + + NormalCursor (); + } } if (UsePreferences) -- cgit v1.2.3