PnP マネージャーがシステム リソースを再配布する
ユーザーがシステムにデバイスを追加し、PnP マネージャーが既に別のデバイスに割り当てられているシステム リソースがデバイスに必要な場合、PnP マネージャーはリソースの再割り当てを試みます。
このプロセス中、PnP マネージャーはデバイスを停止し、動作 (D0) 状態からデバイスを取り出します。 その後、新しいリソースを使用して再起動できるように、新しいリソース リストがデバイスに配信されます。
リソースを再配布する場合、PnP マネージャーは、デバイスのドライバーの 1 つがリソース割り当てた場合、デバイスのリソース割り当てを変更しません。
WdfDeviceSetSpecialFileSupport が呼び出され、特殊ファイルがデバイスで開かれています。
WdfDeviceSetStaticStopRemove が呼び出されました。
EvtDeviceQueryStop コールバック関数を指定し、コールバック関数が再割り当てを拒否しました。
電源ダウン シーケンス
停止中のデバイスをサポートする各機能とフィルター ドライバーごとに、フレームワークは、ドライバー スタックで最も高いドライバーから始めて、ドライバーを 1 つずつ順番に、次の処理を行います。
ドライバーが自己管理 I/O を使用している場合、フレームワークはドライバーの EvtDeviceSelfManagedIoSuspend コールバック関数を呼び出します。
フレームワークは、デバイスの電源管理 I/O キューをすべて停止します。
ハードウェアとドライバーが DMA をサポートしている場合、フレームワークは、作成された各 DMA チャネルのドライバーの EvtDmaEnablerSelfManagedIoStop、EvtDmaEnablerFlush、EvtDmaEnablerDisable コールバック関数を呼び出します。
ドライバーの EvtDeviceD0ExitPreInterruptsDisabled コールバック関数と EvtInterruptDisable コールバック関数 (存在する場合) を呼び出して、ドライバーがデバイスの割り込みを無効にできるようにします。
フレームワークは、ドライバーの EvtDeviceD0Exit コールバック関数を呼び出します (存在する場合)。
フレームワークは、ドライバーの EvtDeviceReleaseHardware コールバック関数 (存在する場合) を呼び出し、PnP マネージャーがデバイスに割り当てたハードウェア リソースの一覧を渡します。
バス ドライバーは、スタック内で最下位で、最後に呼び出されるドライバーです。 フレームワークは、バス ドライバーの EvtDeviceD0Exit コールバック関数を呼び出すときに、デバイスの PDO と WdfPowerDeviceD3Final の TargetState 値を表すフレームワーク デバイス オブジェクトにハンドルを渡します。 バス ドライバーは、フレームワークが WdfDeviceInitSetReleaseHardwareOrderOnFailure を呼び出すことによって、その EvtDeviceReleaseHardware コールバック関数を呼び出すタイミングを制御できます。
電源投入シーケンス
最初に呼び出されるドライバーはバス ドライバーです。 フレームワークがバス ドライバーの EvtDeviceD0Entry コールバック関数を呼び出すと、コールバック関数はデバイス (バスの子デバイス) を動作 (D0) 状態に戻します。
デバイスをサポートする関数とフィルター ドライバーごとに、フレームワークは、ドライバー スタックで最も低いドライバーから始めて、ドライバーを 1 つずつ順番に、次の処理を行います。
フレームワークは、ドライバーの EvtDevicePrepareHardware コールバック関数 (存在する場合) を呼び出し、PnP マネージャーがデバイスに割り当てたハードウェア リソースの一覧を渡します。
フレームワークは、ドライバーの EvtDeviceD0Entry コールバック関数を呼び出します (存在する場合)。
フレームワークは、ドライバーの EvtInterruptEnable コールバック関数と EvtDeviceD0EntryPostInterruptsEnabled コールバック関数 (存在する場合) を呼び出して、ドライバーがデバイスの割り込みを有効にできるようにします。
ハードウェアとドライバーが DMA をサポートしている場合、フレームワークは、作成された各 DMA チャネルのドライバーの EvtDmaEnablerFill、EvtDmaEnablerEnable、EvtDmaEnablerSelfManagedIoStart コールバック関数を呼び出します。
フレームワークは、ドライバーの EvtChildListScanForChildren コールバック関数 (存在する場合) を呼び出します。
フレームワークは、デバイスの電源管理 I/O キューをすべて再起動します。
ドライバーが自己管理 I/O を使用している場合、フレームワークはドライバーの EvtDeviceSelfManagedIoRestart コールバック関数を呼び出します。