瞭解何時發出移除 IRP
下圖顯示移除裝置驅動程式所涉及的一般 IRP 序列。
下列附注對應至上圖中的圓圈數位:
查詢移除
PnP 管理員發出 IRP_MN_QUERY_REMOVE_DEVICE ,詢問是否可以移除裝置,而不中斷機器。 當使用者要求更新裝置的驅動程式 () ,並在 windows 2000 和更新版本上 () ,裝置管理員 停用裝置時,也會傳送此 IRP。 (Windows 98/Me 上,PnP 管理員在此情況下會傳送停止 IRP;如需詳細資訊,請參閱 停止裝置 。)
如果裝置堆疊中的所有驅動程式都會傳回STATUS_SUCCESS,則驅動程式會將裝置置於移除擱置狀態。 在此狀態下,驅動程式不得啟動任何防止移除裝置的作業。
在此「清除」移除案例中,PnP 管理員會在傳送移除 IRP 之前,先傳送查詢移除 IRP。 如需「意外」移除的描述,請參閱步驟 5。
雖然上圖未顯示,但總線驅動程式可能會收到未啟動之裝置 的IRP_MN_QUERY_REMOVE_DEVICE 。 如果使用者要求動態移除計算機上實際存在的裝置,但已停用,就會發生這種情況。
成功查詢之後移除
PnP 管理員會發出 IRP_MN_REMOVE_DEVICE 來移除裝置的驅動程式。
驅動程式必須成功此要求。 裝置的驅動程式會執行任何必要的清除、從裝置堆疊中斷連結,以及刪除 FDO 和任何篩選 DO。 父總線驅動程式會保留 PDO,直到用戶實際從計算機中移除裝置為止。
請注意,驅動程式可能會在移除 IRP 之前收到 IRP_MN_STOP_DEVICE ,但並非必要。 在 Windows 2000 和更新版本上, IRP_MN_STOP_DEVICE 只會用來暫停裝置以進行資源重新平衡;這不是移除的步驟。 如果使用者在裝置停止時移除裝置硬體,PnP 管理員會在停止 IRP 之後於某個時間點傳送移除 IRP,但停止不是移除的必要條件。
繼續裝置
如果裝置在驅動程式刪除其裝置對象之後繼續執行,PnP 管理員會呼叫驅動程式的 AddDevice 例程,併發出 IRP_MN_START_DEVICE 以恢復裝置。 (另請參閱 PnP 檢視方塊中的裝置狀態 圖。)
取消查詢移除
PnP 管理員發出 IRP_MN_CANCEL_REMOVE_DEVICE 來取消查詢移除要求。
為了回應 IRP_MN_CANCEL_REMOVE_DEVICE,驅動程式會將裝置傳回其啟動狀態。
意外移除 (Windows 2000 和更新版本的 Windows)
在 Windows 2000 和更新版本系統上,如果使用者從電腦取消卸載裝置,而不需使用 [取消安裝] 或 [退出硬體] 程式,PnP 管理員就會傳送 IRP_MN_SURPRISE_REMOVAL IRP。
此案例稱為「意外」移除,因為驅動程式不會收到預先警告。
為了回應 IRP_MN_SURPRISE_REMOVAL IRP,裝置的驅動程式會失敗任何未處理的 I/O,並釋放裝置所使用的硬體資源。 驅動程式必須確定沒有元件嘗試存取裝置,因為它已不存在。
所有驅動程式都必須處理 IRP_MN_SURPRISE_REMOVAL IRP,且必須將狀態設定為STATUS_SUCCESS。
無法取消 IRP_MN_SURPRISE_REMOVAL 。
意外移除 Windows 2000 和更新版本的 Windows (後移除)
關閉裝置的所有開啟句柄時,PnP 管理員會將 IRP_MN_REMOVE_DEVICE 要求傳送給裝置的驅動程式。 每個驅動程式都會從裝置堆疊中斷連結,並刪除其裝置物件。
意外移除 Windows 98/Me) (
在 Windows 98/Me 上,當裝置移除時,驅動程式不會收到 IRP_MN_SURPRISE_REMOVAL 而不發出警告。 PnP 管理員只會傳送 IRP_MN_REMOVE_DEVICE。 WDM 驅動程式必須有程式代碼來處理 IRP_MN_SURPRISE_REMOVAL ,後面接著 IRP_MN_REMOVE_DEVICE ( Windows 2000 和更新版本的行為,以便意外移除) 和 IRP_MN_REMOVE_DEVICE ,而不需要先前的意外移除 IRP (Windows 98/Me 行為) 。
在 Windows 2000 和更新版本 (失敗後移除)
如果裝置的其中一個驅動程序失敗 IRP_MN_START_DEVICE,PnP 管理員會將 IRP_MN_REMOVE_DEVICE 要求傳送至裝置堆疊。 這類移除 IRP 可確保裝置的所有驅動程式都會收到裝置未成功啟動的通知。 為了回應 IRP_MN_REMOVE_DEVICE IRP,如果裝置成功啟動 IRP) 並復原其 AddDevice 作業,則裝置的驅動程式會復原其啟動作業 (。 PnP 管理員會將這類裝置標示為「啟動失敗」。
此行為僅適用於 Windows 2000 和更新版本平臺。 在 Windows 98/Me 上,PnP 管理員會傳送 IRP_MN_STOP_DEVICE 以回應失敗的啟動。
PnP 裝置的驅動程式可以在比說明一般移除 IRP 轉換的圖形中顯示的更多情況下收到 IRP_MN_SURPRISE_REMOVAL 。 例如,使用者可以將計算機卡片插入計算機,然後在裝置啟動之前將其移除。 在此情況下,PnP 管理員會在呼叫驅動程式的 AddDevice 例程之後發出意外移除的 IRP,但在發出 IRP_MN_START_DEVICE 要求之前。 呼叫驅動程式 AddDevice 例程之後,必須準備好隨時處理 PnP 裝置的驅動程式,以處理移除 IRP。