HID のアーキテクチャ

Windows における HID ドライバー スタックのアーキテクチャは、hidclass.sys という名前のクラス ドライバー上に構築されています。 クライアントとトランスポート ミニドライバーは、ユーザー モードまたはカーネル モードからクラス ドライバーにアクセスします。

HID クラス ドライバー

システム提供の HID クラス ドライバーは、HID デバイス セットアップ クラス (HIDClass) の WDM 関数ドライバーとバス ドライバーです。 HID クラス ドライバーの実行可能コンポーネントは hidclass.sys。 HID クラス ドライバーは、HID クライアントとさまざまなトランスポートの間の接着です。 これにより、HID クライアントをトランスポートから独立した方法で記述できます。 このレベルの抽象化により、新しい標準またはサード パーティのトランスポートが導入されたときに、クライアントは引き続き動作し続けられます (ほとんど、またはまったく変更されません)。

アーキテクチャ表現を次に示します。

hid クライアント、hid クラス ドライバー、hid トランスポート コンポーネントを示す、簡略化された hid ドライバー スタック。

上の図には、次のものが含まれています。

  • HID クライアント – Windows およびサード パーティのクライアントとそのインターフェイスを識別します。
  • HID クラス ドライバー - hidclass.sys 実行可能ファイル。
  • HID トランスポート ミニドライバー - Windows およびサード パーティのトランスポートとそのインターフェイスを識別します。

汎用 HID クライアントとトランスポートのデバイス スタック図を次に示します。

汎用 HID クライアントとトランスポートの HID デバイス スタック。

USB 経由の 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 では、次に示す最上位のコレクションがサポートされます。

[使用状況] ページ 使用 Windows 7 Windows 8 Windows 10 Notes アクセス モード
0x0001 0x0001 - 0x0002 はい はい はい マウス クラス ドライバーとマッパー ドライバー 排他的
0x0001 0x0004 - 0x0005 はい はい はい ゲーム コントローラー Shared
0x0001 0x0006 - 0x0007 はい はい はい キーボード/キーパッド クラス ドライバーとマッパー ドライバー 排他的
0x0001 0x000C いいえ はい はい フライト モード スイッチ Shared
0x0001 0x0080 はい はい はい システム コントロール (Power) Shared
0x000C 0x0001 はい はい はい (Windows 10とWindows 10 Mobileの両方) コンシューマー コントロール 共有 (Windows 10とWindows 10 Mobileの両方)
0x000D 0x0001 はい はい はい 外部ペン デバイス 排他的
0x000D 0x0002 はい はい はい 統合ペン デバイス 排他的
0x000D 0x0004 はい はい はい Touchscreen 排他的
0x000D 0x0005 いいえ はい はい 高精度タッチパッド (PTP) 排他的
0x0020 *複数 いいえ はい はい センサー Shared
0x0084 0x0004 はい はい はい HID UPS バッテリー Shared
0x008C 0x0002 いいえ はい (Windows 8.1 以降) はい バーコード スキャナー (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 トランスポートの一覧については、 このページ を参照してください。

Windows Hardware Lab Kit (HLK) の USB 汎用 HID テストでは、HidUsb ドライバーと HidClass ドライバーについて説明します。 サード パーティの HID ミニ ドライバーの HLK テストはありません。