驱动程序验证程序:新增功能

驱动程序验证程序 在从 Windows 2000 开始的所有 Windows 版本中都可用。 每个版本都引入了新功能,并检查 Windows 驱动程序中的 bug。 本部分汇总了这些更改,并提供相关文档的链接。

Windows 11 (中的驱动程序验证程序已更新:2021 年 9 月 30 日)

从 Windows 11 开始,现在会使用与易失性语法不同的命令语法来启用许多标志,而无需重新启动。 有关新语法的详细信息,请参阅 驱动程序验证程序命令语法

Windows 10 (中的驱动程序验证程序 更新时间:2018 年 5 月 8 日)

重要

有关在 Windows 10 版本 1803 或更高版本上启用 WDF 验证程序的信息,请参阅使用 KMDF 验证程序

  • 你仍然可以在驱动程序验证程序的 /standard 标志中启用 WDF 验证。 有关详细信息 ,请参阅驱动程序验证程序命令语法
  • 如果要使用语法 /flags 0x209BB 启用 DV,此更改将影响你,因为不再自动启用 WDF 验证。

从 Windows 10 开始,驱动程序验证程序包括以下技术的新驱动程序验证规则:

Windows 8-1 (中的驱动程序验证程序 已更新:2013 年 6 月 17 日)

从 Windows 8.1 开始,驱动程序验证程序引入了四个新选项来检测错误。

Windows 8 (中的驱动程序验证程序更新时间:2012 年 10 月 20 日)

从 Windows 8 开始,驱动程序验证程序引入了五个新选项来检测错误。

  • Power Framework 延迟模糊选项插入随机执行延迟,以帮助检测使用电源管理框架的驱动程序中的并发 bug (PoFx) 。 执行延迟有时间上限。 对于不直接利用电源管理框架 (PoFx) 的驱动程序,不建议使用此选项。
  • DDI 符合性检查选项 (DDI) 使用规则应用相同的设备驱动程序接口,静态驱动程序验证程序使用该规则来验证驱动程序是否在函数所需的 IRQL 下进行函数调用。 DDI 符合性检查作为标准驱动程序验证程序选项的一部分运行。
  • 面向堆栈的固定 MDL 检查选项用于监控驱动程序如何处理驱动程序堆栈中的固定 MDL 缓冲区。
  • 面向驱动程序的固定 MDL 检查选项用于监控每个驱动程序是如何处理固定 MDL 缓冲区的。
  • “基于堆栈的故障注入”选项在内核模式驱动程序中注入资源分配失败。

使用 Visual Studio 2012 和 WDK for Windows 8 生成、部署和测试驱动程序时,还可以将驱动程序验证程序配置为在部署驱动程序进行测试时在测试计算机上运行。

Windows 7 (驱动程序验证程序 已更新:2012 年 10 月 22 日)

对于 Windows 7,驱动程序验证程序已通过新的测试和功能进行了增强,这些功能允许驱动程序验证程序公开更多类的典型驱动程序 bug。

  • 内核驱动程序中对用户句柄的错误引用
  • I/O 验证改进
  • 特殊池、池跟踪和低资源模拟改进
  • 同步机制用法不正确
  • 对象引用不正确
  • 来自 DPC 例程的池配额费用
  • 系统关闭阻止或延迟
  • 改进了强制挂起 I/O 请求

在 Windows 7 中,驱动程序验证程序提供对排队的旋转锁的检查,这些检查类似于在早期 Windows 版本中为旋转锁提供的检查。 这些检查包括:

  • 验证应 (IRQL) 值引发中断请求级别的操作(如 KeAcquireInStackQueuedSpinLock)实际上并没有降低 IRQL 值。

  • 验证应降低 IRQL 值的操作(如 KeReleaseInStackQueuedSpinLock)实际上并没有提高 IRQL 值。

  • 如果启用了 强制 IRQL 检查 选项,则剪裁系统进程的工作集(当 IRQL 提升为DISPATCH_LEVEL或更高版本时),以尝试在驱动程序在提升的 IRQL 下运行时公开对可分页内存的可能引用。

  • 启用死锁检测选项时预测可能的死锁。

  • 在启用“死锁检测”选项时,尝试使用相同的KSPIN_LOCK数据结构作为旋转锁和堆栈排队的旋转锁。

  • 检查指针值是否明显不正确,例如用作旋转锁地址的用户模式虚拟地址。

  • 记录驱动程序验证程序 IRQL 日志中的 IRQL 转换。 使用 Windows 调试 器的 !verifier 8 扩展时,将显示此信息。 请参阅 !verifier

其他调试信息

在 Windows 7 中,驱动程序验证程序提供以下可用于调试的其他信息:

对于最近从已验证的驱动程序调用 KeEnterCriticalRegionKeLeaveCriticalRegion ,存在按时间顺序排列的堆栈跟踪的日志。 日志内容通过使用 Windows 调试 器的 !verifier 0x200 调试器扩展显示。 此信息可用于了解线程意外在关键区域中运行或尝试离开已离开的关键区域的情况。

