各 関数ドライバー は、システム上に存在するサポートされている各デバイスに対してフレームワークデバイスオブジェクトを作成します。 これらのデバイス オブジェクトはファンクション ドライバーによって作成されるため、機能デバイス オブジェクト (FDO) と呼ばれます。 各 FDO は、デバイスのファンクション ドライバーの表現です。
関数ドライバーは、フレームワークがドライバーのEvtDriverDeviceAddコールバック関数を呼び出すたびに、フレームワークデバイスオブジェクトを作成する必要があります。 フレームワークは、サポートされているデバイスのいずれかがシステムに存在することをドライバーに通知するために、このコールバック関数を呼び出します。
ドライバーのEvtDriverDeviceAddコールバック関数は、WDFDEVICE_INIT構造体へのポインターを受け取ります。 ドライバーは、WDFDEVICE_INIT構造体に情報を格納する、セットのフレームワーク デバイス オブジェクト初期化メソッドを呼び出すことができます。 さらに、関数ドライバーは、フレームワーク FDO 初期化メソッドを呼び出すことができます。
通常、関数ドライバーでフレームワーク デバイス オブジェクトを作成するには、次の手順が含まれます。
PnP、電源、電源ポリシーのコールバック関数を登録します。
ほとんどの関数ドライバーは、WdfDeviceInitSetPnpPowerEventCallbacks を呼び出して、PnP および電源コールバック関数を登録します。 これらのコールバック関数の詳細については、「関数ドライバーにおける PnP と電源管理のサポート」を参照してください。
デバイスが低電力アイドルをサポートしている場合やウェイクアップ機能を備えている場合、通常、関数ドライバーはWdfDeviceInitSetPowerPolicyEventCallbacksを呼び出して、電源ポリシーコールバック関数を登録します。 これらのコールバック関数の詳細については、「電源ポリシーの所有権」を参照してください。
関数ドライバー固有のコールバック関数の登録。
一部の関数ドライバーは、デバイスが必要とするシステム ハードウェア リソースを指定する必要がある場合、WdfFdoInitSetEventCallbacksを呼び出します。 ハードウェア リソースの詳細については、「Framework-Based ドライバーのハードウェア リソース」を参照してください。
ファイル イベント コールバック関数の登録。
アプリケーションがデバイス上のファイルを開いたり閉じたりしたときにドライバーが応答する必要がある場合、ドライバーは WdfDeviceInitSetFileObjectConfig #A2 #C3 #B0 #A1 を呼び出してフレームワーク ファイル オブジェクトのコールバック関数を登録する必要があります。 詳細については、「フレームワーク ファイル オブジェクトの使用 #A1 #B0」を参照してください。
I/O 要求属性の設定。
ドライバーがフレームワーク キュー オブジェクトから I/O 要求を受信する場合、ドライバーは WdfDeviceInitSetRequestAttributes を呼び出して、フレームワークがデバイスの要求オブジェクトに割り当てるコンテキストメモリを設定できます。 詳細については、「リクエストオブジェクトコンテキストの使用」を参照してください。
デバイスの特性の設定。
通常、関数ドライバーは、次のメソッドの一部を呼び出して、デバイスの特性を指定します。
- WdfDeviceInitSetDeviceTypeを使用して、ドライバーがサポートするハードウェアの種類を識別します。
- WdfDeviceInitSetIoType: ドライバーがアプリケーションからの I/O 要求を処理する場合に、データ バッファーにアクセスするためのメソッドを識別します。
- WdfDeviceInitSetCharacteristicsは、デバイスの特性を設定するためのもので、たとえばデバイスが読み取り専用であるかどうか、あるいはリムーバブルメディアをサポートしているかどうかを指定します。
- デバイスが一度に1つのアプリケーションからの排他アクセスを必要とする場合は、WdfDeviceInitSetExclusive を使用してください。
- デバイスが低電力状態から動作状態 (D0) に移行するときに電流の突入を必要とする場合、WdfDeviceInitSetPowerInrush を使用します。
- システムがスリープ状態から動作中 (S0) 状態に移行する際に、ドライバーがページング可能なデータにアクセスする必要があるかどうかを示すために、WdfDeviceInitSetPowerPageable または WdfDeviceInitSetPowerNotPageable を使用します。
- デバイス オブジェクトに名前を割り当てるために、WdfDeviceInitAssignName を使用します。
- WdfDeviceInitAssignSDDLString 関数を使用して、デバイスオブジェクトにセキュリティ記述子を割り当てます。
- WdfDeviceInitSetDeviceClassを使用して、デバイスのセットアップクラスを特定します。
デバイスのプロパティの取得。
場合によっては、ファンクションドライバーは、デバイスのバスドライバーまたは他の下位レベルのドライバーが設定したデバイスのプロパティに関する情報を取得する必要があります。 ドライバーは、WdfFdoInitQueryPropertyまたはWdfFdoInitAllocAndQueryPropertyを呼び出して、この情報を取得できます。 Windows 8.1 以降を対象とする新しいドライバーは、WdfFdoInitQueryPropertyEx および WdfFdoInitAllocAndQueryPropertyEx を呼び出すことができます。
デバイスのレジストリ キーへのアクセス。
一部の関数ドライバーは、別のドライバー、ユーザー、またはインストール パッケージがレジストリに配置したデバイスまたはドライバーに関する情報を取得する必要があります。 ドライバーは WdfFdoInitOpenRegistryKey を呼び出して、デバイスまたはドライバーのレジストリ キーを開くことができます。 詳細については、「 Framework-Based ドライバーでのレジストリの使用」を参照してください。
動的列挙に使用する既定の子リスト構成を作成する。
バス用のファンクション ドライバーを作成している場合、そしてドライバーがバスに接続されている子デバイスの動的な列挙を行う場合、ドライバーはWdfFdoInitSetDefaultChildListConfigを呼び出す必要があります。 詳細については、「バス上のデバイスの列挙」を参照してください。
デバイス オブジェクトの作成。
デバイス オブジェクトを作成する最後の手順は、WdfDeviceCreate を呼び出すことです。