Nt Device Name в Dos Device Names

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheph, 10 фев 2008.

  1. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Всем доброго времени суток, задача такая, получить список mount point'ов для nt device name, т.е, допустим у нас есть: "\Device\HarddiskVolume1" и есть ссылки на него: "C:" и "D:\DiskC", нужно по строке "\Device\HarddiskVolume1" получить все такие ссылки, в MSDN'е есть пример: http://msdn2.microsoft.com/en-us/library/bb891980(VS.85).aspx?s=1 но это слишком громоздко, мне нужно получать mount point'ы быстро, поэтому я хочу сделать так: в режиме ядра из строки "\Device\HarddiskVolume1" получить Volume GUID и сформировать соответствующую ссылку (типа "\\?\Volume{015de57a-ae55-11dc-b751-0050bf7178db}\") передать её в UserMode, а там уже вызвать только GetVolumePathNamesForVolumeName. Вопрос: как в ядре из "\Device\HarddiskVolume1" получить "\\?\Volume{015de57a-ae55-11dc-b751-0050bf7178db}\" ну или хотя бы узнать GUID volume'а ?
     
  2. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    ZwQueryVolumeInformationFile(FileFsVolumeInformation)
     
  3. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    GetVolumeInformation кстати в апи
    зачем через драйвер )
    перечислить лог. диски - GetLogicalDrives
     
  4. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    0x56, хм, насчёт FileFsVolumeInformation, поля FILE_FS_VOLUME_INFORMATION:
    LARGE_INTEGER VolumeCreationTime;
    ULONG VolumeSerialNumber;
    ULONG VolumeLabelLength;
    BOOLEAN SupportsObjects;
    WCHAR VolumeLabel[1];
    Где здесь GUID ? Он же 128-битный должен быть, ни в одно из этих полей он не поместится, а VolumeLabel - это всего-навсего метка тома.
     
  5. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    Sheph
    извиняюсь
    не вник в суть
     
  6. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
  7. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Так дело как раз в том что я не хочу перечислять все томы, я хочу сделать это быстро просто вызвав GetVolumePathNamesForVolumeName для нужного, это возможно ?
     
  8. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
  9. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Как же часто оказывается приходится переписывать WinAPI функции под ядро, GetLongPathName я уже переписал, что-то вроде QueryDosDevice тоже, теперь это...
    Всем спасибо за помошь, буду разбираться.
     
  10. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    А вот у меня в ring3 такая проблемма (WinXP Sp2).
    Ф-ия NtQueryVirtualMemory (с параметром MemorySectionName) возвращает для файлов лежащих на втором динамическом разделе (диск J) такой путь:
    \device\HarddiskDmVolumes\<имя_компа>IDg0\Volume2
    Хотя ф-ия QueryDosDeviceW для диска J:\ возвращает такой путь:
    \device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume2

    Так как же мне сопоставить Nt_Device_Name и Dos_Device ?

    ЗЫ. Через GetVolumeNameForVolumeMountPointW получаю тоже самое.
     
  11. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Наверное \device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume2 - это символическая ссылка на \device\HarddiskDmVolumes\<имя_компа>IDg0\Volume2 или наоборот, нужно вызвать ZwQuerySymbolicLinkObject и проверить. Хотя не уверне что символическия ссылки могут называться как \device\...