ミニドライバーと HID クラス ドライバー

この記事では、ミニドライバーと HID クラス ドライバーについて説明します。

詳細については、「 WDF HID ミニドライバーの作成」を参照してください。

HID クラス ドライバーの操作機能

HID クラス ドライバーは、次の操作を行います。

  • カーネル モード ドライバーとユーザー モード アプリケーションが入力デバイスでサポートされている HID コレクション にアクセスするために使用する上位レベルのインターフェイスを提供および管理します。

    HID クラス ドライバーは、上位レベルのドライバーとアプリケーションと HID コレクションをサポートする基になる入力デバイスとの間のすべての通信を透過的に管理およびルーティングします。 同じ HID コレクションで複数の開いているファイルをサポートするさまざまな入力デバイスと入力キューで使用されるさまざまなデータ プロトコルを管理します。

    HID コレクションへの上位レベルのインターフェイスは、 HID クラス ドライバー IOCTLHIDClass サポート ルーチン、および HIDClass 構造体で構成されます。

  • ミニドライバーの標準ドライバー ルーチンを呼び出すことによって HID ミニドライバーと通信します。

  • 下位レベルのバスまたはポート ドライバーによって列挙された HIDClass 入力デバイスの機能デバイス オブジェクト (FDO) を作成します。

    たとえば、HID クラス ドライバーは、システム提供の USB ドライバー スタックによって列挙された USB HID デバイスを表す FDO の操作を作成および管理します。

  • 基になる入力デバイスでサポートされている子デバイス (HID コレクション) のバス ドライバーの機能を提供します。

    HID クラス ドライバーは、入力デバイスでサポートされている HID コレクションごとに物理デバイス オブジェクト (PDO) を作成し、コレクションの操作を管理します。

ミニドライバーを HIDClass にバインドする

HID ミニドライバーは、HID クラス ドライバーに自身を登録するために HidRegisterMinidriver を呼び出すことによって、その操作を HID クラス ドライバーにバインドします。 登録操作:

  • HID クラス ドライバーのデバイス拡張機能で HID ミニドライバーの標準ドライバー ルーチンへのエントリ ポイント (ポインター) のコピーを保存します。

    HID ミニドライバーは、ミニドライバーが DRIVER_INITIALIZE ルーチンへの 入力として受け取るドライバー オブジェクトのエントリ ポイントを設定します。 HID ミニドライバーは、HID クラス ドライバーに登録する前に、これらのエントリ ポイントを設定します。

  • ミニドライバーのドライバー オブジェクト内のエントリ ポイントを HID クラス ドライバーによって提供される標準ドライバー ルーチンのエントリ ポイントにリセットします。

HID クラス ドライバーは、次の標準ドライバー ルーチンを提供します。

登録プロセスでは、HID Mind River デバイス拡張機能のメモリも割り当てられます。 メモリは HID クラス ドライバーによって割り当てられますが、HID ミニドライバーのみがこのデバイス拡張機能を使用します。

HID ミニドライバーとの通信

HID クラス ドライバーは、HID ミニドライバーの DRIVER_ADD_DEVICEDRIVER_UNLOAD、ディスパッチ ルーチンを次のように呼び出すことによって HID ミニドライバーと通信します。

AddDevice ルーチンの呼び出し

HID クラス ドライバーの AddDevice ルーチンを呼び出して機能デバイス オブジェクト (FDO) を作成すると、HID クラス ドライバーは FDO を作成して初期化し、HID ミニドライバー AddDevice ルーチンを呼び出します。 HID ミニドライバー AddDevice ルーチンは、内部デバイス固有の初期化を行い、成功した場合は、STATUS_SUCCESSを返します。 HID ミニドライバーの AddDevice ルーチンが成功しない場合、HID クラス ドライバーは FDO を削除し、HID ミニドライバー の AddDevice ルーチンによって返される状態を返します。

Unload ルーチンの呼び出し

