使用 KMDF 验证程序

该框架提供可用于测试正在运行的 KMDF 驱动程序的内置验证功能。 此功能称为 KMDF 验证程序,可广泛验证驱动程序的状态以及驱动程序传递给框架对象方法的参数。 可以单独使用框架的验证程序,也可以与常规用途 驱动程序验证程序 (Verifier.exe) 工具一起使用。

如果启用了 KMDF 验证程序,则框架会检查锁获取和层次结构,确保对框架的调用在正确的 IRQL 处发生,验证正确的 I/O 取消和队列使用情况,并确保驱动程序和框架遵循记录的协定。 它还可以模拟内存不足的情况,以便驱动程序开发人员可以测试驱动程序是否正确响应,而不会崩溃、挂起或无法卸载。

启用 KMDF 验证程序后,如果默认超时期限(60 秒)在前面所述的某些事件完成之前过期,框架会中断调试器。 此时,可以调试问题,或在调试器中键入“g”以重启超时期限。 可以使用控制验证程序的行为中所述的 DbgWaitForSignalTimeoutInSec 注册表值更改默认超时期限。

建议在测试期间运行驱动程序验证程序 (Verifier.exe) ,并将自己的驱动程序和 wdf01000.sys 添加到验证列表。

注意

使用驱动程序验证程序的设置时,将自动启用 KMDF 验证程序 /standard 。 如果使用 /flags 而不是/standard驱动程序验证程序设置,请注意,在 Windows 10 版本 1803 或更新的版本上, 已弃用,/flags取而代之/ruleclasses的是 。 WDF 的规则类为 34。 若要在不使用 时 /standard 启用 WDF 验证程序,请使用 /ruleclasses 34

还可以使用 WDF 验证程序控制应用程序 (WdfVerifier.exe) 来启用和禁用 KMDF 验证程序。

启用和禁用框架的内置验证

可以使用此过程手动启用 KMDF 验证程序:

  1. 如果驱动程序已加载,请使用设备管理器禁用设备。 禁用设备会导致驱动程序卸载。

  2. 使用 RegEdit 将 Windows 注册表中 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 项的驱动程序 Parameters\Wdf 子项中的 VerifierOn 设置为非零值。 非零值指示已启用 KMDF 验证程序。

    如果子项不存在,可能需要手动将 VerifierOn 添加到子项。

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

  4. 当驱动程序调用 WdfDriverCreate 时,如果 VerifierOn 为非零值,框架将检查注册表并启用框架的验证程序。

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

若要确定是否启用了框架的验证程序,请在驱动程序调用 WdfDriverCreate 后在某个位置设置断点,并使用 !wdfdriverinfo 调试器扩展命令:

!wdfkd.wdfdriverinfo<your drivername> **** 0x1

有关调试器扩展命令的详细信息,请参阅 基于框架的驱动程序的调试器扩展

控制验证程序的行为

建议使用 WDF 验证程序控件应用程序 来控制以下选项。 但是,可以直接在注册表中修改以下值。

相关值位于 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 项的 Parameters\Wdf 子项下。

VerifyOn (REG_DWORD)
将此值设置为非零值以启用 WDFVERIFY 宏。

DbgBreakOnError (REG_DWORD)
如果此值设置为非零值,则每次驱动程序调用 WdfVerifierDbgBreakPoint 时,框架将中断调试器 ((如果可用) )。

DbgWaitForSignalTimeoutInSec (REG_DWORD)
从 Windows 8 开始,当 VerifierOnDbgBreakOnError 设置为非零值时,驱动程序可以通过设置 DbgWaitForSignalTimeoutInSec 来更改默认超时期限。

VerifierAllocateFailCount (REG_DWORD)
如果此值设置为值 n,则框架在第 n 次分配后每次尝试为驱动程序的对象分配内存都会失败。

TrackHandles (REG_MULTI_SZ)
如果此值设置为框架对象句柄的一个或多个类型名称的列表,则框架将跟踪对与指定句柄类型匹配的所有对象句柄的引用。

EnhancedVerifierOptions (REG_DWORD)
仅 KMDF

包含可用于启用框架验证程序可选功能的位图。

VerifyDownLevel (REG_DWORD)
如果设置为非零值,并且驱动程序是使用低于当前版本的框架版本生成的,则框架的验证程序包括生成驱动程序后添加的测试。

一般情况下,如果设置了上述注册表值,请在不再需要它们时将其删除。

有关这些注册表值的完整说明,请参阅 用于调试基于框架的驱动程序的注册表值