停止裝置以重新平衡資源
下圖顯示停止和重新開機裝置以重新平衡資源的 IRP 順序。
下列附注對應至上圖中的圓形數位:
PnP 管理員發出 IRP_MN_QUERY_STOP_DEVICE ,詢問裝置的驅動程式是否可以停止裝置並釋放其硬體資源。
如果裝置堆疊中的所有驅動程式都會傳回STATUS_SUCCESS,則驅動程式已讓裝置進入狀態 (停止擱置中) ,以便快速停止裝置。
如果裝置堆疊傳回STATUS_SUCCESS以外的任何專案,則不會參與重新平衡程式。 因為資源重新平衡是最佳作業,在此情況下,系統仍會嘗試重新平衡作業,以滿足系統中裝置的資源需求。 不過,如果裝置無法停止查詢,可能無法達到所需的結果 (例如,如果列舉新的裝置並觸發重新平衡,它可能不會收到其所需的資源,因此最終無法啟動) 。
失敗查詢停止作業的裝置會繼續處於作業狀態,即使查詢停止失敗也一樣。
PnP 管理員會視需要查詢許多裝置堆疊,以重新平衡所需的資源。
PnP 管理員發出 IRP_MN_STOP_DEVICE 來停止裝置。
在 Windows 2000 和更新版本的 Windows 上,PnP 管理員只有在裝置先前的查詢停止 IRP 成功完成時,才會傳送停止 IRP。 為了回應停止 IRP,驅動程式會釋出裝置的硬體資源 (,例如其 I/O 埠) ,並保留需要存取裝置的任何 IRP。
成功重新平衡資源之後,PnP 管理員 會發出IRP_MN_START_DEVICE 要求,以重新開機在重新平衡期間停止的任何裝置。
否則,PnP 管理員會傳送 IRP_MN_CANCEL_STOP_DEVICE來取消查詢停止 IRP。
為了回應 IRP_MN_CANCEL_STOP_DEVICE,裝置的驅動程式會將裝置傳回啟動狀態,並繼續處理裝置的 I/O 要求。
如果堆疊中有一個驅動程式失敗或整體重新平衡作業失敗,且正在取消其所有查詢停止要求,PnP 管理員就會取消裝置堆疊的查詢停止。 當 PnP 管理員只取消一個裝置堆疊上的查詢停止時,它會傳送 IRP_MN_CANCEL_STOP_DEVICE 要求,因為查詢失敗的驅動程式上方的任何驅動程式都處於停止擱置狀態。 當 IRP_MN_CANCEL_STOP_DEVICE 成功時,驅動程式已將裝置傳回已啟動狀態。
如果驅動程式在重新平衡資源之後無法重新開機裝置,PnP 管理員會將移除 IRP 傳送至 Windows 2000 和更新版本的 Windows) 上的裝置堆疊 (。
PnP 管理員會先傳送 IRP_MN_SURPRISE_REMOVAL 要求。 然後,它會傳送 IRP_MN_REMOVE_DEVICE 要求,但只有在裝置的所有開啟控制碼都關閉之後。
重新平衡 PnP 裝置的硬體資源對應用程式和終端使用者而言必須透明。 使用者可能會遇到作業暫時延遲,但資料不得遺失。 當您處理停止 IRP 時,必須將其納入考慮。