次の方法で共有


HID レポートを送信する

この記事では、ユーザーモード アプリケーションとカーネルモード ドライバーが HID コレクションに HID レポートを送信する方法について説明します。

ユーザーモード アプリケーションによる HID レポートの送信

ユーザーモード アプリケーションは WriteFile を使用して、出力レポートを HID コレクションに継続的に送信します。 HidD_SetXxx ルーチンを使用して、出力レポートと機能レポートをコレクションに送信することもできます。 ただし、コレクションの現在の状態を設定するには、HidD_SetXxx ルーチンのみを使用します。 一部のデバイスは HidD_SetOutputReport をサポートしていない可能性があり、このルーチンを使用すると応答しなくなる場合があります。

WriteFile ルーチン

書き込み要求を使用して HID コレクションに出力レポートを送信します。 ユーザーモード アプリケーションは、出力レポートを作成した後、WriteFile を使用して出力レポートをコレクションに送信できます。

HidD_SetXxx ルーチン

HID レポートを HID コレクションに送信するには、次の HIDClass サポート ルーチンを使用します。

  • HidD_SetOutputReport: HID コレクション (Windows XP 以降のバージョン) に出力レポートを送信します。
  • HidD_SetFeature: HID コレクションに機能レポートを送信します。

カーネルモード ドライバーによる HID レポートの送信

カーネルモード ドライバーは IRP_MJ_WRITE 要求を使用して、HID コレクションに出力レポートを継続的に送信します。 IOCTL_HID_SET_Xxx 要求を使用して、出力レポートと機能レポートをコレクションに送信することもできます。 ただし、コレクションの現在の状態を設定するには IOCTL_HID_SET_Xxx 要求のみを使用します。 一部のデバイスは IOCTL_HID_SET_OUTPUT_REPORT をサポートしていない可能性があり、この要求を使用すると応答しなくなる場合があります。

IRP_MJ_WRITE 要求

WDM 以外の Windows 2000 ドライバーと Windows XP 以降のバージョンのドライバーでは、1 つの IRP を使用して、コレクションに送信されるすべての書き込み要求に対処できます。 ただし、Windows 2000 の WDM ドライバーでは、書き込み要求ごとに新しい IRP を割り当てる必要があります。 IRP の使用方法と再利用方法の詳細については、「IRP の処理」と「IRP の再利用」を参照してください。

ドライバーが書き込み IRP を再利用する場合、IRP の IoCompletion ルーチンは、状態が STATUS_MORE_PROCESSING_REQUIRED (IRP を解放しない) で要求を完了する必要があります。 ドライバーが IRP を必要としなくなった場合は、IoCompleteRequestIoFreeIrp を呼び出して IRP を完了し、解放する必要があります。 たとえば、ドライバーは通常、そのアンロード ルーチンで、またはデバイスが削除された後に IRP を完了し、解放する可能性があります。

ドライバーが 1 つの書き込み要求にのみ IRP を使用する場合、IRP の IoCompletion ルーチンは IRP を完了して解放し、STATUS_SUCCESS を返す必要があります。

ドライバーは、出力レポートを送信する前に、「HID レポートを初期化する」で説明されているように、最初に出力レポート バッファーを初期化して設定する必要があります。 その後、ドライバーは MDL を使用して、書き込み要求の出力レポート バッファーをマップする必要があります。 ドライバーは、IoAllocateMdl を呼び出して出力レポートの MDL を割り当て、書き込み IRP の Irp->MdlAddress メンバーを出力レポート バッファーの MDL アドレスに設定します。 レポート バッファーと MDL は、不要になったら解放する必要があります。

ドライバーは、書き込み IRP の MDL アドレスを設定するだけでなく、次の下位レベルのドライバーの I/O スタックの場所も設定する必要があります。 ドライバーは、IoGetNextIrpStackLocation を呼び出すことで、次の下位レベルのドライバーの I/O スタックの場所へのアクセスを取得します。 ドライバーは、I/O スタックの場所の次のメンバーを設定します。

  • Parameters.Write.Length: 出力レポートの長さ (バイト単位) に設定します。 コレクションの HIDP_CAPS 構造体の OutputReportByteLength メンバーによって指定されているとおりに、このメンバーを HID コレクションの出力レポートの長さに設定します。
  • Parameters.Write.Key: 0 に設定します。
  • Parameters.Write.ByteOffset.QuadPart: 0 に設定します。
  • MajorFunction: IRP_MJ_WRITE に設定します。
  • FileObject: HID コレクションで開いているファイルを表すファイル オブジェクト ポインターに設定します。

IOCTL_HID_SET_Xxx 要求

次の入出力要求を使用して、HID コレクションに出力レポートと機能レポートを送信することもできます。