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