HID クラス ドライバー のアンロード ルーチンが呼び出されると、HID クラス ドライバーは、FDO に関連付けられているすべてのリソースの解放を完了し、HID ミニドライバーの アンロード ルーチンを呼び出します。

ディスパッチ ルーチンの呼び出し

デバイスを操作するために、HID クラス ドライバーは主に、内部デバイス制御要求の HID ミニドライバー ディスパッチ ルーチンを呼び出します。

I/O マネージャーが HID クラス ドライバーに要求を送信すると、HID クラス ドライバーは要求を処理し、HID ミニドライバーの対応するディスパッチ ルーチンを呼び出します。

HID クラス ドライバーは、HID ミニドライバーに次の要求を送信しません: 作成、閉じる、またはデバイス コントロール。

HID ミニドライバーの操作

HID トランスポート ミニドライバーは、入力デバイスが接続するハードウェア バスまたはポートの操作を抽象化します。

HID ミニドライバーは、次のいずれかのフレームワークを使用して構築できます。

  • UMDF – ユーザー モード ドライバー フレームワーク
  • KDMF – カーネル モード ドライバー フレームワーク
  • WDF - Windows ドライバー フレームワーク
  • WDM – Windows ドライバー モデル (レガシ)

Microsoft では、フレームワーク ベースのソリューション (KMDF または UMDF) を使用することをお勧めします。 各ドライバー モデルの詳細については、次のセクションを参照してください。

  • KMDF ベースの HID ミニドライバーについては、「フレームワーク ベースの HID ミニドライバーの作成」を参照してください
  • UMDF ベースの HID ミニドライバーについては、「WDF HID ミニドライバーの作成」を参照してください

次のセクションでは、WDM ベースの HID ミニドライバーの登録について説明しますが、その多くは KMDF ベースのフレームワーク ドライバーにも関連しています。 HID ミニドライバーはすべて HID クラス ドライバーに登録する必要があり、HID クラス ドライバーはミニドライバーの標準ドライバー ルーチンを呼び出すことによってミニドライバーと通信します。

HID ミニドライバーが標準ドライバー ルーチンでサポートする必要がある機能の詳細については、次のセクションを参照してください。

HID クラス ドライバーの詳細については、「 HID ミニドライバーの操作」を参照してください。

HID ミニドライバーの登録

HID ミニドライバーが DRIVER_INITIALIZE ルーチンで他のすべてのドライバーの初期化を完了した後、HID ミニドライバーは HidRegisterMinidriver を呼び出すことによって、その操作を HID クラス ドライバーにバインドします。

HID ミニドライバーは、HID クラス ドライバーに登録するときに、 HID_MINIDRIVER_REGISTRATION 構造体を使用します。 構造体は次を指定します。

  • HID リビジョン
  • HID ミニドライバー ドライバー オブジェクト
  • HID ミニドライバー デバイス拡張機能のサイズ
  • デバイスがポーリングされるかどうか

HID ミニドライバー拡張機能

HID ミニドライバー デバイス拡張機能はデバイス固有であり、HID ミニドライバーでのみ使用されます。 HID クラス ドライバーは、クラス ドライバーが機能デバイス オブジェクト (FDO) のデバイス拡張機能を作成するときに、ミニドライバー デバイス拡張機能のメモリを割り当てます。 HID ミニドライバーは、HID クラス ドライバーにミニドライバーを登録するときに、そのデバイス拡張機能のサイズを指定します。 サイズは、HID_MINIDRIVER_REGISTRATION構造体の DeviceExtensionSize メンバーによって指定されます。

HID_DEVICE_EXTENSION構造体の使用

HID ミニドライバーは、機能デバイス オブジェクト (FDO) の HID クラス ドライバーによって作成されたデバイス拡張機能のレイアウトとして、HID_DEVICE_EXTENSION構造体を使用する必要があります。 HID クラス ドライバーは、FDO を初期化するときに、この構造体のメンバーを設定します。 HID ミニドライバーは、この構造体の情報を変更することはできません。

HID_DEVICE_EXTENSION構造体には、次のメンバーが含まれます。

  • PhysicalDeviceObject は、基になる入力デバイスを表す物理デバイス オブジェクト (PDO) へのポインターです。

  • NextDeviceObject は、FDO の下にあるデバイス スタックの上部へのポインターです。

  • MiniDeviceExtension は、HID ミニドライバー デバイス拡張機能へのポインターです。

入力デバイスの FDO へのポインターを指定すると、次のGET_MINIDRIVER_DEVICE_EXTENSIONマクロは HID ミニドライバー拡張機能へのポインターを返します。

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

PDEVICE_EXTENSIONは、HID ミニドライバーによって宣言されたデバイス固有のデバイス拡張機能へのポインターです。

同様に、HID ミニドライバーは、入力デバイスの PDO へのポインターと、入力デバイスの FDO の下にあるデバイス スタックの上部を取得できます。

HID ミニドライバーは、デバイス スタックの下に IRP を送信するときに、ターゲット デバイス オブジェクトとして NextDeviceObject を使用する必要があります。

標準ミニドライバー ルーチン

HID ミニドライバーは、次の標準ドライバーサポート ルーチンを提供する必要があります。

  • HID ミニドライバー DriverEntry ルーチン
  • HID ミニドライバー AddDevice ルーチン
  • HID ミニドライバー アンロード ルーチン

HID ミニドライバーは、「HID ミニドライバーによって提供されるディスパッチ ルーチン」で説明されているディスパッチ ルーチンもサポートする必要があります。

DriverEntry ルーチン

HID ミニドライバーの DRIVER_INITIALIZE ルーチンは、次の処理を行います。

  • リンクされたドライバーのペア (HID クラス ドライバーと HID ミニドライバー) のドライバー オブジェクトを作成します。

  • HID ミニドライバー ドライバー オブジェクトに必要なドライバーエントリ ポイントを設定します。

  • HidRegisterMinidriver を呼び出して、HID ミニドライバーを HID クラス ドライバーに登録します。

  • HID ミニドライバーでのみ使用されるデバイス固有の構成を実行します。

AddDevice ルーチン

HID クラス ドライバーは、基になる入力デバイスの機能デバイス オブジェクト (FDO) の作成と初期化を処理します。 HID クラス ドライバーは、基になるデバイスとその子デバイス (HID コレクション) への上位レベルのインターフェイスの観点から FDO も操作します。

HID クラス ドライバー DRIVER_ADD_DEVICE ルーチンは、HID ミニドライバー AddDevice ルーチンを呼び出して、ミニドライバーがデバイス固有の内部初期化を実行できるようにします。

HID ミニドライバー DRIVER_ADD_DEVICE ルーチンに渡されるパラメーターは、ミニドライバー ドライバー オブジェクトと FDO です。 HID クラス ドライバーは、基になる入力デバイスの物理デバイス オブジェクトではなく、ミニドライバー の AddDevice ルーチンに FDO を渡します。

HID ミニドライバー DRIVER_ADD_DEVICE ルーチンは、FDO からミニドライバー デバイス拡張機能へのポインターを取得します。

  • 通常、HID ミニドライバー DRIVER_ADD_DEVICE ルーチンは、次の処理を行います。

  • ミニドライバー デバイス拡張機能を初期化します。 デバイス拡張機能は、ミニドライバーでのみ使用されます。

  • STATUS_SUCCESSを返します。 ミニドライバーがエラー状態を返す場合、HID クラス ドライバーは FDO を削除し、プラグ アンド プレイ マネージャーにエラーの状態を返します。

アンロード ルーチン

HID クラス ドライバーの Unload ルーチンは、HID ミニドライバー DRIVER_UNLOAD ルーチンを呼び出します。 HID ミニドライバーは、ミニドライバーによって割り当てられた内部リソースを解放します。

ディスパッチ ルーチン

HID ミニドライバーは、作成、閉じる、内部デバイス制御、システム制御、プラグ アンド プレイ、電源管理のディスパッチ ルーチンを提供する必要があります。 内部デバイス制御要求を除き、これらのディスパッチ ルーチンのほとんどは最小限の機能を提供します。 HID クラス ドライバーは、これらのディスパッチ ルーチンを呼び出すと、ミニドライバー ドライバー オブジェクトと機能デバイス オブジェクト (FDO) を渡します。

IRP_MJ_CREATE

WDM の要件に準拠して、HID クラス ドライバーと HID ミニドライバーは、要求を作成するためのディスパッチ ルーチンを提供します。 ただし、FDO を開くできません。 HID クラス ドライバーは、STATUS_UNSUCCESSFULを返します。

HID ミニドライバーはスタブのみを提供する必要があります。 ディスパッチ作成ルーチンは呼び出されません。

IRP_MJ_CLOSE

WDM の要件に準拠して、HID クラス ドライバーと HID ミニドライバーは、閉じる要求のディスパッチ ルーチンを提供する必要があります。 ただし、FDO を開くできません。 HID クラス ドライバーは、STATUS_INVALID_PARAMETER_1を返します。

HID ミニドライバーはスタブのみを提供する必要があります。 クローズ ディスパッチ ルーチンは呼び出されません。

IRP_MJ_DEVICE_CONTROL

HID ミニドライバーには、デバイス制御要求のディスパッチ ルーチンは必要ありません。 HID クラス ドライバーは、デバイス制御要求をミニドライバーに渡しません。

IRP_MJ_INTERNAL_DEVICE_CONTROL

HID ミニドライバーは、HID ミニドライバー IOCTL で説明されている要求をサポートする内部デバイス制御要求のディスパッチ ルーチンを提供する必要があります。

HID クラス ドライバーは、主に内部デバイス制御要求を使用して、基になる入力デバイスにアクセスします。

HID ミニドライバーは、デバイス固有の方法でこれらの要求を処理します。

IRP_MJ_SYSTEM_CONTROL

HID ミニドライバーは、システム制御要求のディスパッチ ルーチンを提供する必要があります。 ただし、HID ミニドライバーは、次のようにデバイス スタックにシステム制御要求を渡すためにのみ必要です。

  • 現在の IRP スタックの場所をスキップする

  • FDO のデバイス スタックに要求を送信する

IRP_MJ_PNP

HID ミニドライバーは、プラグ アンド プレイ要求のディスパッチ ルーチンを指定する必要があります。

HID クラス ドライバーは、FDO に関連付けられているすべてのプラグ アンド プレイ処理を実行します。 HID クラス ドライバーは、プラグ アンド プレイ要求を処理するときに、HID ミニドライバーのプラグ アンド プレイディスパッチ ルーチンを呼び出します。

HID ミニドライバー プラグ アンド プレイディスパッチ ルーチン:

  • 要求の種類ごとに、FDO のデバイス スタックを下に送信し、デバイス スタックをバックアップする方法で要求を完了します。

  • FDO の状態に関する情報を更新するための特定の要求に関連付けられているデバイス固有の処理を行います。

    たとえば、ミニドライバーは、FDO のプラグ アンド プレイ状態を更新する場合があります (特に、FDO が開始、停止、または削除中かどうか)。

IRP_MJ_POWER

HID ミニドライバーは、電源要求のディスパッチ ルーチンを指定する必要があります。 ただし、HID クラス ドライバーは、FDO の電源処理を処理します。

WDM 要件に準拠して、HID ミニドライバーは次のように FDO のデバイス スタックに電源要求を送信します。

  • 現在の IRP スタックの場所をスキップします

  • 次の電源 IRP を開始します

  • FDO のデバイス スタックに電源 IRP を送信します

通常、HID ミニドライバーは、余分な処理を行わずにデバイス スタックに電源要求を渡します。