キーボードとマウスの HID クライアント ドライバー

Note

このトピックは、キーボードとマウスの HID クライアント用のドライバーを作成する開発者を対象としています。 マウスまたはキーボードを修正する場合は、次のトピックを参照してください。

この記事では、キーボードとマウスの HID クライアント ドライバーについて説明します。 キーボードとマウスは、HID 使用法テーブルで標準化され、Windows オペレーティング システムに実装された HID クライアントの最初のセットを表します。

キーボードとマウスの HID クライアント ドライバーは、HID マッパー ドライバーの形式で実装されます。 HID マッパー ドライバーは、非 HID クラス ドライバーと HID クラス ドライバー間の I/O 要求の双方向インターフェイスを提供するカーネル モードの WDM フィルター ドライバーです。 マッパー ドライバーは、一方の I/O 要求とデータ プロトコルを他方にマップします。

Windows には、HID キーボードと HID マウス デバイス用に、システム提供の HID マッパー ドライバーが用意されています。

アーキテクチャと概要

次の図は、USB キーボード、マウス、タッチパッド デバイス用のシステム提供のドライバー スタックを示しています。

Diagram of the keyboard and mouse driver stack showing the HID class mapper drivers for keyboards and mice.

この図は、次のコンポーネントを示しています。

  • KBDHID.sys: キーボード用の HID クライアント マッパー ドライバー。 HID の使用法をスキャン コードに変換して、既存のキーボード クラス ドライバーとインターフェイスします。
  • MOUHID.sys: マウス/タッチパッド用の HID クライアント マッパー ドライバー。 HID の使用法をマウス コマンド (X/Y、ボタン、ホイール) に変換して、既存のキーボード クラス ドライバーとインターフェイスします。
  • KBDCLASS.sys: キーボード クラス ドライバーは、システム上のすべてのキーボードとキーパッドに安全な方法で機能を提供します。
  • MOUCLASS.sys: マウス クラス ドライバーは、システム上のすべてのマウスとタッチパッドに機能を提供します。 このドライバーは、絶対および相対ポインティング デバイスの両方をサポートしています。 MOUCLASS.sys は、タッチスクリーン用の Windows ドライバーではありません。
  • HIDCLASS.sys: HID クラス ドライバー。 HID クラス ドライバーは、KBDHID.sys および MOUHID.sys HID クライアントと、USB や Bluetooth などのさまざまなトランスポートをつなぐ接着剤のような役割を果たします。

システムは、次のようにドライバー スタックをビルドします。

  • トランスポート スタックは、接続されている各 HID デバイスの物理デバイス オブジェクト (PDO) を作成し、適切な HID トランスポート ドライバーを読み込みます。それに続けて、HID クラス ドライバーを読み込みます。
  • HID クラス ドライバーは、キーボードまたはマウスの TLC ごとに PDO を作成します。 複雑な HID デバイス (複数の TLC) は、HID クラス ドライバーによって作成された複数の PDO として公開されます。 たとえば、マウスが統合されたキーボードは、標準のキーボード コントロール用に 1 つ、マウス用にもう 1 つのコレクションを持つ場合があります。
  • キーボードまたはマウスの HID クライアント マッパー ドライバーは、適切な FDO に読み込まれます。
  • HID マッパー ドライバーは、キーボードとマウスの FDO を作成し、クラス ドライバーを読み込みます。

重要な注意事項

  • サポートされている HID 使用法と最上位のコレクションに準拠しているキーボードとマウスの場合、ベンダー ドライバーは必要ありません。
  • ベンダーは、必要に応じて、HID スタックにフィルター ドライバーを提供して、これらの特定の TLC の機能を変更または強化します。
  • ベンダーは、HID クライアントとデバイスの間で独自のデータを交換するために、個別のベンダー固有の TLC を作成する必要があります。 重要でない限り、フィルター ドライバーの使用は避けてください。
  • システムは、すべてのキーボードとマウスのコレクションを排他的に使用するために開きます。
  • システムは、キーボードの無効化/有効化を禁止します。
  • システムは滑らかなスクロール機能を備えた水平/垂直ホイールのサポートを提供します。

ドライバー ガイダンス

