removeLockMnSurpriseRemove 規則 (wdm)
RemoveLockMnSurpriseRemove 規則會驗證呼叫 IoAcquireRemoveLock 和 IoReleaseRemoveLockAndWait 在處理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 永遠不會到達。
若要避免此錯誤
從裝置堆疊中斷連結之前, IoAcquireRemoveLock 必須先成功,IRP 才能將下列 IRP 類型轉送至堆疊:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
呼叫 IoDetachDevice 或 IoDeleteDevice 之前,應該先呼叫 IoReleaseRemoveLockAndWait。 (這可確保所有移除鎖定都會在設備驅動器中釋放) 。
驅動程式模型:WDM
測試方法
在編譯時期 |
---|
執行 靜態驅動程序驗證程式 ,並指定 RemoveLockMnSurpriseRemove 規則。 使用下列步驟來執行程式碼的分析:如需詳細資訊,請參閱 使用靜態驅動程式驗證器尋找驅動程式中的瑕疵。 |
適用於
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList