バス ドライバーでのデバイス オブジェクトの作成
各バス ドライバーは、親デバイスに子デバイスが接続されていることを検出したときに、フレームワーク デバイス オブジェクトを作成する必要があります。通常、親デバイスはバスですが、各機能に一連の個別のドライバーが必要な多機能デバイスの場合もあります (デジタル オーディオと MIDI をサポートするサウンド カードなど)。バス ドライバーが作成するデバイス オブジェクトは、それぞれが 1 つのハードウェア (子) から別のハードウェア (親) への実際の接続を表すため、物理デバイス オブジェクト (PDO) と呼ばれます。
バスに接続されているデバイスを識別し報告する処理は、バス列挙と呼ばれます。
バス ドライバーが動的なバス列挙を実行する場合は、その EvtChildListCreateDevice コールバック関数が WDFDEVICE_INIT 構造体へのハンドルを受け取ります。
バス ドライバーが静的なバス列挙を実行する場合は、WdfPdoInitAllocate を呼び出して WDFDEVICE_INIT 構造体へのハンドルを取得する必要があります。
バス列挙の詳細については、「バス上のデバイスの列挙」を参照してください。
バス ドライバーは、一連のフレームワーク デバイス オブジェクト初期化メソッドを呼び出して、WDFDEVICE_INIT 構造体に情報を格納できます。さらに、フレームワーク PDO 初期化メソッドを呼び出すこともできます。
通常、列挙された子デバイスのフレームワーク デバイス オブジェクトを作成するには、次の手順が必要です。
バス ドライバー固有のコールバック関数を登録します。
ほとんどのバス ドライバーは、デバイスに必要なシステム ハードウェア リソースを指定する必要があるため、WdfPdoInitSetEventCallbacks を呼び出します。ハードウェア リソースの指定方法の詳細については、「フレームワークベース ドライバーのハードウェア リソース」を参照してください。デバイスおよびドライバーが取り出し機能をサポートしている場合、追加のコールバック関数を登録できます。
デバイス識別文字列を報告します。
バス ドライバーは、デバイスがサポートする文字列の種類ごとに、WdfPdoInitAssignDeviceID、WdfPdoInitAssignInstanceID、WdfPdoInitAddCompatibleID、および WdfPdoInitAddHardwareID を呼び出してデバイスの識別文字列を報告する必要があります。また、フレームワーク Version 1.9 以降を使用するバス ドライバーは、 WdfPdoInitAssignContainerID を呼び出すことができます。
バス ドライバーが RAW モードでデバイスをサポートできるかどうかを報告します。
バス ドライバーが RAW モードでデバイスをサポートする場合、WdfPdoInitAssignRawDevice を呼び出す必要があります。
デバイスを説明する表示可能なテキストを指定します。
バス ドライバーは、WdfPdoInitAddDeviceText および WdfPdoInitSetDefaultLocale を呼び出して、ユーザーに向けてデバイスを説明するテキストを複数の言語で指定します。
デバイス オブジェクトを作成します。
デバイス オブジェクトの作成における最後の手順は、WdfDeviceCreate を呼び出すことです。
ドライバーは、WdfPdoInitAllocate から取得した WDFDEVICE_INIT 構造体を初期化しているときにエラーが発生すると、WdfDeviceCreate ではなく WdfDeviceInitFree を呼び出す必要があります。
バス ドライバーは、デバイス オブジェクトを作成した後、通常、WdfDeviceSetPnpCapabilities と WdfDeviceSetPowerCapabilities を呼び出して、デバイスのプラグ アンド プレイ機能および電源機能を報告します。
また、各バス ドライバーは、バス アダプターの関数ドライバーにもなります。そのため、ドライバーは EvtDriverDeviceAdd コールバック関数も提供する必要があります。このコールバック関数は、システム上のバス アダプターごとに機能デバイス オブジェクト (FDO) を作成します。FDO の作成方法の詳細については、「関数ドライバーでのデバイス オブジェクトの作成」を参照してください。