Microsoft では、ドライバーを記述する IHV 向けに次のガイダンスを提供しています。

  1. ドライバー開発者は、フィルター ドライバーまたは新しい HID クライアント ドライバーの形式でドライバーを追加できます。

    1. フィルター ドライバー: ドライバー開発者は、付加価値を提供するドライバーがフィルター ドライバーであり、入力スタック内の既存の Windows HID ドライバーを置き換える (または代わりに使用される) ことがないことを確認する必要があります。

      • フィルター ドライバーは、次のシナリオで使用できます。
        • kbdhid/mouhid に対する上位フィルターとして使用する
        • kbdclass/mouclass に対する上位フィルターとして使用する
      • HIDCLASS と HID トランスポート ミニドライバーの間のフィルターとしてフィルター ドライバーを使用することは推奨されません
    2. ファンクション ドライバー: ベンダーは、(フィルター ドライバーではなく) ファンクション ドライバーを作成することもできますが、ベンダー固有の HID PDO (必要に応じてユーザー モード サービスを使用) に対してのみ作成できます。

      ファンクション ドライバーは、次のシナリオで使用できます。

      • 特定のベンダーのハードウェアにのみ読み込む場合
    3. トランスポート ドライバー: Windows チームでは、多数の HID トランスポート ミニドライバーを作成することはお勧めしていません。 トランスポート ドライバーは、書き込みと保守を行う複雑なドライバーです。 パートナーが新しい HID トランスポート ミニドライバー (特に SoC システム) を作成している場合は、その理由を理解し、ドライバーが正しく開発されていることを確認するために、アーキテクチャを詳細にレビューすることをお勧めします。

  2. ドライバー開発者は、ドライバー フレームワーク (KMDF または UMDF) を使用し、フィルター ドライバーを WDM に依存しないようにする必要があります。

  3. ドライバー開発者は、サービスとドライバー スタック間のカーネル ユーザーの切り換え回数を減らす必要があります。

  4. ドライバー開発者は、キーボードとタッチパッドの両方の機能 (エンド ユーザー (デバイス マネージャー) または PC の製造元によって調整可能) を介してシステムをスリープ解除する機能を確保する必要があります。 SoC システムに加え、このようなデバイスも、システムが動作している S0 状態の間に、低電力状態から復帰できる必要があります。

  5. ドライバー開発者は、ハードウェアが効率的に電源管理されていることを確認する必要があります。

    • デバイスがアイドル状態になると、デバイスは最も低い電力状態に移行できます。
    • システムが低電力状態 (スタンバイ (S3) やコネクト スタンバイなど) の場合、デバイスは最も低い電力状態になります。

キーボード レイアウト

キーボード レイアウトは、Microsoft Windows 2000 以降のバージョンにおけるキーボードの入力特性を完全に表したものです。 たとえば、キーボード レイアウトでは、言語、キーボードの種類とバージョン、修飾子、スキャン コードなどを指定します。

キーボード レイアウトの詳細は、次のリソースを参照してください。

  • キーボード レイアウトに関する一般的な情報を文書化する Windows Driver Development Kit (DDK) のキーボード ヘッダー ファイル kdb.h。

  • キーボード レイアウトのサンプル。

具体的なキーボードのレイアウトについては、「Windows のキーボード レイアウト」を参照してください。

キーボード レイアウトの詳細については、[コントロール パネル] で [時計、言語、および地域] の [言語] を参照してください。

マウスでサポートされているボタンとホイール

次の表は、Windows オペレーティング システムのさまざまなクライアント バージョンでサポートされている機能を示しています。

機能 Windows XP Windows Vista Windows 7 Windows 8 以降
ボタン 1 から 5 サポート対象 (P/2 & HID) サポート対象 (PS/2 および HID) サポート対象 (PS/2 および HID) サポート対象 (PS/2 および HID)
垂直スクロール ホイール サポート対象 (PS/2 および HID) サポート対象 (PS/2 および HID) サポート対象 (PS/2 および HID) サポート対象 (PS/2 および HID)
水平スクロール ホイール サポートされていません サポート対象 (HID のみ) サポート対象 (HID のみ) サポート対象 (HID のみ)
スムーズ スクロール ホイールのサポート (水平および垂直) サポートされていません 一部サポート サポート対象 (HID のみ) サポート対象 (HID のみ)

PS/2 マウスでボタン 4 から 5 とホイールをアクティブにする