可以使用 !verifier 0x40 调试器扩展显示强制挂起 I/O 请求日志中的其他信息。 在早期 Windows 版本中,对于驱动程序验证程序强制挂起的每个 IRP,日志仅包含一个堆栈跟踪。 这是从首次为强制挂起的 IRP 调用 IoCompleteRequest 时开始的堆栈跟踪。 对于每个强制挂起的 IRP,Windows 7 至少有两个日志条目(可能超过两个):

  • 驱动程序验证程序选取强制挂起的 IRP 时的堆栈跟踪。 当其中一个已验证的驱动程序调用 IoCallDriver 时,驱动程序验证程序会选择一些要强制挂起的 IRP。
  • 在完成到达已验证的驱动程序之前,针对强制挂起 IRP 的每个 IoCompleteRequest 调用的堆栈跟踪。 同一 IRP 可以存在多个 IoCompleteRequest 调用,因为其中一个驱动程序可以暂时停止其完成例程中的完成,然后通过调用 IoCompleteRequest 来恢复它。

IRQL 转换日志中有更多有效的堆栈跟踪。 使用 !verifier 8 显示此日志。 在低于 Windows 7 的 Windows 版本中,驱动程序验证程序可能尝试在提升的 IRQL 处记录其中一些堆栈跟踪,但由于 IRQL 值较高而无法捕获堆栈跟踪。 在 Windows 7 中,驱动程序验证程序尝试捕获以下堆栈跟踪:

  • 在引发 IRQL 之前,例如,当已验证的驱动程序调用 KeAcquireSpinLock 时。
  • 降低 IRQL 后,当已验证的驱动程序调用 KeReleaseSpinLock 时。

通过这种方式,驱动程序验证程序可以捕获更多这些 IRQL 转换堆栈跟踪。

!analyze 可以会审 Windows 7) 中属于 I/O 验证程序一部分的增强型 I/O 验证程序检查 (公开的问题。 在早期 Windows 版本中,增强型 I/O 验证程序错误报告包括显示驱动程序验证程序检测到的驱动程序缺陷的说明,然后显示中断调试器。 在此类中断后运行 !analyze 不会导致许多中断进行有意义的会审,因为 !analyze 无法使用调试器中显示的错误说明文本中的信息。 在 Windows 7 中,驱动程序验证程序会将有关这些驱动程序缺陷的有意义信息保存在内存中。 !analyze 可以找到此信息,并为其中许多中断执行更有意义的自动会审。

Windows Vista 中的驱动程序验证程序 (更新:2009 年 2 月 9 日)

对于 Windows Vista,驱动程序验证程序已通过新的测试和功能进行了增强。

  • 在不重新启动的情况下启用驱动程序验证程序并更改设置
  • 增强的低资源模拟
  • 强制挂起 I/O 请求
  • 安全检查
  • 更彻底的 I/O 验证
  • 增强的 IRQL 检查
  • 其他检查
  • 锁定的内存页跟踪
  • 其他自动检查

Windows XP 中的驱动程序验证程序 (更新:2001 年 12 月 4 日)

驱动程序验证程序是用于监视 Windows 内核模式驱动程序和图形驱动程序的工具。 Microsoft 强烈建议硬件制造商使用驱动程序验证程序测试其驱动程序,以确保驱动程序不会进行非法的函数调用或导致系统损坏。 驱动程序验证程序已通过 Microsoft Windows XP 的新测试和功能进行了增强。

提交到 WHQL 进行测试的驱动程序必须通过驱动程序验证程序。 Windows XP 中的新驱动程序验证程序功能包括:

  • 驱动程序验证程序管理器,用于 verifier.exe 的全新图形用户界面 (GUI)
  • 用于监视堆栈切换的新自动检查
  • 用于 DMA 验证的新驱动程序验证程序选项 (也称为 HAL 验证) 、死锁检测和 SCSI 验证
  • 结合“级别 1”和“级别 2”测试(可选增强型 I/O 验证测试)的 I/O 验证更改
  • 新的调试器扩展 !死锁!dma
  • 新 bug 检查:0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) 和0xF1 (SCSI_VERIFIER_DETECTED_VIOLATION)
  • 现有 bug 的其他子代码检查代码0xC4和0xC9

驱动程序验证程序功能还包括:

  • 新的验证程序命令行选项verifier.exe 实用工具具有一个新参数 VolatileDriverList,该参数可与 /adddriver 关键字 (keyword) 一起使用,以指定要添加到可变设置的驱动程序列表。 VolatileDriverList 可与 /removedriver 关键字 (keyword) 一起使用,以指定要删除的驱动程序列表。

  • 新的 !验证程序扩展 新的 !验证程序 扩展在监视资源不足或 IRQL 引发和旋转锁时显示其他日志信息。 还可以使用联机帮助。

    • 使用 0x4 设置的标志会导致显示包含驱动程序验证程序在资源不足模拟期间注入的错误日志
    • 使用 0x8 设置的标志会导致显示包含正在验证的驱动程序进行的最新 IRQL 更改的日志
    • 如果 标志 完全等于0x4或0x8,则 Quantity 参数将指定要包含在显示中的记录数或日志条目数
    • 参数显示简短的帮助文本
  • 驱动程序验证程序管理器联机帮助驱动程序验证程序管理器联机帮助可以采用以下任一方式显示:

    • 选择并按住 (或右键单击“驱动程序验证程序管理器”窗口中的某个项) ,然后从弹出菜单中选择 “这是什么?”
    • 选择窗口右上角的问号 () ,然后在“驱动程序验证程序管理器”窗口中选择一项。