Есть ли функция конвертации вида \Device\HarddiskVolume1\1.txt -> C:\1.txt т.е. обратная к QueryDosDevice?
Не рулит. Видел этот топик. ZwOpenSymbolicLinkObject требует линк. Как из имени выделить линк, чтобы передать туда? Линки могут быть совершенно различного вида. Вижу только один способ: получить все девайсы и каждый из них сравнивать на n первых символов с именем файла. И так для каждого файла. Долго, неудобно и ненадёжно.
Вот здесь тоже аналог. вопрос Ф-ции которая с \Device\HarddiskVolume1\1.txt зделает C:\1.txt вроде нет ... но хз, может ошибаюсь.
Там собственно та же информация. Думаю быстрее и надёжней будет подойти с обратной стороны: получить список имен дисков GetLogicalDriveStrings и список линков QueryDosDevice. Для каждого имени диска получить линк и сопоставить с \Device\HarddiskVolume1\1.txt
Ну тогда и мой вариант до кучи Код (Text): lpDevice - input buffer ptr lpPathOut - output buffer ptr cbPathOut - output buffer length ;===================================================================== ================== DeviceToPath proc uses ebx esi lpDevice:DWORD, lpPathOut:DWORD, cbPathOut:DWORD LOCAL logStrings[256] :BYTE invoke GetLogicalDriveStrings, 256, addr logStrings .if (eax) lea ebx,logStrings .while (byte ptr[ebx]) invoke lstrlen, ebx lea eax,[eax+ebx-1] mov byte ptr[eax],0 invoke QueryDosDevice, ebx, lpPathOut, cbPathOut lea esi,[eax-2] .if (esi) invoke RtlCompareMemory, lpPathOut, lpDevice, esi .if (eax==esi) invoke lstrcpy, lpPathOut, ebx mov eax,lpDevice add eax,esi invoke lstrcat, lpPathOut, eax or eax,-1 jmp _ret .endif .endif .while (byte ptr[ebx]) inc ebx .endw add ebx,2 .endw .endif xor eax,eax _ret: ret DeviceToPath endp Хотя раз есть QueryDosDevice, должно было бы быть и обратное.