Windows の HID ドライバー スタックのアーキテクチャは、 hidclass.sysという名前のクラス ドライバーに基づいて構築されています。 クライアントとトランスポート ミニドライバーは、ユーザー モードまたはカーネル モードからクラス ドライバーにアクセスします。
HID クラス ドライバー
システム提供の HID クラス ドライバーは、HID デバイス セットアップ クラス (HIDClass) の WDM 関数ドライバーとバス ドライバーです。 HID クラス ドライバーの実行可能コンポーネントが hidclass.sys。 HID クラス ドライバーは、HID クライアントとさまざまなトランスポート間の接着であり、HID クライアントをトランスポートから独立した方法で記述できるようにします。 このレベルの抽象化により、新しい標準またはサードパーティのトランスポートが導入されたときに、クライアントは引き続き (ほとんどまたはまったく変更なしで) 動作し続けられます。
次の図は、HID アーキテクチャの表現です。
上の図には、次のものが含まれています。
- HID クライアント – Windows およびサード パーティのクライアントとそのインターフェイスを識別します。
- HID クラス ドライバー - hidclass.sys 実行可能ファイル。
- HID トランスポート ミニドライバー - Windows およびサード パーティのトランスポートとそのインターフェイスを識別します。
汎用 HID クライアントとトランスポートのデバイス スタック図を次に示します。
USB 経由の HID キーボードとマウス コレクションを示す別のデバイス スタック図を次に示します。
HID クライアント
HID クライアントは、 HIDClass.sys と通信し、多くの場合、特定の種類のデバイス (センサー、キーボード、マウスなど) を表すドライバー、サービス、またはアプリケーションです。 ハードウェア ID または特定の HID コレクションを使用してデバイスを識別し、次のガイダンスを使用して HID コレクションと通信します。
ユーザー モード ドライバーとアプリケーション、およびカーネル モード ドライバーは、HID コレクションを操作するには、次の操作を行います。
- ユーザー モード ドライバーとアプリケーションは、HIDClass サポート ルーチン (HidD_Xxx) を使用して HID コレクションに関する情報を取得します。
- カーネル モード ドライバー、ユーザー モード ドライバー、およびアプリケーションは HID 解析サポート ルーチン (HidP_Xxx) を使用し、カーネル モード ドライバーは HID クラス ドライバーの IOCTL を使用して HID レポートを処理します。
次の表は、情報を簡略化します。
| モード | ドライバー | アプリケーション |
|---|---|---|
| ユーザー モード | HidD_Xxx | HidP_Xxx |
| カーネル モード | HidD_Xxx OR IOCTL_HID_xxx | なし |
詳細については、「 HID コレクションを開く」を参照してください。
Windows でサポートされている HID クライアント
Windows では、次の最上位レベルのコレクションがサポートされています。
| 使用状況ページ | 使用方法 | 注記 | アクセス モード |
|---|---|---|---|
| 0x0001 | 0x0001 - 0x0002 | マウス クラス ドライバーとマッパー ドライバー | Exclusive |
| 0x0001 | 0x0004 - 0x0005 | ゲーム コントローラー | Shared |
| 0x0001 | 0x0006 - 0x0007 | キーボード/キーパッド クラス ドライバーとマッパー ドライバー | Exclusive |
| 0x0001 | 0x000C | フライト モード スイッチ | Shared |
| 0x0001 | 0x0080 | システム制御(電源) | Shared |
| 0x000C | 0x0001 | コンシューマー コントロール | Shared |
| 0x000D | 0x0001 | 外部ペン デバイス | Exclusive |
| 0x000D | 0x0002 | 統合ペン デバイス | Exclusive |
| 0x000D | 0x0004 | タッチスクリーン | Exclusive |
| 0x000D | 0x0005 | 高精度タッチパッド (PTP) | Exclusive |
| 0x0020 | *複数の | センサー | Shared |
| 0x0084 | 0x0004 | HID UPS バッテリー | Shared |
| 0x008C | 0x0002 | バーコード スキャナー (hidscanner.dll) | Shared |
前の表では、入力 HID クライアントのアクセス モードは、他の HID クライアントがその入力のターゲット受信者でない場合にグローバル入力状態をインターセプトまたは受信できないようにするために 排他的 です。 セキュリティ上の理由から、Raw Input Manager (RIM) はこれらのすべてのデバイスを専用に開きます。
RIM が 排他 モードでデバイスを開いた場合でも、ユーザーは読み取りと書き込みのアクセス許可を要求せずに HID デバイス インターフェイスを開き、HIDClass サポート ルーチン (HidD_GetXxx) を使用して HID デバイス情報を取得できます。
共有モードでは、複数のアプリケーションがデバイスにアクセスできます。 たとえば、複数のアプリケーションがバーコード スキャナーにアクセスして、デバイスの機能について問い合わせ、統計情報を取得できます。 ただし、バーコード スキャナーからデコードされたデータの取得は 、排他 モードで行われます。 使用法は、 USB-IF 使用状況テーブルで定義されます。
*複数:0x00からのセンサーの使用状況 - 0xFFは、さまざまな目的でセグメント化されています。 たとえば、0x10は生体認証センサーを示します。0x40は光センサーを示します。 これらの割り当ては連続していません。 センサーの使用状況の一覧については、「 HID のデバイス クラス定義USB-IF」を参照してください。 Windows でサポートされているセンサーの使用状況については、「 HID センサーの使用状況」を参照してください。
HID トランスポート ドライバー
HID クラス ドライバーは、HID ミニドライバーを使用してハードウェア入力デバイスにアクセスするように設計されています。 HID ミニドライバーは、サポートされている入力デバイスのデバイス固有の操作を抽象化します。 HID ミニドライバーは、HID クラス ドライバーに登録することによって、その操作を HID クラス ドライバーにバインドします。 HID クラス ドライバーは、ミニドライバーのサポート ルーチンを呼び出すことによって HID ミニドライバーと通信します。 HID ミニドライバーは、次に、下位のバスまたはポートドライバーにドライバースタックを通じて通信を送ります。
Windows でサポートされている HID トランスポート
サポートされている HID トランスポートの一覧については、 HID トランスポートの概要を参照してください。
Windows ハードウェア ラボ キット (HLK) の USB 汎用 HID テストでは、HidUsb ドライバーと HidClass ドライバーについて説明します。 サード パーティ製 HID ミニドライバーの HLK テストはありません。