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