on  it road.com

原因

通常,发生此错误时,驱动程序已尝试访问可分页(或者完全无效)的地址,而中断请求级别 (IRQL) 太高。
这可能是由以下原因引起的:

  • 在 DISPATCH_LEVEL 或者高于 DISPATCH_LEVEL 执行时取消引用错误指针(例如 NULL 或者已释放的指针)。
  • 访问 DISPATCH_LEVEL 或者更高级别的可分页数据。
  • 在 DISPATCH_LEVEL 或者更高级别执行可分页代码。

如果可以识别出导致错误的驱动程序,其名称将打印在蓝屏上并存储在内存中的 (PUNICODE_STRING) KiBugCheckDriver 位置。
我们可以使用调试器命令 dx(显示调试器对象模型表达式)来显示: dx KiBugCheckDriver 。

这种错误检查通常是由使用了不正确内存地址的驱动程序引起的。

页面错误的可能原因包括以下事件:

  • 该函数被标记为可分页并以提升的 IRQL(包括获取锁)运行。
  • 函数调用是对另一个驱动程序中的函数进行的,并且该驱动程序被卸载。
  • 该函数是通过使用无效指针的函数指针调用的。
Windows 蓝屏代码 0xD1:DRIVER_IRQL_NOT_LESS_OR_EQUAL

DRIVER_IRQL_NOT_LESS_OR_EQUAL 错误检查的值为 0x000000D1.
这表明内核模式驱动程序在进程 IRQL 过高时尝试访问可分页内存。

DRIVER_IRQL_NOT_LESS_OR_EQUAL 参数

参数描述
1内存引用。
2参考时的 IRQL。
30 - 读取
1 - 写入
2 - 执行
8 - 执行
4引用内存的地址。在这个地址上使用 ln(列出最近的符号)来查看函数的名称。

解决方法

如果问题是由我们正在开发的驱动程序引起的,请确保在错误检查时正在执行的函数 (1) 未标记为可分页或者 (2) 未调用任何其他内联函数调出。

!analyze 调试器扩展显示有关错误检查的信息,有助于确定根本原因。
详细步骤查看我们的教程 在windows 中使用WinDBG 调试dmp文件

以下示例是 !analyze 的输出。

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

如果转储文件中存在陷阱帧,请使用 .trap 命令将上下文设置为提供的地址。

要开始调试此类错误检查,请使用 k 、 kb 、 kc 、 kd 、 kp 、 kP 、 kv(显示堆栈回溯)命令检查堆栈跟踪。

在调试器中,运行 !irql 命令以在调试器中断之前显示有关目标计算机上处理器的 IRQL 的信息。

例如:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

在大多数此类错误检查的情况下,问题不是 IRQL 级别,而是正在访问的内存。

由于此错误检查通常是由使用了不正确内存地址的驱动程序引起的,因此请使用参数 1. 3 和 4 进行进一步调查。

使用带有参数 4 的 ln(列出最近的符号)来查看被调用函数的名称。

还要检查 !analyze 输出以查看是否识别了错误代码。

在参数 1 地址上使用 !pool 来查看它是否是分页池。

使用 !address 和高级 !pte 命令来了解有关此内存区域的更多信息。

使用 display memory 命令检查参数 1 中命令中引用的内存。

使用 u 、 ub 、 uu(反汇编)命令查看地址中引用参数 4 中的内存的代码。

使用命令 lm tn列出加载到内存中的模块。
使用 !memusage 并检查系统内存的一般状态。

驱动程序验证器

Driver Verifier 是一种实时运行以检查驱动程序行为的工具。
例如,Driver Verifier 检查内存资源的使用,例如内存池。
如果它在驱动程序代码的执行中发现错误,它会主动创建一个异常,以允许进一步检查该部分驱动程序代码。
Driver Verifier Manager 内置于 Windows 中,可在所有 Windows PC 上使用。

要启动 Driver Verifier Manager,请在命令提示符下键入 verifier。
我们可以配置要验证的驱动程序。
验证驱动程序的代码在运行时会增加开销,因此请尝试验证尽可能少的驱动程序。
有关详细信息,请参阅驱动程序验证程序。

日期:2020-09-17 00:16:12 来源:oir作者:oir