Объем Win32_Volume 4096 байт меньше, чем в Win32 API DeviceIOControl IOCTL_DISK_GET_LENGTH_INFO
К сожалению, эта ссылка была закрыта, но у меня есть актуальный вопрос: получить размер тома в Windows
Когда я использую WMI для получения емкости тома в Windows, через Win32_Volume и свойство Capacity для моего диска c:\, я получаю это значение: 499513290752
Тем не менее, когда я использую
bool Success = DeviceIoControl(
Handle,
IoControl.IOCTL_DISK_GET_LENGTH_INFO,
IntPtr.Zero, //InBuffer
0, //InBuffer Size
OutputBuffer,
(uint)Marshal.SizeOf(OutputLengthInfo),
out BytesReturned,
IntPtr.Zero
);
Я получаю: 499513294848, что ровно на 4096 больше, чем сообщает WMI. Я считаю, что это то же самое для каждого тома на жестком диске. (Этот дескриптор является SafeFileHandle, который получается из вызова CreateFile() с именем файла "\\?\Volume{93b1858d-033d-4719-a42a-870d8eb3fe0d}\").
Кроме того, используя следующую команду для запроса диска c:\
uint SectorsPerCluster = 0;
uint BytesPerSector = 0;
uint NumberOfFreeClusters = 0;
uint TotalNumberOfClusters = 0;
GetDiskFreeSpace(
Drive,
out SectorsPerCluster,
out BytesPerSector,
out NumberOfFreeClusters,
out TotalNumberOfClusters
);
Сообщает, что общее количество кластеров составляет 121951487, 8 секторов на кластер и 512 байт на сектор, что дает 499513290752 байта, то же самое, что и WMI.
Когда я использую Win32_DiskPartition, он сообщает о том же значении, что и DeviceIoControl для емкости, что странно (имя файла здесь "\\?\GLOBALROOT\Device\Harddisk0\Partition1" в качестве одного примера).
Я также получаю совершенно другое число при сравнении значения, полученного из функций Win32_DiskDrive и DeviceIoControl для физического диска, заданного параметром "\\. \ PhysicalDrive0":
Win32_DiskDrive: 500105249280
IoControl: 500107862016 (разница около 2,5 МБ, я думаю)
Размер Win32_DiskDrive соответствует математике байтов на сектор * TotalSectors, как сообщается в классе WMI: 512 байт на сектор * общее количество секторов 976768065 = 500105249280. Если значение IoControl является правильным, это будет означать, что фактически существует 976773168 общих секторов. Значение из геометрии диска также поддерживает размер диска 500105249280.
Итак, какому значению / источнику мне следует доверять, и почему они всегда различаются по объему на 4096 байт? Является ли IOCTL_DISK_GET_LENGTH_INFO действительным только для разделов, а не для физических дисков или томов?
ОБНОВЛЕНИЕ: Еще немного информации / разъяснений. Я также пытался читать физические секторы и могу читать за пределами размера диска, сообщенного Disk Geometry и Win32_DiskDrive. В этом случае значение IOCTL_DISK_GET_LENGTH_INFO на самом деле является правильным, я могу прочитать до числа секторов, сообщенных этой функцией, и получить ошибку только тогда, когда я пытаюсь прочитать за ее пределами. Так почему же другие функции не сообщают о фактическом общем количестве секторов / правильном размере? Физический диск скрывает определенные области, к которым некоторые функции не могут получить доступ?
1 ответ
GetDiskFreeSpace сообщает размер тома файловой системы, который в случае NTFS не включает кластер, содержащий резервный сектор в конце тома (раздела).
IOCTL_DISK_GET_LENGTH_INFO сообщает фактический размер тома (раздела) (он не относится к тому файловой системы).