如何启用 Frameworks Verifier

Updated: March 17, 2006

内核模式驱动程序框架 (KMDF) 包含内置的验证程序来提供驱动程序验证程序 (Verifier.exe) 中当前不可用的功能。框架验证程序提供了大量跟踪消息,这些消息提供了关于框架内的活动的详细信息。它跟踪对每个 WDF 对象的引用并构建一个可以发送到调试器的跟踪。

在内核模式中,框架验证程序检查锁获得情况和层次结构,确保对框架的调用在正确的 IRQL 上发生,验证正确的 I/O 取消和队列使用,确保驱动程序和框架遵循文档记录的约定。它还可以模拟内存不足和内存耗尽情况并测试驱动程序对这些情况的响应,以确定驱动程序是否正确响应而不发生崩溃、挂起或无法卸载。

默认情况下,框架验证程序被禁用(因为其繁多的检查会降低系统性能)。在测试期间,您应该在加载您的驱动程序之前启用验证程序。与驱动程序验证程序不同,启用框架验证程序不需要重新启动系统。

启用框架验证程序
要启用框架验证程序:

1.

如果您的驱动程序已经被加载,那么使用设备管理器禁用设备。禁用设备会导致驱动程序被卸载。

2.

使用 RegEdit 将 VerifierOn 设置成一个非零值(在 Windows 注册表中驱动程序的 HKEY_LOCAL_MACHINE\System\CurrentControlSet\ServicesParameters\Wdf 项的 Parameters\Wdf 子项中)。

非零值指示框架验证程序被启用。在下面的例子中,框架验证程序被启用:
VerifierOn REG_DWORD 0x1

3.

使用设备管理器来重新启用设备,从而加载驱动程序。

启用框架验证程序之后不必重启系统。

要禁用框架验证程序,请遵循相同的步骤,但是将 VerifierOn 的值设置为零。

当验证程序被启用时,您还可以为下列内容使用注册表设置:

模拟内存不足。要启用验证程序的内存不足模拟,请使用 RegEdit 在 Windows 注册表中为驱动程序的 Parameters\Wdf 子项中的 VerifierAllocateFailCount 设置一个大于零的值 n。在 n 次尝试分配内存之后,框架将拒绝每次额外尝试。这些失败可以帮助测试您的驱动程序处理内存不足情况。

跟踪句柄。要为一种或多种对象类型启用句柄引用跟踪,请设置注册表中的 TrackHandles 值。当 TrackHandles 被启用时,KMDF 跟踪指定对象类型上进行的引用。这项功能可以帮助您找到由您的驱动程序未释放的引用引起的内存泄漏。

要启用这项功能,请使用 RegEdit 在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 项中驱动程序的 Parameters\Wdf 子项中设置 TrackHandles 项。TrackHandles 是一个 MULTI_SZ 值,所以您可以指定一个或多个 WDF 对象类型的名称。例如:
TrackHandles MULTI_SZ: WDFDEVICE WDFQUEUE

这个设置使 KMDF 跟踪 WDFDEVICE 和 WDFQUEUE 对象的句柄。您还可以指定星号 (*) 来跟踪所有 KMDF 对象。

在调试期间使用验证程序信息
在您的驱动程序被加载之后,您可以键入下列调试器扩展命令来确定框架验证程序是否被启用:

!wdfkd.wdfdriverinfo <your drivername> 0x1

!wdfkd.wdfdriverinfo 命令返回关于驱动程序的信息。驱动程序名称后面的十六进制值是用于确定返回哪些信息的一系列标志。值 0x1 使命令返回验证程序的状态。如果验证程序被启用,那么调试器显示下列信息:

驱动程序映像的名称。

WDF 库映像的名称。

内部 FxDriverGlobals 变量的地址。

内部 WdfBindInfo 变量的值。

编译驱动程序的 KMDF 版本号。版本号不得大于加载到测试机器上的 KMDF 版本。

例如,下面的例子显示名称为 wdfrawbusenumtest 的驱动程序的 !wdfkd.wdfdriverinfo 命令的输出:

0: kd> !wdfdriverinfo wdfrawbusenumtest f ---------------------------------- Default driver image name:wdfrawbusenumtest WDF library image name:Wdf01000 FxDriverGlobals  0x83b6af18 WdfBindInfo      0xf22550ec Version        v1.5 build(1234) ---------------------------------- WDFDRIVER:0x7cfb30d0

!WDFDEVICE 0x7c58b1c0 context:dt 0x83a74ff8 ROOT_CONTEXT (size is 0x1 bytes) <no associated attribute callbacks>

!WDFDEVICE 0x7d2df1c8 context:dt 0x82d20ff0 RAW_PDO_CONTEXT (size is 0xc bytes) <no associated attribute callbacks>

!WDFDEVICE 0x7c8671d8 context:dt 0x83798fe0 PDO_DEVICE_DATA (size is 0x1c bytes) EvtCleanupCallback f2251710 wdfrawbusenumtest!RawBus_Pdo_Cleanup ----------------------------------

WDF Verifier settings for wdfrawbusenumtest.sys is ON Pool tracking is ON Handle verification is ON IO verification is ON Lock verification is ON Handle reference tracking is ON for the following types:WDFDEVICE ----------------------------------

示例命令使用标志值 f,这使得示例输出包含验证程序的状态和所有其它可能的信息。示例输出还包括与 WDFDEVICE 对象每个句柄关联的上下文和回调函数的信息(因为为 WDFDEVICE 对象启用了 TrackHandles 注册表设置)。

您应该做什么?

在测试期间启用框架验证程序来查找驱动程序中的错误。

启用内存不足模拟来测试驱动程序对内存分配失败的响应。

使用句柄跟踪来查找驱动程序中潜在的内存泄漏。

在调试 WDF 驱动程序时,下载最新版本的 Windows 调试工具。

使用 KMDF 发布版本提供的调试器扩展。

更多信息:
Windows Driver Foundation 体系结构

Windows 调试工具

Kernel-Mode Driver Framework (KMDF)
在 KMDF 文档中,请参阅:
设计指南
调试基于框架的驱动程序



此信息有用吗?