新しい 4 ボタン/5 ボタンおよびホイール モードをアクティブにするために Windows で使用される方法は、IntelliMouse 互換マウスで 3 番目のボタンとホイールをアクティブにするために使用される方法の拡張です。

  • マウスを 3 ボタン ホイール モードに設定するには、レポート レートを 1 秒あたり 200 レポート、1 秒あたり 100 レポート、1 秒あたり 80 レポートに設定します。 次に、マウスから ID を読み取ります。 このシーケンスが完了すると、マウスは 3 という ID を報告されます。

  • 次に、レポート レートを 1 秒あたり 200 レポートに設定し、もう一度 1 秒あたり 200 レポート、その後で 1 秒あたり 80 レポートに設定することで、マウスを 5 ボタン ホイール モードに設定します。 次に、マウスから ID を読み取ります。 シーケンスが完了すると、5 ボタン ホイール マウスは 4 という ID を報告します (IntelliMouse 互換の 3 ボタン ホイール マウスでは、ここでも 3 という ID が報告されます)。

この方法は PS/2 マウスにのみ適用され、HID マウスには適用されません。 HID マウスは、レポート記述子で正確な使用法を報告する必要があります。

標準 PS/2 互換マウスのデータ パケット形式 (2 ボタン)

Byte D7 D6 D5 D4 D3 D2 D1 D0 コメント
1 Yover Xover Ysign Xsign Tag M R L X/Y オーバーフローと符号、ボタン
2 X7 X6 X5 X4 X3 X2 X1 X0 X データ バイト
3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Y データ バイト

Note

Windows マウス ドライバーは、オーバーフロー ビットをチェックしません。 オーバーフローが発生した場合、マウスは単に符号付き変位量の最大値を送信します。

標準 PS/2 互換マウスのデータ パケット形式 (3 ボタン + 垂直ホイール)

Byte D7 D6 D5 D4 D3 D2 D1 D0 コメント
1 0 0 Ysign Xsign 1 M R L X/Y 符号と R/L/M ボタン
2 X7 X6 X5 X4 X3 X2 X1 X0 X データ バイト
3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Y データ バイト
4 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 Z/ホイールのデータ バイト

標準 PS/2 互換マウスのデータ パケット形式 (5 ボタン + 垂直ホイール)

Byte D7 D6 D5 D4 D3 D2 D1 D0 コメント
1 0 0 Ysign Xsign 1 M R L X/Y 符号と R/L/M ボタン
2 X7 X6 X5 X4 X3 X2 X1 X0 X データ バイト
3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Y データ バイト
4 0 0 B5 B4 Z3 Z2 Z1 Z0 Z/ホイールのデータとボタン 4 および 5

重要

Z/ホイール データは、IntelliMouse 互換の 3 ボタン ホイール モードでは 8 ビットが使用されていますが、5 ボタン ホイール マウスでは 4 ビットに縮小されている点に注意してください。 ホイールは通常、任意の割り込み期間中に +7/-8 の範囲を超える値を生成できないため、このような縮小が可能になります。 Windows マウス ドライバーは、マウスが 5 ボタン ホイール モードの場合は Z/wheel データの 4 ビットを拡張し、マウスが 3 ボタン ホイール モードで動作する場合は Z/ホイール データの全バイトを拡張します。

ボタン 4 と 5 は、WM_APPCOMMAND メッセージにマップされ、App_Back と App_Forward に対応します。

ベンダー ドライバーを必要としないデバイス

ベンダー ドライバーは、次のデバイスでは必要ありません。

  • HID 標準に準拠しているデバイス。
  • システム提供の HIDClass 以外のドライバーによって動作するキーボード、マウス、またはゲーム ポート デバイス。

Kbfiltr のサンプル

Kbfiltr は、キーボード デバイス用のシステム クラス ドライバーである Kbdclass と、PS/2 スタイルのキーボードのファンクション ドライバーである I8042prt と共に使用されます。 Kbfiltr では、I/O 要求をフィルター処理する方法と、Kbdclass と I8042prt の操作を変更するコールバック ルーチンを追加する方法を示しています。

Kbfiltr の操作の詳細については、以下を参照してください。

  • ntddkbd.h WDK ヘッダー ファイル。

  • サンプルの Kbfiltr ソース コード。

Kbfiltr IO 制御コード

Kbfiltr では、次の IOCTL が使用されます。

IOCTL_INTERNAL_I8042_HOOK_KEYBOARD

IOCTL_INTERNAL_I8042_HOOK_KEYBOARD 要求:

  • I8042prt キーボード初期化ルーチンに初期化コールバック ルーチンを追加します。
  • I8042prt キーボード ISR に ISR コールバック ルーチンを追加します。

