
![]() |
||
Наши проекты: | Журнал · Discuz!ML · Алгоритмы · Естественные науки · Wiki · DRKB · Помощь проекту |
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | DigiMania | RSS |
[54.197.24.206] |
![]() |
![]() |
Сообщ. #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 не зашиты! vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
|
![]() |
Сообщ. #2,
|
|
Цитата Jin X @ 2. И главный вопрос: как связать физические диски с разделами? Т.е. определить – какие разделы на каком физическом диске находятся? QueryDosDevice char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; ![]() |
![]() |
Сообщ. #3,
|
|
Цитата B.V. @ Нет, мне надо НЕ из диска C: получить странное имя \Device\HarddiskVolume1 (которое даже открыть нельзя через CreateFile... не понятно вообще, нафига это имя нужно и что с ним делать).QueryDosDevice А надо получить из \\?\Volume{GUID} имя физического диска \\PhysicalDrive0, к примеру. Или имея \\PhysicalDrive0 получить все \\?\Volume{GUID}, которые находятся на этом физ. диске. Ну или если где-то там будет фигурировать \Device\HarddiskVolume1, то надо понять, как с них работать, как получить GUID этого раздела и пр... vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
|
![]() |
Сообщ. #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). Прикреплённый файл ![]() vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
|
![]() |
Сообщ. #5,
|
|
Сопоставил буквы с номерами разделов через IOCTL_STORAGE_GET_DEVICE_NUMBER (перебирая все буквы)
![]() p.s. Он, кстати, ведёт нумерацию PartitionNumber с 1. Прикреплённый файл ![]() vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
|
![]() |
Сообщ. #6,
|
|
Навскидку, может кто знает, как по букве найти имя тома, т.е. \\?\Volume{GUID} ?
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
|