使用 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 验证程序的行为。

强烈建议在 应用程序验证工具 上启用 应用程序验证工具 (AppVerif.exe ) 驱动程序WUDFHost.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 验证程序

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

注意 存在 VerifierOn 值(即使设置为零)会使用 应用程序验证工具。 因此,如果不强制启用该值,建议删除该值,而不是将其设置为零。

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

!wdfkd.wdfdriverinfoy<你的 drivername> **** 0x1

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

控制验证程序的行为

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

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

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

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

此值位于 DriverName 注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\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 验证程序中列出的许多 注册表值