Также интересует способ такого преобразования. Необходимо конвертировать: \\.\PHYSICALDRIVE0 -> буквы партиций ?:\, ?:\, ?:\ ... либо C:\ -> \\.\PHYSICALDRIVE? Подскажите пожалуйста варианты реализаций.
PHYSICALDRIVE это символическая ссылка на девайс. Она ссылается к примеру на \Device\Harddisk0\DR0. В директории \Device\Harddisk0 перечислены все ссылки на тома: \Device\Harddisk0\Partition1" ссылается на \Device\HarddiskVolume1, \Device\Harddisk0\Partition2" ссылается на \Device\HarddiskVolume2. А дос имя начинается с символической ссылки, это и есть буква, соответствующая тому. Тоесть например ссылка C: ссылается на \Device\HarddiskVolume1. Для получения списка томов нужно раскрыть вашу ссылку PHYSICALDRIVE# и перечислить там ссылки "Partition#". На каждой итерации перечислить буквы алфавита, каждую раскрыть и сравнить с полученным на текущей итерации именем. Если найдено, то взводим единичку в бите результата, с номером итерации. Далее выполняем цикл до окончания списка разделов. Хотя можно и наоборот, буквы перечислить, но сути это не меняет.
LightMoon, спасибо за ответ. А не подскажите какие API функции мне нужно использовать для раскрытия PHYSICALDRIVE и прочего?
NtOpenSymbolicLinkObject, NtQuerySymbolicLinkObject; апи вроде были, но не помню название. В ядре есть функа IoVolumeDeviceToDosName(), она сводится к IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, но это какой то стрёмны функционал. Я бы в юзедмодах лучше сим. ссылки пораскрывал.
Перед тем как писать прогу, я решил посмотреть на эти симлинки. Выбрал полезное из списка: C: -> \Device\HarddiskVolume3 D: -> \Device\HarddiskVolume4 E: -> \Device\HarddiskVolume1 F: -> \Device\HarddiskVolume5 Harddisk0Partition2 -> \Device\HarddiskVolume2 Harddisk0Partition3 -> \Device\HarddiskVolume3 Harddisk1Partition2 -> \Device\HarddiskVolume1 PhysicalDrive0 -> \Device\Harddisk0\DR0 PhysicalDrive1 -> \Device\Harddisk0\DR1 У меня установлено на компе 2 харда. На одном партиции C и F(раздел без буквы, резерв системы). На втором E и D. И вышеперечисленных симлинков могу составить две цепочки: C: -> \Device\HarddiskVolume3 -> Harddisk0Partition3 -> PhysicalDrive0 E: -> \Device\HarddiskVolume1 -> Harddisk1Partition2 -> PhysicalDrive1 Для F: и D: я не могу построить цепочки ибо не хватает симлинков. Hard 0 ---------- Партиция зарезервированная системой - 100 МБ Партиция С: - 70 ГБ Партиция F: - 851 ГБ Hard 1 ---------- Партиция D: - 851 ГБ Партиция E: - 30 ГБ Может отсутствовать симлинк из-за большого размера партиции? Правильно я построил цепочки? -) P.S. Симлинки смотрел через WinObj.
exkilla Не знаем. Тогда IOCTL попробуйте поюзать. Сурс в dev2dos.c А вообще откуда вы и зачем линк на девайс берёте ?
Правильно я понимаю, что это Kernel-Mode решение? Все данные с прошлого моего поста взяты с каталога \\GLOBAL??. А цель получить номер PHYSICALDRIVE с которого загружена винда. Или Вы имели в виду другое?
exkilla Мод не имеет значения. Тогда просто раскройте линк "SystemRoot", у меня к примеру он ссылается на \Device\Harddisk0\Partition1\WINDOWS, если раскрыть \Device\Harddisk0\Partition1, то получим \Device\HarddiskVolume1 и соответственно "C:" сюда и ссылается.
Спасибо, так и сделаю. Кстати, есть еще догадки, почему нет симлинков для раздела D: и F:. Они у меня не системные. А C: и E: системные. Win7 x64 Всегда работает следующая закономерность? Harddisk0 == PHYSICALDRIVE0 Harddisk1 == PHYSICALDRIVE1 Harddisk2 == PHYSICALDRIVE2 ...
exkilla В случае RAID работать не будет. Вообще, чтобы получить нужное соответствие, надо использовать IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS для томов (том -- это то, что имеет букву), затем перечислить все диски в системе, спросить у каждого диска его номер с помощью IOCTL_STORAGE_GET_DEVICE_NUMBER и сопоставить VOLUME_DISK_EXTENTS:ISK_EXTENT:iskNumber (том может состоять из нескольких дисков).