使用 UMDF 验证程序

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

UMDF 验证程序检查锁获取和层次结构,验证正确的 I/O 取消和队列使用情况,并确保驱动程序和框架遵循记录的协定。

UMDF 验证程序会导致 UMDF 驱动程序代码中的故障检查主机进程出现 bug。 但是,UMDF bug 检查不会导致蓝色文本屏幕显示有关错误的信息。 相反,UMDF bug 检查:

  • 创建内存转储文件并将该文件保存到计算机的日志文件目录, (例如%windir%\System32\LogFiles\WUDF\Xxx.dmp) 。

    注意 从 UMDF 2.15 开始,日志目录为 %ProgramData%\Microsoft\WDF。

  • 为 Microsoft (选择加入) 创建 错误报告

  • 如果一个连接到计算机,则中断调试器。

  • 终止主机进程并禁用设备。

从 UMDF 2.0 开始,UMDF 验证程序在某些情况下会发出断点,并导致 UMDF bug 检查。 此行为类似于 KMDF 验证程序的行为。

强烈建议在 WUDFHost.exe 上启用 应用程序验证程序 (AppVerif.exe) 后,对驱动程序进行所有开发和测试。 使用以下命令,附加调试器,然后重新启动。

AppVerif -enable Heaps Exceptions Handles Locks Memory TLS Leak -for WudfHost.exe

从 UMDF 版本 2.0 开始,如果在驱动程序主机进程 (Wudfhost) 上运行 应用程序 验证程序,则会自动为该主机中的所有 UMDF 2.0 驱动程序以及将来的驱动程序主机进程中的所有 UMDF 2.0 驱动程序启用 UMDF 验证程序。

在 UMDF 1.11 及更早版本中,框架的验证程序始终处于打开状态,你无法将其关闭。

启用和禁用 UMDF 验证程序

可以通过在驱动程序的 Parameters\Wdf 子项(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\<驱动程序名称>注册表项)中将 VerifierOn 设置为非零值来手动启用 UMDF 验证程序。

注意一个 VerifierOn 值的存在(甚至设置为零)会替代应用程序验证程序的链接。 因此,如果不强制启用该值,建议将其删除,而不是将其设置为零。

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

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

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

控制验证程序的行为

可以通过修改注册表中的值来控制 UMDF 验证程序的行为。 或者,可以使用 WDF 验证程序控制应用程序 来设置这些值。

以下注册表值可用于 UMDF 1。x 驱动程序以及 UMDF 2.0 及更高版本的驱动程序。

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

例如,如果驱动程序是使用 1.7 版框架生成的,并且计算机上安装了框架版本 1.9,将 VerifyDownLevel 设置为非零会导致验证程序包含驱动程序运行时添加到验证程序版本 1.9 的测试。

此值位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\DriverName 注册表项的 Parameters\Wdf 子项中。

TrackObjects (REG_DWORD)
如果 TrackObjects 设置为非零值,则框架将在卸载驱动程序时进入调试器,前提是任何基于框架的对象 已泄漏 (未) 删除。

在常规测试期间,应启用 TrackObjects 而不是 TrackRefCounts。 如果验证程序报告驱动程序正在泄漏框架对象,则使用控制应用程序启用 TrackRefCounts 验证程序选项。

此值位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services 注册表项的 DefaultHostProcessGuid 子项中,其中 DefaultHostProcessGuid 是可在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF 子项中找到的值。

TrackRefCounts (REG_DWORD)
如果 TrackRefCounts 设置为非零值,则框架将保留对每个基于框架的对象引用的计数。 可以使用 !wudfrefhist 调试器扩展来查看对象的引用计数的更改。

TrackRefCounts 设置为非零值会降低驱动程序的性能,因此,除非调试对象删除 bug,否则应将该值保留为零。

此值位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services 注册表项的 DefaultHostProcessGuid 子项中,其中 DefaultHostProcessGuid 是可在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF 子项中找到的值。

除了上面列出的注册表值外,UMDF 2.0 及更高版本的驱动程序还可以使用 使用 KMDF 验证程序中列出的许多注册表值。