傳送 HID 報表

本節說明使用者模式應用程式和核心模式驅動程式如何將 HID 報告傳送至 HID 集合

透過User-Mode應用程式傳送 HID 報表

使用者模式應用程式應該使用 WriteFile 作為其主要方法,以持續將輸出報告傳送至 HID 集合。 應用程式也可以使用 HidD_SetXxx 常式,將輸出報表和功能報表傳送至集合。 不過,應用程式應該只使用這些常式來設定集合的目前狀態。 某些裝置可能不支援 HidD_SetOutputReport ,如果使用此常式,將會變得沒有回應。

使用 WriteFile

應用程式應該使用寫入要求,將輸出報告傳送至 HID 集合。 使用者模式應用程式建立輸出報表之後,可以使用 WriteFile將輸出報表傳送至集合。

使用HidD_SetXxx常式

應用程式可以使用下列 HIDClass 支援常式,將 HID 報告傳送至 HID 集合:

HidD_SetOutputReport 將輸出報表傳送至 HID 集合, (Windows XP 和更新版本) 。

HidD_SetFeature 將功能報表傳送至 HID 集合。

Kernel-Mode驅動程式傳送 HID 報告

核心模式驅動程式應該使用 IRP_MJ_WRITE 要求作為其主要方法,以持續將輸出報告傳送至 HID 集合。 驅動程式也可以使用 IOCTL_HID_SET_Xxx 要求,將輸出報表和功能報表傳送至集合。 不過,驅動程式應該只使用這些 I/O 要求來設定集合的目前狀態。 某些裝置可能不支援 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 時,應該藉由呼叫 IoCompleteRequestIoFreeIrp來完成並釋放 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 集合:

IOCTL_HID_SET_OUTPUT_REPORT
將輸出報表傳送至集合 (Windows XP 和更新版本) 。

IOCTL_HID_SET_FEATURE
將功能報表傳送至集合。