1 /**
2  * @file hidpi.h
3  * Copyright 2012, 2013 MinGW.org project
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
25 #ifndef __HIDPI_H
26 #define __HIDPI_H
27 #pragma GCC system_header
28 #include <_mingw.h>
29 
30 /*
31  * Public Interface for HID parsing library.
32  */
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include "ntddk.h"
39 #include "hidusage.h"
40 
41 #if defined(_HIDPI_)
42   #define HIDAPI DECLSPEC_EXPORT
43 #else
44   #define HIDAPI DECLSPEC_IMPORT
45 #endif
46 
47 typedef PUCHAR PHIDP_REPORT_DESCRIPTOR;
48 typedef struct _HIDP_PREPARSED_DATA * PHIDP_PREPARSED_DATA;
49 
50 typedef struct _HIDP_UNKNOWN_TOKEN {
51   UCHAR  Token;
52   UCHAR  Reserved[3];
53   ULONG  BitField;
54 } HIDP_UNKNOWN_TOKEN, *PHIDP_UNKNOWN_TOKEN;
55 
56 typedef enum _HIDP_KEYBOARD_DIRECTION {
57   HidP_Keyboard_Break,
58   HidP_Keyboard_Make
59 } HIDP_KEYBOARD_DIRECTION;
60 
61 typedef struct _HIDP_KEYBOARD_MODIFIER_STATE {
62   _ANONYMOUS_UNION union {
63     _ANONYMOUS_STRUCT struct {
64       ULONG  LeftControl : 1;
65       ULONG  LeftShift : 1;
66       ULONG  LeftAlt : 1;
67       ULONG  LeftGUI : 1;
68       ULONG  RightControl : 1;
69       ULONG  RightShift : 1;
70       ULONG  RightAlt : 1;
71       ULONG  RigthGUI : 1;
72       ULONG  CapsLock : 1;
73       ULONG  ScollLock : 1;
74       ULONG  NumLock : 1;
75       ULONG  Reserved : 21;
76     } DUMMYSTRUCTNAME;
77     ULONG ul;
78   } DUMMYUNIONNAME;
79 } HIDP_KEYBOARD_MODIFIER_STATE, *PHIDP_KEYBOARD_MODIFIER_STATE;
80 
81 typedef BOOLEAN (DDKAPI *PHIDP_INSERT_SCANCODES)(
82   /*IN*/ PVOID  Context,
83   /*IN*/ PCHAR  NewScanCodes,
84   /*IN*/ ULONG  Length);
85 
86 typedef struct _USAGE_AND_PAGE {
87   USAGE  Usage;
88   USAGE  UsagePage;
89 } USAGE_AND_PAGE, *PUSAGE_AND_PAGE;
90 
91 HIDAPI
92 NTSTATUS
93 DDKAPI
94 HidP_TranslateUsageAndPagesToI8042ScanCodes(
95   /*IN*/ PUSAGE_AND_PAGE  ChangedUsageList,
96   /*IN*/ ULONG  UsageListLength,
97   /*IN*/ HIDP_KEYBOARD_DIRECTION  KeyAction,
98   /*IN OUT*/ PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
99   /*IN*/ PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
100   /*IN*/ PVOID  InsertCodesContext);
101 
102 HIDAPI
103 NTSTATUS
104 DDKAPI
105 HidP_TranslateUsagesToI8042ScanCodes(
106   /*IN*/ PUSAGE  ChangedUsageList,
107   /*IN*/ ULONG  UsageListLength,
108   /*IN*/ HIDP_KEYBOARD_DIRECTION  KeyAction,
109   /*IN OUT*/ PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
110   /*IN*/ PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
111   /*IN*/ PVOID  InsertCodesContext);
112 
113 typedef struct _HIDP_BUTTON_CAPS {
114   USAGE  UsagePage;
115   UCHAR  ReportID;
116   BOOLEAN  IsAlias;
117   USHORT  BitField;
118   USHORT  LinkCollection;
119   USAGE  LinkUsage;
120   USAGE  LinkUsagePage;
121   BOOLEAN  IsRange;
122   BOOLEAN  IsStringRange;
123   BOOLEAN  IsDesignatorRange;
124   BOOLEAN  IsAbsolute;
125   ULONG  Reserved[10];
126   _ANONYMOUS_UNION union {
127     struct {
128       USAGE  UsageMin, UsageMax;
129       USHORT  StringMin, StringMax;
130       USHORT  DesignatorMin, DesignatorMax;
131       USHORT  DataIndexMin, DataIndexMax;
132     } Range;
133     struct  {
134        USAGE  Usage, Reserved1;
135        USHORT  StringIndex, Reserved2;
136        USHORT  DesignatorIndex, Reserved3;
137        USHORT  DataIndex, Reserved4;
138     } NotRange;
139   } DUMMYUNIONNAME;
140 } HIDP_BUTTON_CAPS, *PHIDP_BUTTON_CAPS;
141 
142 typedef struct _HIDP_CAPS {
143   USAGE  Usage;
144   USAGE  UsagePage;
145   USHORT  InputReportByteLength;
146   USHORT  OutputReportByteLength;
147   USHORT  FeatureReportByteLength;
148   USHORT  Reserved[17];
149   USHORT  NumberLinkCollectionNodes;
150   USHORT  NumberInputButtonCaps;
151   USHORT  NumberInputValueCaps;
152   USHORT  NumberInputDataIndices;
153   USHORT  NumberOutputButtonCaps;
154   USHORT  NumberOutputValueCaps;
155   USHORT  NumberOutputDataIndices;
156   USHORT  NumberFeatureButtonCaps;
157   USHORT  NumberFeatureValueCaps;
158   USHORT  NumberFeatureDataIndices;
159 } HIDP_CAPS, *PHIDP_CAPS;
160 
161 typedef struct _HIDP_DATA {
162   USHORT  DataIndex;
163   USHORT  Reserved;
164   _ANONYMOUS_UNION union {
165     ULONG  RawValue;
166     BOOLEAN  On;
167   }  DUMMYUNIONNAME;
168 } HIDP_DATA, *PHIDP_DATA;
169 
170 typedef struct _HIDP_EXTENDED_ATTRIBUTES {
171   UCHAR  NumGlobalUnknowns;
172   UCHAR  Reserved[3];
173   PHIDP_UNKNOWN_TOKEN  GlobalUnknowns;
174   ULONG  Data[1];
175 } HIDP_EXTENDED_ATTRIBUTES, *PHIDP_EXTENDED_ATTRIBUTES;
176 
177 #define HIDP_LINK_COLLECTION_ROOT         ((USHORT) -1)
178 #define HIDP_LINK_COLLECTION_UNSPECIFIED  ((USHORT) 0)
179 
180 typedef struct _HIDP_LINK_COLLECTION_NODE {
181   USAGE  LinkUsage;
182   USAGE  LinkUsagePage;
183   USHORT  Parent;
184   USHORT  NumberOfChildren;
185   USHORT  NextSibling;
186   USHORT  FirstChild;
187   ULONG  CollectionType: 8;
188   ULONG  IsAlias: 1;
189   ULONG  Reserved: 23;
190   PVOID  UserContext;
191 } HIDP_LINK_COLLECTION_NODE, *PHIDP_LINK_COLLECTION_NODE;
192 
193 typedef struct _HIDP_VALUE_CAPS {
194   USAGE  UsagePage;
195   UCHAR  ReportID;
196   BOOLEAN  IsAlias;
197   USHORT  BitField;
198   USHORT  LinkCollection;
199   USAGE  LinkUsage;
200   USAGE  LinkUsagePage;
201   BOOLEAN  IsRange;
202   BOOLEAN  IsStringRange;
203   BOOLEAN  IsDesignatorRange;
204   BOOLEAN  IsAbsolute;
205   BOOLEAN  HasNull;
206   UCHAR  Reserved;
207   USHORT  BitSize;
208   USHORT  ReportCount;
209   USHORT  Reserved2[5];
210   ULONG  UnitsExp;
211   ULONG  Units;
212   LONG  LogicalMin, LogicalMax;
213   LONG  PhysicalMin, PhysicalMax;
214     _ANONYMOUS_UNION union {
215       struct {
216         USAGE  UsageMin, UsageMax;
217         USHORT  StringMin, StringMax;
218         USHORT  DesignatorMin, DesignatorMax;
219         USHORT  DataIndexMin, DataIndexMax;
220       } Range;
221       struct {
222         USAGE  Usage, Reserved1;
223         USHORT  StringIndex, Reserved2;
224         USHORT  DesignatorIndex, Reserved3;
225         USHORT  DataIndex, Reserved4;
226       } NotRange;
227     } DUMMYUNIONNAME;
228 } HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS;
229 
230 typedef enum _HIDP_REPORT_TYPE {
231   HidP_Input,
232   HidP_Output,
233   HidP_Feature
234 } HIDP_REPORT_TYPE;
235 
236 #define FACILITY_HID_ERROR_CODE           0x11
237 
238 #define HIDP_ERROR_CODES(SEV, CODE) \
239   ((NTSTATUS) (((SEV) << 28) | (FACILITY_HID_ERROR_CODE << 16) | (CODE)))
240 
241 #define HIDP_STATUS_SUCCESS                 (HIDP_ERROR_CODES(0x0, 0))
242 #define HIDP_STATUS_NULL                    (HIDP_ERROR_CODES(0x8, 1))
243 #define HIDP_STATUS_INVALID_PREPARSED_DATA  (HIDP_ERROR_CODES(0xC, 1))
244 #define HIDP_STATUS_INVALID_REPORT_TYPE     (HIDP_ERROR_CODES(0xC, 2))
245 #define HIDP_STATUS_INVALID_REPORT_LENGTH   (HIDP_ERROR_CODES(0xC, 3))
246 #define HIDP_STATUS_USAGE_NOT_FOUND         (HIDP_ERROR_CODES(0xC, 4))
247 #define HIDP_STATUS_VALUE_OUT_OF_RANGE      (HIDP_ERROR_CODES(0xC, 5))
248 #define HIDP_STATUS_BAD_LOG_PHY_VALUES      (HIDP_ERROR_CODES(0xC, 6))
249 #define HIDP_STATUS_BUFFER_TOO_SMALL        (HIDP_ERROR_CODES(0xC, 7))
250 #define HIDP_STATUS_INTERNAL_ERROR          (HIDP_ERROR_CODES(0xC, 8))
251 #define HIDP_STATUS_I8042_TRANS_UNKNOWN     (HIDP_ERROR_CODES(0xC, 9))
252 #define HIDP_STATUS_INCOMPATIBLE_REPORT_ID  (HIDP_ERROR_CODES(0xC, 0xA))
253 #define HIDP_STATUS_NOT_VALUE_ARRAY         (HIDP_ERROR_CODES(0xC, 0xB))
254 #define HIDP_STATUS_IS_VALUE_ARRAY          (HIDP_ERROR_CODES(0xC, 0xC))
255 #define HIDP_STATUS_DATA_INDEX_NOT_FOUND    (HIDP_ERROR_CODES(0xC, 0xD))
256 #define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE (HIDP_ERROR_CODES(0xC, 0xE))
257 #define HIDP_STATUS_BUTTON_NOT_PRESSED      (HIDP_ERROR_CODES(0xC, 0xF))
258 #define HIDP_STATUS_REPORT_DOES_NOT_EXIST   (HIDP_ERROR_CODES(0xC, 0x10))
259 #define HIDP_STATUS_NOT_IMPLEMENTED         (HIDP_ERROR_CODES(0xC, 0x20))
260 #define HIDP_STATUS_I8242_TRANS_UNKNOWN     HIDP_STATUS_I8042_TRANS_UNKNOWN
261 
262 
263 
264 /*
265  * NTSTATUS
266  * HidP_GetButtonCaps(
267  * IN HIDP_REPORT_TYPE  ReportType,
268  * OUT PHIDP_BUTTON_CAPS  ButtonCaps,
269  * IN OUT PULONG  ButtonCapsLength,
270  * IN PHIDP_PREPARSED_DATA  PreparsedData);
271  */
272 #define HidP_GetButtonCaps(_Type_, _Caps_, _Len_, _Data_) \
273   HidP_GetSpecificButtonCaps(_Type_, 0, 0, 0, _Caps_, _Len_, _Data_)
274 
275 /*
276  * NTSTATUS
277  * HidP_GetButtons(
278  * IN HIDP_REPORT_TYPE  ReportType,
279  * IN USAGE  UsagePage,
280  * IN USHORT  LinkCollection,
281  * OUT USAGE  *UsageList,
282  * IN OUT ULONG  *UsageLength,
283  * IN PHIDP_PREPARSED_DATA  PreparsedData,
284  * IN PCHAR  Report,
285  * IN ULONG  ReportLength);
286  */
287 #define HidP_GetButtons(Rty, UPa, LCo, ULi, ULe, Ppd, Rep, RLe) \
288   HidP_GetUsages(Rty, UPa, LCo, ULi, ULe, Ppd, Rep, RLe)
289 
290 #define HidP_GetButtonListLength(RTy, UPa, Ppd) \
291   HidP_GetUsageListLength(Rty, UPa, Ppd)
292 
293 
294 /*
295  * NTSTATUS
296  * HidP_GetButtonsEx(
297  * IN HIDP_REPORT_TYPE  ReportType,
298  * IN USHORT  LinkCollection,
299  * OUT PUSAGE_AND_PAGE  ButtonList,
300  * IN OUT ULONG  *UsageLength,
301  * IN PHIDP_PREPARSED_DATA  PreparsedData,
302  * IN PCHAR  Report,
303  * IN ULONG  ReportLength);
304  */
305 #define HidP_GetButtonsEx(RT, LC, BL, UL, PD, R, RL)  \
306   HidP_GetUsagesEx(RT, LC, BL, UL, PD, R, RL)
307 
308 HIDAPI
309 NTSTATUS
310 DDKAPI
311 HidP_GetCaps(
312   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
313   /*OUT*/ PHIDP_CAPS  Capabilities);
314 
315 HIDAPI
316 NTSTATUS
317 DDKAPI
318 HidP_GetData(
319   /*IN*/ HIDP_REPORT_TYPE  ReportType,
320   /*OUT*/ PHIDP_DATA  DataList,
321   /*IN OUT*/ PULONG  DataLength,
322   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
323   /*IN*/ PCHAR  Report,
324   /*IN*/ ULONG  ReportLength);
325 
326 HIDAPI
327 NTSTATUS
328 DDKAPI
329 HidP_GetExtendedAttributes(
330   /*IN*/ HIDP_REPORT_TYPE  ReportType,
331   /*IN*/ USHORT  DataIndex,
332   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
333   /*OUT*/ PHIDP_EXTENDED_ATTRIBUTES  Attributes,
334   /*IN OUT*/ PULONG  LengthAttributes);
335 
336 HIDAPI
337 NTSTATUS
338 DDKAPI
339 HidP_GetLinkCollectionNodes(
340   /*OUT*/ PHIDP_LINK_COLLECTION_NODE  LinkCollectionNodes,
341   /*IN OUT*/ PULONG  LinkCollectionNodesLength,
342   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData);
343 
344 HIDAPI
345 NTSTATUS
346 DDKAPI
347 HidP_GetScaledUsageValue(
348   /*IN*/ HIDP_REPORT_TYPE  ReportType,
349   /*IN*/ USAGE  UsagePage,
350   /*IN*/ USHORT  LinkCollection  /*OPTIONAL*/,
351   /*IN*/ USAGE  Usage,
352   /*OUT*/ PLONG  UsageValue,
353   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
354   /*IN*/ PCHAR  Report,
355   /*IN*/ ULONG  ReportLength);
356 
357 HIDAPI
358 NTSTATUS
359 DDKAPI
360 HidP_GetSpecificButtonCaps(
361   /*IN*/ HIDP_REPORT_TYPE  ReportType,
362   /*IN*/ USAGE  UsagePage,
363   /*IN*/ USHORT  LinkCollection,
364   /*IN*/ USAGE  Usage,
365   /*OUT*/ PHIDP_BUTTON_CAPS  ButtonCaps,
366   /*IN OUT*/ PULONG  ButtonCapsLength,
367   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData);
368 
369 HIDAPI
370 NTSTATUS
371 DDKAPI
372 HidP_GetSpecificValueCaps(
373   /*IN*/ HIDP_REPORT_TYPE  ReportType,
374   /*IN*/ USAGE  UsagePage,
375   /*IN*/ USHORT  LinkCollection,
376   /*IN*/ USAGE  Usage,
377   /*OUT*/ PHIDP_VALUE_CAPS  ValueCaps,
378   /*IN OUT*/ PULONG  ValueCapsLength,
379   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData);
380 
381 HIDAPI
382 NTSTATUS
383 DDKAPI
384 HidP_GetUsages(
385   /*IN*/ HIDP_REPORT_TYPE  ReportType,
386   /*IN*/ USAGE  UsagePage,
387   /*IN*/ USHORT  LinkCollection  /*OPTIONAL*/,
388   /*OUT*/ USAGE  *UsageList,
389   /*IN OUT*/ ULONG  *UsageLength,
390   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
391   /*IN*/ PCHAR  Report,
392   /*IN*/ ULONG  ReportLength);
393 
394 HIDAPI
395 NTSTATUS
396 DDKAPI
397 HidP_GetUsagesEx(
398   /*IN*/ HIDP_REPORT_TYPE  ReportType,
399   /*IN*/ USHORT  LinkCollection,
400   /*OUT*/ PUSAGE_AND_PAGE  ButtonList,
401   /*IN OUT*/ ULONG  *UsageLength,
402   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
403   /*IN*/ PCHAR  Report,
404   /*IN*/ ULONG  ReportLength);
405 
406 HIDAPI
407 NTSTATUS
408 DDKAPI
409 HidP_GetUsageValue(
410   /*IN*/ HIDP_REPORT_TYPE  ReportType,
411   /*IN*/ USAGE  UsagePage,
412   /*IN*/ USHORT  LinkCollection,
413   /*IN*/ USAGE  Usage,
414   /*OUT*/ PULONG  UsageValue,
415   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
416   /*IN*/ PCHAR  Report,
417   /*IN*/ ULONG  ReportLength);
418 
419 HIDAPI
420 NTSTATUS
421 DDKAPI
422 HidP_GetUsageValueArray(
423   /*IN*/ HIDP_REPORT_TYPE  ReportType,
424   /*IN*/ USAGE  UsagePage,
425   /*IN*/ USHORT  LinkCollection  /*OPTIONAL*/,
426   /*IN*/ USAGE  Usage,
427   /*OUT*/ PCHAR  UsageValue,
428   /*IN*/ USHORT  UsageValueByteLength,
429   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
430   /*IN*/ PCHAR  Report,
431   /*IN*/ ULONG  ReportLength);
432 
433 /*
434  * NTSTATUS
435  * HidP_GetValueCaps(
436  * IN HIDP_REPORT_TYPE  ReportType,
437  * OUT PHIDP_VALUE_CAPS  ValueCaps,
438  * IN OUT PULONG  ValueCapsLength,
439  * IN PHIDP_PREPARSED_DATA  PreparsedData);
440  */
441 #define HidP_GetValueCaps(_Type_, _Caps_, _Len_, _Data_) \
442   HidP_GetSpecificValueCaps (_Type_, 0, 0, 0, _Caps_, _Len_, _Data_)
443 
444 HIDAPI
445 NTSTATUS
446 DDKAPI
447 HidP_InitializeReportForID(
448   /*IN*/ HIDP_REPORT_TYPE  ReportType,
449   /*IN*/ UCHAR  ReportID,
450   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
451   /*IN OUT*/ PCHAR  Report,
452   /*IN*/ ULONG  ReportLength);
453 
454 /*
455  * BOOLEAN
456  * HidP_IsSameUsageAndPage(
457  *   USAGE_AND_PAGE  u1,
458  *   USAGE_AND_PAGE  u2);
459  */
460 #define HidP_IsSameUsageAndPage(u1, u2) ((* (PULONG) &u1) == (* (PULONG) &u2))
461 
462 HIDAPI
463 ULONG
464 DDKAPI
465 HidP_MaxDataListLength(
466   /*IN*/ HIDP_REPORT_TYPE  ReportType,
467   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData);
468 
469 HIDAPI
470 ULONG
471 DDKAPI
472 HidP_MaxUsageListLength(
473   /*IN*/ HIDP_REPORT_TYPE  ReportType,
474   /*IN*/ USAGE  UsagePage  /*OPTIONAL*/,
475   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData);
476 
477 /*
478  * NTSTATUS
479  * HidP_SetButtons(
480  * IN HIDP_REPORT_TYPE  ReportType,
481  * IN USAGE  UsagePage,
482  * IN USHORT  LinkCollection,
483  * IN PUSAGE  UsageList,
484  * IN OUT PULONG  UsageLength,
485  * IN PHIDP_PREPARSED_DATA  PreparsedData,
486  * IN OUT PCHAR  Report,
487  * IN ULONG  ReportLength);
488  */
489 #define HidP_SetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \
490   HidP_SetUsages(RT, UP, LC, UL1, UL2, PD, R, RL)
491 
492 HIDAPI
493 NTSTATUS
494 DDKAPI
495 HidP_SetData(
496   /*IN*/ HIDP_REPORT_TYPE  ReportType,
497   /*IN*/ PHIDP_DATA  DataList,
498   /*IN OUT*/ PULONG  DataLength,
499   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
500   /*IN OUT*/ PCHAR  Report,
501   /*IN*/ ULONG  ReportLength);
502 
503 HIDAPI
504 NTSTATUS
505 DDKAPI
506 HidP_SetScaledUsageValue(
507   /*IN*/ HIDP_REPORT_TYPE  ReportType,
508   /*IN*/ USAGE  UsagePage,
509   /*IN*/ USHORT  LinkCollection  /*OPTIONAL*/,
510   /*IN*/ USAGE  Usage,
511   /*IN*/ LONG  UsageValue,
512   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
513   /*IN OUT*/ PCHAR  Report,
514   /*IN*/ ULONG  ReportLength);
515 
516 HIDAPI
517 NTSTATUS
518 DDKAPI
519 HidP_SetUsages(
520   /*IN*/ HIDP_REPORT_TYPE  ReportType,
521   /*IN*/ USAGE  UsagePage,
522   /*IN*/ USHORT  LinkCollection /*OPTIONAL*/,
523   /*IN*/ PUSAGE  UsageList,
524   /*IN OUT*/ PULONG  UsageLength,
525   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
526   /*IN OUT*/ PCHAR  Report,
527   /*IN*/ ULONG  ReportLength);
528 
529 HIDAPI
530 NTSTATUS
531 DDKAPI
532 HidP_SetUsageValue(
533   /*IN*/ HIDP_REPORT_TYPE  ReportType,
534   /*IN*/ USAGE  UsagePage,
535   /*IN*/ USHORT  LinkCollection,
536   /*IN*/ USAGE  Usage,
537   /*IN*/ ULONG  UsageValue,
538   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
539   /*IN OUT*/ PCHAR  Report,
540   /*IN*/ ULONG  ReportLength);
541 
542 HIDAPI
543 NTSTATUS
544 DDKAPI
545 HidP_SetUsageValueArray(
546   /*IN*/ HIDP_REPORT_TYPE  ReportType,
547   /*IN*/ USAGE  UsagePage,
548   /*IN*/ USHORT  LinkCollection  /*OPTIONAL*/,
549   /*IN*/ USAGE  Usage,
550   /*IN*/ PCHAR  UsageValue,
551   /*IN*/ USHORT  UsageValueByteLength,
552   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
553   /*OUT*/ PCHAR  Report,
554   /*IN*/ ULONG  ReportLength);
555 
556 /*
557  * NTSTATUS
558  * HidP_UnsetButtons(
559  * IN HIDP_REPORT_TYPE  ReportType,
560  * IN USAGE  UsagePage,
561  * IN USHORT  LinkCollection,
562  * IN PUSAGE  UsageList,
563  * IN OUT PULONG  UsageLength,
564  * IN PHIDP_PREPARSED_DATA  PreparsedData,
565  * IN OUT PCHAR  Report,
566  * IN ULONG  ReportLength);
567  */
568 #define HidP_UnsetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \
569   HidP_UnsetUsages(RT, UP, LC, UL1, UL2, PD, R, RL)
570 
571 HIDAPI
572 NTSTATUS
573 DDKAPI
574 HidP_UnsetUsages(
575   /*IN*/ HIDP_REPORT_TYPE  ReportType,
576   /*IN*/ USAGE  UsagePage,
577   /*IN*/ USHORT  LinkCollection,
578   /*IN*/ PUSAGE  UsageList,
579   /*IN OUT*/ PULONG  UsageLength,
580   /*IN*/ PHIDP_PREPARSED_DATA  PreparsedData,
581   /*IN OUT*/ PCHAR  Report,
582   /*IN*/ ULONG  ReportLength);
583 
584 HIDAPI
585 NTSTATUS
586 DDKAPI
587 HidP_UsageAndPageListDifference(
588   /*IN*/ PUSAGE_AND_PAGE  PreviousUsageList,
589   /*IN*/ PUSAGE_AND_PAGE  CurrentUsageList,
590   /*OUT*/ PUSAGE_AND_PAGE  BreakUsageList,
591   /*OUT*/ PUSAGE_AND_PAGE  MakeUsageList,
592   /*IN*/ ULONG  UsageListLength);
593 
594 HIDAPI
595 NTSTATUS
596 DDKAPI
597 HidP_UsageListDifference(
598   /*IN*/ PUSAGE  PreviousUsageList,
599   /*IN*/ PUSAGE  CurrentUsageList,
600   /*OUT*/ PUSAGE  BreakUsageList,
601   /*OUT*/ PUSAGE  MakeUsageList,
602   /*IN*/ ULONG  UsageListLength);
603 
604 #ifdef __cplusplus
605 }
606 #endif
607 
608 #endif /* __HIDPI_H */
609