Собствено пытаюсь получить полный путь к открытому файлу, по его хендлу. Но Получается только полный путь к папке, где лежит этот файл, без имени самого файла, что очень странно и не понятно.. Код: Код (Text): for(i = 0; i < Info->NumberOfHandles; i++) { if( Info->Handles[i].ObjectTypeIndex == FileObjectType && PsGetCurrentProcessId() != (HANDLE)Info->Handles[i].UniqueProcessId) { status = PsLookupProcessByProcessId ((HANDLE)Info->Handles[i].UniqueProcessId , &EProcN ); if (!NT_SUCCESS(status)) { DbgPrint("PsLookupProcessByProcessId() ERROR : 0x%.8x\n", status); } else { KeStackAttachProcess(EProcN, &kApcState); status = ObReferenceObjectByHandle( (HANDLE)Info->Handles[i].HandleValue, 0, 0, UserMode, &UObjFile, NULL ); if (!NT_SUCCESS(status)) { DbgPrint("ObReferenceObjectByHandle, status %x", status); } else { DbgPrint("Handle %X || %ws", (HANDLE)Info->Handles[i].UniqueProcessId, UObjFile->FileName.Buffer); status = ObQueryNameString( UObjFile, (POBJECT_NAME_INFORMATION)NameInfo, sizeof(NameInfo), &ReturnLength ); if (!NT_SUCCESS(status)) { DbgPrint("ObQueryNameString, status %x", status); } else { DbgPrint("NameSTR: %ws", &((POBJECT_NAME_INFORMATION)NameInfo)->Name.Buffer) } ObDereferenceObject(&UObjFile); } KeUnstackDetachProcess(&kApcState); } Открываю файл в нотпаде C:\access_test\file.txt , а на выводе получаю: Код (Text): Handle 35C || \access_test NameSTR: ??\Device\HarddiskVolume1\access_test И обязательно делать аттач к процессу или можно как-то это иначе реализовать?
А ты не думал, что Блокнот может открыть файл, прочитать и сразу же закрыть его? Код (Text): DbgPrint("NameSTR: %ws", &((POBJECT_NAME_INFORMATION)NameInfo)->Name.Buffer) Что это за ересь? Зачем тут амперсанд? Обязательно, т.к. функция ObReferenceObjectByHandle() всегда берёт таблицу хендлов текущего процесса.
Согласен, это кусок где-то скопипастил. Думал, посему написал драйвер, который будет открывать файл в монопольном режиме(для верности) и закрывать его после выгрузки. И вот тут получились очень интересные результаты. Я чесно сказать, весь день бился над тестами. Сделал 2 реализации, получения пути к фалу по его хенду. 1 - с помощью ZwQueryInformationFile 2 - ObReferenceObjectByHandle Запускаю драйвер, который открывает файл. 1 - вариант отрабатывает хорошо, получаю вот такой лог: Код (Text): || Handle 4c8 || UniqueProcessId 178 || Name: \access_test\file.txt Тут же запускаю 2ой вариант, код которого в 1ом посте: Код (Text): PID 178|| Handle 4C8 || \WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03 wtf? Что касаемо 1го варианта, ZwQueryInformationFile частенько вешается, наверно нужно как-то это дело в потоке реализовывать. Хотелось бы разобраться со 2ым вариантом. P.S: Т.к. ZwQueryInformationFile загинается, нужно создавать поток, а убивать его только извне, это лишний изварт и вариант значит этот отметается.