tiechui_lesson01_入口函数和卸载函数

2023-05-16

主要讲解入口函数和卸载函数。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tiechui_lesson01_入口函数和卸载函数 的相关文章

随机推荐