バス ドライバーでのデバイス オブジェクトの作成

バス ドライバーは、親デバイスに子デバイスが接続されていることを検出したときに、フレームワーク デバイス オブジェクトを作成する必要があります。通常、親デバイスはバスですが、各機能に一連の個別のドライバーが必要な多機能デバイスの場合もあります (デジタル オーディオと MIDI をサポートするサウンド カードなど)。バス ドライバーが作成するデバイス オブジェクトは、それぞれが 1 つのハードウェア (子) から別のハードウェア (親) への実際の接続を表すため、物理デバイス オブジェクト (PDO) と呼ばれます。

バスに接続されているデバイスを識別し報告する処理は、バス列挙と呼ばれます。

バス列挙の詳細については、「バス上のデバイスの列挙」を参照してください。

バス ドライバーは、一連のフレームワーク デバイス オブジェクト初期化メソッドを呼び出して、WDFDEVICE_INIT 構造体に情報を格納できます。さらに、フレームワーク PDO 初期化メソッドを呼び出すこともできます。

通常、列挙された子デバイスのフレームワーク デバイス オブジェクトを作成するには、次の手順が必要です。

  • バス ドライバー固有のコールバック関数を登録します。

    ほとんどのバス ドライバーは、デバイスに必要なシステム ハードウェア リソースを指定する必要があるため、WdfPdoInitSetEventCallbacks を呼び出します。ハードウェア リソースの指定方法の詳細については、「フレームワークベース ドライバーのハードウェア リソース」を参照してください。デバイスおよびドライバーが取り出し機能をサポートしている場合、追加のコールバック関数を登録できます。

  • デバイス識別文字列を報告します。

    バス ドライバーは、デバイスがサポートする文字列の種類ごとに、WdfPdoInitAssignDeviceIDWdfPdoInitAssignInstanceIDWdfPdoInitAddCompatibleID、および WdfPdoInitAddHardwareID を呼び出してデバイスの識別文字列を報告する必要があります。また、フレームワーク Version 1.9 以降を使用するバス ドライバーは、 WdfPdoInitAssignContainerID を呼び出すことができます。

  • バス ドライバーが RAW モードでデバイスをサポートできるかどうかを報告します。

    バス ドライバーが RAW モードでデバイスをサポートする場合、WdfPdoInitAssignRawDevice を呼び出す必要があります。

  • デバイスを説明する表示可能なテキストを指定します。

    バス ドライバーは、WdfPdoInitAddDeviceText および WdfPdoInitSetDefaultLocale を呼び出して、ユーザーに向けてデバイスを説明するテキストを複数の言語で指定します。

  • デバイス オブジェクトを作成します。

    デバイス オブジェクトの作成における最後の手順は、WdfDeviceCreate を呼び出すことです。

ドライバーは、WdfPdoInitAllocate から取得した WDFDEVICE_INIT 構造体を初期化しているときにエラーが発生すると、WdfDeviceCreate ではなく WdfDeviceInitFree を呼び出す必要があります。

バス ドライバーは、デバイス オブジェクトを作成した後、通常、WdfDeviceSetPnpCapabilitiesWdfDeviceSetPowerCapabilities を呼び出して、デバイスのプラグ アンド プレイ機能および電源機能を報告します。

また、各バス ドライバーは、バス アダプターの関数ドライバーにもなります。そのため、ドライバーは EvtDriverDeviceAdd コールバック関数も提供する必要があります。このコールバック関数は、システム上のバス アダプターごとに機能デバイス オブジェクト (FDO) を作成します。FDO の作成方法の詳細については、「関数ドライバーでのデバイス オブジェクトの作成」を参照してください。