初期化コールバックと ISR コールバックは省略可能であり、PS/2 スタイルのキーボード デバイスの上位レベルのフィルター ドライバーによって提供されます。

I8042prt は、IOCTL_INTERNAL_KEYBOARD_CONNECT 要求を受信すると、同期 IOCTL_INTERNAL_I8042_HOOK_KEYBOARD 要求をキーボード デバイス スタックの先頭に送信します。

Kbfiltr がフック キーボード要求を受け取ると、Kbfiltr は次のように要求をフィルター処理します。

  • Kbfiltr に渡される上位レベルの情報を保存します。これには、上位レベルのデバイス オブジェクトのコンテキスト、初期化コールバックへのポインター、ISR コールバックへのポインターが含まれます。
  • 上位レベルの情報を独自の情報に置き換えます。
  • I8042prt のコンテキストと、Kbfiltr ISR コールバックで使用できるコールバックへのポインターを保存します。

IOCTL_INTERNAL_KEYBOARD_CONNECT

IOCTL_INTERNAL_KEYBOARD_CONNECT 要求は、Kbdclass サービスをキーボード デバイスに接続します。 Kbdclass は、キーボード デバイスを開く前に、この要求をキーボード デバイス スタックに送信します。

Kbfiltr がキーボード接続要求を受信すると、Kbfiltr は次のように接続要求をフィルター処理します。

  • Kbdclass によってフィルター ドライバーに渡される Kbdclass の CONNECT_DATA (Kbdclass) 構造体のコピーを保存します。
  • クラス ドライバーの接続情報を独自の接続情報に置き換えます。
  • IOCTL_INTERNAL_KEYBOARD_CONNECT 要求をデバイス スタックに送信します。

要求が成功しなかった場合、Kbfiltr は適切なエラー状態で要求を完了します。

Kbfiltr には、Kbdclass クラス サービス コールバック ルーチンである KeyboardClassServiceCallback の操作を補完できるフィルター サービス コールバック ルーチンのテンプレートが用意されています。 フィルター サービス コールバックは、デバイス入力バッファーからクラス データ キューに転送される入力データをフィルター処理できます。

IOCTL_INTERNAL_KEYBOARD_DISCONNECT

IOCTL_INTERNAL_KEYBOARD_DISCONNECT 要求は、STATUS_NOT_IMPLEMENTED の状態で完了します。 プラグ アンド プレイ マネージャーは、プラグ アンド プレイ キーボードを追加または削除できます。

他のすべてのデバイス制御要求の場合、Kbfiltr は現在の IRP スタックをスキップし、それ以上の処理を行わずにデバイス スタックに要求を送信します。

Kbfiltr によって実装されるコールバック ルーチン

Kbfiltr は、次のコールバック ルーチンを実装します。

KbFilter_InitializationRoutine

PI8042_KEYBOARD_INITIALIZATION_ROUTINE」を参照してください。

キーボードの I8042prt の既定の初期化で十分な場合、KbFilter_InitializationRoutine は必要ありません。

I8042prt は、キーボードを初期化するときに KbFilter_InitializationRoutine を呼び出します。 既定のキーボード初期化には、次の操作が含まれます。

  • キーボードをリセットする
  • 型指定レートと遅延を設定する
  • 発光ダイオード (LED) を設定する
/*
Parameters
DeviceObject [in]
Pointer to the device object that is the context for this callback.

SynchFuncContext [in]
Pointer to the context for the routines pointed to by ReadPort and Writeport.

ReadPort [in]
Pointer to the system-supplied PI8042_SYNCH_READ_PORT callback that reads from the port.

WritePort [in]
Pointer to the system-supplied PI8042_SYNCH_WRITE_PORT callback that writes to the port.

TurnTranslationOn [out]
Specifies, if TRUE, to turn translation on. Otherwise, translation is turned off.

Return value
KbFilter_InitializationRoutine returns an appropriate NTSTATUS code.
*/

NTSTATUS KbFilter_InitializationRoutine(
  In  PDEVICE_OBJECT          DeviceObject,
  In  PVOID                   SynchFuncContext,
  In  PI8042_SYNCH_READ_PORT  ReadPort,
  In  PI8042_SYNCH_WRITE_PORT WritePort,
  Out PBOOLEAN                TurnTranslationOn
);

KbFilter_IsrHook

