系統的電源 IRP
系統電源 IRP指定主要 IRP 程式碼IRP_MJ_POWER、下列其中一個次要電源 IRP 代碼,以及 IRP 堆疊Power.Type成員中的SystemPowerState值。 只有電源管理員可以傳送這類 IRP;驅動程式無法傳送系統電源 IRP。
電源管理員會基於下列其中一個原因傳送系統電源 IRP:
若要變更系統電源狀態以回應閒置逾時、系統活動、使用者要求或過期的電池 (IRP_MN_SET_POWER)
若要查詢裝置,以判斷系統是否可以進入睡眠 (IRP_MN_QUERY_POWER)
在查詢 (IRP_MN_SET_POWER) 之後,使目前的系統電源狀態處於)
電源管理員會代表系統傳送 IRP_MN_QUERY_POWER 和 IRP_MN_SET_POWER 要求。 驅動程式可能會失敗 IRP_MN_QUERY_POWER 要求,但無法失敗 IRP_MN_SET_POWER。
例如,若要變更系統電源狀態,電源管理員會將系統電源 IRP 傳送至裝置樹狀結構每個裝置節點堆疊中的頂端驅動程式。 下圖顯示單一裝置堆疊內的驅動程式如何處理系統電源 IRP。
如上圖所示:
電源管理員會呼叫 I/O 管理員,將系統電源 IRP 傳送至裝置樹狀結構中的每個分葉節點。
驅動程式盡可能處理 IRP、視需要設定 IoCompletion 常式,並視需要呼叫 IoCallDriver (Windows 7 和 Windows Vista) 或 PoCallDriver (Windows Server 2003、Windows XP 和 Windows 2000) 將 IRP 轉送至堆疊。 如果驅動程式必須失敗 IRP,驅動程式會立即完成 IRP。 驅動程式 可能會IRP_MN_QUERY_POWER IRP 失敗,但不得失敗 IRP_MN_SET_POWER 設定系統電源狀態的 IRP。
當擁有裝置電源原則的驅動程式收到 IRP 時,該驅動程式會為系統 IRP 設定 IoCompletion 常式,然後轉送 IRP。
如果可能的話,堆疊中的任何其他驅動程式會處理 IRP、視需要設定 IoCompletion 常式,並將 IRP 轉送至下一個較低的驅動程式,如步驟 2 所示。
最後,公車驅動程式會接收並完成系統 IRP。
I/O 管理員會呼叫任何已設定為驅動程式的 IoCompletion 常式,將系統 IRP 傳遞至裝置堆疊。
在其 IoCompletion 常式中,裝置電源原則擁有者會呼叫 PoRequestPowerIrp 來傳送裝置電源 IRP,並指定系統 IRP 中系統電源狀態有效的裝置電源狀態。 驅動程式會設定在裝置電源 IRP 完成時要叫用的回呼常式。
如有必要,驅動程式會在DEVICE_CAPABILITIES結構的快取複本中查閱DeviceState成員, (請參閱報告裝置電源功能) ,以判斷哪些裝置電源狀態對應至 IRP 中的系統電源狀態。
裝置 IRP 完成且任何裝置 IRP 完成常式都已執行之後,就會叫用電源原則擁有者的回呼常式。 在回呼常式中,驅動程式會將傳回的狀態複製到系統 IRP 中。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,回呼會呼叫 PoStartNextPowerIrp 來啟動下一個電源 IRP。 不過,在 Windows 7 和 Windows Vista 中,不需要呼叫 PoStartNextPowerIrp ,因此呼叫不會執行任何電源管理作業。 最後,回呼會呼叫 IoCompleteRequest 來完成系統 IRP。
如需詳細資訊,請參閱 處理系統電源狀態要求。
由於某些裝置在開啟電源時需要目前的啟動,因此系統內嵌電源 IRP 會以同步方式和序列方式處理整個系統。 一次只能有一個這類 IRP 作用中。 如需詳細資訊,請參閱 呼叫 IoCallDriver 與呼叫 PoCallDriver。