针对堆栈的固定 MDL 检查

面向堆栈的固定 MDL 检查选项用于监控驱动程序如何处理驱动程序堆栈中的固定 MDL 缓冲区。 驱动程序验证程序可检测是否对固定 MDL 缓冲区进行了非法修改。 若要使用此选项,必须在至少一个驱动程序上启用 I/O 验证。

注意此选项从 Windows 8 开始可用。

“堆栈的固定 MDL 检查”选项可确保驱动程序仅在请求离开驱动程序堆栈时遵循固定 MDL 缓冲区的规则。

首次在 IoCallDriver 例程中看到具有固定 MDL 的 IRP 时,将从固定 MDL 缓冲区的内容中计算出唯一签名并存储在内部数据库中。 在 IoCompleteRequest 例程中完成 IRP 期间,如果 IRP 仍携带我们为其记录了签名的固定 MDL,驱动程序验证程序将验证缓冲区是否未更改。

在 IRP 的整个生存期内,无法修改写入请求的固定缓冲区。 对于读取请求,固定缓冲区不能在其调度路径上修改,因此缓冲区签名的比较是在上次调用 IoCallDriver 时完成的。

“堆栈的固定 MDL 检查”选项验证整个驱动程序堆栈中的 MDL 缓冲区不变性,而不考虑缓冲区在通过堆栈中的单个驱动程序时会发生什么情况。 此选项是全局性的,不能基于每个驱动程序选择性地强制实施。 “堆栈的固定 MDL 检查”选项只能捕获冲突,而无法查明违反缓冲区不变性的驱动程序。 若要帮助查明故障驱动程序,请使用“驱动程序的 固定 MDL 检查 ”选项,该选项在每次调用 IoCallDriverIoCompleteRequest DDI 时验证缓冲区内容的固定性。

激活此选项

可以使用驱动程序验证程序管理器或 Verifier.exe 命令行为一个或多个驱动程序激活固定 MDL 检查堆栈功能。 必须重新启动计算机才能激活或停用“堆栈的固定 MDL 检查”选项。 有关详细信息,请参阅 选择驱动程序验证程序选项

若要激活“堆栈的固定 MDL 检查”选项,还必须激活 I/O 验证

  • 在命令行

    在命令行中,Stack 的固定 MDL 检查由 0x00002000 ( 位 13) 表示。 若要激活堆栈的固定 MDL 检查,请使用标志值0x00002010或向标志值添加0x00002010。 此值激活堆栈 (0x00002000) 的 I/O 验证 (0x10) 和固定 MDL 检查。 例如:

    verifier /flags 0x00002010 /driver MyDriver.sys
    

    下次启动后,该功能将处于活动状态。

  • 使用驱动程序验证程序管理器

    1. 启动驱动程序验证程序管理器。 在命令提示符窗口中键入 验证程序
    2. 选择“ 为代码开发人员创建自定义设置 () ,然后单击” 下一步”。
    3. 从完整列表中选择“选择单个设置”。
    4. 为堆栈选择 (检查) I/O 验证和固定 MDL 检查。
    5. 重新启动计算机。