PnP マネージャーがシステム リソースを再配布する

ユーザーがシステムにデバイスを追加し、PnP マネージャーが既に別のデバイスに割り当てられているシステム リソースがデバイスに必要な場合、PnP マネージャーはリソースの再割り当てを試みます。

このプロセス中、PnP マネージャーはデバイスを停止し、動作 (D0) 状態からデバイスを取り出します。 その後、新しいリソースを使用して再起動できるように、新しいリソース リストがデバイスに配信されます。

リソースを再配布する場合、PnP マネージャーは、デバイスのドライバーの 1 つがリソース割り当てた場合、デバイスのリソース割り当てを変更しません。

電源ダウン シーケンス

停止中のデバイスをサポートする各機能とフィルター ドライバーごとに、フレームワークは、ドライバー スタックで最も高いドライバーから始めて、ドライバーを 1 つずつ順番に、次の処理を行います。

  1. ドライバーが自己管理 I/O を使用している場合、フレームワークはドライバーの EvtDeviceSelfManagedIoSuspend コールバック関数を呼び出します。

  2. フレームワークは、デバイスの電源管理 I/O キューをすべて停止します。

  3. ハードウェアとドライバーが DMA をサポートしている場合、フレームワークは、作成された各 DMA チャネルのドライバーの EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerFlushEvtDmaEnablerDisable コールバック関数を呼び出します。

  4. ドライバーの EvtDeviceD0ExitPreInterruptsDisabled コールバック関数と EvtInterruptDisable コールバック関数 (存在する場合) を呼び出して、ドライバーがデバイスの割り込みを無効にできるようにします。

  5. フレームワークは、ドライバーの EvtDeviceD0Exit コールバック関数を呼び出します (存在する場合)。

  6. フレームワークは、ドライバーの EvtDeviceReleaseHardware コールバック関数 (存在する場合) を呼び出し、PnP マネージャーがデバイスに割り当てたハードウェア リソースの一覧を渡します。

バス ドライバーは、スタック内で最下位で、最後に呼び出されるドライバーです。 フレームワークは、バス ドライバーの EvtDeviceD0Exit コールバック関数を呼び出すときに、デバイスの PDO と WdfPowerDeviceD3FinalTargetState 値を表すフレームワーク デバイス オブジェクトにハンドルを渡します。 バス ドライバーは、フレームワークが WdfDeviceInitSetReleaseHardwareOrderOnFailure を呼び出すことによって、その EvtDeviceReleaseHardware コールバック関数を呼び出すタイミングを制御できます。

電源投入シーケンス

最初に呼び出されるドライバーはバス ドライバーです。 フレームワークがバス ドライバーの EvtDeviceD0Entry コールバック関数を呼び出すと、コールバック関数はデバイス (バスの子デバイス) を動作 (D0) 状態に戻します。

デバイスをサポートする関数とフィルター ドライバーごとに、フレームワークは、ドライバー スタックで最も低いドライバーから始めて、ドライバーを 1 つずつ順番に、次の処理を行います。

  1. フレームワークは、ドライバーの EvtDevicePrepareHardware コールバック関数 (存在する場合) を呼び出し、PnP マネージャーがデバイスに割り当てたハードウェア リソースの一覧を渡します。

  2. フレームワークは、ドライバーの EvtDeviceD0Entry コールバック関数を呼び出します (存在する場合)。

  3. フレームワークは、ドライバーの EvtInterruptEnable コールバック関数と EvtDeviceD0EntryPostInterruptsEnabled コールバック関数 (存在する場合) を呼び出して、ドライバーがデバイスの割り込みを有効にできるようにします。

  4. ハードウェアとドライバーが DMA をサポートしている場合、フレームワークは、作成された各 DMA チャネルのドライバーの EvtDmaEnablerFillEvtDmaEnablerEnableEvtDmaEnablerSelfManagedIoStart コールバック関数を呼び出します。

  5. フレームワークは、ドライバーの EvtChildListScanForChildren コールバック関数 (存在する場合) を呼び出します。

  6. フレームワークは、デバイスの電源管理 I/O キューをすべて再起動します。

  7. ドライバーが自己管理 I/O を使用している場合、フレームワークはドライバーの EvtDeviceSelfManagedIoRestart コールバック関数を呼び出します。