针对堆栈的固定 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 DIS 时验证缓冲区内容的固定性。

激活此选项

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

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

  • 在命令行

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

    verifier /flags 0x00002010 /driver MyDriver.sys
    

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

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

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