Буква диска по имени устройства

Тема в разделе "WASM.WIN32", создана пользователем jnw, 18 окт 2005.

  1. jnw

    jnw New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    6
    Приветствую уважаемый форум!



    Проблема в следующем. Имеем имя файла в канонической форме:

    \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1\test2\test.ex t"

    Как определить, на каком логическом диске он лежит, то есть преобразовать это имя к "нормальному" виду, например,

    с:\test2\test.ext"? Как определить, какая буква логического диска соответствует какому устройству? И как можно получить список таких устройств: \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1?

    Заранее спасибо всем ответившим.



    P.S. Если речь зайдет о QueryDosDevices, то подскажите плз, как заставить ее нормально работать с динамическими дисками?
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    ZwOpenSymbolicLinkObject

    ZwQuerySymbolicLinkObject
     
  3. jnw

    jnw New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    6
    Пытался, безрезультатно.

    Диск у меня динамический, есть файл c:\test.ext. От функции GetMappedFileName приходит имя в виде \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1\test2\test.ex t.

    Когда же я пытаюсь воспользоваться ZwOpenSymbolicLinkObject + ZwQuerySymbolicLinkObject,

    то получаю для с: результат \Device\HarddiskDmVolumes\Jnw1Dg0\Volume2.

    Как бы их связать?
     
  4. jnw

    jnw New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    6
    Стоп, все получилось, до тупости просто, вопрос снят. Спасибо MegaZu, навел на мысль :)
     
  5. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    VolumeDeviceToDosName

    RtlVolumeDeviceToDosName

    IoVolumeDeviceToDosName



    пробуй.



    [add]



    Просю =)

    gl & hf
     
  6. jnw

    jnw New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    6
    NTSTATUS

    IoVolumeDeviceToDosName(

    IN PVOID VolumeDeviceObject,

    OUT PUNICODE_STRING DosName

    );



    А где мне взять VolumeDeviceObject?



    P.S. У меня получилось иначе. Если прогнать \Device\HarddiskDmVolumes\Jnw1Dg0\Volume2 через ZwOpenSymbolicLinkObject + ZwQuerySymbolicLinkObject то получиться как раз \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Наверняка ты не сразу получаешь имя, а имеешь еще хэндл файла или FileObject, тогда VolumeDeviceObject = FileObject->DeviceObject
     
  8. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Если я не ошыбаюсь то в туторах от Four-F где-то было.



    [add]



    Ты лучше прочти их все сначала до конца =)



    gg
     
  9. jnw

    jnw New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    6
    К сожалению, ни хэндла, ни, тем более FileObject, нет. Только имя.



    А по хэндлу можно получить FileObject?



    Простите за наивность, а что такое "туторах от Four-F"?
     
  10. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290




    =)



    Ищи
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Тогда тебе нужно перечислять девайсы в \??\ (ZwQueryDirectoryObject), там будут символические ссылки с именами c:, d: и.т.д. (вместо перечисления можно просто открывать все линки от a до z).

    Дальше по линку надо получить имя девайса, сделать это можно с помощью ZwQuerySymbolicLinkObject либо открыть девайс по линку и извлечь имя из ObjectHeader. Затем при получении имени файла нужно выделять из него девайс (это может быть также символическая ссылка) и сравнивать ия с получеными именами существующих девайсов.



    Более простой способ - в цикле перебирать все имена от A до Z, открывать соответствующий линк на девайс в \??\, делать референс на хэндл (ObReferenceObjectByHandle) и сохранять полученые FileObject->DeviceObject в массив.

    Потом при получении имени файла открывать соответствующий девайс, делать референс и искать девайс в массиве, индекс найденого элемента и будет буквой диска.



    При этом следует учесть, что один диск может иметь несколько букв, соответственно в \??\ будет несколько ссылок на его девайс.





    ObReferenceObjectByHandle
     
  12. jnw

    jnw New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    6
    Проблема решена, спасибо всем :)
     
  13. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Все намного проще:
    Код (Text):
    1. HANDLE hFlash = CreateFile("\\\\.\\C:",GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
    2.     if(INVALID_HANDLE_VALUE == hFlash) {MessageBox(NULL,"Err1","",0);goto __err;}
    3.     ULONG size = 0x2000;
    4.     DWORD ret=0;
    5.     NtQueryObject (hFlash,ObjectNameInformation,NULL,0,&size );
    6.     if(size==0) size = 0x2000;
    7.     PUNICODE_STRING lpBuffer=(PUNICODE_STRING)LocalAlloc(LMEM_ZEROINIT,size);
    8.     NtQueryObject(hFlash,ObjectNameInformation,(PVOID)lpBuffer, size, &ret );
    lpBuffer->Buffer и есть \Device\...
    Блин, на дату не посмотрел...Все равно пригодится.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    http://www.wasm.ru/forum/viewtopic.php?id=21205