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 永远不会到达。
避免此错误
在设备从设备堆栈分离之前, IoAcquireRemoveLock 必须成功,然后才能将 IRP 转发到以下 IRP 类型的堆栈:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
应在调用 IoDetachDevice 或 IoDeleteDevice 之前调用 IoReleaseRemoveLockAndWait。 (这可确保在设备驱动程序) 释放所有删除锁。
驱动程序模型:WDM
如何测试
编译时 |
---|
运行 静态驱动程序验证程序 并指定 RemoveLockMnRemove2 规则。 使用以下步骤运行代码分析:有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷。 |
适用于
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver