4 * Public Interface for HID parsing library.
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
35 #define HIDAPI DECLSPEC_IMPORT
38 typedef PUCHAR PHIDP_REPORT_DESCRIPTOR
;
39 typedef struct _HIDP_PREPARSED_DATA
* PHIDP_PREPARSED_DATA
;
41 typedef struct _HIDP_UNKNOWN_TOKEN
{
45 } HIDP_UNKNOWN_TOKEN
, *PHIDP_UNKNOWN_TOKEN
;
47 typedef enum _HIDP_KEYBOARD_DIRECTION
{
50 } HIDP_KEYBOARD_DIRECTION
;
52 typedef struct _HIDP_KEYBOARD_MODIFIER_STATE
{
53 _ANONYMOUS_UNION
union {
54 _ANONYMOUS_STRUCT
struct {
55 ULONG LeftControl
: 1;
59 ULONG RightControl
: 1;
70 } HIDP_KEYBOARD_MODIFIER_STATE
, *PHIDP_KEYBOARD_MODIFIER_STATE
;
73 (NTAPI
*PHIDP_INSERT_SCANCODES
)(
74 _In_opt_ PVOID Context
,
75 _In_reads_bytes_(Length
) PCHAR NewScanCodes
,
78 typedef struct _USAGE_AND_PAGE
{
81 } USAGE_AND_PAGE
, *PUSAGE_AND_PAGE
;
83 typedef struct _HIDD_ATTRIBUTES
{
88 } HIDD_ATTRIBUTES
, *PHIDD_ATTRIBUTES
;
90 typedef struct _HIDD_CONFIGURATION
{
94 } HIDD_CONFIGURATION
, *PHIDD_CONFIGURATION
;
100 HidP_TranslateUsageAndPagesToI8042ScanCodes(
101 _In_reads_(UsageListLength
) PUSAGE_AND_PAGE ChangedUsageList
,
102 _In_ ULONG UsageListLength
,
103 _In_ HIDP_KEYBOARD_DIRECTION KeyAction
,
104 _Inout_ PHIDP_KEYBOARD_MODIFIER_STATE ModifierState
,
105 _In_ PHIDP_INSERT_SCANCODES InsertCodesProcedure
,
106 _In_opt_ PVOID InsertCodesContext
);
108 _Must_inspect_result_
112 HidP_TranslateUsagesToI8042ScanCodes(
113 _In_reads_(UsageListLength
) PUSAGE ChangedUsageList
,
114 _In_ ULONG UsageListLength
,
115 _In_ HIDP_KEYBOARD_DIRECTION KeyAction
,
116 _Inout_ PHIDP_KEYBOARD_MODIFIER_STATE ModifierState
,
117 _In_ PHIDP_INSERT_SCANCODES InsertCodesProcedure
,
118 _In_opt_ PVOID InsertCodesContext
);
120 typedef struct _HIDP_BUTTON_CAPS
{
125 USHORT LinkCollection
;
129 BOOLEAN IsStringRange
;
130 BOOLEAN IsDesignatorRange
;
133 _ANONYMOUS_UNION
union {
135 USAGE UsageMin
, UsageMax
;
136 USHORT StringMin
, StringMax
;
137 USHORT DesignatorMin
, DesignatorMax
;
138 USHORT DataIndexMin
, DataIndexMax
;
141 USAGE Usage
, Reserved1
;
142 USHORT StringIndex
, Reserved2
;
143 USHORT DesignatorIndex
, Reserved3
;
144 USHORT DataIndex
, Reserved4
;
147 } HIDP_BUTTON_CAPS
, *PHIDP_BUTTON_CAPS
;
149 typedef struct _HIDP_CAPS
{
152 USHORT InputReportByteLength
;
153 USHORT OutputReportByteLength
;
154 USHORT FeatureReportByteLength
;
156 USHORT NumberLinkCollectionNodes
;
157 USHORT NumberInputButtonCaps
;
158 USHORT NumberInputValueCaps
;
159 USHORT NumberInputDataIndices
;
160 USHORT NumberOutputButtonCaps
;
161 USHORT NumberOutputValueCaps
;
162 USHORT NumberOutputDataIndices
;
163 USHORT NumberFeatureButtonCaps
;
164 USHORT NumberFeatureValueCaps
;
165 USHORT NumberFeatureDataIndices
;
166 } HIDP_CAPS
, *PHIDP_CAPS
;
168 typedef struct _HIDP_DATA
{
171 _ANONYMOUS_UNION
union {
175 } HIDP_DATA
, *PHIDP_DATA
;
177 typedef struct _HIDP_EXTENDED_ATTRIBUTES
{
178 UCHAR NumGlobalUnknowns
;
180 PHIDP_UNKNOWN_TOKEN GlobalUnknowns
;
182 } HIDP_EXTENDED_ATTRIBUTES
, *PHIDP_EXTENDED_ATTRIBUTES
;
184 #define HIDP_LINK_COLLECTION_ROOT ((USHORT) -1)
185 #define HIDP_LINK_COLLECTION_UNSPECIFIED ((USHORT) 0)
187 typedef struct _HIDP_LINK_COLLECTION_NODE
{
191 USHORT NumberOfChildren
;
194 ULONG CollectionType
: 8;
198 } HIDP_LINK_COLLECTION_NODE
, *PHIDP_LINK_COLLECTION_NODE
;
200 typedef struct _HIDP_VALUE_CAPS
{
205 USHORT LinkCollection
;
209 BOOLEAN IsStringRange
;
210 BOOLEAN IsDesignatorRange
;
219 LONG LogicalMin
, LogicalMax
;
220 LONG PhysicalMin
, PhysicalMax
;
221 _ANONYMOUS_UNION
union {
223 USAGE UsageMin
, UsageMax
;
224 USHORT StringMin
, StringMax
;
225 USHORT DesignatorMin
, DesignatorMax
;
226 USHORT DataIndexMin
, DataIndexMax
;
229 USAGE Usage
, Reserved1
;
230 USHORT StringIndex
, Reserved2
;
231 USHORT DesignatorIndex
, Reserved3
;
232 USHORT DataIndex
, Reserved4
;
235 } HIDP_VALUE_CAPS
, *PHIDP_VALUE_CAPS
;
237 typedef enum _HIDP_REPORT_TYPE
{
243 #define FACILITY_HID_ERROR_CODE 0x11
245 #define HIDP_ERROR_CODES(SEV, CODE) \
246 ((NTSTATUS) (((SEV) << 28) | (FACILITY_HID_ERROR_CODE << 16) | (CODE)))
248 #define HIDP_STATUS_SUCCESS (HIDP_ERROR_CODES(0x0, 0))
249 #define HIDP_STATUS_NULL (HIDP_ERROR_CODES(0x8, 1))
250 #define HIDP_STATUS_INVALID_PREPARSED_DATA (HIDP_ERROR_CODES(0xC, 1))
251 #define HIDP_STATUS_INVALID_REPORT_TYPE (HIDP_ERROR_CODES(0xC, 2))
252 #define HIDP_STATUS_INVALID_REPORT_LENGTH (HIDP_ERROR_CODES(0xC, 3))
253 #define HIDP_STATUS_USAGE_NOT_FOUND (HIDP_ERROR_CODES(0xC, 4))
254 #define HIDP_STATUS_VALUE_OUT_OF_RANGE (HIDP_ERROR_CODES(0xC, 5))
255 #define HIDP_STATUS_BAD_LOG_PHY_VALUES (HIDP_ERROR_CODES(0xC, 6))
256 #define HIDP_STATUS_BUFFER_TOO_SMALL (HIDP_ERROR_CODES(0xC, 7))
257 #define HIDP_STATUS_INTERNAL_ERROR (HIDP_ERROR_CODES(0xC, 8))
258 #define HIDP_STATUS_I8042_TRANS_UNKNOWN (HIDP_ERROR_CODES(0xC, 9))
259 #define HIDP_STATUS_INCOMPATIBLE_REPORT_ID (HIDP_ERROR_CODES(0xC, 0xA))
260 #define HIDP_STATUS_NOT_VALUE_ARRAY (HIDP_ERROR_CODES(0xC, 0xB))
261 #define HIDP_STATUS_IS_VALUE_ARRAY (HIDP_ERROR_CODES(0xC, 0xC))
262 #define HIDP_STATUS_DATA_INDEX_NOT_FOUND (HIDP_ERROR_CODES(0xC, 0xD))
263 #define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE (HIDP_ERROR_CODES(0xC, 0xE))
264 #define HIDP_STATUS_BUTTON_NOT_PRESSED (HIDP_ERROR_CODES(0xC, 0xF))
265 #define HIDP_STATUS_REPORT_DOES_NOT_EXIST (HIDP_ERROR_CODES(0xC, 0x10))
266 #define HIDP_STATUS_NOT_IMPLEMENTED (HIDP_ERROR_CODES(0xC, 0x20))
267 #define HIDP_STATUS_I8242_TRANS_UNKNOWN HIDP_STATUS_I8042_TRANS_UNKNOWN
270 #if !defined(_HIDPI_NO_FUNCTION_MACROS_)
273 * HidP_GetButtonCaps(
274 * IN HIDP_REPORT_TYPE ReportType,
275 * OUT PHIDP_BUTTON_CAPS ButtonCaps,
276 * IN OUT PULONG ButtonCapsLength,
277 * IN PHIDP_PREPARSED_DATA PreparsedData);
279 #define HidP_GetButtonCaps(_Type_, _Caps_, _Len_, _Data_) \
280 HidP_GetSpecificButtonCaps(_Type_, 0, 0, 0, _Caps_, _Len_, _Data_)
285 * IN HIDP_REPORT_TYPE ReportType,
286 * IN USAGE UsagePage,
287 * IN USHORT LinkCollection,
288 * OUT USAGE *UsageList,
289 * IN OUT ULONG *UsageLength,
290 * IN PHIDP_PREPARSED_DATA PreparsedData,
292 * IN ULONG ReportLength);
294 #define HidP_GetButtons(Rty, UPa, LCo, ULi, ULe, Ppd, Rep, RLe) \
295 HidP_GetUsages(Rty, UPa, LCo, ULi, ULe, Ppd, Rep, RLe)
297 #define HidP_GetButtonListLength(RTy, UPa, Ppd) \
298 HidP_GetUsageListLength(Rty, UPa, Ppd)
304 * IN HIDP_REPORT_TYPE ReportType,
305 * IN USHORT LinkCollection,
306 * OUT PUSAGE_AND_PAGE ButtonList,
307 * IN OUT ULONG *UsageLength,
308 * IN PHIDP_PREPARSED_DATA PreparsedData,
310 * IN ULONG ReportLength);
312 #define HidP_GetButtonsEx(RT, LC, BL, UL, PD, R, RL) \
313 HidP_GetUsagesEx(RT, LC, BL, UL, PD, R, RL)
315 #endif /* _HIDPI_NO_FUNCTION_MACROS_ */
317 _Must_inspect_result_
318 _IRQL_requires_max_(PASSIVE_LEVEL
)
323 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
324 _Out_ PHIDP_CAPS Capabilities
);
326 _Must_inspect_result_
327 _IRQL_requires_max_(DISPATCH_LEVEL
)
332 _In_ HIDP_REPORT_TYPE ReportType
,
333 _Out_writes_to_(*DataLength
, *DataLength
) PHIDP_DATA DataList
,
334 _Inout_ PULONG DataLength
,
335 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
336 _Out_writes_bytes_(ReportLength
) PCHAR Report
,
337 _In_ ULONG ReportLength
);
339 _Must_inspect_result_
340 _IRQL_requires_max_(DISPATCH_LEVEL
)
344 HidP_GetExtendedAttributes(
345 _In_ HIDP_REPORT_TYPE ReportType
,
346 _In_ USHORT DataIndex
,
347 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
348 _Out_writes_to_(*LengthAttributes
, *LengthAttributes
) PHIDP_EXTENDED_ATTRIBUTES Attributes
,
349 _Inout_ OUT PULONG LengthAttributes
);
351 _Must_inspect_result_
352 _IRQL_requires_max_(DISPATCH_LEVEL
)
356 HidP_GetLinkCollectionNodes(
357 _Out_ PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes
,
358 _Inout_ PULONG LinkCollectionNodesLength
,
359 _In_ PHIDP_PREPARSED_DATA PreparsedData
);
361 _Must_inspect_result_
365 HidP_GetScaledUsageValue(
366 _In_ HIDP_REPORT_TYPE ReportType
,
367 _In_ USAGE UsagePage
,
368 _In_ USHORT LinkCollection
,
370 _Out_ PLONG UsageValue
,
371 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
372 _In_reads_bytes_(ReportLength
) PCHAR Report
,
373 _In_ ULONG ReportLength
);
375 _Must_inspect_result_
376 _IRQL_requires_max_(PASSIVE_LEVEL
)
380 HidP_GetSpecificButtonCaps(
381 _In_ HIDP_REPORT_TYPE ReportType
,
382 _In_ USAGE UsagePage
,
383 _In_ USHORT LinkCollection
,
385 _Out_ PHIDP_BUTTON_CAPS ButtonCaps
,
386 _Inout_ PUSHORT ButtonCapsLength
,
387 _In_ PHIDP_PREPARSED_DATA PreparsedData
);
389 _Must_inspect_result_
390 _IRQL_requires_max_(DISPATCH_LEVEL
)
394 HidP_GetSpecificValueCaps(
395 _In_ HIDP_REPORT_TYPE ReportType
,
396 _In_ USAGE UsagePage
,
397 _In_ USHORT LinkCollection
,
399 _Out_ PHIDP_VALUE_CAPS ValueCaps
,
400 _Inout_ PUSHORT ValueCapsLength
,
401 _In_ PHIDP_PREPARSED_DATA PreparsedData
);
403 _Must_inspect_result_
408 _In_ HIDP_REPORT_TYPE ReportType
,
409 _In_ USAGE UsagePage
,
410 _In_ USHORT LinkCollection
,
411 _Out_writes_to_(*UsageLength
, *UsageLength
) USAGE
*UsageList
,
412 _Inout_ ULONG
*UsageLength
,
413 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
414 _Out_writes_bytes_(ReportLength
) PCHAR Report
,
415 _In_ ULONG ReportLength
);
417 _Must_inspect_result_
418 _IRQL_requires_max_(DISPATCH_LEVEL
)
423 _In_ HIDP_REPORT_TYPE ReportType
,
424 _In_ USHORT LinkCollection
,
425 _Inout_updates_to_(*UsageLength
, *UsageLength
) PUSAGE_AND_PAGE ButtonList
,
426 _Inout_ ULONG
*UsageLength
,
427 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
428 _In_reads_bytes_(ReportLength
) PCHAR Report
,
429 _In_ ULONG ReportLength
);
431 _Must_inspect_result_
436 _In_ HIDP_REPORT_TYPE ReportType
,
437 _In_ USAGE UsagePage
,
438 _In_ USHORT LinkCollection
,
440 _Out_ PULONG UsageValue
,
441 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
442 _In_reads_bytes_(ReportLength
) PCHAR Report
,
443 _In_ ULONG ReportLength
);
445 _Must_inspect_result_
449 HidP_GetUsageValueArray(
450 _In_ HIDP_REPORT_TYPE ReportType
,
451 _In_ USAGE UsagePage
,
452 _In_ USHORT LinkCollection
,
454 _Inout_updates_bytes_(UsageValueByteLength
) PCHAR UsageValue
,
455 _In_ USHORT UsageValueByteLength
,
456 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
457 _In_reads_bytes_(ReportLength
) PCHAR Report
,
458 _In_ ULONG ReportLength
);
460 #if !defined(_HIDPI_NO_FUNCTION_MACROS_)
465 * IN HIDP_REPORT_TYPE ReportType,
466 * OUT PHIDP_VALUE_CAPS ValueCaps,
467 * IN OUT PULONG ValueCapsLength,
468 * IN PHIDP_PREPARSED_DATA PreparsedData);
470 #define HidP_GetValueCaps(_Type_, _Caps_, _Len_, _Data_) \
471 HidP_GetSpecificValueCaps (_Type_, 0, 0, 0, _Caps_, _Len_, _Data_)
473 #endif /* _HIDPI_NO_FUNCTION_MACROS_ */
475 _Must_inspect_result_
476 _IRQL_requires_max_(DISPATCH_LEVEL
)
480 HidP_InitializeReportForID(
481 _In_ HIDP_REPORT_TYPE ReportType
,
483 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
484 _Out_writes_bytes_(ReportLength
) PCHAR Report
,
485 _In_ ULONG ReportLength
);
487 #if !defined(_HIDPI_NO_FUNCTION_MACROS_)
491 * HidP_IsSameUsageAndPage(
493 * USAGE_AND_PAGE u2);
495 #define HidP_IsSameUsageAndPage(u1, u2) ((* (PULONG) &u1) == (* (PULONG) &u2))
497 #endif /* _HIDPI_NO_FUNCTION_MACROS_ */
499 _IRQL_requires_max_(DISPATCH_LEVEL
)
503 HidP_MaxDataListLength(
504 _In_ HIDP_REPORT_TYPE ReportType
,
505 _In_ PHIDP_PREPARSED_DATA PreparsedData
);
507 _IRQL_requires_max_(PASSIVE_LEVEL
)
511 HidP_MaxUsageListLength(
512 _In_ HIDP_REPORT_TYPE ReportType
,
513 _In_ USAGE UsagePage
,
514 _In_ PHIDP_PREPARSED_DATA PreparsedData
);
516 #if !defined(_HIDPI_NO_FUNCTION_MACROS_)
521 * IN HIDP_REPORT_TYPE ReportType,
522 * IN USAGE UsagePage,
523 * IN USHORT LinkCollection,
524 * IN PUSAGE UsageList,
525 * IN OUT PULONG UsageLength,
526 * IN PHIDP_PREPARSED_DATA PreparsedData,
527 * IN OUT PCHAR Report,
528 * IN ULONG ReportLength);
530 #define HidP_SetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \
531 HidP_SetUsages(RT, UP, LC, UL1, UL2, PD, R, RL)
533 #endif /* _HIDPI_NO_FUNCTION_MACROS_ */
535 _Must_inspect_result_
540 _In_ HIDP_REPORT_TYPE ReportType
,
541 _Inout_updates_to_(*DataLength
, *DataLength
) PHIDP_DATA DataList
,
542 _Inout_ PULONG DataLength
,
543 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
544 _In_reads_bytes_(ReportLength
) PCHAR Report
,
545 _In_ ULONG ReportLength
);
547 _Must_inspect_result_
551 HidP_SetScaledUsageValue(
552 _In_ HIDP_REPORT_TYPE ReportType
,
553 _In_ USAGE UsagePage
,
554 _In_ USHORT LinkCollection
,
556 _In_ LONG UsageValue
,
557 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
558 _Inout_updates_bytes_(ReportLength
) PCHAR Report
,
559 _In_ ULONG ReportLength
);
561 _Must_inspect_result_
566 _In_ HIDP_REPORT_TYPE ReportType
,
567 _In_ USAGE UsagePage
,
568 _In_ USHORT LinkCollection
, /* Optional */
569 _Inout_updates_to_(*UsageLength
, *UsageLength
) PUSAGE UsageList
,
570 _Inout_ PULONG UsageLength
,
571 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
572 _In_reads_bytes_(ReportLength
) PCHAR Report
,
573 _In_ ULONG ReportLength
);
575 _Must_inspect_result_
580 _In_ HIDP_REPORT_TYPE ReportType
,
581 _In_ USAGE UsagePage
,
582 _In_ USHORT LinkCollection
,
584 _In_ ULONG UsageValue
,
585 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
586 _Inout_updates_bytes_(ReportLength
) PCHAR Report
,
587 _In_ ULONG ReportLength
);
589 _Must_inspect_result_
593 HidP_SetUsageValueArray(
594 _In_ HIDP_REPORT_TYPE ReportType
,
595 _In_ USAGE UsagePage
,
596 _In_ USHORT LinkCollection
,
598 _In_reads_bytes_(UsageValueByteLength
) PCHAR UsageValue
,
599 _In_ USHORT UsageValueByteLength
,
600 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
601 _Inout_updates_bytes_(ReportLength
) PCHAR Report
,
602 _In_ ULONG ReportLength
);
604 #if !defined(_HIDPI_NO_FUNCTION_MACROS_)
609 * IN HIDP_REPORT_TYPE ReportType,
610 * IN USAGE UsagePage,
611 * IN USHORT LinkCollection,
612 * IN PUSAGE UsageList,
613 * IN OUT PULONG UsageLength,
614 * IN PHIDP_PREPARSED_DATA PreparsedData,
615 * IN OUT PCHAR Report,
616 * IN ULONG ReportLength);
618 #define HidP_UnsetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \
619 HidP_UnsetUsages(RT, UP, LC, UL1, UL2, PD, R, RL)
621 #endif /* _HIDPI_NO_FUNCTION_MACROS_ */
623 _Must_inspect_result_
628 _In_ HIDP_REPORT_TYPE ReportType
,
629 _In_ USAGE UsagePage
,
630 _In_opt_ USHORT LinkCollection
,
631 _Inout_updates_to_(*UsageLength
, *UsageLength
) PUSAGE UsageList
,
632 _Inout_ PULONG UsageLength
,
633 _In_ PHIDP_PREPARSED_DATA PreparsedData
,
634 _In_reads_bytes_(ReportLength
) PCHAR Report
,
635 _In_ ULONG ReportLength
);
637 _Must_inspect_result_
638 _IRQL_requires_max_(PASSIVE_LEVEL
)
642 HidP_UsageAndPageListDifference(
643 _In_reads_(UsageListLength
) PUSAGE_AND_PAGE PreviousUsageList
,
644 _In_reads_(UsageListLength
) PUSAGE_AND_PAGE CurrentUsageList
,
645 _Out_writes_(UsageListLength
) PUSAGE_AND_PAGE BreakUsageList
,
646 _Out_writes_(UsageListLength
) PUSAGE_AND_PAGE MakeUsageList
,
647 _In_ ULONG UsageListLength
);
649 _Must_inspect_result_
650 _IRQL_requires_max_(PASSIVE_LEVEL
)
654 HidP_UsageListDifference(
655 _In_reads_(UsageListLength
) PUSAGE PreviousUsageList
,
656 _In_reads_(UsageListLength
) PUSAGE CurrentUsageList
,
657 _Out_writes_(UsageListLength
) PUSAGE BreakUsageList
,
658 _Out_writes_(UsageListLength
) PUSAGE MakeUsageList
,
659 _In_ ULONG UsageListLength
);
665 #endif /* __HIDPI_H__ */