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