Windows: workaround FormatEx keeping references on formatted volume by adding extra delays.

This commit is contained in:
Mounir IDRASSI 2015-05-29 02:04:13 +02:00
parent 5867250820
commit fdc2143bfa
3 changed files with 18 additions and 7 deletions

View File

@ -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)
{

View File

@ -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);

View File

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