![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер физического диска
d_oleg © (2004-08-16 17:48:00)Подскажите пожалуйста, как можно определить размер _физического_ (не логического) диска? Поясню на примере: есть 80Гб диск, на нём создан раздел на 40Гб. Мне нужно узнать, что диск 80Гб, независимо от размера раздела.
Игорь Шевченко (2004-08-18 10:31:00) [1]http://www.schevchenko.net.ru/SRC/DeviceIoControl_60.zip+
http://www.schevchenko.net.ru/SRC/Common_60.zip
Dimaxx (2004-08-17 22:05:00) [2]Забыл написать, что 458752 это команда IOCTL_DISK_GET_DRIVE_GEOMETRY.
Dimaxx (2004-08-16 22:23:00) [3]
type
MEDIA_TYPE = (Unknown, F5_1Pt2_512, F3_1Pt44_512, F3_2Pt88_512, F3_20Pt8_512, F3_720_512, F5_360_512, F5_320_512, F5_320_1024, F5_180_512, F5_160_512, RemovableMedia, FixedMedia);
...
var
H: THandle;
R: cardinal;
DG: packed record
Cylinders: int64;
MediaType: MEDIA_TYPE;
TracksPerCylinder: cardinal;
SectorsPerTrack: cardinal;
BytesPerSector: cardinal;
end;
...
H:=CreateFile('\\.\PHYSICALDRIVE0',GENERIC_READ,0,nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
if H<>INVALID_HANDLE_VALUE then DeviceIOControl(H,458752,nil,0,@DG,sizeof(DG),R,nil);
CloseHandle(H);
Код для NT. Для неNT пока кода нет.
Перемножаем Cylinders*TracksPerCylinder*SectorsPerTrack*BytesPerSector и получаем емкость накопителя в байтах. Потом делим на 1073741824 - получаем в Гбайтах.
PHYSICALDRIVE0 - для Primary Master
PHYSICALDRIVE1 - для Primary Slave
PHYSICALDRIVE2 - для Secondary Master
PHYSICALDRIVE3 - для Secondary Slave
Fay (2004-08-16 17:56:00) [4]DeviceIoControl