Приветствую уважаемый форум! Проблема в следующем. Имеем имя файла в канонической форме: \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1\test2\test.ex t" Как определить, на каком логическом диске он лежит, то есть преобразовать это имя к "нормальному" виду, например, с:\test2\test.ext"? Как определить, какая буква логического диска соответствует какому устройству? И как можно получить список таких устройств: \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1? Заранее спасибо всем ответившим. P.S. Если речь зайдет о QueryDosDevices, то подскажите плз, как заставить ее нормально работать с динамическими дисками?
Пытался, безрезультатно. Диск у меня динамический, есть файл c:\test.ext. От функции GetMappedFileName приходит имя в виде \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1\test2\test.ex t. Когда же я пытаюсь воспользоваться ZwOpenSymbolicLinkObject + ZwQuerySymbolicLinkObject, то получаю для с: результат \Device\HarddiskDmVolumes\Jnw1Dg0\Volume2. Как бы их связать?
VolumeDeviceToDosName RtlVolumeDeviceToDosName IoVolumeDeviceToDosName пробуй. [add] Просю =) gl & hf
NTSTATUS IoVolumeDeviceToDosName( IN PVOID VolumeDeviceObject, OUT PUNICODE_STRING DosName ); А где мне взять VolumeDeviceObject? P.S. У меня получилось иначе. Если прогнать \Device\HarddiskDmVolumes\Jnw1Dg0\Volume2 через ZwOpenSymbolicLinkObject + ZwQuerySymbolicLinkObject то получиться как раз \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1
Наверняка ты не сразу получаешь имя, а имеешь еще хэндл файла или FileObject, тогда VolumeDeviceObject = FileObject->DeviceObject
Если я не ошыбаюсь то в туторах от Four-F где-то было. [add] Ты лучше прочти их все сначала до конца =) gg
К сожалению, ни хэндла, ни, тем более FileObject, нет. Только имя. А по хэндлу можно получить FileObject? Простите за наивность, а что такое "туторах от Four-F"?
Тогда тебе нужно перечислять девайсы в \??\ (ZwQueryDirectoryObject), там будут символические ссылки с именами c:, d: и.т.д. (вместо перечисления можно просто открывать все линки от a до z). Дальше по линку надо получить имя девайса, сделать это можно с помощью ZwQuerySymbolicLinkObject либо открыть девайс по линку и извлечь имя из ObjectHeader. Затем при получении имени файла нужно выделять из него девайс (это может быть также символическая ссылка) и сравнивать ия с получеными именами существующих девайсов. Более простой способ - в цикле перебирать все имена от A до Z, открывать соответствующий линк на девайс в \??\, делать референс на хэндл (ObReferenceObjectByHandle) и сохранять полученые FileObject->DeviceObject в массив. Потом при получении имени файла открывать соответствующий девайс, делать референс и искать девайс в массиве, индекс найденого элемента и будет буквой диска. При этом следует учесть, что один диск может иметь несколько букв, соответственно в \??\ будет несколько ссылок на его девайс. ObReferenceObjectByHandle
Все намного проще: Код (Text): HANDLE hFlash = CreateFile("\\\\.\\C:",GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if(INVALID_HANDLE_VALUE == hFlash) {MessageBox(NULL,"Err1","",0);goto __err;} ULONG size = 0x2000; DWORD ret=0; NtQueryObject (hFlash,ObjectNameInformation,NULL,0,&size ); if(size==0) size = 0x2000; PUNICODE_STRING lpBuffer=(PUNICODE_STRING)LocalAlloc(LMEM_ZEROINIT,size); NtQueryObject(hFlash,ObjectNameInformation,(PVOID)lpBuffer, size, &ret ); lpBuffer->Buffer и есть \Device\... Блин, на дату не посмотрел...Все равно пригодится.