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

関数ドライバーは、システム上に存在しているサポート対象のデバイスごとにフレームワーク デバイス オブジェクトを作成します。これらのデバイス オブジェクトは関数ドライバーで作成されるため、機能デバイス オブジェクト (FDO) と呼ばれます。各 FDO は、関数ドライバーのデバイス表現です。

関数ドライバーは、フレームワークがドライバーの EvtDriverDeviceAdd コールバック関数を呼び出すたびにフレームワーク デバイス オブジェクトを作成する必要があります。フレームワークは、このコールバック関数を呼び出して、システム上にサポート対象のデバイスの 1 つが存在していることをドライバーに通知します。

ドライバーの EvtDriverDeviceAdd コールバック関数は、WDFDEVICE_INIT 構造体へのポインターを受け取ります。ドライバーは、一連のフレームワーク デバイス オブジェクト初期化メソッドを呼び出して、WDFDEVICE_INIT 構造体に情報を格納できます。さらに、フレームワーク FDO 初期化メソッドを呼び出すこともできます。

通常、関数ドライバーでフレームワーク デバイス オブジェクトを作成するには、次の手順が必要です。

  • PnP、電源、および電源ポリシーの各コールバック関数を登録します。

    ほとんどの関数ドライバーは、WdfDeviceInitSetPnpPowerEventCallbacks を呼び出して PnP コールバック関数と電源コールバック関数を登録します。これらのコールバック関数の詳細については、「関数ドライバーでの PnP および電源管理のサポート」を参照してください。

    デバイスが低電力アイドル状態をサポートするか、スリープ解除機能を備えている場合、通常、関数ドライバーは WdfDeviceInitSetPowerPolicyEventCallbacks も呼び出して、電源ポリシー コールバック関数を登録します。これらのコールバック関数の詳細については、「電源ポリシーの所有権」を参照してください。

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

    一部の関数ドライバーは、デバイスに必要なシステム ハードウェア リソースの指定に関与する必要がある場合、WdfFdoInitSetEventCallbacks を呼び出します。ハードウェア リソースの詳細については、「フレームワークベース ドライバーのハードウェア リソース」を参照してください。

  • ファイル イベント コールバック関数を登録します。

    アプリケーションがデバイス上でファイルを開くか閉じるときにドライバーが応答する必要がある場合、ドライバーは WdfDeviceInitSetFileObjectConfig を呼び出して、フレームワーク ファイル オブジェクトのコールバック関数を登録する必要があります。詳細については、「フレームワーク ファイル オブジェクト」を参照してください。

  • I/O 要求属性を設定します。

    ドライバーがフレームワーク キュー オブジェクトから I/O 要求を受け取る場合、ドライバーは WdfDeviceInitSetRequestAttributes を呼び出して、フレームワークがデバイスの要求オブジェクトに割り当てるコンテキスト メモリをセットアップできます。詳細については、「要求オブジェクト コンテキストの使用」を参照してください。

  • デバイス特性を設定します。

    通常、関数ドライバーは次のいくつかのメソッドを呼び出して、デバイスの特性を指定します。

    WdfDeviceInitSetDeviceType: ドライバーがサポートするハードウェアの種類を識別します。

    WdfDeviceInitSetIoType: ドライバーがアプリケーションからの I/O 要求を処理する場合、データ バッファーにアクセスするメソッドを識別します。

    WdfDeviceInitSetCharacteristics: デバイスが読み取り専用かどうか、リムーバブル メディアをサポートするかどうかなどのデバイス特性を設定します。

    WdfDeviceInitSetExclusive: デバイスが、一度に 1 つのアプリケーションによる排他的なアクセスを必要とするかどうかを示します。

    WdfDeviceInitSetPowerInrush: デバイスが低電力状態から作業 (D0) 状態に切り替わるときに、電流の注入を必要とするかどうかを示します。

    WdfDeviceInitSetPowerPageable または WdfDeviceInitSetPowerNotPageable: システムがスリープ状態と作業 (S0) 状態を切り替えている間に、ドライバーがページング可能なデータにアクセスする必要があるかどうかを示します。

    WdfDeviceInitAssignName: デバイス オブジェクトに名前を割り当てます。

    WdfDeviceInitAssignSDDLString: デバイス オブジェクトにセキュリティ記述子を割り当てます。

    WdfDeviceInitSetDeviceClass: デバイスのセットアップ クラスを識別します。

  • デバイス プロパティを取得します。

    場合によっては、関数ドライバーは、デバイスのバスのドライバーまたはその他の下位レベル ドライバーが設定したデバイス プロパティに関する情報を取得する必要があります。ドライバーは、WdfFdoInitQueryProperty または WdfFdoInitAllocAndQueryProperty を呼び出して、この情報を取得できます。

  • デバイスのレジストリ キーにアクセスします。

    一部の関数ドライバーは、別のドライバー、ユーザー、またはインストール パッケージがレジストリーに配置した、デバイスまたはドライバーに関する情報を取得する必要があります。ドライバーは、WdfFdoInitOpenRegistryKey を呼び出して、デバイスまたはドライバーのレジストリ キーを開くことができます。詳細については、「フレームワークベースのドライバーでのレジストリの使用」を参照してください。

  • 動的な列挙に使用する既定の子リスト構成を作成します。

    バスの関数ドライバーを作成中で、そのドライバーがバスに接続されている子デバイスの動的な列挙を実行する場合、ドライバーは WdfFdoInitSetDefaultChildListConfig を呼び出す必要があります。詳細については、「バス上のデバイスの列挙」を参照してください。

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

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