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);

来将这个回调函数从操作系统删除掉,之后就不会蓝屏了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值