Windows驱动中的Crash回调
关于Windows驱动的CRASH回调函数的一些用法。
我们知道CRASH,是Windows系统产生了无法恢复的错误,导致整个系统无法进行下去,而没有办法的一种选择。表项形式,
就是我们日常电脑中看到的蓝屏。其中的原因是多方面的,可能是内存访问越界,硬件问题,超时机制,中断机制等。我们有时候需
要捕捉这种信息,然后,给用户一种提示,或者反馈给开发人员,系统出现了严重的错误。这里,我们要用到CRASH的回调机制。这
里,主要有2个函数。KeRegisterBugCheckCallback和KeRegisterBugCheckReasonCallback。
先看第一个:
BOOLEAN KeRegisterBugCheckCallback(
IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
IN PVOID Buffer,
IN ULONG Length,
IN PUCHAR Component
);
这个函数很简单;
第一个是CallbackRecord,这个感觉没什么用,感觉就是个枚举类别。需要使用移动非分页内存来初始化。MSDN上面说是指
向KBUGCHECK_CALLBACK_RECORD或者KBUGCHECK_REASON_CALLBACK_RECORD结构体的指针,由于这个结构体WINDOWS没有公开,所以一般
我没有管它。这个分配好空间的指针,需要使用 KeInitializeCallbackRecord函数来调用。
第二个就是回调函数的地址。我们来看一下这个回调函数。
VOID BugCheckCallback(
IN PVOID Buffer,
IN ULONG Length
);
Buffer 感觉是DUMP的指针,Length 是大小,后续我验证后再确定。因为这个函数是在生成了DUMP以后来调用的。
第三个参数:一个指向非分页空间的指针。
第四个参数:空间的大小。
第无个参树:可有可无,如果要填可以把设备驱动的名字写进去。
再看一下第二个函数:
NTKERNELAPI BOOLEAN KeRegisterBugCheckReasonCallback (
IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
IN KBUGCHECK_CALLBACK_REASON Reason,
IN PUCHAR Component
);
第一个参数:跟上面一样CallbackRecord,这个感觉没什么用,感觉就是个枚举类别。需要使用移动非分页内存来初始化。
MSDN上面说是指向KBUGCHECK_CALLBACK_RECORD或者KBUGCHECK_REASON_CALLBACK_RECORD结构体的指针,由于这个结构体WINDOWS没有
公开,所以一般我没有管它。这个分配好空间的指针,需要使用 KeInitializeCallbackRecord函数来调用。
第二个参数:这里就不一样了,有两种回调函数的形式。
VOID BugcheckDumpIoCallback (
IN KBUGCHECK_CALLBACK_REASON Reason,
IN PKBUGCHECK_REASON_CALLBACK_RECORD Record,
IN OUT PVOID ReasonSpecificData,
IN ULONG ReasonSpecificDataLength
);
VOID BugCheckSecondaryDumpDataCallback (
IN KBUGCHECK_CALLBACK_REASON Reason,
IN PKBUGCHECK_REASON_CALLBACK_RECORD Record,
IN OUT PVOID ReasonSpecificData,
IN ULONG ReasonSpecificDataLength
);
这两种形式,是有第三个参数决定的。
第三个参数:可以取值KbCallbackDumpIo 来取回调的BugcheckDumpIoCallback这个形式,或者取
KbCallbackSecondaryDumpData指定回调函数的BugCheckSecondaryDumpDataCallback 这中类型。
第四个参数:跟上面一样,可有可无,如果要填可以把设备驱动的名字写进去。
再看一下回调函数的参数:
第一个参数:可以取值KbCallbackDumpIo 来取回调的BugcheckDumpIoCallback这个形式,或者取
KbCallbackSecondaryDumpData指定回调函数的BugCheckSecondaryDumpDataCallback 这中类型。
第二个参数:PKBUGCHECK_REASON_CALLBACK_RECORD Record这个参数,这个是什么了,一看就知道,就一个指向
KBUGCHECK_REASON_CALLBACK_RECORD的指针,但是很可惜,微软也没有公开这个结构体。感觉是记录回调函数的指针。
第三个参树:指向下面结构体的指针。
typedef struct _KBUGCHECK_DUMP_IO {
IN ULONG64 Offset;
IN PVOID Buffer;
IN ULONG BufferLength;
IN KBUGCHECK_DUMP_IO_TYPE Type;
} KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO;
typedef enum _KBUGCHECK_DUMP_IO_TYPE {
KbDumpIoInvalid,
KbDumpIoHeader,
KbDumpIoBody,
KbDumpIoSecondaryData,
KbDumpIoComplete
} KBUGCHECK_DUMP_IO_TYPE;
第四个参数:就是系统传下来的KBUGCHECK_DUMP_IO的buffer的大小。如果是BugCheckSecondaryDumpDataCallback,这个大
小固定为sizeof(KBUGCHECK_DUMP_IO).
这里需要说明的,KbDumpIoSecondaryData这个类型就是专为BugCheckSecondaryDumpDataCallback准备的。
KeRegisterBugCheckReasonCallback 这个回调函数是,系统在生成DUMP文件的过程中调用的,
(KeRegisterBugCheckCallback是在生成后调用的),在生成的时候,会同步调用这个回调函数多次。
也就是会将DUMP的所有内容都传到这个函数中来。我们可以通过Buffer,以及KBUGCHECK_DUMP_IO_TYPE来完成整个DUMP文件的备份,
或保护。
还有一点需要注意的是,这两个回调函数的优先级非常高,我之前试过好像是15。所以很多函数都不能调用。一般可以调用
读写硬件寄存器的函数。比如READ/WRITE_REGISTER_XXX,或者READ/WRITE_IO_PORT_XXX系列函数。
禁止进行做的事情有:
1,分配内存(已经崩溃当然不行)。
2,进入分页内存(当然不行,优先级太高)。
3,使用同步机制(当然不行,优先级太高)。
4, 调用那些必须值IRQL等于或小于DISPATCH_LEVEL优先级的函数
Windows驱动中的Crash回调相关推荐
- Windows编程—Windows驱动中定时器的使用
文章目录 Windows编程-Windows驱动中定时器的使用 前言 代码 简单版 升级版 程序效果 Windows编程-Windows驱动中定时器的使用 前言 定时器操作是应用编程中非常常见的操作, ...
- Windows驱动中的inf文件
我们知道Windows设备驱动的安装都需要inf文件,inf文件中定义了驱动的服务,定义了驱动的硬件子键,服务子键和类子键.使操作系统可以方便的了解你的驱动的属性,特性等等. Windows系统从98 ...
- Windows驱动中的电源管理
想来想去,今天还是更新一章,虽然回来点晚!因为,可能以后的时间会越来越少,一方面,是案子马上会非常忙,还有更重要的是,宝宝要会回来了! 不知道,为什么,今天一直在想,怎么去准备创业,哪个方向,才是适合 ...
- 《Windows驱动开发技术详解》学习笔记
Abstract 如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...
- windows 驱动开发入门——驱动中的数据结构
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...
- Windows内核驱动中操作文件
一. 在驱动中使用文件 在Windows执行体中,通过文件对象来代表文件,该文件对象是一种由对象管理器管理的执行体对象.例如:目录也是由文件对象代表的. 内核组件通过对象名来引用文件,即在文件的全路径 ...
- 在Windows 2003中集成RAID卡驱动
新弄了一台文件服务器,用一块 Promise TX 4310 SATA卡接4块500GB硬盘做RAID 5.弄好RAID装Windows2003 (集成SP2),提示找不到硬盘,唉,2003还是老了, ...
- 在windows系统中安装显卡驱动
Windows系统下在docker中使用nvidia的GPU 微软官方文档 https://docs.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda- ...
- Windows驱动开发学习记录-驱动中快速重启关闭计算机之一
引言 关于快速重启和关闭计算机,网上有不少软件在Ring3下调用ZwShutdownSystem (NtShutdownSystem)来实现,虽然速度很快,但还至少经历一些流程,比如向设备驱动发送停机 ...
最新文章
- 张艺谋镜头里的科技力量:为世界注入5G之心
- jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
- Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
- Python-OpenCV 处理视频(二): 视频处理
- 操作系统(一)操作系统的概念、功能
- 华菱重卡仪表指示说明_仪表装置11种常见故障的解决方法
- 前端项目引入js文件写绝对目录还是相对目录_flask入门(三)静态文件
- 基于C语言的软件,基于C语言的计算机软件编程分析
- Linux环境下用vim编写编译运行C/C++程序
- 通过截取实时系统日志查找问题bug的小技巧命令--linux
- presto、druid、sparkSQL、kylin的对比分析
- Aaron Swartz Rewriting Reddit中关于web.py的创建思路
- 创建一个网站需要多少预算?
- 在IPCAM上实现RTSP协议直播-live555
- java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )
- Mysql连接数据库url的参数解析
- 到2020年,山西大数据产业产值将力争突破1000亿元
- matlab识别岩石破坏,MATLAB环境下岩石SEM图像损伤分形维数的实现
- 法国计算机学校排名2015,法国大学2015年排名情况
- pdf转cad最好的软件如何选择免费