关于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回调相关推荐

  1. Windows编程—Windows驱动中定时器的使用

    文章目录 Windows编程-Windows驱动中定时器的使用 前言 代码 简单版 升级版 程序效果 Windows编程-Windows驱动中定时器的使用 前言 定时器操作是应用编程中非常常见的操作, ...

  2. Windows驱动中的inf文件

    我们知道Windows设备驱动的安装都需要inf文件,inf文件中定义了驱动的服务,定义了驱动的硬件子键,服务子键和类子键.使操作系统可以方便的了解你的驱动的属性,特性等等. Windows系统从98 ...

  3. Windows驱动中的电源管理

    想来想去,今天还是更新一章,虽然回来点晚!因为,可能以后的时间会越来越少,一方面,是案子马上会非常忙,还有更重要的是,宝宝要会回来了! 不知道,为什么,今天一直在想,怎么去准备创业,哪个方向,才是适合 ...

  4. 《Windows驱动开发技术详解》学习笔记

    Abstract   如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...

  5. windows 驱动开发入门——驱动中的数据结构

    最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...

  6. Windows内核驱动中操作文件

    一. 在驱动中使用文件 在Windows执行体中,通过文件对象来代表文件,该文件对象是一种由对象管理器管理的执行体对象.例如:目录也是由文件对象代表的. 内核组件通过对象名来引用文件,即在文件的全路径 ...

  7. 在Windows 2003中集成RAID卡驱动

    新弄了一台文件服务器,用一块 Promise TX 4310 SATA卡接4块500GB硬盘做RAID 5.弄好RAID装Windows2003 (集成SP2),提示找不到硬盘,唉,2003还是老了, ...

  8. 在windows系统中安装显卡驱动

    Windows系统下在docker中使用nvidia的GPU 微软官方文档 https://docs.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda- ...

  9. Windows驱动开发学习记录-驱动中快速重启关闭计算机之一

    引言 关于快速重启和关闭计算机,网上有不少软件在Ring3下调用ZwShutdownSystem (NtShutdownSystem)来实现,虽然速度很快,但还至少经历一些流程,比如向设备驱动发送停机 ...

最新文章

  1. 张艺谋镜头里的科技力量:为世界注入5G之心
  2. jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
  3. Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
  4. Python-OpenCV 处理视频(二): 视频处理
  5. 操作系统(一)操作系统的概念、功能
  6. 华菱重卡仪表指示说明_仪表装置11种常见故障的解决方法
  7. 前端项目引入js文件写绝对目录还是相对目录_flask入门(三)静态文件
  8. 基于C语言的软件,基于C语言的计算机软件编程分析
  9. Linux环境下用vim编写编译运行C/C++程序
  10. 通过截取实时系统日志查找问题bug的小技巧命令--linux
  11. presto、druid、sparkSQL、kylin的对比分析
  12. Aaron Swartz Rewriting Reddit中关于web.py的创建思路
  13. 创建一个网站需要多少预算?
  14. 在IPCAM上实现RTSP协议直播-live555
  15. java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )
  16. Mysql连接数据库url的参数解析
  17. 到2020年,山西大数据产业产值将力争突破1000亿元
  18. matlab识别岩石破坏,MATLAB环境下岩石SEM图像损伤分形维数的实现
  19. 法国计算机学校排名2015,法国大学2015年排名情况
  20. pdf转cad最好的软件如何选择免费

热门文章

  1. NR 5G 身份标识
  2. 深入SecureFile—新一代LOB揭秘000
  3. Win7安装golang开发环境--备忘录
  4. 算法导论--python--插入排序
  5. LeetCode: 2_Add Two Numbers | 两个链表中的元素相加 | Medium
  6. 物理学家解说2012
  7. 邮件服务器轻松组建 友旺MG1200功能介绍
  8. Session 存储方式
  9. Thinkphp5+PHPExcel实现批量上传表格数据
  10. 洛谷U4727小L的二叉树[树转序列 LIS]