подскажите одну мелочь

Тема в разделе "WASM.BEGINNERS", создана пользователем moderhi, 26 ноя 2011.

  1. exkilla

    exkilla New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2010
    Сообщения:
    7
    Также интересует способ такого преобразования.

    Необходимо конвертировать:

    \\.\PHYSICALDRIVE0 -> буквы партиций ?:\, ?:\, ?:\ ...
    либо
    C:\ -> \\.\PHYSICALDRIVE?

    Подскажите пожалуйста варианты реализаций.
     
  2. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    PHYSICALDRIVE это символическая ссылка на девайс. Она ссылается к примеру на \Device\Harddisk0\DR0. В директории \Device\Harddisk0 перечислены все ссылки на тома: \Device\Harddisk0\Partition1" ссылается на \Device\HarddiskVolume1, \Device\Harddisk0\Partition2" ссылается на \Device\HarddiskVolume2. А дос имя начинается с символической ссылки, это и есть буква, соответствующая тому. Тоесть например ссылка C: ссылается на \Device\HarddiskVolume1. Для получения списка томов нужно раскрыть вашу ссылку PHYSICALDRIVE# и перечислить там ссылки "Partition#". На каждой итерации перечислить буквы алфавита, каждую раскрыть и сравнить с полученным на текущей итерации именем. Если найдено, то взводим единичку в бите результата, с номером итерации. Далее выполняем цикл до окончания списка разделов. Хотя можно и наоборот, буквы перечислить, но сути это не меняет.
     
  3. exkilla

    exkilla New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2010
    Сообщения:
    7
    LightMoon, спасибо за ответ.

    А не подскажите какие API функции мне нужно использовать для раскрытия PHYSICALDRIVE и прочего?
     
  4. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    NtOpenSymbolicLinkObject, NtQuerySymbolicLinkObject; апи вроде были, но не помню название.

    В ядре есть функа IoVolumeDeviceToDosName(), она сводится к IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, но это какой то стрёмны функционал. Я бы в юзедмодах лучше сим. ссылки пораскрывал.
     
  5. exkilla

    exkilla New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2010
    Сообщения:
    7
    Перед тем как писать прогу, я решил посмотреть на эти симлинки.

    Выбрал полезное из списка:
    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.
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    exkilla
    Не знаем. Тогда IOCTL попробуйте поюзать. Сурс в dev2dos.c

    А вообще откуда вы и зачем линк на девайс берёте ?
     
  7. exkilla

    exkilla New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2010
    Сообщения:
    7
    Правильно я понимаю, что это Kernel-Mode решение?
    Все данные с прошлого моего поста взяты с каталога \\GLOBAL??.
    А цель получить номер PHYSICALDRIVE с которого загружена винда.
    Или Вы имели в виду другое?
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    exkilla
    Мод не имеет значения.

    Тогда просто раскройте линк "SystemRoot", у меня к примеру он ссылается на \Device\Harddisk0\Partition1\WINDOWS, если раскрыть \Device\Harddisk0\Partition1, то получим \Device\HarddiskVolume1 и соответственно "C:" сюда и ссылается.
     
  9. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    Respect и уважуха! LightMoonа разбанить!)
     
  10. zxcv

    zxcv New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    257
    клерк это. он же инди, малфой и >9000
     
  11. exkilla

    exkilla New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2010
    Сообщения:
    7
    Спасибо, так и сделаю.

    Кстати, есть еще догадки, почему нет симлинков для раздела D: и F:.
    Они у меня не системные. А C: и E: системные. Win7 x64

    Всегда работает следующая закономерность?

    Harddisk0 == PHYSICALDRIVE0
    Harddisk1 == PHYSICALDRIVE1
    Harddisk2 == PHYSICALDRIVE2
    ...
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    exkilla
    В случае RAID работать не будет. Вообще, чтобы получить нужное соответствие, надо использовать IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS для томов (том -- это то, что имеет букву), затем перечислить все диски в системе, спросить у каждого диска его номер с помощью IOCTL_STORAGE_GET_DEVICE_NUMBER и сопоставить VOLUME_DISK_EXTENTS::lol: ISK_EXTENT::lol: iskNumber (том может состоять из нескольких дисков).
     
  13. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Mika0x65
    Чем это проще, чем юзать симлинки ?

    IOCTL это последнее решение, если больше вбора нет.