Здравствуйте, misha_irpen, Вы писали:
_>Заметил очень странную вещь: если для пустого, свежеотформатированного диска сделать _>DeviceIoControl(Handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, ...), то DISK_GEOMETRY.Cylinders*DISK_GEOMETRY.TracksPerCylinder*DISK_GEOMETRY.SectorsPerTrack*DISK_GEOMETRY.BytesPerSector оказывается меньше, чем то, что GetDiskFreeSpaceEx(...) записывает в FreeAvailable.
_>То есть полный, обусловленный логической геометрией, объем устройства получается меньше, чем свободное пространство на его единственном разделе! Как это объяснить?
Для получения размера диска надо пользоваться IOCTL_DISK_GET_PARTITION_INFO указывая handle диска.
Работает в Win2K+
Разница между этим значением и значением полученным из IOCTL_DISK_GET_DRIVE_GEOMETRY до 8 Мб.
Дело в том, что DISK_GEOMETRY это фикция. Чтобы заполнить эту структуру Windows берет настоящий размер (см выше) выставляет в DISK_GEOMETRY все числа кроме Cylinders, а цилиндры считает обычным целочисленным делением.
Происходит округление в меньшую строну. А поскольку один цилиндр это обычно ~8Мбг, то и разница может достигать этого значения как угодно близко.