Перехватываю в ядре (драйвер) функции NtOpenFile, NtCreateFile Задача - отловить процесс записи файла на диск. Легко ловлю последние 2 функции, пути файлов и флаги (когда открывают на запись). Однако проблемка, операцию с этим файлом требуется делать только после закрытия, таким образом ловить ntClose Вопрос: какими ядерными функциями определить, что при вызове ntClose : а) Что это был хендл файла б) Путь к файлу в) Флаги с которыми он был открыт. Т.к. интересуют только когда закрываются файлы, открытые для записи. Когда писал в юзермоде, была функция GetFileNameByHandle Покопался в мсдн, не нашел подобного... Форум тоже проискал на словосочетание ntClose .. Есть конечно вариант, запоминать хендлы при открытии файлов (на запись) а потом сравнивать в процедуре закрытия.. Но это плозой вариант... Спасибо
По крайней мере сперва ObReferenceObjectByHandle. Получишь указатель на объект. Определить тип документированно - ZwQueryObject (Class=ObjectTypeInfo), недокументированно и быстрее - щн есть в ObjectHeader->ObjectType (проверка OBJECT_TO_OBJECT_HEADER(Object)->ObjectType == *IoFileObjectType) Получить флаги с которми он был открыт - изучай поля FILE_OBJECT структуры PS. ZwQueryObject нет в ntddk.h, потребуется ntifs.h PPS. Ворненг: сам не видел, но слышал, что в ZwQueryObject есть deadlock при некоорых обстоятельствах, связанных, кажется, с пайпами.
Код (Text): PFILE_OBJECT pFileObject; status = ObReferenceObjectByHandle(Handle, 0, *IoFileObjectType, KernelMode, &pFileObject, NULL ); if (status ==0 ) DPRINT("CLOSE HANDLE %x, status = %x", Handle, status); Если возвращяет не ноль, значит это не файл.. Так и есть, 0xC0000024 STATUS_OBJECT_TYPE_MISMATCH Это он мне и давал.. Вопрос только у меня, правильно ли я ему Кернелмод поставил в параметре и что ему дал IN ACCESS_MASK DesiredAccess равному 0 Пока не могу понять, почему в перехваченных функциях у меня печатаются хендлы в %x как миниум 6 символов, а в ntClose - всегоп о три.. Я думал что какие-то ранее открытые хендлы будут закрыты.. Странно...
Все же еще прошу помощи.. Код (Text): PFILE_OBJECT pFileObject; status = ObReferenceObjectByHandle(Handle, 0, *IoFileObjectType, KernelMode, &pFileObject, NULL ); if (status ==0 ) { if ( pFileObject->WriteAccess) DPRINT("FILE CLOSE = %S", pFileObject->FileName.Buffer); .. Выводит путь без диска.. Нашел совет использовать функцию IoGetRelatedDeviceObject А вот дальше, не пойму. Посмотрел структуру PDEVICE_OBJECT в DDK.. Даже не знаю что дальше делать..
Есть такое дело. Обходится просто. Вызываем функцию в отдельном треде. Если нет ответа - прибиваем тред по таймауту.