PsSetCreateProcessNotifyRoutine
PsSetCreateProcessNotifyRoutine添加或者移除一個驅動支持的回調例程(也可以成為函數)。
當一個進程被創建或者刪除時,一系列的例程將會被調用。PS:相當於把例程加入到一個鏈表中,當進程被創建或者刪除時,所有的例程都會被調用(應該是這個意思)
NTSTATUS
PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, 例程函數的入口地址,
IN BOOLEAN Remove FALSE時,添加例程到鏈表, TRUE,從鏈表中刪除該例程
);
返回值:
-
STATUS_SUCCESS 例程被注冊到系統中
STATUS_INVALID_PARAMETER 例程已被注冊過,所以此例程是多余的,或者已經達到了注冊個數的上限。
評注:
-
最高級的驅動可以調用 PsSetCreateProcessNotifyRoutine 去設置他們的進程創建通知例程,聲明如下:
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
一個IFS或最高級的system-profiling驅動可能注冊一個process-creation回調去追蹤全系統的創建和刪除進程而不是驅動的內部的,
對於Vista和其后的版本,系統可以創建高達64個系統創建回調。
-
一個驅動在卸載前,必須移除所有它注冊過的例程,你可以通過調用PsSetCreateProcessNotify (Remove = TRUE)去移除例程。
- 當Create為True時,例程在新創建的進程(ProcessId句柄指定)的初始化線程被創建后被調用。
- 當Create為False時,例程在進程的最后一個線程被關閉,進程的地址空間將被釋放時調用。
-
- 進程的進程通知例程運行在IRQL = PASSIVE_LEVEL,當一個進程被創建,例程運行在新創建的進程的線程上下文中。
- 當進程被刪除時,例程運行在進程的最后一個線程(將要退出進程)中。