Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.174.168] |
|
Сообщ.
#1
,
|
|
|
Приветствую!
Есть \\.\PhysicalDriveX, его можно открыть через CreateFile и получить GUID (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX... или можно как-то ещё проще получить GUID?). Можно получить список (GUID) всех томов через FindFirstVolume/FindNextVolume (в формате \\?\Volume{GUID}). 0. Можно ли получить GUID типа раздела через IOCTL_DISK_GET_PARTITION_INFO_EX, подставив этот том (\\?\Volume{GUID})? 1. И есть ли вообще разница между томами и разделами? К примеру, в описании IOCTL_DISK_GET_LENGTH_INFO сказано "Retrieves the length of the specified disk, volume, or partition." (типа раздел и том – это не одно и то же). 2. И главный вопрос: как связать физические диски с разделами? Т.е. определить – какие разделы на каком физическом диске находятся? 3. А как перечислить все физические диски и все разделы на этом диске? Можно открывать все подряд PhysicalDrive0, 1, 2... до ошибки типа not found. Но это единственный способ? А не может быть такого, что PhysicalDrive1 нет, а PhysicalDrive2 есть? 4. Ну и ещё вопрос до кучи: какие вообще устройства (диски, разделы) можно задать для CreateFile кроме \\.\PhysycalDriveX, \\.\CdRomX и \\.\X: ? Scsi ещё вроде были (только как их задать – х/з). В инете можно найти ещё устройства типа \Device\Harddisk0\Partition1, но у меня открыть (CreateFile) такое устройство не получается (не найден), задаю \\?\Device\Harddisk0\Partition1 – аналогично (\\.\ тоже, без Device\ та же история). Ещё фигурируют какие-то \Device\Harddisk0\DR0 и т.п. – тоже не работает (что это такое вообще?) Добавлено Ну и бомбану ещё вопросом: 5. Откуда берутся GUID дисков на основе MBR (или вообще с boot-секторами) типа флешек и пр.? Там же нигде эти GUID не зашиты! |
Сообщ.
#2
,
|
|
|
Цитата Jin X @ 2. И главный вопрос: как связать физические диски с разделами? Т.е. определить – какие разделы на каком физическом диске находятся? QueryDosDevice |
Сообщ.
#3
,
|
|
|
Цитата B.V. @ Нет, мне надо НЕ из диска C: получить странное имя \Device\HarddiskVolume1 (которое даже открыть нельзя через CreateFile... не понятно вообще, нафига это имя нужно и что с ним делать).QueryDosDevice А надо получить из \\?\Volume{GUID} имя физического диска \\PhysicalDrive0, к примеру. Или имея \\PhysicalDrive0 получить все \\?\Volume{GUID}, которые находятся на этом физ. диске. Ну или если где-то там будет фигурировать \Device\HarddiskVolume1, то надо понять, как с них работать, как получить GUID этого раздела и пр... |
Сообщ.
#4
,
|
|
|
По поводу вопроса №2...
С помощью DeviceIoControl(IOCTL_DISK_GET_DRIVE_LAYOUT_EX) можно получить инфу обо всех разделах и их GUID (как для MBR, так и для GPT разделов). И дальше через GetVolumePathNamesForVolumeName('\\?\Volume{GUID}\') получить инфу о буквах/путях. Через GetVolumeInformation('\\?\Volume{GUID}\') получаем метки, файловую систему и пр. ерунду. Есть только один интересный нюанс. На хардах всё работает. А вот с флешкой глюки: \\?\Volume{GUID}\ не совпадает с тем, что выдаёт утилита mountvol, и GetVolumePathNamesForVolumeName/GetVolumeInformation тоже ничего не выдают. Вопрос: как сопоставить GUID диска с GUID, который указан в \\?\Volume{GUID}\. По логике он должен совпадать. Код прикрепляю (тут этот GUID отображается как PartitionId). Прикреплённый файлHardDriveInfo.zip (31,37 Кбайт, скачиваний: 114) |
Сообщ.
#5
,
|
|
|
Сопоставил буквы с номерами разделов через IOCTL_STORAGE_GET_DEVICE_NUMBER (перебирая все буквы)
p.s. Он, кстати, ведёт нумерацию PartitionNumber с 1. Прикреплённый файлHardDriveInfo.zip (31,73 Кбайт, скачиваний: 117) |
Сообщ.
#6
,
|
|
|
Навскидку, может кто знает, как по букве найти имя тома, т.е. \\?\Volume{GUID} ?
|