RemoveLockMnRemove2 規則 (wdm)
RemoveLockMnRemove2 規則會確認呼叫 IoAcquireRemoveLock 和 IoReleaseRemoveLockAndWait 會在將 IRP 轉送至較低的驅動程式之前處理IRP_MN_REMOVE_DEVICE要求時正確使用。
此規則僅適用於 FDO 和 FIDO 驅動程式。
例如,假設 PnP 驅動程式堆疊是由篩選驅動程式、FDO 和 PDO 所組成。
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