驱动程序验证程序

驱动程序验证程序监视 Windows 内核模式驱动程序和图形驱动程序,目的是检测可能损坏系统的非法函数调用或操作。 驱动程序验证程序可以使 Windows 驱动程序经受各种压力和测试以发现不当行为。 你可以配置要运行的测试,让驱动程序承受沉重的压力负载或经受更精简的测试。 还可以同时在多个驱动程序上运行驱动程序验证程序,或每次在一个驱动程序上运行。

注意

  • 运行驱动程序验证程序可能会导致计算机崩溃。
  • 应仅在用于测试和调试的计算机上运行驱动程序验证程序。
  • 只有计算机上管理员组的成员才能使用驱动程序验证程序。

可在何处下载驱动程序验证程序?

无需下载驱动程序验证程序,因为它包含在 %WinDir%\system32\ 中的大多数 Windows 版本作为Verifier.exe。 (Windows 10 S 中不包含驱动程序验证程序,因此我们建议改为在 Windows 10 上测试驱动程序行为。驱动程序验证程序不会单独分发为下载包。

有关 Windows 10 和早期版本的 Windows 驱动程序验证程序更改的信息,请参阅 驱动程序验证程序:新增功能。

何时使用驱动程序验证程序

在整个驱动程序开发和测试过程中运行驱动程序验证程序。 更具体地说,将驱动程序验证程序用于以下目的:

  • 若要在开发周期的早期发现问题,当问题更容易且成本更低时进行更正。

  • 用于故障排除和调试测试失败和计算机崩溃。

  • 部署驱动程序以使用 WDK、Visual Studio 和 Windows 硬件实验室工具包 (Windows HLK)或 Windows 硬件认证工具包 (适用于 Windows 8.1)进行测试时监视行为。 有关测试驱动程序的详细信息,请参阅 测试驱动程序

重要

Windows 硬件兼容性计划需要 CodeQL 进行客户端和服务器操作系统上的静态工具徽标 (STL) 测试。 我们将继续在旧版产品上维护对 SDV 和 CA 的支持。 强烈建议合作伙伴查看静态工具徽标测试的 CodeQL 要求。 有关使用 CodeQL 的详细信息,请参阅 CodeQL 和静态工具徽标测试

如何启动驱动程序验证程序

应仅在测试计算机上或正在测试和调试的计算机上运行驱动程序验证程序。 若要充分利用驱动程序验证程序,应使用内核调试器并连接到测试计算机。 有关调试工具的详细信息,请参阅适用于 Windows 的调试工具(WinDbg、KD、CDB、NTSD)。

  1. 选择“以管理员身份运行”,然后键入验证程序以打开驱动程序验证程序管理器,启动命令提示符窗口。

  2. 选择“ 创建标准设置 ”(默认任务),然后选择“ 下一步”。

    还可以选择 “创建自定义设置”以从预定义设置 中进行选择,或选择单个选项。 有关详细信息,请参阅 驱动程序验证程序选项和规则类 ,以及 选择驱动程序验证程序选项

  3. 在“选择要验证的驱动程序”下,选择下表中所述的选择方案之一。

    选项 建议用途
    自动选择未签名的驱动程序

    适用于在运行不需要签名驱动程序的 Windows 版本的计算机上进行测试。

    自动选择为旧版 Windows 生成的驱动程序

    适用于测试驱动程序与较新版本 Windows 的兼容性。

    自动选择此计算机上安装的所有驱动程序

    在系统上测试的驱动程序数方面提供最大覆盖范围。 此选项适用于驱动程序可与系统上的其他设备或驱动程序交互的测试方案。

    此选项还可以耗尽可用于 特殊池 的资源和某些资源跟踪。 测试所有驱动程序也会对系统性能产生不利影响。

    从列表中选择驱动程序名称

    在大多数情况下,需要指定要测试的驱动程序。

    选择设备堆栈中的所有驱动程序后,增强型 I/O 验证选项可以跟踪对象和检查符合性,因为堆栈中的每个驱动程序之间都会传递 I/O 请求数据包(IRP),这允许在检测到错误时提供更详细的级别。

    如果要运行度量系统或驱动程序性能指标的测试方案,或者想要分配可用于检测内存损坏或资源跟踪问题(如死锁或互斥体)的最大资源数,请选择单个驱动程序。 在一个驱动程序上使用时,特殊池I/O 验证选项更有效。

  4. 如果选择从列表中选择选择驱动程序名称”,请选择“下一步,然后选择一个或多个特定驱动程序。

  5. 选择“完成,然后重新启动计算机。

注意

将驱动程序验证程序用于 Windows 版本 20150 到 25126 时,如果选择 了 ntoskrnl ,可能会收到无效状态错误。
若要避免此问题,请取消选择 ntoskrnl 或在内部版本 25126 之后升级到 Windows 版本。

在命令提示符处运行驱动程序验证程序

还可以在命令提示符窗口中运行驱动程序验证程序,而无需启动驱动程序验证程序管理器。 例如,若要在名为 myDriver.sys 的驱动程序上运行标准设置的驱动程序验证程序,请使用以下命令:

verifier /standard /driver myDriver.sys

有关命令行选项的详细信息,请参阅 驱动程序验证程序命令语法

如何控制驱动程序验证程序

可以使用驱动程序验证程序管理器或命令行来控制驱动程序验证程序。 若要启动驱动程序验证程序管理器,请参阅 本主题前面的“如何启动驱动程序验证程序”。

对于以下每个操作,可以使用驱动程序验证程序管理器或输入命令行。

停止或重置驱动程序验证程序

  1. 驱动程序验证程序管理器中,选择“ 删除现有设置”,然后选择“ 完成”。

    在命令提示符处输入以下命令:

    verifier /reset
    
  2. 重新启动计算机。

查看驱动程序验证程序统计信息

驱动程序验证程序管理器中,选择“ 显示有关当前已验证驱动程序的信息”,然后选择“ 下一步”。 继续选择“下一步会显示其他信息。

在命令提示符处输入以下命令:

verifier /query

查看驱动程序验证程序设置

驱动程序验证程序管理器中,选择“ 显示现有设置”,然后选择“ 下一步”。

在命令提示符处输入以下命令:

verifier /querysettings

如何调试驱动程序验证程序冲突

若要充分利用驱动程序验证程序,应使用内核调试器并将其连接到测试计算机。 有关 Windows 调试工具的概述,请参阅适用于 Windows 的调试工具(WinDbg、KD、CDB、NTSD)。

如果驱动程序验证程序检测到冲突,它会生成一个 bug 检查来停止计算机。 这是为调试问题提供最可能的信息。 如果内核调试器连接到运行驱动程序验证程序的测试计算机,并且驱动程序验证程序检测到冲突,Windows 会进入调试器并显示错误的简要说明。

驱动程序验证程序检测到的所有冲突都会导致 bug 检查。 这通常是 bug 检查0xC4。 有关详细信息,请参阅调试 bug 检查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION Bug 检查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION

其他常见的 bug 检查代码包括:

有关详细信息,请参阅启用驱动程序验证程序时处理错误检查

启动新的调试会话时,请使用调试器扩展命令 ! analyze。 在内核模式下,!analyze 命令显示有关最新 bug 的信息检查。 若要显示其他信息,若要帮助识别故障驱动程序,请在 kd> 提示符处将 option -v 添加到命令:

kd> !analyze -v

除了 !analyze,还可以在 kd> 提示符处输入以下调试器扩展,以查看特定于驱动程序验证程序的信息:

  • !验证程序 转储捕获的驱动程序验证程序统计信息。 使用 !verifier -? 显示所有可用选项。

    kd> !verifier
    
  • !死锁 显示与驱动程序验证程序死锁检测功能跟踪的锁或对象相关的信息。 使用 !deadlock -? 显示所有可用选项。

    kd> !deadlock
    
  • !iovirp [address] 显示与 I/O 验证程序跟踪的 IRP 相关的信息。 例如:

    kd> !iovirp 947cef68
    
  • 查找违反的 DDI 符合性检查规则。 (RuleID 始终是 bug 检查 的第一个参数。DDI 符合性检查中的所有规则 ID 都采用 0x200nn 格式。

驱动程序验证程序选项

驱动程序验证程序命令语法

使用驱动程序验证程序

控制驱动程序验证程序

DDI 符合性检查