ユーザーがデバイスを接続する
次のシナリオでは、デバイス ノードには、KMDF バス ドライバーと、PnP デバイスをサポートする 1 つ以上の KMDF 機能またはフィルター ドライバーが含まれています。
システムの実行中にユーザーがデバイスをバスに接続すると、デバイスのバス ドライバーとフレームワークは次のタスクを実行します。
デバイスのバス ドライバーはデバイスを検出し、WdfChildListAddOrUpdateChildDescriptionAsPresent を呼び出します。 (このプロセスは「動的列挙」と呼ばれます。)
フレームワークはバス ドライバーの EvtChildListCreateDevice コールバック関数を呼び出すため、バス ドライバーは WdfDeviceCreate を呼び出して物理デバイスのフレームワーク デバイス オブジェクト (PDO) を作成できます。
フレームワークは、バス ドライバーの EvtDeviceResourcesQuery および EvtDeviceResourceRequirementsQuery コールバック関数を呼び出して、デバイスが必要とするシステム ハードウェア リソースを特定します。
KMDF バス ドライバーの一連の電源投入手順の詳細については、「バス ドライバーの一連の電源投入手順」を参照してください。
次に、PnP マネージャーは、デバイスに必要な追加のドライバー (ファンクション ドライバーとフィルター ドライバー) を特定します。 これらのドライバーがまだ読み込まれていない場合、PnP マネージャーはドライバーを読み込み、DriverEntry ルーチンを呼び出します。 ファンクション ドライバーまたはフィルター ドライバーごとに、次のアクションが実行されます。
フレームワークは、追加の各ドライバーの EvtDriverDeviceAdd コールバック関数を呼び出して、ドライバーが WdfDeviceCreate を呼び出して、対応するデバイスを表現するフレームワーク デバイス オブジェクトを作成できるようにします。 ファンクション ドライバーは機能デバイス オブジェクト (FDO) を作成し、フィルター ドライバーはフィルター デバイス オブジェクト (Filter DO) を作成します。
フレームワークは、各ファンクション ドライバーとフィルタードライバーの EvtDeviceFilterRemoveResourceRequirements コールバック関数を呼び出した後、各ドライバーの EvtDeviceFilterAddResourceRequirements コールバック関数を呼び出します。 デバイスが起動する直前に、フレームワークは EvtDeviceRemoveAddedResources コールバック関数を呼び出します。 これら 3 つのコールバック関数により、フィルター ドライバーとファンクション ドライバーは、PnP マネージャーがデバイスにリソースを割り当てる前に、デバイスが必要とするハードウェア リソースのリストを変更できます。 詳細については、「フレームワークベースのドライバーのハードウェア リソース」を参照してください。
フレームワークは、デバイスが動作 (D0) 電力状態に達していることを確認します。
デバイスをサポートする機能とフィルター ドライバーごとに、フレームワークは、ドライバー スタックの最下位にあるドライバーから始めて、一度に 1 つのドライバーずつ、以下の一連の手順を進めていきます。
- フレームワークは、ドライバーの EvtDevicePrepareHardware コールバック関数 (存在する場合) を呼び出し、PnP マネージャーがデバイスに割り当てたハードウェア リソースのリストを渡します。
- フレームワークは、ドライバーの EvtDeviceD0Entry コールバック関数 (存在する場合) を呼び出します。
- フレームワークは、割り込みごとにドライバーの EvtInterruptEnable コールバック関数 (存在する場合) を呼び出した後、ドライバーがデバイスの割り込みを有効にできるように、ドライバーの EvtDeviceD0EntryPostInterruptsEnabled コールバック関数 (存在する場合) を呼び出します。
- ハードウェアとドライバーが DMA をサポートしている場合、フレームワークは、作成された各 DMA チャネルのドライバーの EvtDmaEnablerFill、EvtDmaEnablerEnable、EvtDmaEnablerSelfManagedIoStart コールバック関数 (存在する場合) を呼び出します。
- フレームワークは、ドライバーの EvtChildListScanForChildren コールバック関数 (存在する場合) を呼び出します。
- フレームワークは、デバイスの電源管理 I/O キューをすべて開始します。
- ドライバーが自己管理 I/O を使用している場合、フレームワークはドライバーの EvtDeviceSelfManagedIoInit コールバック関数を呼び出します。
KMDF ファンクション ドライバーまたはフィルター ドライバーの一連の電源投入手順の詳細については、「ファンクション ドライバーまたはフィルター ドライバーの一連の電源投入手順」を参照してください。