tiechui_lesson01_入口函数和卸载函数
主要讲解入口函数和卸载函数。
#include <ntifs.h>
VOID
nothing(HANDLE ppid, HANDLE mypid, BOOLEAN bcreate)
{
UNREFERENCED_PARAMETER(ppid);
UNREFERENCED_PARAMETER(mypid);
UNREFERENCED_PARAMETER(bcreate);
DbgPrint("processNotify\n");
}
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
//如果卸载清理的时候不做清理,那么系统会蓝屏(第二个参数设置为TRUE)
PsSetCreateProcessNotifyRoutine(nothing, TRUE);
DbgPrint("Unload\n");
}
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = DriverUnload;
PsSetCreateProcessNotifyRoutine(nothing, FALSE);
DbgPrint("%wZ\n",RegistryPath);
return 0;
}
PsSetCreateProcessNotifyRoutine
在安装驱动的时候注册了一个进程通知回调,在系统中有进程创建或者关闭的时候,调用回调函数。第一个参数为注册的回调函数,第二个是添加和删除回调的布尔值。
[in] NotifyRoutine
指定调用方提供的进程创建回调例程的入口点。 请参阅 PCREATE_PROCESS_NOTIFY_ROUTINE。
[in] Remove
指示是否应从系统的通知例程列表中添加或删除 NotifyRoutine 指定的例程。 如果 为 FALSE,则指定例程将添加到列表中。 如果 为 TRUE,则从列表中删除指定的例程。
有一种蓝屏(BSOD)的情况,如果在卸载函数中没有设置删除设置个进程通知回调函数nothing,那么就会产生BSOD。因为操作系统中保有这个回调指针后,我们卸载掉驱动,那么这个指针所指的函数就不存在了,而操作系统仍然去试图访问这个函数那么就导致了蓝屏。所以需要在卸载驱动的时候调用:
PsSetCreateProcessNotifyRoutine(nothing, TRUE);
来将这个回调函数从操作系统删除掉,之后就不会蓝屏了。