Bug 检查 0x10D:WDF_VIOLATION
WDF_VIOLATION Bug 检查的值为 0x0000010D。 这表示内核模式驱动程序框架 (KMDF) 检测到 Windows 在基于框架的驱动程序中发现了错误。
重要
这篇文章适合程序员阅读。 如果您是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答。
WDF_VIOLATION 参数
参数 1 表示 Bug 检查的特定错误代码。 保留参数 4。
参数 1 | 参数 2 | 参数 3 | 错误消息的原因 |
---|---|---|---|
0x1 |
指向 WDF_POWER_ROUTINE_TIMED_OUT_DATA 结构的指针 |
Reserved |
基于框架的驱动程序在电源操作期间超时。 这通常意味着设备堆栈未设置 DO_POWER_PAGABLE 位,驱动程序在分页设备堆栈关闭后尝试了可分页操作。 |
0x2 |
预留 |
预留 |
正在尝试获取当前正在保留的锁。 |
0x3 |
WDFREQUEST 句柄 |
这两个缓冲区上保留的未完成引用数 |
Windows 驱动程序框架验证程序遇到致命错误。 特别是,I/O 请求已完成,但框架请求对象无法删除,因为输入缓冲区、输出缓冲区或两者都存在未完成的引用。 |
0x4 |
Reserved |
呼叫方的地址 |
NULL 参数传递给需要非 NULL 值的函数。 |
0x5 |
传入的句柄值 |
Reserved |
错误类型的框架对象句柄传递给框架对象方法。 |
0x6 |
请参阅下表。 |
||
0x7 |
框架对象的句柄 |
Reserved |
驱动程序尝试通过调用 WdfObjectDereference 删除句柄,而不是调用 WdfObjectDelete 来错误地删除框架对象。 |
0x8 |
DMA 事务对象的句柄 |
Reserved |
在 DMA 事务对象未处于正确状态时对其执行了操作。 |
0x9 |
当前尚未使用。 |
||
0xA |
指向 WDF_QUEUE_FATAL_ERROR_DATA 结构的指针 |
Reserved |
处理当前在队列中的请求时发生致命错误。 |
0xB |
请参阅下表。 |
||
0xC |
WDFDEVICE 句柄 |
指向新 PnP IRP 的指针 |
驱动程序正在处理另一个更改状态的 PnP IRP 时到达新的状态更改 PnP IRP。 |
0xD |
WDFDEVICE 句柄 |
指向电源 IRP 的指针 |
设备电源策略所有者收到了未请求的电源 IRP。 可能有多个电源策略所有者,但只允许一个。 KMDF 驱动程序可以通过调用 WdfDeviceInitSetPowerPolicyOwnership 来更改电源策略所有权。 |
0xE |
调用事件回调函数的 IRQL。 |
事件回调函数返回的 IRQL。 |
事件回调函数未在调用它的同一 IRQL 处返回。 回调函数直接或间接地更改了 IRQL(例如,通过获取一个旋转锁,将 IRQL 提升为 DISPATCH_LEVEL,但不释放旋转锁)。 |
0xF |
事件回调函数的地址。 |
Reserved |
事件回调函数输入了关键区域,但在返回之前它未离开关键区域。 |
参数 1 等于 0x6
如果参数 1 等于 0x6,则处理 WDF 请求时出现致命错误。 在这种情况下,参数 2 进一步指定已根据枚举 WDF_REQUEST_FATAL_ERROR 定义的致命错误的类型。
参数 2 | 参数 3 | 错误消息的原因 |
---|---|---|
0x1 |
IRP 的地址 |
没有更多 I/O 堆栈位置可用于格式化地层 IRP。 |
0x2 |
WDF 请求句柄值 |
尝试格式化不包含 IRP 的框架请求对象。 |
0x3 |
WDF 请求句柄值 |
驱动程序尝试发送已发送到 I/O 目标的框架请求。 |
0x4 |
指向 WDR_REQUEST_FATAL_ERROR_INFORMATION_LENGTH_MISMATCH_DATA 结构的指针,其中包含指向 IRP 的指针、WDF 请求句柄值、IRP 主函数和尝试写入的字节数 |
驱动程序已完成框架请求,但已向输出缓冲区写入的字节数超过了 IRP 中指定的字节数。 |
参数 1 等于 0xB
如果参数 1 等于 0xB,则尝试获取或释放锁无效。 在这种情况下,参数 3 进一步指定已发生的错误。
参数 2 | 参数 3 | 错误消息的原因 |
---|---|---|
句柄值 |
0x0 |
传递给 WdfObjectAcquireLock 或 WdfObjectReleaseLock 的句柄代表不支持同步锁的对象。 |
WDF 旋转锁控点 |
0x1 |
旋转锁正由未获取它的线程释放。 |
原因
有关原因的说明,请参阅“参数”章节中每个代码的说明。
解决方法
!analyze 调试扩展显示有关 Bug 的信息检查,而且有助于收集信息,例如故障代码模块。
通常,WDF 转储文件将提供有关导致此 Bug 检查的的驱动程序的更多信息。 使用此命令查看日志文件。
kd> !wdfkd.wdflogdump <WDF_Driver_Name>
如果参数 1 等于 0x2,请检查调用方堆栈以确定有问题的锁。
如果参数 1 等于 0x3,驱动程序的内核模式驱动程序框架错误日志将包含有关未完成引用的详细信息。
如果参数 1 等于 0x4,请使用以参数 3 的值作为参数的 ln 调试器命令来确定哪个函数需要非 NULL 参数。
如果参数 1 等于 0x7,请使用 !wdfkd.wdfhandle 参数 2扩展命令来确定句柄类型。
如果参数 1 等于 0xA,则 WDF_QUEUE_FATAL_ERROR_DATA 结构将指示有问题的请求或队列句柄。 如果可用,它还将指示 NTSTATUS(如果不是 STATUS_SUCCESS)。