RemoveLockMnRemove2 规则 (wdm)

RemoveLockMnRemove2 规则验证在将 IRP 转发到较低级驱动程序之前处理IRP_MN_REMOVE_DEVICE请求时,是否正确使用对 IoAcquireRemoveLock和 IoReleaseRemoveLockAndWait 的调用。

此规则仅适用于 FDO 和 FIDO 驱动程序。

例如,考虑由筛选器驱动程序、FDO 和 PDO 组成的 PnP 驱动程序堆栈。

PnP 管理器通过堆栈发送查询删除。 当系统运行时,FDO 处于空闲状态。 FDO 决定在查询删除状态下关闭电源,因此它请求 d0 IRP。 在 d0 IRP 到达之前,PnP 管理器会发送一个 PnP 删除 IRP,该 IRP 由筛选器驱动程序处理。 筛选器驱动程序从堆栈中分离并清理其状态。 d0 到达堆栈的顶部,但筛选器驱动程序不会将其发送到堆栈下,因为它没有上下文或数据知道再将它发送到何处。 FDO 挂起,等待 d0 IRP 到达,但 IRP 永远不会到达。

避免此错误

  1. 在设备从设备堆栈分离之前, IoAcquireRemoveLock 必须成功,然后才能将 IRP 转发到以下 IRP 类型的堆栈:

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. 应在调用 IoDetachDevice 或 IoDeleteDevice 之前调用 IoReleaseRemoveLockAndWait (这可确保在设备驱动程序) 释放所有删除锁。

驱动程序模型:WDM

如何测试

编译时

运行 静态驱动程序验证程序 并指定 RemoveLockMnRemove2 规则。

使用以下步骤运行代码分析:
  1. 准备代码 (使用角色类型声明) 。
  2. 运行静态驱动程序验证程序。
  3. 查看和分析结果。

有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷

适用于

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver