共用方式為


RemoveLockQueryMnRemove 規則 (wdm)

RemoveLockQueryMnRemove 規則會確認使用 MinorFunction IRP_MN_QUERY_REMOVE_DEVICE 處理IRP_MJ_PNP時,會正確使用 IoAcquireRemoveLockIoReleaseRemoveLock 的呼叫。 驅動程式應該先取得移除鎖定,再將 IRP 轉送至堆疊。

此規則僅適用於 FDO 和 FIDO 驅動程式。

例如,假設 PnP 驅動程式堆疊是由篩選驅動程式、FDO 和 PDO 所組成。

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. 呼叫 IoDetachDeviceIoDeleteDevice 之前,應該先呼叫 IoReleaseRemoveLockAndWait。 (這可確保所有移除鎖定都會在設備驅動器) 中釋放。

驅動程式模型:WDM

測試方法

在編譯時期

執行 靜態驅動程式驗證器 ,並指定 RemoveLockQueryMnRemove 規則。

使用下列步驟來執行程式碼的分析:
  1. 準備程式代碼 (使用角色類型宣告) 。
  2. 執行靜態驅動程式驗證程式。
  3. 檢視和分析結果。

如需詳細資訊,請參閱 使用靜態驅動程式驗證器在驅動程式中尋找瑕疵

適用於

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriver