首先注册一个回调函数
PsSetCreateProcessNotifyRoutine
函数原型
NTSTATUS PsSetCreateProcessNotifyRoutine(
PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
BOOLEAN Remove
);
我们在注册中写入
NTSTATUS status = PsSetCreateProcessNotifyRoutine(MyRoutine, FALSE);//注册
记得在卸载函数中解除注册
NTSTATUS status = PsSetCreateProcessNotifyRoutine(MyRoutine, TRUE);//解除注册
还有很多类似的回调函数,比如
NTSTATUS PsSetLoadImageNotifyRoutine(
PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
然后我们建立一个自己的回调函数
它的原型
// PCREATE_PROCESS_NOTIFY_ROUTINE PcreateProcessNotifyRoutine;
void PcreateProcessNotifyRoutine(
HANDLE ParentId,
HANDLE ProcessId,
BOOLEAN Create
)
{...}
在回调函数中,我们通过PsLookupProcessByProcessId
获取进程的EPROCESS信息
NTSTATUS
PsLookupProcessByProcessId(
__in HANDLE ProcessId, //进程ID
__deref_out PEPROCESS *Process //返回的EPROCESS
)