Re: DeviceIoControl and IOCTL_DISK_GET_DRIVE_GEOMETRY
От: MShura  
Дата: 07.04.05 13:23
Оценка:
Здравствуйте, 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Мбг, то и разница может достигать этого значения как угодно близко.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.