傳送 HID 報告
本文說明使用者模式應用程式和內核模式驅動程式如何將 HID 報告傳送至 HID 集合。
依使用者模式應用程式傳送 HID 報告
使用者模式應用程式會使用 WriteFile 持續將輸出報告傳送至 HID 集合。 您也可以使用 HidD_SetXxx 例程,將輸出報表和功能報表傳送至集合。 不過,只使用 HidD_SetXxx 例程來設定集合的目前狀態。 某些裝置可能不支援 HidD_SetOutputReport ,如果使用此例程,則變得沒有回應。
WriteFile 例程
使用寫入要求將輸出報告傳送至 HID 集合。 在使用者模式應用程式建立輸出報表之後,可以使用 WriteFile 將輸出報表傳送至集合。
HidD_SetXxx例程
使用這些 HIDClass 支援例程,將 HID 報告傳送至 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 和更新版本的驅動程式,都可以針對傳送至集合的所有寫入要求使用單一 IRP。 不過,Windows 2000 WDM 驅動程式必須為每個寫入要求配置新的 IRP。 如需如何使用和重複使用 IRP 的詳細資訊,請參閱 處理 IRP 和 重複使用 IRP。
如果驅動程式重複使用寫入 IRP,IRP 的 IoCompletion 例程應該以STATUS_MORE_PROCESSING_REQUIRED狀態完成要求(而不是釋放 IRP)。 當驅動程式不再需要 IRP 時,應該呼叫 IoCompleteRequest 和 IoFreeIrp 來完成並釋放 IRP。 例如,驅動程式通常會在其 Unload 例程中完成並釋放 IRP,或在移除裝置之後。
如果驅動程式只針對一個寫入要求使用 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:設定為輸出報表的長度,以位元組為單位。 將此成員設定為 HID 集合輸出報表的長度,如集合HIDP_CAPS結構的 OutputReportByteLength 成員所指定。
- Parameters.Write.Key:設定為零。
- Parameters.Write.ByteOffset.QuadPart:設為零。
- MajorFunction:設定為
IRP_MJ_WRITE
。 - FileObject:設定為代表 HID 集合上開啟檔案的檔案物件指標。
IOCTL_HID_SET_Xxx要求
您也可以使用下列 I/O 要求,將輸出和功能報告傳送至 HID 集合: