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