共用方式為


removeLockMnSurpriseRemove 規則 (wdm)

RemoveLockMnSurpriseRemove 規則會驗證呼叫 IoAcquireRemoveLockIoReleaseRemoveLockAndWait 在處理IRP_MJ_PNP與 MinorFunction IRP_MN_SUPRISE_REMOVAL時會正確使用。 驅動程式應該先取得移除鎖定,再將 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. 呼叫 IoDetachDeviceIoDeleteDevice 之前,應該先呼叫 IoReleaseRemoveLockAndWait。 (這可確保所有移除鎖定都會在設備驅動器中釋放) 。

驅動程式模型:WDM

測試方法

在編譯時期

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

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

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

適用於

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList