驱动程序验证程序是一种 Windows 测试工具,可帮助你在驱动程序问题导致系统崩溃或损坏之前识别驱动程序问题。 通过实时监视内核模式驱动程序和图形驱动程序,驱动程序验证程序可检测非法函数调用和可能导致系统不稳定的问题作。
无论是开发新驱动程序还是对现有驱动程序进行故障排除,驱动程序验证程序都提供生成可靠、高质量的驱动程序所需的早期检测和调试功能。 本综合指南涵盖从基本设置到高级调试技术的所有内容。
- 了解何时和为什么使用驱动程序验证程序
- 为测试环境设置驱动程序验证程序
- 为特定需求配置验证选项
- 调试违例并解释结果
- 应用驱动程序测试工作流的最佳做法
重要
- 运行驱动程序验证程序可能会导致计算机崩溃。
- 仅在用于测试和调试的计算机上运行驱动程序验证程序。
- 只有计算机上管理员组的成员才能使用驱动程序验证程序。
在哪里可以获取驱动程序验证程序?
无需获取驱动程序验证程序,因为大多数版本的 Windows 都包含在 %WinDir%\system32\ as Verifier.exe中。 (Windows 10 S 中不包含驱动程序验证程序,因此我们建议改为在 Windows 10 上测试驱动程序行为。驱动程序验证程序不会单独分发为下载包。
有关 Windows 10 和早期版本的 Windows 驱动程序验证程序更改的信息,请参阅 驱动程序验证程序:新增功能。
何时使用驱动程序验证程序
在整个驱动程序开发和测试过程中使用驱动程序验证程序:
早期开发
- 在开发周期中尽早发现问题,这样更容易解决且成本更低。
- 通过在到达生产环境之前捕获问题来防止成本高昂的延迟
Troubleshooting
- 快速调试测试失败 和计算机崩溃
- 确定驱动程序相关的系统不稳定的根本原因
测试和部署
- 在使用 WDK、Visual Studio 和
Windows 硬件实验室工具包(Windows HLK)进行测试部署时, 监视驱动程序行为 - 确保 与 Windows 硬件认证工具包 要求兼容
有关全面的驱动程序测试指南,请参阅 测试驱动程序。
重要
Windows 硬件兼容性计划要求在我们的客户端和服务器操作系统上使用 CodeQL 进行静态工具徽标 (STL) 测试。 我们将继续在旧版产品上维护对 SDV 和 CA 的支持。 强烈建议合作伙伴查看 静态工具徽标测试的 CodeQL 要求。 有关使用 CodeQL 的详细信息,请参阅 CodeQL 和静态工具徽标测试。
如何启动驱动程序验证程序
仅在测试计算机上或在要测试和调试的计算机上运行驱动程序验证程序。 若要充分利用驱动程序验证程序的优势,请使用内核调试器连接到测试计算机。 有关调试工具的详细信息,请参阅适用于 Windows 的调试工具(WinDbg、KD、CDB、NTSD)。
选择“以管理员身份运行”,然后键入验证程序以打开驱动程序验证程序管理器,启动命令提示符窗口。
选择“ 创建标准设置 ”(默认任务),然后选择“ 下一步”。
还可以选择 “创建自定义设置 ”以从预定义设置中进行选择,或选择单个选项。 有关详细信息,请参阅 驱动程序验证程序选项和规则类 ,以及 选择驱动程序验证程序选项。
在 “选择要验证的驱动程序”下,选择下表中所述的选择方案之一:
选项 建议用途 自动选择未签名的驱动程序 适用于在运行不需要签名驱动程序的 Windows 版本的计算机上进行测试。 自动选择为旧版 Windows 生成的驱动程序 适用于测试驱动程序与较新版本 Windows 的兼容性。 自动选择此计算机上安装的所有驱动程序 在系统上测试的驱动程序数方面提供最大覆盖范围。 此选项适用于驱动程序可与系统上的其他设备或驱动程序交互的测试方案。
此选项还可能耗尽可用于特别池的资源和某些资源跟踪。 测试所有驱动程序也会对系统性能产生不利影响。从列表中选择驱动程序名称 在大多数情况下,需要指定要测试的驱动程序。
选择设备堆栈中的所有驱动程序后, 增强型 I/O 验证 选项可以跟踪对象并检查符合性,因为堆栈中的每个驱动程序之间都会传递 I/O 请求数据包(IRP),这允许在检测到错误时提供更详细的级别。
如果要运行度量系统或驱动程序性能指标的测试方案,或者想要分配可用于检测内存损坏或资源跟踪问题(如死锁或互斥体)的最大资源数,请选择单个驱动程序。 在 特殊池 和 I/O 验证 选项同时用于一个驱动程序上时,效果更佳。如果选择 从列表中选择“选择驱动程序名称”,请选择“ 下一步”,然后选择一个或多个特定驱动程序。
选择 “完成”,然后重新启动计算机。
注释
将驱动程序验证程序用于 Windows 版本 20150 到 25126 时,如果选择ntoskrnl,可能会收到无效状态错误。
若要避免此问题,请取消选择 ntoskrnl 或升级 Windows 至版本 25126 之后。
在命令提示符处运行驱动程序验证程序
还可以在命令提示符窗口中运行驱动程序验证程序,而无需启动驱动程序验证程序管理器。 例如,若要在名为 myDriver.sys的驱动程序上运行标准设置的驱动程序验证程序,请使用以下命令:
verifier /standard /driver myDriver.sys
有关命令行选项的详细信息,请参阅 驱动程序验证程序命令语法。
如何控制驱动程序验证程序
选择首选方法来控制驱动程序验证程序:
- 驱动程序验证程序管理器 (GUI) - 更易于初学者、可视化界面
- 命令行 - 对经验丰富的用户而言操作更快,支持脚本编写
注释
若要启动驱动程序验证程序管理器,请参阅上一部分 的“如何启动驱动程序验证程序 ”。
常见驱动程序验证工具任务
对于以下每个操作,可以使用驱动程序验证器管理器或输入命令行。
停止或重置驱动程序验证程序
在 驱动程序验证程序管理器中,选择“ 删除现有设置”,然后选择“ 完成”。
或
在命令提示符处输入以下命令:
verifier /reset重启电脑
查看驱动验证器统计信息
在 驱动程序验证程序管理器中,选择 “显示有关当前已验证驱动程序的信息”,然后选择“ 下一步”。 继续选择 “下一步 ”会显示其他信息。
或
在命令提示符处输入以下命令:
verifier /query
查看驱动程序验证程序设置
在 驱动程序验证程序管理器中,选择“ 显示现有设置”,然后选择“ 下一步”。
或
在命令提示符处输入以下命令:
verifier /querysettings
如何调试驱动程序验证器违规情况
若要充分利用驱动程序验证程序,请使用内核调试器并将其连接到测试计算机。 有关 Windows 调试工具的概述,请参阅适用于 Windows 的调试工具(WinDbg、KD、CDB、NTSD)。
如果驱动程序验证工具检测到违规,它将生成一个错误检查以停止计算机。 此操作将为您提供尽可能多的调试信息。 将内核调试器连接到运行驱动程序验证器的测试计算机时,如果驱动程序验证器检测到违规,Windows 会中断到调试器,并显示错误的简要说明。
驱动程序验证程序检测到的所有冲突都会导致 bug 检查。 此 Bug Check 通常是 Bug Check 0xC4。 有关详细信息,请参阅 调试错误检查 0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION 和 错误检查 0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION。
其他常见的 bug 检查代码包括以下代码:
- 错误检查 0xC1:SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
- 错误检查 0xC6:DRIVER_CAUGHT_MODIFYING_FREED_POOL
- Bug 检查 0xC9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
- 故障检查0xD6:DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
- 错误检查 0xE6:DRIVER_VERIFIER_DMA_VIOLATION
有关详细信息,请参阅 在启用驱动程序验证程序时处理 Bug 检测。
启动新的调试会话时,请使用调试器扩展命令 !analyze。 在内核模式下, !analyze 命令显示有关最新 bug 检查的信息。 若要显示其他信息以帮助识别故障驱动程序,请在 提示符处将 option > 添加到命令:
kd> !analyze -v
除了 !analyze,还可以在 kd> 提示符处输入以下调试器扩展,以查看特定于驱动程序验证程序的信息:
!verifier 转储已捕获的驱动验证统计信息。 使用 !verifier -? 显示所有可用选项。
kd> !verifier!死锁 显示与驱动程序验证程序死锁检测功能跟踪的锁或对象相关的信息。 使用 !deadlock -? 显示所有可用选项。
kd> !deadlock!iovirp [address] 显示与 I/O 验证程序跟踪的 IRP 相关的信息。 例如:
kd> !iovirp 947cef68查找已被违反的 DDI 符合性检查 规则。 (RuleID 始终是 bug 检查的第一个参数。DDI 符合性检查中的所有规则 ID 都采用 0x200nn 格式。
后续步骤
了解驱动程序验证程序的基本知识后,请浏览以下相关主题:
- 驱动程序验证程序选项 - 配置高级测试方案
- 使用驱动程序验证程序 - 高级使用模式和最佳做法
- DDI 合规性检查 - 理解合规性规则和违规行为
- Windows 调试工具 - 为驱动程序验证程序设置内核调试
获取帮助
- 驱动程序验证程序命令语法 - 完整命令参考
- 控制驱动程序验证程序 - 高级控制技术