使用 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 将 VerifierOn 设置为 Windows 注册表中 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 密钥的驱动程序 Parameters\Wdf 子项中的非零值。 非零值指示已启用 KMDF 验证程序。

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

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

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

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

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

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

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

控制验证程序的行为

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

相关值位于 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 密钥的参数\Wdf 子项下

VerifyOnREG_DWORD
将此值设置为非零值以启用 WDFVERIFY 宏。

DbgBreakOnErrorREG_DWORD
如果此值设置为非零值,则每次驱动程序调用 WdfVerifierDbgBreakPoint 时,框架都会闯入调试器(如果可用)。

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

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

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

EnhancedVerifierOptionsREG_DWORD
仅 KMDF

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

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

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

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