Здраствуйте, господа, Необходима Ваша помощь в перехвате ntCreateFile и ntOpenFile из-под драйвера: - Как определить что пытается открыть система: файл или каталог? - Как получить полный путь к открываемому файлу/каталогу (т.к. иногда запрос на открытие передается без пути в расчете на: файл в текущем каталоге; файл лежит в каталогах прописанных в окружении и т.п...)? - Как система еще может открывать каталоги, кроме ntOpenFile? Заранее очень благодарен!
1) Если есть флаг FILE_DIRECTORY_FILE, то каталог. Если FILE_NON_DIRECTORY_FILE - файл. В других случаях возможны варианты. 2) ObReferenceObjectByHandle --> ObQueryNameString 3) Только NtCreateFile и NtOpenFile, которые сводятся к вызову IoCreateFile
В ntCreateFile, я так понимаю параметр IN ULONG FileAttributes, верно? А как же с ntOpenFile? Через какой там параметр передается этот атрибут? Код (Text): NTSTATUS NtOpenFile ( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions ) В смысле? Какие еще случаи/варианты?
if (CreateOptions & FILE_DIRECTORY_FILE) DbgPrint("Create/Open Directory."); Много способов есть. Самые изощренные, как то чтение напрямую структуры NTFS, не перехватишь. Ищи на форуме, такое было.
1) при создании обычно указывается тип объекта, при открытии существующего - достаточно имени тип можно узнать запросив ФС (после удачного Create) 2) это нетривиальная процедура ObQueryNameString - один из вариантов еще ZwQueryInformationFile, самому IRP послать 3) IoCreateFile часто вызывают напрямую (например Srv.sys)
Узнать можно всегда, но там не все определяется флагами. В какой-то книжке по нутрям виндовс было расписано, как узнать, только не помню в какой