突然的喚醒是意料之外的過渡到 D0。 裝置進入 D3cold 之後,當相同電源軌上另一個裝置的驅動程式要求從 D3cold 轉換至 D0 時,它可能會遇到意外喚醒作為副作用。 第一個裝置的驅動程式必須收到意外喚醒的通知,以防止裝置保持在未初始化的 D0 狀態。
當裝置從 D3hot 移至 D3cold 時,它可能會這麼做,因為其與某些其他裝置共用的電源已關閉。 在這些裝置進入 D3cold 之後,其中一個裝置的驅動程式可能會要求轉換至 D0。 為了回應此要求,父匯流排驅動程式或 ACPI 篩選驅動程式會開啟電源,而共用電源的所有裝置都會進入其預設的開機硬體狀態。
唯一預期此電源狀態變更的裝置驅動程式是要求變更的驅動程式。 其他裝置的驅動程式必須收到這項變更的通知,才能正確初始化其裝置以在 D0 中運作。 只有可以接收此通知的驅動程式才能讓其裝置輸入 D3cold。 否則,驅動程式將不知道裝置何時進入 D0。
當裝置開啟時,它會進入預設的未初始化硬體狀態。 例如, PCI Express Base 3.0 規格 定義了裝置在第一次接收電源時進入的 D0 未初始化 狀態。 此狀態的定義是 PCI 和 PCI Express 裝置特有的,但連線到其他匯流排的裝置設計為在開啟時進入類似的硬體狀態。
如果是實作多項功能的 PCI 或 PCI Express 裝置,這些裝置功能可能會共用相同的電源軌。 不過,每個函式可能都有個別的驅動程式,而且這些函式的驅動程式不太可能直接彼此通訊。 當其中一個函式的驅動程式要求將電源狀態從 D3cold 變更為 D0 時,其他函式的驅動程式不會預期此變更。 當這些其他函式收到電源時,必須通知其驅動程式,以便將函式設定為在 D0 中正確運作。
匯流排驅動程式會偵測何時開啟子裝置的電源。 如果此裝置的函式驅動程式未要求轉換至 D0,匯流排驅動程式會提示裝置驅動程式自行傳送 D0 電源 IRP(IRP_MN_SET_POWER 要求,目標狀態為 PowerDeviceD0),以初始化裝置在 D0 狀態中運作。 從這個初始化的 D0 狀態,裝置驅動程式可以接著發起裝置轉換到 D3hot 的過程。 裝置驅動程式可以透過下列方式從匯流排驅動程式收到突然轉換至 D0 的通知:
- 直接或間接將自己註冊為 運行時電源管理框架(PoFx)用戶端的裝置驅動程式會收到通知回調。
- 配置裝置喚醒的裝置驅動程式,其擱置的 IRP_MN_WAIT_WAKE 要求會由匯流排驅動程式完成。
從 Windows 8 開始,裝置的功能驅動程式作為電源政策擁有者,可以註冊本身為 PoFx 的用戶端。 當總線驅動程式通知 PoFx 裝置意外轉換到 D0 時,PoFx 會協助裝置移至已初始化的 D0 狀態,然後再移至 D3hot。 首先,PoFx 會呼叫驅動程式的 DevicePowerRequiredCallback 常式,以提示裝置驅動程式將 D0 電源 IRP 向下傳送裝置堆疊。 接下來,PoFx 會呼叫驅動程式的 DevicePowerNotRequiredCallback 常式,以通知裝置驅動程式裝置不需要保持在 D0 狀態。
從 Kernel-Mode 驅動程式架構 (KMDF) 1.11 版開始,單一元件裝置的 KMDF 驅動程式可以呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 方法,間接向 PoFx 註冊本身。 在此呼叫中,驅動程式會提供回呼程序的指標,以通知驅動程式進行至 D0 的突然轉換。 如需詳細資訊,請參閱 支援功能電源狀態。
如果裝置已經啟用喚醒功能,即使驅動程式未向 PoFx 註冊其裝置,仍可收到裝置意外轉換至 D0 的通知。 當總線驅動程式開啟裝置電源時,它們會完成驅動程式的 IRP_MN_WAIT_WAKE 要求。 回應中,驅動程式會初始化其裝置以在 D0 中運作。 裝置很可能處於閒置狀態,在此情況下,驅動程式會在一段時間後將此裝置移至 D3hot。
未向 PoFx 註冊且未啟動其設備以進行喚醒的功能驅動程式不會收到設備從 D3cold 到 D0 的意外轉換通知。 裝置可能會花費大量時間處於未初始化的 D0 狀態。 在此狀態下,裝置中的所有元件通常都會開啟。 若要減少閒置裝置的耗電量,只有在驅動程式可以收到突然轉換到 D0 的通知時,才應該啟用進入 D3cold 模式。