驱动程序验证程序选项和规则类
本主题介绍驱动程序验证程序中的可选功能和规则类。 有关使用标准设置时包含的选项列表,请参阅标准设置。
注意
无论选择了哪些选项,始终会对正在验证的驱动程序执行某些自动检查。 如果驱动程序在不适当的 IRQL 下使用内存,不适当地调用或释放旋转锁和内存分配,不适当地切换堆栈,或在未删除计时器的情况下释放内存池,则驱动程序验证程序将检测到这种行为。 在卸载驱动程序时,驱动程序验证程序将检查其是否已正确释放资源。
使用 /ruleclasses 启用规则类
从 Windows 10 17627 及更高版本开始,可以使用以下语法来启用规则类:
/ruleclasses or /rc [<ruleclass_1> <ruleclass_2> ... <ruleclass_k>]
请注意,启用多个类(以下面的正十进制整数表示)时,请用空格分隔每个整数。
这些规则类的说明如下。
标准规则类
规则类 | 十进制 ID |
---|---|
特殊池 | 1 |
强制 IRQL 检查 | 2 |
池跟踪 | 4 |
I/O 验证 | 5 |
死锁检测 | 6 |
DMA 检查 | 8 |
安全检查 | 9 |
其他检查 | 12 |
DDI 合规性检查 | 18 |
WDF 验证 | 34 |
其他规则类
这些规则类用于特定场景测试。 标有 (*) 的规则类别需要 I/O 验证 (5),将被自动启用。 标有 (**) 的标志支持禁用个别规则。
规则类 | 十进制 ID |
---|---|
随机化低资源模拟 | 3 |
强制挂起 I/O 请求 (*) | 10 |
IRP 日志记录 | 11 |
针对堆栈的固定 MDL 检查 (*) | 14 |
针对驱动程序的固定 MDL 检查 (*) | 15 |
电源框架延迟模糊处理 | 16 |
端口/微型端口接口检查 | 17 |
系统性资源不足模拟 | 19 |
DDI 符合性检查(其他) | 20 |
内核同步延迟模糊处理 | 24 |
VM 交换机验证 | 25 |
代码完整性检查 | 26 |
驱动程序隔离检查(需要 36) | 33 |
其他 IRQL 检查 | 35 |
启用 DIF | 36 |
可选功能和规则类说明
启用此选项后,驱动程序验证程序将从一个特殊池中分配驱动程序的大部分内存请求。 将会监控此特殊池是否存在内存溢出、内存欠载和内存在释放后仍可访问的情况。
启用此选项后,驱动程序验证程序会通过使可分页代码失效来对驱动程序施加极大的内存压力。 如果驱动程序尝试访问错误 IRQL 处的分页内存或持有旋转锁,则驱动程序验证程序将会检测到此行为。
低资源模拟(在 Windows 8.1 中称为随机化低资源模拟)
启用此选项后,驱动程序验证程序会随机让池分配请求和其他资源请求失败。 通过将这些分配故障注入到系统中,驱动程序验证程序可以测试驱动程序处理资源不足情况的能力。
启用此选项后,驱动程序验证程序会检查驱动程序在卸载时是否释放了所有内存分配。 这会揭示内存泄漏。
启用此选项后,驱动程序验证程序将从一个特殊池中分配驱动程序的 IRP,并监控驱动程序的 I/O 处理。 这将检测 I/O 例程的使用是否非法或不一致。
当此选项处于活动状态时,驱动程序验证程序将监控驱动程序对旋转锁、互斥体和快速互斥体的使用。 这将检测驱动程序的代码是否有可能在某个时刻导致死锁。
启用此选项后,驱动程序验证程序将监控多个 I/O 管理器例程的调用,并对 PnP IRP、电源 IRP 和 WMI IRP 执行压力测试。 在 Windows 7 及更高版本的 Windows 操作系统中,增强型 I/O 验证的所有功能都已作为 I/O 验证的一部分包含在内,不再提供也没有必要在驱动程序验证管理器中或通过命令行选择此选项。
启用此选项后,驱动程序验证程序将监控驱动程序对 DMA 例程的使用情况。 这将检测 DMA 缓冲器、适配器和映射寄存器的使用是否不正确。
(Windows Vista 及更高版本)启用此选项后,驱动程序验证程序会查找可能导致安全漏洞的常见错误,如内核模式例程引用用户模式地址。
(Windows Vista 及更高版本)启用此选项后,驱动程序验证程序会查找驱动程序崩溃的常见原因,如对释放的内存处理不当。
(Windows Vista 及更高版本)启用此选项后,驱动程序验证程序将通过随机调用 IoCallDriver 返回 STATUS_PENDING 返回值来测试驱动程序对 STATUS_PENDING 返回值的响应。
(Windows Server 2003 及更高版本)启用此选项后,驱动程序验证程序将监控驱动程序对 IRP 的使用情况,同时创建 IRP 使用日志。
(Windows Vista 及更高版本)启用此选项后,驱动程序验证程序将监控 Storport 微型端口驱动程序,以防止输出的 Storport 例程使用不当、过度延迟和 Storport 请求处理不当。
(从 Windows 8 开始)启用此选项后,驱动程序验证程序将随机化线程计划,以帮助清除使用电源管理框架 (PoFx) 的驱动程序中的并发错误。 对于不直接使用电源管理框架 (PoFx) 的驱动程序,不建议使用此选项。
(从 Windows 8 开始)启用此选项后,驱动程序验证程序会应用一组设备驱动程序接口 (DDI) 规则,检查驱动程序与操作系统内核接口之间的交互是否正确。
(从 Windows 8 开始)堆栈的固定 MDL 检查选项可监控驱动程序如何跨驱动程序堆栈处理固定 MDL 缓冲区。 驱动程序验证程序可检测是否对固定 MDL 缓冲区进行了非法修改。 要使用此选项,必须在至少一个驱动程序上启用 I/O 验证。
(从 Windows 8 开始)堆栈的固定 MDL 检查选项可按驱动程序来监控其如何处理固定 MDL 缓冲区。 此选项可检测是否对固定 MDL 缓冲区进行了非法修改。 要使用此选项,你必须在至少一个驱动程序上启用 I/O 验证。
(仅适用于 Windows 8 和 WDK 8)基于堆栈的故障注入选项可在内核模式驱动程序中注入资源故障。 此选项结合使用了特殊驱动程序 KmAutoFail.sys 和驱动程序验证程序来侵入驱动程序错误处理路径。
(从 Windows 8.1 开始)系统低资源模拟选项会在内核模式驱动程序中注入资源故障。
(从 Windows 8.1 开始)启用此选项后,驱动程序验证程序会应用一组 NDIS 和无线 LAN (WIFI) 规则,检查 NDIS 微型端口驱动程序与操作系统内核之间的交互是否正常。
(从 Windows 8.1 开始)此选项会随机化线程计划,以帮助检测驱动程序中的并发错误。
(从 Windows 8.1 开始)此选项可监控在 Hyper-V 可扩展交换机内部运行的筛选器驱动程序(可扩展交换机扩展)。
端口/微型端口接口检查使驱动程序验证程序能够检查 PortCls.sys 及其音频微型端口驱动程序与 ks.sys 及其 AVStream 微型端口驱动程序之间的 DDI 接口。 请参阅 AVStream 驱动程序规则和音频驱动程序规则。
使用基于虚拟化的安全性来隔离代码完整性时,内核内存变成可执行内存的唯一方式是通过代码完整性验证。 这意味着永远都不能写入和执行 (W+X) 内核内存页面,并且不能直接修改可执行代码。 代码完整性检查可确保这些代码完整性规则的兼容性,并检测违反规则的情况。
WDF 验证会检查内核模式驱动程序是否正确遵循了内核模式驱动程序框架 (KMDF) 的要求。
其他 IRQL 检查
额外的 IRQL 检查增强了 PASSIVE_LEVEL 的 DDI 合规性检查 IRQL 规则。 它包含两个规则:
- IrqlIoRtlZwPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL,驱动程序才调用规则中列出的 DDI。
- IrqlNtifsApcPassive 规则指定,仅当驱动程序在 IRQL = PASSIVE_LEVEL 或 IRQL <= APC_LEVEL 执行时,才调用规则中列出的 DDI。
驱动程序隔离检查对于验证 Windows 驱动程序的运行时驱动程序包隔离要求至关重要。有关详细信息,请参阅Windows 驱动程序开发入门。 这些检查会监控隔离驱动程序包所不允许的注册表读取和写入。
标准设置
标准设置中包括的选项 |
---|
增强 I/O 验证(在 Windows 7 及更高版本中,选择 I/O 验证时会自动激活此选项) |
其他检查(Windows Vista 及更高版本) |
DDI 合规性检查(从 Windows 8 开始) |
需要 I/O 验证的驱动程序验证程序选项
有四个选项需要你先启用 I/O 验证。 如果未启用 I/O 验证,则无法启用这些选项。