RemoveLockMnSurpriseRemove rule (wdm)

RemoveLockMnSurpriseRemove 规则验证在使用 MinorFunction IRP_MN_SUPRISE_REMOVAL 处理IRP_MJ_PNP时,是否正确使用对 IoAcquireRemoveLockIoReleaseRemoveLockAndWait 的调用。 驱动程序应先获取删除锁,然后再将 IRP 转发到堆栈中。

此规则仅适用于 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

如何测试

编译时

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

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

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

适用于

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList