Доброго времени суток! Господа, расскажите, по какому принципу система назначает локальным дискам псевдонимы вида \DEVICE\HARDISKVOLUMEX?
Или может кто знает стабильный метод по получению Буквы диска по строке \DEVICE\HARDISKVOLUMEX? Одно условие: не использовать (Rtl)IoVolumeDeviceToDosName, т.к. с ней много проблем.
можно преобразовать \\.\харддискволум* в имя диска, я под юзером делал, но к сожалению уже не помню как. Как вариант, на эти волумы есть символические ссылки вида "c:", "d:" ..., мож попробовать сопоставить.
_Serega_ Сорри, я не уточнил, это для кернел мода. А по-подробнее можно? Просто я в этих темах плаваю...
Возми WinObjEx от FOUR-F. Теперь небольшой экскурс - внутренняя система путей в NT пронизана симлинками; так, мой системный каталог, на который указывает симлинк \SystemRoot, имеет путь \Device\Harddisk0\Partition8\WINNT. Ещё к нему можно обратиться по пути \DosDevices\H:\WINNT, где \DosDevices -- симлинк на \??, а \??\H:, как и \Device\Harddisk0\Partition8, -- симлинк на \Device\HarddiskVolume3. Значит, "истинный путь" моего системного каталога -- \Device\HarddiskVolume3\WINNT. При каждом обращении к именованым объектам, например файлам, WinNT проходит всю эту цепочку симлинков. А тебе нужно пройти в обратном направлении.
Держи мож пригодится: Код (Text): ///////////////////////////// // Given the full pathname of a symbolic link // this function prints out what the link is too // eg " \DEVICE\HARDISKVOLUME0" is a link to "\??\С:" void ProcessSymbolicLink(WCHAR *name) { NTSTATUS status; HANDLE h; OBJECT_ATTRIBUTES oa; UNICODE_STRING s; WCHAR buffer[1024]; // void *f1,f2; HANDLE fh; typedef NTSTATUS (*MYPROC1)(OUT PHANDLE LinkHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes); typedef NTSTATUS (*MYPROC2)(IN HANDLE LinkHandle, IN OUT PUNICODE_STRING LinkTarget, OUT PULONG ReturnedLength OPTIONAL); MYPROC1 ZwOpenSymbolicLinkObject; MYPROC2 ZwQuerySymbolicLinkObject; fh=LoadLibraryA("ntdll.dll"); ZwOpenSymbolicLinkObject=(MYPROC1)GetProcAddress(fh,"ZwOpenSymbolicLinkObject"); ZwQuerySymbolicLinkObject=(MYPROC2)GetProcAddress(fh,"ZwQuerySymbolicLinkObject"); s.Buffer=name; s.Length=wcslen(s.Buffer)*2; s.MaximumLength=s.Length; InitializeObjectAttributes(&oa,&s,OBJ_CASE_INSENSITIVE,NULL,NULL); status=ZwOpenSymbolicLinkObject(&h, 0x20001, &oa); if(status!=0) { //wprintf(L"status=%lx %s\n",status,name); } else { s.Buffer=buffer; s.Length=1024; s.MaximumLength=1024; memset(buffer,0,1024); status=ZwQuerySymbolicLinkObject(h, &s, 0); if(status==0) wprintf(L" -> %s",buffer); } printf("\n"); // I should probably have a close here. } ЗЫ: динамическое связывание мож убить, просто у меня Борланд либу зы ддк не подхватывает.