取得 HID 報表
本文說明使用者模式應用程式和內核模式驅動程式如何從 HID 集合取得 HID 報告。
依使用者模式應用程式取得 HID 報表
本節討論使用 ReadFile 或 HidD_GetXxx 例程的使用者模式應用程式取得 HID 輸入報告或 HID 功能報告。
不過,應用程式應該只使用 HidD_GetXxx 例程來取得裝置的目前狀態。 如果應用程式嘗試使用 HidD_GetInputReport 持續取得輸入報告,報表可能會遺失。 此外,某些裝置不支援 HidD_GetInputReport ,如果使用此例程,則變得沒有回應。
使用 ReadFile
應用程式會使用 使用 CreateFile 取得的開啟檔案句柄來開啟集合上的檔案。 當應用程式呼叫 ReadFile 時,不需要指定重疊的 I/O,因為 HID 用戶端驅動程式 緩衝區會在通道緩衝區中報告。 不過,應用程式可以使用重疊的 I/O 來有多個未完成的讀取要求。
使用 HidD_GetXxx 例程
應用程式可以使用下列 HIDClass 支援例程 ,從 HID 集合取得最新的輸入報告和功能報告:
應用程式可以要求傳回特定報表。 若要使用HidD_GetXxx例程擷取特定報表,應用程式會配置報表輸出緩衝區、零初始化緩衝區,並將緩衝區中的第一個字節設定為特定的報表標識符。 如需詳細資訊,請參閱 初始化 HID 報表。
依內核模式驅動程式取得 HID 報告
本節討論核心模式驅動程式 應如何使用IRP_MJ_READ 要求作為持續取得 HID 輸入報告的主要方法。
連續讀取要求會依照從集合接收的順序傳回輸入報告。 驅動程式也可以使用 IOCTL_HID_GET_Xxx 要求來取得輸入和功能報告。 不過,驅動程式應該只使用 IOCTL_HID_GET_Xxx 要求來取得裝置的目前狀態。 如果驅動程式嘗試使用 IOCTL_HID_GET_INPUT_REPORT 持續取得輸入報告,報表可能會遺失。 此外,某些裝置不支援 IOCTL_HID_GET_INPUT_REPORT ,如果使用此要求,則變得沒有回應。
使用IRP_MJ_READ要求
如需如何使用和重複使用 I/O 要求封包的一般資訊,請參閱處理 IRP 和重複使用 IRP。
如果驅動程式重複使用 IRP,IRP 的 IoCompletion 例程應該以STATUS_MORE_PROCESSING_REQUIRED狀態完成要求(而不是釋放 IRP)。 當驅動程式不再需要 IRP 時,應該呼叫 IoCompleteRequest 和 IoFreeIrp 來完成並釋放 IRP。 例如,驅動程式通常會在其 Unload 例程中完成並釋放 IRP,或在移除裝置之後。
如果驅動程式只針對一個讀取要求使用 IRP,IRP 的 IoCompletion 例程應該會完成並釋放 IRP,並傳回 STATUS_SUCCESS。
在驅動程式可以要求輸入報表之前,必須先從非分頁記憶體集區配置零初始化的輸入報表緩衝區。 緩衝區的大小,以位元組為單位,是由 HID 集合HIDP_CAPS結構的 InputReportByteLength 成員所指定。 驅動程式接著必須使用 MDL 來對應讀取要求的輸入報表緩衝區。 驅動程式會呼叫IoAllocateMdl來配置輸入報表緩衝區的 MDL,並將讀取 IRP 的 Irp-MdlAddress> 成員設定為輸入報表緩衝區的 MDL 位址。 驅動程序應該會在不再需要報表緩衝區和 MDL 時釋放它們。
除了設定讀取 IRP 的 MDL 位址之外,驅動程式也必須設定下一個較低層級驅動程式的 I/O 堆疊位置。 驅動程式會呼叫 IoGetNextIrpStackLocation,以取得下一個較低層級驅動程式之 I/O 堆疊位置的存取權。 驅動程式會設定下列 I/O 堆疊位置的成員:
- Parameters.Read.Length:設定為讀取緩衝區的大小,以位元組為單位。 大小必須大於或等於 HID 集合 之 HIDP_CAPS 結構之 InputReportByteLength 成員所指定的值。
- Parameters.Read.Key:設定為零。
- Parameters.Read.ByteOffset.QuadPart:設為零。
- MajorFunction:設定為 IRP_MJ_READ。
- FileObject:設定為代表 HID 集合上開啟檔案的檔案物件指標。
驅動程式取得輸入報表之後,就可以訪問控制數據,如解譯 HID 報表中所述。
使用IOCTL_HID_GET_Xxx要求
驅動程式可以使用下列 I/O 要求,從 HID 集合取得最新的輸入與功能報告:
驅動程式可以要求傳回特定報表。 若要使用這些 I/O 要求擷取特定報表,驅動程式會先配置輸出報表緩衝區,然後將緩衝區中的第一個字節設定為特定的報表標識符。
如需詳細資訊,請參閱 解譯 HID 報表。