Есть драйвер режима ядра. Мне необходимо мониторить всю систему и ловить завершение процессов с получением их PID. Не подскажете какие функции нада перехватывать для этого? Всем заранее спасибо.
Это как без перехвата ? Я так понял перехватываешь PsSetCreateProcessNotify и по нему узнаешь какой процесс закрывают и можно какнить получить PID процесса... ведь так ?
нет. Система при завершении процесса вызывает твой нотификатор, который ты ставишь с помошью PsSetCreateProcessNotify
Все понял. Но тут возникает еще одна проблема. Получается мне нада мониторить запуск процессов для того чтобы добавить им калбэк, это не есть гуд... я все прально понял ? И еще... процесс завершается, вызывает нотификатор. Куда передается управление ? П.С. В MSDN мало что по этому поводу написано =\
Oh my god PsSetCreateProcessNotifyRoutine ставит обработчик, который вызовется при создании/завершении процесса. Перехватывать ее саму нет смысла. Достаточно с ее помощью поставить обработчик. Либо перехватывать NtTerminateProcess. Но лучше первое - это документировано
Да все прекрасно там написано! Калбек надо ставить ОДИН раз и не надо потом ничего менять. Вызывается он системой. Управление передается к тебе в драйвер в функцию калбека, ты обрабатываешь както это событие и управление возвращается в функцию, вызывающую калбеки
Но чтобы поставить этот нотификатор, мне нада мониторить создание процесса(или как-то другим способом можно?) и пихать ему его чтобы он при завершении калбэк вызывал. Все правильно ?
Ой, простите нубку) Кажись понял. PsSetCreateProcessNotifyRoutine добавляет в список системы калбэк на себя и по завершению\созданию процесса этот калбэк вызывается и по нему можно определить какой процесс и что с ним случилось. Верно ?)
Не могли бы привести пример поставки обработчика, а то никак не могу понять как он ставится. Ведь где-то должен быть на указатель на процедуру обработчика. не понимаю=\ сижу уже часа полтора... плииииз
Создаёте свою функцию приёмки нотификации с заданной(В ддк) сигнатурой и передаёте её адрес MSDN Не нужно приводить описание функции здесь, достаточно ссылки!
Ну типа того) Ой все вам расписывать надо.. Code (Text): VOID CreateProcessNotify( IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEAN Create ) { KdPrint(("Process with PID %d, PPID %d %s\n", ProcessId, ParentId, Create?"created":"terminated")); } // Install callback Status = PsSetCreateProcessNotifyRoutine( CreateProcessNotify, FALSE ); ... // Remove callback Status = PsSetCreateProcessNotifyRoutine( CreateProcessNotify, TRUE );
Доброго времени суток! У меня немного сходная задача... Есть драйвер, нужно защитить пользовательский процесс от "случайного" завершения. Я так понимаю PsSetCreateProcessNotify только мониторит создание\завершение процессов, но никак не влияет на результат. Пока из всех найденых методов - это хучить ZwTerminateProcess, но хочется обойтись документироваными способами (если они конечно имеются),а не перехватывать SDT, чтобы всякие антируткитные\антивирусные программы не ругались.... Кто нибудь может что нить подсказать по этому поводу?!