From fdc2143bfabb1e48ea0108fcf12c2e4ad438b44e Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Fri, 29 May 2015 02:04:13 +0200 Subject: [PATCH] Windows: workaround FormatEx keeping references on formatted volume by adding extra delays. --- src/Common/Dlgcode.c | 18 ++++++++++++++---- src/Common/Dlgcode.h | 1 + src/Common/Format.c | 6 +++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index c9d01290..bfa8a32e 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -6889,12 +6889,12 @@ int MountVolume (HWND hwndDlg, return 1; } - -BOOL UnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount) +static BOOL UnmountVolumeBase (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount, BOOL ntfsFormatCase) { int result; BOOL forced = forceUnmount; - int dismountMaxRetries = UNMOUNT_MAX_AUTO_RETRIES; + int dismountMaxRetries = ntfsFormatCase? 5 : UNMOUNT_MAX_AUTO_RETRIES; + DWORD retryDelay = ntfsFormatCase? 2000: UNMOUNT_AUTO_RETRY_DELAY; retry: BroadcastDeviceChange (DBT_DEVICEREMOVEPENDING, nDosDriveNo, 0); @@ -6904,7 +6904,7 @@ BOOL UnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount) result = DriverUnmountVolume (hwndDlg, nDosDriveNo, forced); if (result == ERR_FILES_OPEN) - Sleep (UNMOUNT_AUTO_RETRY_DELAY); + Sleep (retryDelay); else break; @@ -6940,6 +6940,16 @@ BOOL UnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount) return TRUE; } +BOOL UnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount) +{ + return UnmountVolumeBase (hwndDlg, nDosDriveNo, forceUnmount, FALSE); +} + +BOOL UnmountVolumeAfterFormatExCall (HWND hwndDlg, int nDosDriveNo) +{ + return UnmountVolumeBase (hwndDlg, nDosDriveNo, FALSE, TRUE); +} + BOOL IsPasswordCacheEmpty (void) { diff --git a/src/Common/Dlgcode.h b/src/Common/Dlgcode.h index 7dee2db5..781efeee 100644 --- a/src/Common/Dlgcode.h +++ b/src/Common/Dlgcode.h @@ -334,6 +334,7 @@ int DriverUnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forced); void BroadcastDeviceChange (WPARAM message, int nDosDriveNo, DWORD driveMap); int MountVolume (HWND hwndDlg, int driveNo, char *volumePath, Password *password, int pkcs5, int pin, BOOL truecryptMode, BOOL cachePassword, BOOL sharedAccess, const MountOptions* const mountOptions, BOOL quiet, BOOL bReportWrongPassword); BOOL UnmountVolume (HWND hwndDlg , int nDosDriveNo, BOOL forceUnmount); +BOOL UnmountVolumeAfterFormatExCall (HWND hwndDlg, int nDosDriveNo); BOOL IsPasswordCacheEmpty (void); BOOL IsMountedVolume (const char *volname); int GetMountedVolumeDriveNo (char *volname); diff --git a/src/Common/Format.c b/src/Common/Format.c index 37fa38da..3ebfef1e 100644 --- a/src/Common/Format.c +++ b/src/Common/Format.c @@ -641,7 +641,7 @@ int TCFormatVolume (volatile FORMAT_VOL_PARAMETERS *volParams) if (retCode != TRUE) { - if (!UnmountVolume (volParams->hwndDlg, driveNo, FALSE)) + if (!UnmountVolumeAfterFormatExCall (volParams->hwndDlg, driveNo)) MessageBoxW (volParams->hwndDlg, GetString ("CANT_DISMOUNT_VOLUME"), lpszTitle, ICON_HAND); if (dataAreaSize <= TC_MAX_FAT_SECTOR_COUNT * FormatSectorSize) @@ -663,7 +663,7 @@ int TCFormatVolume (volatile FORMAT_VOL_PARAMETERS *volParams) goto fv_end; } - if (!UnmountVolume (volParams->hwndDlg, driveNo, FALSE)) + if (!UnmountVolumeAfterFormatExCall (volParams->hwndDlg, driveNo)) MessageBoxW (volParams->hwndDlg, GetString ("CANT_DISMOUNT_VOLUME"), lpszTitle, ICON_HAND); } @@ -836,7 +836,7 @@ BOOL FormatNtfs (int driveNo, int clusterSize) } // The device may be referenced for some time after FormatEx() returns - Sleep (2000); + Sleep (4000); FreeLibrary (hModule); return FormatExResult;