RemoveLockMnRemove rule (wdm)
RemoveLockMnRemove 规则验证在使用 MinorFunction IRP_MN_REMOVE_DEVICE 处理IRP_MJ_PNP时,是否正确使用对 IoAcquireRemoveLock 和 IoReleaseRemoveLockAndWait 的调用。
此规则仅适用于 FDO 和 FIDO 驱动程序。
例如,考虑由筛选器驱动程序、FDO 和 PDO 组成的 PnP 驱动程序堆栈。
PnP 管理器通过堆栈发送查询删除。 当系统运行时,FDO 处于空闲状态。 FDO 决定关闭查询删除状态,因此请求 d0 IRP。 在 d0 IRP 到达之前,PnP 管理器发送 PnP 删除 IRP,该 IRP 由筛选器驱动程序处理。 筛选器驱动程序从堆栈中分离并清理其状态。 d0 到达堆栈顶部,但筛选器驱动程序不会将它发送到堆栈,因为它没有上下文或数据知道在何处发送它。 FDO 挂起,等待 d0 IRP 到达,但 IRP 永远不会到达。
避免此错误
在从设备堆栈分离设备之前, IoAcquireRemoveLock 必须成功,然后才能将 IRP 向下转发到以下 IRP 类型的堆栈:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
在调用 IoDetachDevice 或 IoDeleteDevice 之前,应调用 IoReleaseRemoveLockAndWait。 (这可确保在设备驱动程序) 释放所有删除锁。
驱动程序模型:WDM
如何测试
编译时 |
---|
运行 静态驱动程序验证程序 并指定 RemoveLockMnRemove 规则。 使用以下步骤运行代码分析:有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷。 |
适用于
IoAcquireRemoveLockIoReleaseRemoveLockIoReleaseRemoveLockAndWaitRemoveHeadList