mirror of
https://github.com/veracrypt/VeraCrypt
synced 2024-11-30 23:13:31 +01:00
Windows: better logic for FormatEx function call. To be replaced in the future by Microsoft COM interfaces.
This commit is contained in:
parent
724043be0b
commit
6a78f7eae2
@ -793,13 +793,64 @@ int FormatNoFs (HWND hwndDlg, unsigned __int64 startSector, __int64 num_sectors,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
volatile BOOLEAN FormatExResult;
|
volatile BOOLEAN FormatExError;
|
||||||
|
|
||||||
BOOLEAN __stdcall FormatExCallback (int command, DWORD subCommand, PVOID parameter)
|
BOOLEAN __stdcall FormatExCallback (int command, DWORD subCommand, PVOID parameter)
|
||||||
{
|
{
|
||||||
if (command == FMIFS_DONE)
|
if (FormatExError)
|
||||||
FormatExResult = *(BOOLEAN *) parameter;
|
return FALSE;
|
||||||
return TRUE;
|
|
||||||
|
switch(command) {
|
||||||
|
case FMIFS_PROGRESS:
|
||||||
|
break;
|
||||||
|
case FMIFS_STRUCTURE_PROGRESS:
|
||||||
|
break;
|
||||||
|
case FMIFS_DONE:
|
||||||
|
if(*(BOOLEAN*)parameter == FALSE) {
|
||||||
|
FormatExError = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FMIFS_DONE_WITH_STRUCTURE:
|
||||||
|
break;
|
||||||
|
case FMIFS_INCOMPATIBLE_FILE_SYSTEM:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_ACCESS_DENIED:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_MEDIA_WRITE_PROTECTED:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_VOLUME_IN_USE:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_DEVICE_NOT_READY:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_CANT_QUICK_FORMAT:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_BAD_LABEL:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_OUTPUT:
|
||||||
|
break;
|
||||||
|
case FMIFS_CLUSTER_SIZE_TOO_BIG:
|
||||||
|
case FMIFS_CLUSTER_SIZE_TOO_SMALL:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_VOLUME_TOO_BIG:
|
||||||
|
case FMIFS_VOLUME_TOO_SMALL:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
case FMIFS_NO_MEDIA_IN_DRIVE:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FormatExError = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (FormatExError? FALSE : TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL FormatNtfs (int driveNo, int clusterSize)
|
BOOL FormatNtfs (int driveNo, int clusterSize)
|
||||||
@ -830,12 +881,13 @@ BOOL FormatNtfs (int driveNo, int clusterSize)
|
|||||||
|
|
||||||
StringCbCatW (dir, sizeof(dir), L":\\");
|
StringCbCatW (dir, sizeof(dir), L":\\");
|
||||||
|
|
||||||
FormatExResult = FALSE;
|
FormatExError = TRUE;
|
||||||
|
|
||||||
// Windows sometimes fails to format a volume (hosted on a removable medium) as NTFS.
|
// Windows sometimes fails to format a volume (hosted on a removable medium) as NTFS.
|
||||||
// It often helps to retry several times.
|
// It often helps to retry several times.
|
||||||
for (i = 0; i < 50 && FormatExResult != TRUE; i++)
|
for (i = 0; i < 50 && FormatExError; i++)
|
||||||
{
|
{
|
||||||
|
FormatExError = FALSE;
|
||||||
FormatEx (dir, FMIFS_HARDDISK, L"NTFS", L"", TRUE, clusterSize * FormatSectorSize, FormatExCallback);
|
FormatEx (dir, FMIFS_HARDDISK, L"NTFS", L"", TRUE, clusterSize * FormatSectorSize, FormatExCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -843,7 +895,7 @@ BOOL FormatNtfs (int driveNo, int clusterSize)
|
|||||||
Sleep (4000);
|
Sleep (4000);
|
||||||
|
|
||||||
FreeLibrary (hModule);
|
FreeLibrary (hModule);
|
||||||
return FormatExResult;
|
return FormatExError? FALSE : TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,7 +44,26 @@ typedef struct
|
|||||||
}
|
}
|
||||||
FORMAT_VOL_PARAMETERS;
|
FORMAT_VOL_PARAMETERS;
|
||||||
|
|
||||||
#define FMIFS_DONE 0xB
|
#define FMIFS_PROGRESS 0x00
|
||||||
|
#define FMIFS_DONE_WITH_STRUCTURE 0x01
|
||||||
|
#define FMIFS_INCOMPATIBLE_FILE_SYSTEM 0x03
|
||||||
|
#define FMIFS_ACCESS_DENIED 0x06
|
||||||
|
#define FMIFS_MEDIA_WRITE_PROTECTED 0x07
|
||||||
|
#define FMIFS_VOLUME_IN_USE 0x08
|
||||||
|
#define FMIFS_CANT_QUICK_FORMAT 0x09
|
||||||
|
#define FMIFS_DONE 0x0B
|
||||||
|
#define FMIFS_BAD_LABEL 0x0C
|
||||||
|
#define FMIFS_OUTPUT 0x0E
|
||||||
|
#define FMIFS_STRUCTURE_PROGRESS 0x0F
|
||||||
|
#define FMIFS_CLUSTER_SIZE_TOO_SMALL 0x10
|
||||||
|
#define FMIFS_CLUSTER_SIZE_TOO_BIG 0x11
|
||||||
|
#define FMIFS_VOLUME_TOO_SMALL 0x12
|
||||||
|
#define FMIFS_VOLUME_TOO_BIG 0x13
|
||||||
|
#define FMIFS_NO_MEDIA_IN_DRIVE 0x14
|
||||||
|
#define FMIFS_DEVICE_NOT_READY 0x18
|
||||||
|
#define FMIFS_CHECKDISK_PROGRESS 0x19
|
||||||
|
#define FMIFS_READ_ONLY_MODE 0x20
|
||||||
|
|
||||||
#define FMIFS_HARDDISK 0xC
|
#define FMIFS_HARDDISK 0xC
|
||||||
|
|
||||||
extern int FormatWriteBufferSize;
|
extern int FormatWriteBufferSize;
|
||||||
|
Loading…
Reference in New Issue
Block a user