PI8042_KEYBOARD_ISR」を参照してください。 I8042prt の既定の操作で十分な場合、このコールバックは必要ありません。

I8042prt キーボード ISR は、割り込みを検証してスキャン コードを読み取った後で、KbFilter_IsrHook を呼び出します。

KbFilter_IsrHook は、I8042prt キーボードの IRQL でカーネル モードで実行されます。

/*
Parameters
DeviceObject [in]
Pointer to the filter device object of the driver that supplies this callback.

CurrentInput [in]
Pointer to the input KEYBOARD_INPUT_DATA structure that is being constructed by the ISR.

CurrentOutput [in]
Pointer to an OUTPUT_PACKET structure that specifies the bytes that are being written to the hardware device.

StatusByte [in, out]
Specifies the status byte that is read from I/O port 60 when an interrupt occurs.

DataByte [in]
Specifies the data byte that is read from I/O port 64 when an interrupt occurs.

ContinueProcessing [out]
Specifies, if TRUE, to continue processing in the I8042prt keyboard ISR after this callback returns; otherwise, processing is not continued.

ScanState [in]
Pointer to a KEYBOARD_SCAN_STATE structure that specifies the keyboard scan state.

Return value
KbFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE.
*/

KbFilter_IsrHook KbFilter_IsrHook(
  In    PDEVICE_OBJECT       DeviceObject,
  In    PKEYBOARD_INPUT_DATA CurrentInput,
  In    POUTPUT_PACKET       CurrentOutput,
  Inout UCHAR                StatusByte,
  In    PUCHAR               DataByte,
  Out   PBOOLEAN             ContinueProcessing,
  In    PKEYBOARD_SCAN_STATE ScanState
);

KbFilter_ServiceCallback

PSERVICE_CALLBACK_ROUTINE」を参照してください。

ファンクション ドライバーの ISR ディスパッチ完了ルーチンは、KbFilter_ServiceCallback を呼び出し、キーボード クラス ドライバーの PSERVICE_CALLBACK_ROUTINE の実装を呼び出します。 ベンダーは、フィルター サービス コールバックを実装して、デバイスの入力バッファーからクラス データ キューに転送される入力データを変更できます。 たとえば、コールバックによってデータの削除、変換、挿入を行うことができます。

/*
Parameters
DeviceObject [in]
Pointer to the class device object.

InputDataStart [in]
Pointer to the first keyboard input data packet in the input data buffer of the port device.

InputDataEnd [in]
Pointer to the keyboard input data packet that immediately follows the last data packet in the input data buffer of the port device.

InputDataConsumed [in, out]
Pointer to the number of keyboard input data packets that are transferred by the routine.

Return value
None
*/

VOID KbFilter_ServiceCallback(
  In    PDEVICE_OBJECT       DeviceObject,
  In    PKEYBOARD_INPUT_DATA InputDataStart,
  In    PKEYBOARD_INPUT_DATA InputDataEnd,
  Inout PULONG               InputDataConsumed
);

Moufiltr のサンプル

Moufiltr は、マウス デバイス用のシステム クラス ドライバーである Mouclass (Windows 2000 以降のバージョンで使用) と、PS/2 スタイルのマウスのファンクション ドライバーである I8042prt (Windows 2000 以降で使用) と共に使用されます。 Moufiltr では、I/O 要求をフィルター処理する方法と、Mouclass と I8042prt の操作を変更するコールバック ルーチンを追加する方法を示しています。

Moufiltr 操作の詳細については、次のリソースを参照してください。

  • ntddmou.h WDK ヘッダー ファイル。

  • サンプルの Moufiltr ソース コード。

Moufiltr IO 制御コード

Moufiltr では、次の IOCTL が使用されます。

IOCTL_INTERNAL_I8042_HOOK_MOUSE

IOCTL_INTERNAL_I8042_HOOK_MOUSE 要求は、I8042prt マウス ISR に ISR コールバック ルーチンを追加します。 ISR コールバックは省略可能であり、上位レベルのマウス フィルター ドライバーによって提供されます。

I8042prt は、IOCTL_INTERNAL_MOUSE_CONNECT 要求を受信した後にこの要求を送信します。 I8042prt は、同期 IOCTL_INTERNAL_I8042_HOOK_MOUSE 要求をマウス デバイス スタックの最上位に送信します。

Moufiltr はフック マウス要求を受け取ると、次のように要求をフィルター処理します。

  • Moufiltr に渡される上位レベルの情報を保存します。これには、上位レベルのデバイス オブジェクトのコンテキストと ISR コールバックへのポインターが含まれます。
  • 上位レベルの情報を独自の情報に置き換えます。
  • I8042prt のコンテキストと、Moufiltr ISR コールバックで使用できるコールバックへのポインターを保存します。

IOCTL_INTERNAL_MOUSE_CONNECT

IOCTL_INTERNAL_MOUSE_CONNECT 要求は、Mouclass サービスをマウス デバイスに接続します。

IOCTL_INTERNAL_MOUSE_DISCONNECT

Moufiltr は、STATUS_NOT_IMPLEMENTED のエラー状態で IOCTL_INTERNAL_MOUSE_DISCONNECT 要求を完了します。

その他のすべての要求の場合、Moufiltr は現在の IRP スタックをスキップし、それ以上の処理を行わずにデバイス スタックに要求を送信します。

Moufiltr コールバック ルーチン

MouFiltr では、次のコールバック ルーチンが実装されています。

MouFilter_IsrHook

PI8042_MOUSE_ISR」を参照してください。

/*
Parameters
DeviceObject
Pointer to the filter device object of the driver that supplies this callback.

CurrentInput
Pointer to the input MOUSE_INPUT_DATA structure being constructed by the ISR.

CurrentOutput
Pointer to the OUTPUT_PACKET structure that specifies the bytes being written to the hardware device.

StatusByte
Specifies a status byte that is read from I/O port 60 when the interrupt occurs.

DataByte
Specifies a data byte that is read from I/O port 64 when the interrupt occurs.

ContinueProcessing
Specifies, if TRUE, that the I8042prt mouse ISR continues processing after this callback returns. Otherwise, processing is not continued.

MouseState
Pointer to a MOUSE_STATE enumeration value, which identifies the state of mouse input.

ResetSubState
Pointer to MOUSE_RESET_SUBSTATE enumeration value, which identifies the mouse reset substate. See the Remarks section.

Return value
MouFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE.
*/

BOOLEAN MouFilter_IsrHook(
   PDEVICE_OBJECT        DeviceObject,
   PMOUSE_INPUT_DATA     CurrentInput,
   POUTPUT_PACKET        CurrentOutput,
   UCHAR                 StatusByte,
   PUCHAR                DataByte,
   PBOOLEAN              ContinueProcessing,
   PMOUSE_STATE          MouseState,
   PMOUSE_RESET_SUBSTATE ResetSubState
);

I8042prt の既定の操作で十分な場合、MouFilter_IsrHook コールバックは必要ありません。

I8042prt マウス ISR は、割り込みを検証した後で MouFilter_IsrHook を呼び出します。

マウスをリセットするために、I8042prt は一連の操作のサブ状態を経過します。 各サブ状態は、OUSE_RESET_SUBSTATE 列挙値によって識別されます。 I8042prt がマウスをリセットする方法と、対応するマウス リセットのサブ状態の詳細については、ntdd8042.h の MOUSE_RESET_SUBSTATE のドキュメントを参照してください。

MouFilter_IsrHook は、I8042prt マウス ISR の IRQL でカーネル モードで実行されます。

MouFilter_ServiceCallback

PSERVICE_CALLBACK_ROUTINE」を参照してください。

/*
Parameters
DeviceObject [in]
Pointer to the class device object.

InputDataStart [in]
Pointer to the first mouse input data packet in the input data buffer of the port device.

InputDataEnd [in]
Pointer to the mouse input data packet immediately following the last data packet in the port device's input data buffer.

InputDataConsumed [in, out]
Pointer to the number of mouse input data packets that are transferred by the routine.

Return value
None
*/

VOID MouFilter_ServiceCallback(
  _In_    PDEVICE_OBJECT    DeviceObject,
  _In_    PMOUSE_INPUT_DATA InputDataStart,
  _In_    PMOUSE_INPUT_DATA InputDataEnd,
  _Inout_ PULONG            InputDataConsumed
);

I8042prt の ISR DPC は MouFilter_ServiceCallbackを呼び出し、その後 MouseClassServiceCallback を呼び出します。 フィルター サービス コールバックは、デバイスの入力バッファーからクラス データ キューに転送される入力データを変更するように構成できます。 たとえば、コールバックによってデータの削除、変換、挿入を行うことができます。