当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/18064.html

相关文章:

  • 使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
  • 《AI 使生活更美好》
  • yolov7论文翻译
  • 【Elasticsearch入门到落地】1、初识Elasticsearch
  • 【异质图学习】异构图神经网络中的自监督学习:基于语义强度和特征相似度的对比学习
  • java---认识异常(详解)
  • MySQL数据库——MySQL存储函数详解
  • Java版本企业电子招投标采购系统源码之项目说明和开发类型源码
  • [面试题] 判断二维空间中一点是否在旋转矩形内部
  • 活动策划进阶指南:细节决定成败
  • 飞腾ft2000-麒麟V10-SP1安装Docker、运行gitlab容器
  • JSP网络远程作业处理系统(源代码+论文+开题报告+实习报告)
  • 揭秘镭速传输点对点传输技术,NAT+Raysync强强组合
  • 进程替换函数组介绍exec*
  • 嵌入式设备逆向所需的工具链
  • SPSS如何绘制常用统计图之案例实训?
  • 华为MPLS跨域——后门链路实验配置
  • 直线飙升到10万+star的AutoGpt,有多强?帮我写了个网页!
  • 文鼎创智能物联云原生容器化平台实践
  • 为什么网络安全缺口很大,招聘却很少?
  • 乐鑫esp32-c2开发板 烧录演示
  • PMP-项目整合管理
  • MySQL ---- 事务
  • golang - 函数的使用
  • 什么是网络——TCP/IP协议
  • explain都不懂?搞什么数据库优化,快进来学习了