Share via


静的な列挙

静的列挙は、システムの初期化中にデバイスの存在を検出して報告をするドライバーの機能です。システム構成に対するその後の変更を報告する機能は限られています。

バス ドライバーは、デバイスまたは機能サブユニットの数と種類が事前に定義され、永続的であり、ドライバーが実行されているシステムの構成に依存しない場合は、静的列挙を使用できます。

たとえば、サウンド カードのドライバーがバス ドライバーとして機能し、MIDI、オーディオ、ジョイスティックなどのカードの機能ごとに個別の物理デバイス オブジェクト (PDO) を作成する場合があります。

静的子リスト

フレームワークを使用すると、ドライバーは静的な子リストを提供することで静的列挙をサポートできます。 各静的子リストは、親デバイスに接続されている子デバイスの一覧を表します。 親デバイスのバス ドライバーは、親の子デバイスを識別し、親デバイスの静的子リストに追加し、各子デバイスの PDO を作成する必要があります。

静的子リストの作成

ドライバーがデバイスの機能デバイス オブジェクト (FDO) を表すフレームワーク デバイス オブジェクトを作成するたびに、フレームワークは、デバイスの空の静的な子リストを作成します。

フレームワークがバス ドライバーの EvtDriverDeviceAdd コールバック関数を呼び出す場合、コールバック関数は WdfDeviceCreate を呼び出して親デバイスの FDO を作成する必要があります。 FDO の作成の詳細については、「ファンクション ドライバーでのデバイス オブジェクトの作成」を参照してください。

その後、ドライバーは、親デバイスの子を列挙し、子の PDO を作成し、子リストに子を追加する必要があります。

必要に応じて、ドライバーは WdfDeviceSetBusInformationForChildren を呼び出して、バスに関する情報をフレームワークに提供できます。 そうすることにより子デバイスとアプリがバスを識別しやすくなるため、推奨されます。

検出された子デバイスの PDO を作成するには、バス ドライバーで次の手順を実行する必要があります。

  1. WdfPdoInitAllocate を呼び出して、WDFDEVICE_INIT 構造体を取得します。

  2. WDFDEVICE_INIT 構造体を初期化します。

  3. WdfDeviceCreate を呼び出して、PDO を表すフレームワーク デバイス オブジェクトを作成します。

PDO の作成の詳細については、「バス ドライバーでのデバイス オブジェクトの作成」を参照してください。

WdfDeviceCreate を呼び出した後、ドライバーは WdfFdoAddStaticChild を呼び出して子デバイスを子リストに追加します。

静的子リストの変更

ドライバーは、事前に定義された永続的なデバイス構成にのみ静的子リストを使用する必要があるため、作成後に静的子リストを変更する必要はほとんどありません。 ドライバーが子デバイスにアクセスできなくなったと判断した場合、ドライバーは WdfPdoMarkMissing を呼び出すことができます。 (子デバイスメインアクセス可能であっても応答不能になり、使用できなくなった場合、ドライバーは WDF_DEVICE_STATE 構造体の Failed メンバーを WdfTrue に設定してから、WdfDeviceSetDeviceState を呼び出す必要があります)。

静的子リストの走査

静的な子リストの内容を取得する必要がある場合、ドライバーは次の操作を行ってリストを走査できます。

  1. WdfFdoLockStaticChildListForIteration を呼び出します。

  2. WdfFdoRetrieveNextStaticChild を必要な回数呼び出します。

  3. WdfFdoUnlockStaticChildListFromIteration を呼び出します。