Имена файлов вида \DEVICE\HARDISKVOLUMEX

Тема в разделе "WASM.NT.KERNEL", создана пользователем Begemot, 2 дек 2006.

  1. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Доброго времени суток!
    Господа, расскажите, по какому принципу система назначает локальным дискам псевдонимы вида \DEVICE\HARDISKVOLUMEX?
     
  2. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Или может кто знает стабильный метод по получению Буквы диска по строке \DEVICE\HARDISKVOLUMEX?
    Одно условие: не использовать (Rtl)IoVolumeDeviceToDosName, т.к. с ней много проблем.
     
  3. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    можно преобразовать \\.\харддискволум* в имя диска, я под юзером делал, но к сожалению уже не помню как. Как вариант, на эти волумы есть символические ссылки вида "c:", "d:" ..., мож попробовать сопоставить.
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    может в сторону IOCTL_MOUNTMGR_
     
  5. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    _Serega_
    Сорри, я не уточнил, это для кернел мода.

    А по-подробнее можно? Просто я в этих темах плаваю...
     
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Возми WinObjEx от FOUR-F. Теперь небольшой экскурс - внутренняя система путей в NT пронизана симлинками; так, мой системный каталог, на который указывает симлинк \SystemRoot, имеет путь \Device\Harddisk0\Partition8\WINNT. Ещё к нему можно обратиться по пути \DosDevices\H:\WINNT, где \DosDevices -- симлинк на \??, а \??\H:, как и \Device\Harddisk0\Partition8, -- симлинк на \Device\HarddiskVolume3. Значит, "истинный путь" моего системного каталога -- \Device\HarddiskVolume3\WINNT. При каждом обращении к именованым объектам, например файлам, WinNT проходит всю эту цепочку симлинков. А тебе нужно пройти в обратном направлении.
     
  7. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Держи мож пригодится:
    Код (Text):
    1. /////////////////////////////
    2. // Given the full pathname of a symbolic link
    3. // this function prints out what the link is too
    4. // eg  " \DEVICE\HARDISKVOLUME0"  is a link to "\??\С:"
    5. void ProcessSymbolicLink(WCHAR  *name)
    6. {
    7.     NTSTATUS            status;
    8.  
    9.     HANDLE              h;
    10.     OBJECT_ATTRIBUTES   oa;
    11.     UNICODE_STRING      s;
    12.     WCHAR               buffer[1024];
    13. //  void *f1,f2;
    14.     HANDLE fh;
    15.     typedef NTSTATUS (*MYPROC1)(OUT PHANDLE LinkHandle,
    16.     IN ACCESS_MASK DesiredAccess,
    17.     IN POBJECT_ATTRIBUTES ObjectAttributes);
    18.     typedef NTSTATUS (*MYPROC2)(IN HANDLE LinkHandle,
    19.     IN OUT PUNICODE_STRING LinkTarget,
    20.     OUT PULONG ReturnedLength OPTIONAL);
    21.  
    22.     MYPROC1 ZwOpenSymbolicLinkObject;
    23.     MYPROC2 ZwQuerySymbolicLinkObject;
    24.     fh=LoadLibraryA("ntdll.dll");
    25.     ZwOpenSymbolicLinkObject=(MYPROC1)GetProcAddress(fh,"ZwOpenSymbolicLinkObject");
    26.     ZwQuerySymbolicLinkObject=(MYPROC2)GetProcAddress(fh,"ZwQuerySymbolicLinkObject");
    27.     s.Buffer=name;
    28.     s.Length=wcslen(s.Buffer)*2;
    29.     s.MaximumLength=s.Length;
    30.  
    31.     InitializeObjectAttributes(&oa,&s,OBJ_CASE_INSENSITIVE,NULL,NULL);
    32.  
    33.     status=ZwOpenSymbolicLinkObject(&h, 0x20001, &oa);
    34.  
    35.  
    36.     if(status!=0)
    37.     {
    38.         //wprintf(L"status=%lx  %s\n",status,name);
    39.     }
    40.     else
    41.     {
    42.         s.Buffer=buffer;
    43.         s.Length=1024;
    44.         s.MaximumLength=1024;
    45.         memset(buffer,0,1024);
    46.  
    47.         status=ZwQuerySymbolicLinkObject(h, &s, 0);
    48.  
    49.         if(status==0)
    50.             wprintf(L"  -> %s",buffer);
    51.  
    52.     }
    53.     printf("\n");
    54.  
    55.     // I should probably have a close here.
    56. }
    ЗЫ: динамическое связывание мож убить, просто у меня Борланд либу зы ддк не подхватывает.
     
  8. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    _Serega_
    Спасибо Серега!