]> git.zerfleddert.de Git - proxmark3-svn/blame - winsrc/include/hidpi.h
Add checks in em4x50read to avoid segfaults in case loops go over the GraphTraceLen.
[proxmark3-svn] / winsrc / include / hidpi.h
CommitLineData
6658905f 1/*++\r
2\r
3Copyright (c) 1996-1998 Microsoft Corporation\r
4\r
5Module Name:\r
6\r
7 HIDPI.H\r
8\r
9Abstract:\r
10\r
11 Public Interface to the HID parsing library.\r
12\r
13Environment:\r
14\r
15 Kernel & user mode\r
16\r
17--*/\r
18\r
19#ifndef __HIDPI_H__\r
20#define __HIDPI_H__\r
21\r
22#include <pshpack4.h>\r
23\r
24// Please include "hidsdi.h" to use the user space (dll / parser)\r
25// Please include "hidpddi.h" to use the kernel space parser\r
26\r
27//\r
28// Special Link collection values for using the query functions\r
29//\r
30// Root collection references the collection at the base of the link\r
31// collection tree.\r
32// Unspecifies, references all collections in the link collection tree.\r
33//\r
34#define HIDP_LINK_COLLECTION_ROOT ((USHORT) -1)\r
35#define HIDP_LINK_COLLECTION_UNSPECIFIED ((USHORT) 0)\r
36\r
37\r
38typedef enum _HIDP_REPORT_TYPE\r
39{\r
40 HidP_Input,\r
41 HidP_Output,\r
42 HidP_Feature\r
43} HIDP_REPORT_TYPE;\r
44\r
45typedef struct _USAGE_AND_PAGE\r
46{\r
47 USAGE Usage;\r
48 USAGE UsagePage;\r
49} USAGE_AND_PAGE, *PUSAGE_AND_PAGE;\r
50\r
51#define HidP_IsSameUsageAndPage(u1, u2) ((* (PULONG) &u1) == (* (PULONG) &u2))\r
52\r
53typedef struct _HIDP_BUTTON_CAPS\r
54{\r
55 USAGE UsagePage;\r
56 UCHAR ReportID;\r
57 BOOLEAN IsAlias;\r
58\r
59 USHORT BitField;\r
60 USHORT LinkCollection; // A unique internal index pointer\r
61\r
62 USAGE LinkUsage;\r
63 USAGE LinkUsagePage;\r
64\r
65 BOOLEAN IsRange;\r
66 BOOLEAN IsStringRange;\r
67 BOOLEAN IsDesignatorRange;\r
68 BOOLEAN IsAbsolute;\r
69\r
70 ULONG Reserved[10];\r
71 union {\r
72 struct {\r
73 USAGE UsageMin, UsageMax;\r
74 USHORT StringMin, StringMax;\r
75 USHORT DesignatorMin, DesignatorMax;\r
76 USHORT DataIndexMin, DataIndexMax;\r
77 } Range;\r
78 struct {\r
79 USAGE Usage, Reserved1;\r
80 USHORT StringIndex, Reserved2;\r
81 USHORT DesignatorIndex, Reserved3;\r
82 USHORT DataIndex, Reserved4;\r
83 } NotRange;\r
84 };\r
85\r
86} HIDP_BUTTON_CAPS, *PHIDP_BUTTON_CAPS;\r
87\r
88\r
89typedef struct _HIDP_VALUE_CAPS\r
90{\r
91 USAGE UsagePage;\r
92 UCHAR ReportID;\r
93 BOOLEAN IsAlias;\r
94\r
95 USHORT BitField;\r
96 USHORT LinkCollection; // A unique internal index pointer\r
97\r
98 USAGE LinkUsage;\r
99 USAGE LinkUsagePage;\r
100\r
101 BOOLEAN IsRange;\r
102 BOOLEAN IsStringRange;\r
103 BOOLEAN IsDesignatorRange;\r
104 BOOLEAN IsAbsolute;\r
105\r
106 BOOLEAN HasNull; // Does this channel have a null report union\r
107 UCHAR Reserved;\r
108 USHORT BitSize; // How many bits are devoted to this value?\r
109\r
110 USHORT ReportCount; // See Note below. Usually set to 1.\r
111 USHORT Reserved2[5];\r
112\r
113 ULONG UnitsExp;\r
114 ULONG Units;\r
115\r
116 LONG LogicalMin, LogicalMax;\r
117 LONG PhysicalMin, PhysicalMax;\r
118\r
119 union {\r
120 struct {\r
121 USAGE UsageMin, UsageMax;\r
122 USHORT StringMin, StringMax;\r
123 USHORT DesignatorMin, DesignatorMax;\r
124 USHORT DataIndexMin, DataIndexMax;\r
125 } Range;\r
126\r
127 struct {\r
128 USAGE Usage, Reserved1;\r
129 USHORT StringIndex, Reserved2;\r
130 USHORT DesignatorIndex, Reserved3;\r
131 USHORT DataIndex, Reserved4;\r
132 } NotRange;\r
133 };\r
134} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS;\r
135\r
136//\r
137// Notes:\r
138//\r
139// ReportCount: When a report descriptor declares an Input, Output, or\r
140// Feature main item with fewer usage declarations than the report count, then\r
141// the last usage applies to all remaining unspecified count in that main item.\r
142// (As an example you might have data that required many fields to describe,\r
143// possibly buffered bytes.) In this case, only one value cap structure is\r
144// allocated for these associtated fields, all with the same usage, and Report\r
145// Count reflects the number of fields involved. Normally ReportCount is 1.\r
146// To access all of the fields in such a value structure would require using\r
147// HidP_GetUsageValueArray and HidP_SetUsageValueArray. HidP_GetUsageValue/\r
148// HidP_SetScaledUsageValue will also work, however, these functions will only\r
149// work with the first field of the structure.\r
150//\r
151\r
152//\r
153// The link collection tree consists of an array of LINK_COLLECTION_NODES\r
154// where the index into this array is the same as the collection number.\r
155//\r
156// Given a collection A which contains a subcollection B, A is defined to be\r
157// the parent B, and B is defined to be the child.\r
158//\r
159// Given collections A, B, and C where B and C are children of A, and B was\r
160// encountered before C in the report descriptor, B is defined as a sibling of\r
161// C. (This implies, of course, that if B is a sibling of C, then C is NOT a\r
162// sibling of B).\r
163//\r
164// B is defined as the NextSibling of C if and only if there exists NO\r
165// child collection of A, call it D, such that B is a sibling of D and D\r
166// is a sibling of C.\r
167//\r
168// E is defined to be the FirstChild of A if and only if for all children of A,\r
169// F, that are not equivalent to E, F is a sibling of E.\r
170// (This implies, of course, that the does not exist a child of A, call it G,\r
171// where E is a sibling of G). In other words the first sibling is the last\r
172// link collection found in the list.\r
173//\r
174// In other words, if a collection B is defined within the definition of another\r
175// collection A, B becomes a child of A. All collections with the same parent\r
176// are considered siblings. The FirstChild of the parent collection, A, will be\r
177// last collection defined that has A as a parent. The order of sibling pointers\r
178// is similarly determined. When a collection B is defined, it becomes the\r
179// FirstChild of it's parent collection. The previously defined FirstChild of the\r
180// parent collection becomes the NextSibling of the new collection. As new\r
181// collections with the same parent are discovered, the chain of sibling is built.\r
182//\r
183// With that in mind, the following describes conclusively a data structure\r
184// that provides direct traversal up, down, and accross the link collection\r
185// tree.\r
186//\r
187//\r
188typedef struct _HIDP_LINK_COLLECTION_NODE\r
189{\r
190 USAGE LinkUsage;\r
191 USAGE LinkUsagePage;\r
192 USHORT Parent;\r
193 USHORT NumberOfChildren;\r
194 USHORT NextSibling;\r
195 USHORT FirstChild;\r
196 ULONG CollectionType: 8; // As defined in 6.2.2.6 of HID spec\r
197 ULONG IsAlias : 1; // This link node is an allias of the next link node.\r
198 ULONG Reserved: 23;\r
199 PVOID UserContext; // The user can hang his coat here.\r
200} HIDP_LINK_COLLECTION_NODE, *PHIDP_LINK_COLLECTION_NODE;\r
201\r
202//\r
203// When a link collection is described by a delimiter, alias link collection\r
204// nodes are created. (One for each usage within the delimiter).\r
205// The parser assigns each capability description listed above only one\r
206// link collection.\r
207//\r
208// If a control is defined within a collection defined by\r
209// delimited usages, then that control is said to be within multiple link\r
210// collections, one for each usage within the open and close delimiter tokens.\r
211// Such multiple link collecions are said to be aliases. The first N-1 such\r
212// collections, listed in the link collection node array, have their IsAlias\r
213// bit set. The last such link collection is the link collection index used\r
214// in the capabilities described above.\r
215// Clients wishing to set a control in an aliased collection, should walk the\r
216// collection array once for each time they see the IsAlias flag set, and use\r
217// the last link collection as the index for the below accessor functions.\r
218//\r
219// NB: if IsAlias is set, then NextSibling should be one more than the current\r
220// link collection node index.\r
221//\r
222\r
223typedef PUCHAR PHIDP_REPORT_DESCRIPTOR;\r
224typedef struct _HIDP_PREPARSED_DATA * PHIDP_PREPARSED_DATA;\r
225\r
226typedef struct _HIDP_CAPS\r
227{\r
228 USAGE Usage;\r
229 USAGE UsagePage;\r
230 USHORT InputReportByteLength;\r
231 USHORT OutputReportByteLength;\r
232 USHORT FeatureReportByteLength;\r
233 USHORT Reserved[17];\r
234\r
235 USHORT NumberLinkCollectionNodes;\r
236\r
237 USHORT NumberInputButtonCaps;\r
238 USHORT NumberInputValueCaps;\r
239 USHORT NumberInputDataIndices;\r
240\r
241 USHORT NumberOutputButtonCaps;\r
242 USHORT NumberOutputValueCaps;\r
243 USHORT NumberOutputDataIndices;\r
244\r
245 USHORT NumberFeatureButtonCaps;\r
246 USHORT NumberFeatureValueCaps;\r
247 USHORT NumberFeatureDataIndices;\r
248} HIDP_CAPS, *PHIDP_CAPS;\r
249\r
250typedef struct _HIDP_DATA\r
251{\r
252 USHORT DataIndex;\r
253 USHORT Reserved;\r
254 union {\r
255 ULONG RawValue; // for values\r
256 BOOLEAN On; // for buttons MUST BE TRUE for buttons.\r
257 };\r
258} HIDP_DATA, *PHIDP_DATA;\r
259//\r
260// The HIDP_DATA structure is used with HidP_GetData and HidP_SetData\r
261// functions.\r
262//\r
263// The parser contiguously assigns every control (button or value) in a hid\r
264// device a unique data index from zero to NumberXXXDataIndices -1 , inclusive.\r
265// This value is found in the HIDP_BUTTON_CAPS and HIDP_VALUE_CAPS structures.\r
266//\r
267// Most clients will find the Get/Set Buttons / Value accessor functions\r
268// sufficient to their needs, as they will allow the clients to access the\r
269// data known to them while ignoring the other controls.\r
270//\r
271// More complex clients, which actually read the Button / Value Caps, and which\r
272// do a value add service to these routines (EG Direct Input), will need to\r
273// access all the data in the device without interest in the individual usage\r
274// or link collection location. These are the clients that will find\r
275// HidP_Data useful.\r
276//\r
277\r
278typedef struct _HIDP_UNKNOWN_TOKEN\r
279{\r
280 UCHAR Token;\r
281 UCHAR Reserved[3];\r
282 ULONG BitField;\r
283} HIDP_UNKNOWN_TOKEN, *PHIDP_UNKNOWN_TOKEN;\r
284\r
285typedef struct _HIDP_EXTENDED_ATTRIBUTES\r
286{\r
287 UCHAR NumGlobalUnknowns;\r
288 UCHAR Reserved [3];\r
289 PHIDP_UNKNOWN_TOKEN GlobalUnknowns;\r
290 // ... Additional attributes\r
291 ULONG Data [1]; // variableLength DO NOT ACCESS THIS FIELD\r
292} HIDP_EXTENDED_ATTRIBUTES, *PHIDP_EXTENDED_ATTRIBUTES;\r
293\r
294NTSTATUS __stdcall\r
295HidP_GetCaps (\r
296 IN PHIDP_PREPARSED_DATA PreparsedData,\r
297 OUT PHIDP_CAPS Capabilities\r
298 );\r
299/*++\r
300Routine Description:\r
301 Returns a list of capabilities of a given hid device as described by its\r
302 preparsed data.\r
303\r
304Arguments:\r
305 PreparsedData The preparsed data returned from HIDCLASS.\r
306 Capabilities a HIDP_CAPS structure\r
307\r
308Return Value:\r
309