winapi_ui_automation/shared/
hidpi.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6use shared::hidusage::{PUSAGE, USAGE};
7use shared::minwindef::{PUCHAR, PULONG, PUSHORT, UCHAR, ULONG, USHORT};
8use shared::ntdef::NTSTATUS;
9use shared::ntstatus::FACILITY_HID_ERROR_CODE;
10use um::winnt::{BOOLEAN, LONG, PCHAR, PLONG, PVOID};
11pub const HIDP_LINK_COLLECTION_ROOT: USHORT = -1i16 as u16;
12pub const HIDP_LINK_COLLECTION_UNSPECIFIED: USHORT = 0;
13ENUM!{enum HIDP_REPORT_TYPE {
14    HidP_Input,
15    HidP_Output,
16    HidP_Feature,
17}}
18STRUCT!{struct USAGE_AND_PAGE {
19    Usage: USAGE,
20    UsagePage: USAGE,
21}}
22pub type PUSAGE_AND_PAGE = *mut USAGE_AND_PAGE;
23// HidP_IsSameUsageAndPage
24STRUCT!{struct HIDP_CAPS_Range {
25    UsageMin: USAGE,
26    UsageMax: USAGE,
27    StringMin: USHORT,
28    StringMax: USHORT,
29    DesignatorMin: USHORT,
30    DesignatorMax: USHORT,
31    DataIndexMin: USHORT,
32    DataIndexMax: USHORT,
33}}
34STRUCT!{struct HIDP_CAPS_NotRange {
35    Usage: USAGE,
36    Reserved1: USAGE,
37    StringIndex: USHORT,
38    Reserved2: USHORT,
39    DesignatorIndex: USHORT,
40    Reserved3: USHORT,
41    DataIndex: USHORT,
42    Reserved4: USHORT,
43}}
44UNION!{union HIDP_CAPS_u {
45    [u16; 8],
46    Range Range_mut: HIDP_CAPS_Range,
47    NotRange NotRange_mut: HIDP_CAPS_NotRange,
48}}
49STRUCT!{struct HIDP_BUTTON_CAPS {
50    UsagePage: USAGE,
51    ReportID: UCHAR,
52    IsAlias: BOOLEAN,
53    BitField: USHORT,
54    LinkCollection: USHORT,
55    LinkUsage: USAGE,
56    LinkUsagePage: USAGE,
57    IsRange: BOOLEAN,
58    IsStringRange: BOOLEAN,
59    IsDesignatorRange: BOOLEAN,
60    IsAbsolute: BOOLEAN,
61    Reserved: [ULONG; 10],
62    u: HIDP_CAPS_u,
63}}
64pub type PHIDP_BUTTON_CAPS = *mut HIDP_BUTTON_CAPS;
65STRUCT!{struct HIDP_VALUE_CAPS {
66    UsagePage: USAGE,
67    ReportID: UCHAR,
68    IsAlias: BOOLEAN,
69    BitField: USHORT,
70    LinkCollection: USHORT,
71    LinkUsage: USAGE,
72    LinkUsagePage: USAGE,
73    IsRange: BOOLEAN,
74    IsStringRange: BOOLEAN,
75    IsDesignatorRange: BOOLEAN,
76    IsAbsolute: BOOLEAN,
77    HasNull: BOOLEAN,
78    Reserved: UCHAR,
79    BitSize: USHORT,
80    ReportCount: USHORT,
81    Reserved2: [USHORT; 5],
82    UnitsExp: ULONG,
83    Units: ULONG,
84    LogicalMin: LONG,
85    LogicalMax: LONG,
86    PhysicalMin: LONG,
87    PhysicalMax: LONG,
88    u: HIDP_CAPS_u,
89}}
90pub type PHIDP_VALUE_CAPS = *mut HIDP_VALUE_CAPS;
91STRUCT!{struct HIDP_LINK_COLLECTION_NODE {
92    LinkUsage: USAGE,
93    LinkUsagePage: USAGE,
94    Parent: USHORT,
95    NumberOfChildren: USHORT,
96    NextSibling: USHORT,
97    FirstChild: USHORT,
98    bit_fields: ULONG,
99    UserContext: PVOID,
100}}
101BITFIELD!{HIDP_LINK_COLLECTION_NODE bit_fields: ULONG [
102    CollectionType set_CollectionType[0..8],
103    IsAlias set_IsAlias[8..9],
104]}
105pub type PHIDP_LINK_COLLECTION_NODE = *mut HIDP_LINK_COLLECTION_NODE;
106pub type PHIDP_REPORT_DESCRIPTOR = PUCHAR;
107pub enum HIDP_PREPARSED_DATA {}
108pub type PHIDP_PREPARSED_DATA = *mut HIDP_PREPARSED_DATA;
109STRUCT!{struct HIDP_CAPS {
110    Usage: USAGE,
111    UsagePage: USAGE,
112    InputReportByteLength: USHORT,
113    OutputReportByteLength: USHORT,
114    FeatureReportByteLength: USHORT,
115    Reserved: [USHORT; 17],
116    NumberLinkCollectionNodes: USHORT,
117    NumberInputButtonCaps: USHORT,
118    NumberInputValueCaps: USHORT,
119    NumberInputDataIndices: USHORT,
120    NumberOutputButtonCaps: USHORT,
121    NumberOutputValueCaps: USHORT,
122    NumberOutputDataIndices: USHORT,
123    NumberFeatureButtonCaps: USHORT,
124    NumberFeatureValueCaps: USHORT,
125    NumberFeatureDataIndices: USHORT,
126}}
127pub type PHIDP_CAPS = *mut HIDP_CAPS;
128UNION!{union HIDP_DATA_u {
129    [u32; 1],
130    RawValue RawValue_mut: ULONG,
131    On On_mut: BOOLEAN,
132}}
133STRUCT!{struct HIDP_DATA {
134    DataIndex: USHORT,
135    Reserved: USHORT,
136    u: HIDP_DATA_u,
137}}
138pub type PHIDP_DATA = *mut HIDP_DATA;
139STRUCT!{struct HIDP_UNKNOWN_TOKEN {
140    Token: UCHAR,
141    Reserved: [UCHAR; 3],
142    BitField: ULONG,
143}}
144pub type PHIDP_UNKNOWN_TOKEN = *mut HIDP_UNKNOWN_TOKEN;
145STRUCT!{struct HIDP_EXTENDED_ATTRIBUTES {
146    NumGlobalUnknowns: UCHAR,
147    Reserved: [UCHAR; 3],
148    GlobalUnknowns: PHIDP_UNKNOWN_TOKEN,
149    Data: [ULONG; 1],
150}}
151pub type PHIDP_EXTENDED_ATTRIBUTES = *mut HIDP_EXTENDED_ATTRIBUTES;
152extern "system" {
153    pub fn HidP_GetCaps(
154        PreparsedData: PHIDP_PREPARSED_DATA,
155        Capabilities: PHIDP_CAPS,
156    ) -> NTSTATUS;
157    pub fn HidP_GetLinkCollectionNodes(
158        LinkCollectionNodes: PHIDP_LINK_COLLECTION_NODE,
159        LinkCollectionNodesLength: PULONG,
160        PreparsedData: PHIDP_PREPARSED_DATA,
161    ) -> NTSTATUS;
162    pub fn HidP_GetSpecificButtonCaps(
163        ReportType: HIDP_REPORT_TYPE,
164        UsagePage: USAGE,
165        LinkCollection: USHORT,
166        Usage: USAGE,
167        ButtonCaps: PHIDP_BUTTON_CAPS,
168        ButtonCapsLength: PUSHORT,
169        PreparsedData: PHIDP_PREPARSED_DATA,
170    ) -> NTSTATUS;
171    pub fn HidP_GetButtonCaps(
172        ReportType: HIDP_REPORT_TYPE,
173        ButtonCaps: PHIDP_BUTTON_CAPS,
174        ButtonCapsLength: PUSHORT,
175        PreparsedData: PHIDP_PREPARSED_DATA,
176    ) -> NTSTATUS;
177    pub fn HidP_GetSpecificValueCaps(
178        ReportType: HIDP_REPORT_TYPE,
179        UsagePage: USAGE,
180        LinkCollection: USHORT,
181        Usage: USAGE,
182        ValueCaps: PHIDP_VALUE_CAPS,
183        ValueCapsLength: PUSHORT,
184        PreparsedData: PHIDP_PREPARSED_DATA,
185    ) -> NTSTATUS;
186    pub fn HidP_GetValueCaps(
187        ReportType: HIDP_REPORT_TYPE,
188        ValueCaps: PHIDP_VALUE_CAPS,
189        ValueCapsLength: PUSHORT,
190        PreparsedData: PHIDP_PREPARSED_DATA,
191    ) -> NTSTATUS;
192    pub fn HidP_GetExtendedAttributes(
193        ReportType: HIDP_REPORT_TYPE,
194        DataIndex: USHORT,
195        PreparsedData: PHIDP_PREPARSED_DATA,
196        Attributes: PHIDP_EXTENDED_ATTRIBUTES,
197        LengthAttributes: PULONG,
198    ) -> NTSTATUS;
199    pub fn HidP_InitializeReportForID(
200        ReportType: HIDP_REPORT_TYPE,
201        ReportID: UCHAR,
202        PreparsedData: PHIDP_PREPARSED_DATA,
203        Report: PCHAR,
204        ReportLength: ULONG,
205    ) -> NTSTATUS;
206    pub fn HidP_SetData(
207        ReportType: HIDP_REPORT_TYPE,
208        DataList: PHIDP_DATA,
209        DataLength: PULONG,
210        PreparsedData: PHIDP_PREPARSED_DATA,
211        Report: PCHAR,
212        ReportLength: ULONG,
213    ) -> NTSTATUS;
214    pub fn HidP_GetData(
215        ReportType: HIDP_REPORT_TYPE,
216        DataList: PHIDP_DATA,
217        DataLength: PULONG,
218        PreparsedData: PHIDP_PREPARSED_DATA,
219        Report: PCHAR,
220        ReportLength: ULONG,
221    ) -> NTSTATUS;
222    pub fn HidP_MaxDataListLength(
223        ReportType: HIDP_REPORT_TYPE,
224        PreparsedData: PHIDP_PREPARSED_DATA,
225    ) -> ULONG;
226    pub fn HidP_SetUsages(
227        ReportType: HIDP_REPORT_TYPE,
228        UsagePage: USAGE,
229        LinkCollection: USHORT,
230        UsageList: PUSAGE,
231        UsageLength: PULONG,
232        PreparsedData: PHIDP_PREPARSED_DATA,
233        Report: PCHAR,
234        ReportLength: ULONG,
235    ) -> NTSTATUS;
236    pub fn HidP_UnsetUsages(
237        ReportType: HIDP_REPORT_TYPE,
238        UsagePage: USAGE,
239        LinkCollection: USHORT,
240        UsageList: PUSAGE,
241        UsageLength: PULONG,
242        PreparsedData: PHIDP_PREPARSED_DATA,
243        Report: PCHAR,
244        ReportLength: ULONG,
245    ) -> NTSTATUS;
246    pub fn HidP_GetUsages(
247        ReportType: HIDP_REPORT_TYPE,
248        UsagePage: USAGE,
249        LinkCollection: USHORT,
250        UsageList: PUSAGE,
251        UsageLength: PULONG,
252        PreparsedData: PHIDP_PREPARSED_DATA,
253        Report: PCHAR,
254        ReportLength: ULONG,
255    ) -> NTSTATUS;
256    pub fn HidP_GetUsagesEx(
257        ReportType: HIDP_REPORT_TYPE,
258        LinkCollection: USHORT,
259        ButtonList: PUSAGE_AND_PAGE,
260        UsageLength: *mut ULONG,
261        PreparsedData: PHIDP_PREPARSED_DATA,
262        Report: PCHAR,
263        ReportLength: ULONG,
264    ) -> NTSTATUS;
265    pub fn HidP_MaxUsageListLength(
266        ReportType: HIDP_REPORT_TYPE,
267        UsagePage: USAGE,
268        PreparsedData: PHIDP_PREPARSED_DATA,
269    ) -> ULONG;
270    pub fn HidP_SetUsageValue(
271        ReportType: HIDP_REPORT_TYPE,
272        UsagePage: USAGE,
273        LinkCollection: USHORT,
274        Usage: USAGE,
275        UsageValue: ULONG,
276        PreparsedData: PHIDP_PREPARSED_DATA,
277        Report: PCHAR,
278        ReportLength: ULONG,
279    ) -> NTSTATUS;
280    pub fn HidP_SetScaledUsageValue(
281        ReportType: HIDP_REPORT_TYPE,
282        UsagePage: USAGE,
283        LinkCollection: USHORT,
284        Usage: USAGE,
285        UsageValue: LONG,
286        PreparsedData: PHIDP_PREPARSED_DATA,
287        Report: PCHAR,
288        ReportLength: ULONG,
289    ) -> NTSTATUS;
290    pub fn HidP_SetUsageValueArray(
291        ReportType: HIDP_REPORT_TYPE,
292        UsagePage: USAGE,
293        LinkCollection: USHORT,
294        Usage: USAGE,
295        UsageValue: PCHAR,
296        UsageValueByteLength: USHORT,
297        PreparsedData: PHIDP_PREPARSED_DATA,
298        Report: PCHAR,
299        ReportLength: ULONG,
300    ) -> NTSTATUS;
301    pub fn HidP_GetUsageValue(
302        ReportType: HIDP_REPORT_TYPE,
303        UsagePage: USAGE,
304        LinkCollection: USHORT,
305        Usage: USAGE,
306        UsageValue: PULONG,
307        PreparsedData: PHIDP_PREPARSED_DATA,
308        Report: PCHAR,
309        ReportLength: ULONG,
310    ) -> NTSTATUS;
311    pub fn HidP_GetScaledUsageValue(
312        ReportType: HIDP_REPORT_TYPE,
313        UsagePage: USAGE,
314        LinkCollection: USHORT,
315        Usage: USAGE,
316        UsageValue: PLONG,
317        PreparsedData: PHIDP_PREPARSED_DATA,
318        Report: PCHAR,
319        ReportLength: ULONG,
320    ) -> NTSTATUS;
321    pub fn HidP_GetUsageValueArray(
322        ReportType: HIDP_REPORT_TYPE,
323        UsagePage: USAGE,
324        LinkCollection: USHORT,
325        Usage: USAGE,
326        UsageValue: PCHAR,
327        UsageValueByteLength: USHORT,
328        PreparsedData: PHIDP_PREPARSED_DATA,
329        Report: PCHAR,
330        ReportLength: ULONG,
331    ) -> NTSTATUS;
332    pub fn HidP_UsageListDifference(
333        PreviousUsageList: PUSAGE,
334        CurrentUsageList: PUSAGE,
335        BreakUsageList: PUSAGE,
336        MakeUsageList: PUSAGE,
337        UsageListLength: ULONG,
338    ) -> NTSTATUS;
339    pub fn HidP_TranslateUsagesToI8042ScanCodes(
340        ChangedUsageList: PUSAGE,
341        UsageListLength: ULONG,
342        KeyAction: HIDP_KEYBOARD_DIRECTION,
343        ModifierState: PHIDP_KEYBOARD_MODIFIER_STATE,
344        InsertCodesProcedure: PHIDP_INSERT_SCANCODES,
345        InsertCodesContext: PVOID,
346    ) -> NTSTATUS;
347}
348ENUM!{enum HIDP_KEYBOARD_DIRECTION {
349    HidP_Keyboard_Break,
350    HidP_Keyboard_Make,
351}}
352STRUCT!{struct HIDP_KEYBOARD_MODIFIER_STATE {
353    ul: ULONG,
354}}
355BITFIELD!{HIDP_KEYBOARD_MODIFIER_STATE ul: ULONG [
356    LeftControl set_LeftControl[0..1],
357    LeftShift set_LeftShift[1..2],
358    LeftAlt set_LeftAlt[2..3],
359    LeftGUI set_LeftGUI[3..4],
360    RightControl set_RightControl[4..5],
361    RightShift set_RightShift[5..6],
362    RightAlt set_RightAlt[6..7],
363    RigthGUI set_RigthGUI[7..8],
364    CapsLock set_CapsLock[8..9],
365    ScollLock set_ScollLock[9..10],
366    NumLock set_NumLock[10..11],
367]}
368pub type PHIDP_KEYBOARD_MODIFIER_STATE = *mut HIDP_KEYBOARD_MODIFIER_STATE;
369FN!{stdcall PHIDP_INSERT_SCANCODES(
370    Context: PVOID,
371    NewScanCodes: PCHAR,
372    Length: ULONG,
373) -> BOOLEAN}
374pub const HIDP_STATUS_SUCCESS: NTSTATUS = HIDP_ERROR_CODES!(0x0, 0);
375pub const HIDP_STATUS_NULL: NTSTATUS = HIDP_ERROR_CODES!(0x8, 1);
376pub const HIDP_STATUS_INVALID_PREPARSED_DATA: NTSTATUS = HIDP_ERROR_CODES!(0xC, 1);
377pub const HIDP_STATUS_INVALID_REPORT_TYPE: NTSTATUS = HIDP_ERROR_CODES!(0xC, 2);
378pub const HIDP_STATUS_INVALID_REPORT_LENGTH: NTSTATUS = HIDP_ERROR_CODES!(0xC, 3);
379pub const HIDP_STATUS_USAGE_NOT_FOUND: NTSTATUS = HIDP_ERROR_CODES!(0xC, 4);
380pub const HIDP_STATUS_VALUE_OUT_OF_RANGE: NTSTATUS = HIDP_ERROR_CODES!(0xC, 5);
381pub const HIDP_STATUS_BAD_LOG_PHY_VALUES: NTSTATUS = HIDP_ERROR_CODES!(0xC, 6);
382pub const HIDP_STATUS_BUFFER_TOO_SMALL: NTSTATUS = HIDP_ERROR_CODES!(0xC, 7);
383pub const HIDP_STATUS_INTERNAL_ERROR: NTSTATUS = HIDP_ERROR_CODES!(0xC, 8);
384pub const HIDP_STATUS_I8042_TRANS_UNKNOWN: NTSTATUS = HIDP_ERROR_CODES!(0xC, 9);
385pub const HIDP_STATUS_INCOMPATIBLE_REPORT_ID: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xA);
386pub const HIDP_STATUS_NOT_VALUE_ARRAY: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xB);
387pub const HIDP_STATUS_IS_VALUE_ARRAY: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xC);
388pub const HIDP_STATUS_DATA_INDEX_NOT_FOUND: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xD);
389pub const HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xE);
390pub const HIDP_STATUS_BUTTON_NOT_PRESSED: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xF);
391pub const HIDP_STATUS_REPORT_DOES_NOT_EXIST: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0x10);
392pub const HIDP_STATUS_NOT_IMPLEMENTED: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0x20);
393pub const HIDP_STATUS_I8242_TRANS_UNKNOWN: NTSTATUS = HIDP_STATUS_I8042_TRANS_UNKNOWN;