使用 UMDF 验证程序

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

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

UMDF 验证程序会导致 UMDF 驱动程序代码 中的故障检查 主机进程。 但是,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 验证程序

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

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

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

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

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

控制验证程序的行为

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

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

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

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

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

TrackObjectsREG_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 子项中找到的值。

TrackRefCountsREG_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 验证程序中列出的许多注册表值。