Для начала хочу разобраться с большинством функция типа IOCTL_*
Уже научился и разобрался с этими функциями.
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
IOCTL_STORAGE_GET_DEVICE_NUMBER
IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER
IOCTL_DISK_GET_LENGTH_INFO
IOCTL_DISK_GET_DRIVE_GEOMETRY
Затык начался на этих функциях:
IOCTL_DISK_GET_DRIVE_LAYOUT_EX
IOCTL_DISK_GET_PARTITION_INFO_EX
Точнее проблема в структуре данных DRIVE_LAYOUT_INFORMATION_EX и PARTITION_INFORMATION_EX
Не получается, видимо, ее правильно описать.
Зато если я делаю так, то все успешно:
- Код: Выделить всё
Dim temp(4096) As Byte
If DeviceIoControl(hDrive, IOCTL_DISK_GET_PARTITION_INFO_EX, ByVal 0&, 0, temp(0), 4096, dwOutBytes, ByVal 0&) Then
MsgBox "Good!"
Else
MsgBox "Failed!"
End If
так я и понял что проблема в структуре.
Структура у меня выглядит так:
- Код: Выделить всё
Private Enum PARTITION_STYLE
PARTITION_STYLE_MBR = 0
PARTITION_STYLE_GPT = 1
PARTITION_STYLE_RAW = 2
Private Type DRIVE_LAYOUT_INFORMATION_MBR
Signature As Long
End Type
Private Type DRIVE_LAYOUT_INFORMATION_GPT
DiskId As Long
StartingUsableOffset As Long
UsableLength As Long
MaxPartitionCount As Long
End Type
Private Type PARTITION_INFORMATION_EX
PartitionStyle As PARTITION_STYLE
StartingOffset As Long
PartitionLength As Long
PartitionNumber As Long
RewritePartition As Boolean
Mbr As PARTITION_INFORMATION_MBR
Gpt As PARTITION_INFORMATION_GPT
End Type
Private Type DRIVE_LAYOUT_INFORMATION_EX
PartitionStyle As PARTITION_STYLE
PartitionCount As Long
Mbr As PARTITION_INFORMATION_MBR
Gpt As PARTITION_INFORMATION_GPT
PartitionEntry(1) As PARTITION_INFORMATION_EX
End Type
Скажу сразу, что эта проблема в инете есть, но мало кто этим занимается.
Буду рад если кто поможет.
Если проблему решить не удастся то наверно придется вручную копать и разбирать MBR (читал тут: http://dimnsk.clan.su/publ/master_boot_record_mbr/25-1-0-50)