强制 IRQL 检查
尽管禁止内核模式驱动程序在高 IRQL 或持有旋转锁时访问可分页内存,但如果页面实际上尚未从工作集进行剪裁并分页到磁盘,则可能不会注意到此类操作。
启用强制 IRQL 检查后,驱动程序验证程序会对系统内存的使用施加极大的压力。 每当要验证的驱动程序请求旋转锁、调用 KeSynchronizeExecution 或将 IRQL 提升为DISPATCH_LEVEL或更高版本时,所有系统可分页池、代码和数据 ((包括驱动程序的可分页代码和数据) )都会从工作集中剪裁。 如果驱动程序尝试访问任何此内存,驱动程序验证程序会检查发出 bug。
从 Windows Vista 开始,此选项还会导致驱动程序验证程序检测何时某些同步对象包含在可分页内存中。 无法对这些同步对象进行分页,因为操作系统内核在提升的 IRQL 中访问它们。 驱动程序验证程序可以检测可分页 的 KTIMER、PRKMUTEX、PKSPIN_LOCK、PRKEVENT、PKSPIN_LOCK、PRKSEMAPHORE、PERESOURCE 和 FAST_MUTEX 结构。
内存使用量的这种压力不会直接影响未选择进行验证的驱动程序。 当未选择进行验证的驱动程序引发 IRQL 时,它不会触发修整操作。 但是,当正在验证的驱动程序引发 IRQL 时,驱动程序验证程序会剪裁未验证的驱动程序可以使用的页面。 因此,在此选项处于活动状态时,可能会偶尔捕获未验证的驱动程序提交的错误。
监视 IRQL 引发和旋转锁
可以监视被验证的驱动程序发出的 IRQL 引发、旋转锁和对 KeSynchronizeExecution 的调用数。 还可以监视驱动程序验证程序从工作集中剪裁可分页内存的次数。 这些统计信息可由驱动程序验证程序管理器、Verifier.exe命令行或日志文件中显示。 有关详细信息 ,请参阅监视全局计数器 。
内核调试器扩展 !验证程序 也可用于监视这些统计信息。 它提供与驱动程序验证程序管理器类似的信息。 在 Windows XP 及更高版本中, !验证程序0x8 扩展将显示正在验证的驱动程序最近进行的 IRQL 更改的日志。 有关调试器扩展的信息,请参阅 Windows 调试。
在 DISPATCH_LEVEL 或更高版本调用 KeEnterCriticalRegion 或 KeLeaveCriticalRegion
KeEnterCriticalRegion 和 KeLeaveCriticalRegion 是可用于将关键驱动程序代码序列的执行与普通内核异步过程调用 (APC) 传递同步的 API。 无法在 IRQL = DISPATCH_LEVEL 或更高版本中调用 KeEnterCriticalRegion 和 KeLeaveCriticalRegion API。 在 DISPATCH_LEVEL 或更高版本调用 KeEnterCriticalRegion 或 KeLeaveCriticalRegion 可能会导致系统挂起或内存损坏。
从 Windows 7 开始,如果启用了强制 IRQL 检查选项,驱动程序验证程序将在 DISPATCH_LEVEL 或更高版本检测对这些 API 的调用。
激活此选项
可以使用驱动程序验证程序管理器或Verifier.exe命令行为一个或多个驱动程序激活强制 IRQL 检查功能。 有关详细信息,请参阅 选择驱动程序验证程序选项。
在命令行
在命令行中,强制 IRQL 检查选项由 位 1 (0x2) 表示。 若要激活强制 IRQL 检查,请使用标志值0x2或向标志值添加0x2。 例如:
verifier /flags 0x2 /driver MyDriver.sys
下次启动后,该功能将处于活动状态。
还可以通过将 /volatile 参数添加到 命令来激活和停用强制 IRQL 检查,而无需重启计算机。 例如:
verifier /volatile /flags 0x2 /adddriver MyDriver.sys
此设置会立即生效,但在关闭或重启计算机时会丢失。 有关详细信息,请参阅 使用易失性设置。
强制 IRQL 检查功能也包含在标准设置中。 例如:
verifier /standard /driver MyDriver.sys
使用驱动程序验证程序管理器
- 启动驱动程序验证程序管理器。 在命令提示符窗口中键入 验证程序 。
- 选择“ 为代码开发人员) 创建自定义设置 ( ”,然后单击“ 下一步”。
- 从完整列表中选择“选择单个设置”。
- 选择“ (检查) 强制进行 IRQL 检查。
强制 IRQL 检查功能也包含在标准设置中。 若要使用此功能,请在驱动程序验证程序管理器中单击“创建标准设置”。