https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c5a9f22d4eab1b36a240e…
commit c5a9f22d4eab1b36a240ef306ec927784219d111
Author: Adam Słaboń <asaillen(a)protonmail.com>
AuthorDate: Sat Mar 2 23:56:51 2024 +0100
Commit: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito(a)reactos.org>
CommitDate: Mon Oct 7 11:16:03 2024 +0200
[FORMAT] Use QueryDeviceInformation for retrieving the volume size before formatting
it
QueryDeviceInformation returns more reliable volume length and works
with unformatted volumes. It will return volume length only on ROS and Vista+
however,
so also keep the GetFreeDiskSpaceExW as a fallback for XP/2003.
---
base/system/format/format.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/base/system/format/format.c b/base/system/format/format.c
index 0d7e642c598..c8805af5e69 100644
--- a/base/system/format/format.c
+++ b/base/system/format/format.c
@@ -360,6 +360,7 @@ static VOID Usage(LPWSTR ProgramName)
int wmain(int argc, WCHAR *argv[])
{
int badArg;
+ DEVICE_INFORMATION DeviceInformation = {0};
FMIFS_MEDIA_FLAG media = FMIFS_HARDDISK;
DWORD driveType;
WCHAR fileSystem[1024];
@@ -479,7 +480,19 @@ int wmain(int argc, WCHAR *argv[])
return -1;
}
- if (!GetDiskFreeSpaceExW(RootDirectory,
+ if (QueryDeviceInformation(RootDirectory,
+ &DeviceInformation,
+ sizeof(DeviceInformation)))
+ {
+ totalNumberOfBytes.QuadPart = DeviceInformation.SectorSize *
+ DeviceInformation.SectorCount.QuadPart;
+ }
+
+ /* QueryDeviceInformation returns more accurate volume length and works with
+ * unformatted volumes, however it will NOT return volume length on XP/2003.
+ * Fallback to GetFreeDiskSpaceExW if we did not get any volume length. */
+ if (totalNumberOfBytes.QuadPart == 0 &&
+ !GetDiskFreeSpaceExW(RootDirectory,
&freeBytesAvailableToCaller,
&totalNumberOfBytes,
&totalNumberOfFreeBytes))