* Sync up to trunk r55544.
[reactos.git] / drivers / hid / hidparse / hidparse.c
1 /*
2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/hidparse/hidparse.c
5 * PURPOSE: HID Parser
6 * PROGRAMMERS:
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 */
10
11 #include "hidparse.h"
12
13 PVOID
14 NTAPI
15 AllocFunction(
16 IN ULONG ItemSize)
17 {
18 PVOID Item = ExAllocatePool(NonPagedPool, ItemSize);
19 if (Item)
20 {
21 //
22 // zero item
23 //
24 RtlZeroMemory(Item, ItemSize);
25 }
26
27 //
28 // done
29 //
30 return Item;
31 }
32
33 VOID
34 NTAPI
35 FreeFunction(
36 IN PVOID Item)
37 {
38 //
39 // free item
40 //
41 ExFreePool(Item);
42 }
43
44 VOID
45 NTAPI
46 ZeroFunction(
47 IN PVOID Item,
48 IN ULONG ItemSize)
49 {
50 //
51 // zero item
52 //
53 RtlZeroMemory(Item, ItemSize);
54 }
55
56 VOID
57 NTAPI
58 CopyFunction(
59 IN PVOID Target,
60 IN PVOID Source,
61 IN ULONG Length)
62 {
63 //
64 // copy item
65 //
66 RtlCopyMemory(Target, Source, Length);
67 }
68
69 VOID
70 NTAPI
71 DebugFunction(
72 IN LPCSTR FormatStr, ...)
73 {
74
75 va_list args;
76 unsigned int i;
77 char printbuffer[1024];
78
79 va_start(args, FormatStr);
80 i = vsprintf(printbuffer, FormatStr, args);
81 va_end(args);
82
83 DbgPrint(printbuffer);
84 }
85
86 VOID
87 NTAPI
88 HidP_FreeCollectionDescription (
89 IN PHIDP_DEVICE_DESC DeviceDescription)
90 {
91 HID_PARSER Parser;
92
93 //
94 // init parser
95 //
96 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
97
98 //
99 // free collection
100 //
101 HidParser_FreeCollectionDescription(&Parser, DeviceDescription);
102 }
103
104
105 HIDAPI
106 NTSTATUS
107 NTAPI
108 HidP_GetCaps(
109 IN PHIDP_PREPARSED_DATA PreparsedData,
110 OUT PHIDP_CAPS Capabilities)
111 {
112 HID_PARSER Parser;
113
114 //
115 // init parser
116 //
117 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
118
119 //
120 // get caps
121 //
122 return HidParser_GetCaps(&Parser, PreparsedData, Capabilities);
123 }
124
125 NTSTATUS
126 NTAPI
127 HidP_GetCollectionDescription(
128 IN PHIDP_REPORT_DESCRIPTOR ReportDesc,
129 IN ULONG DescLength,
130 IN POOL_TYPE PoolType,
131 OUT PHIDP_DEVICE_DESC DeviceDescription)
132 {
133 HID_PARSER Parser;
134
135 //
136 // init parser
137 //
138 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
139
140 //
141 // get description;
142 //
143 return HidParser_GetCollectionDescription(&Parser, ReportDesc, DescLength, PoolType, DeviceDescription);
144 }
145
146 HIDAPI
147 ULONG
148 NTAPI
149 HidP_MaxUsageListLength(
150 IN HIDP_REPORT_TYPE ReportType,
151 IN USAGE UsagePage OPTIONAL,
152 IN PHIDP_PREPARSED_DATA PreparsedData)
153 {
154 HID_PARSER Parser;
155
156 //
157 // sanity check
158 //
159 ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
160
161 //
162 // init parser
163 //
164 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
165
166
167 //
168 // get usage length
169 //
170 return HidParser_MaxUsageListLength(&Parser, PreparsedData, ReportType, UsagePage);
171 }
172
173 HIDAPI
174 NTSTATUS
175 NTAPI
176 HidP_GetSpecificValueCaps(
177 IN HIDP_REPORT_TYPE ReportType,
178 IN USAGE UsagePage,
179 IN USHORT LinkCollection,
180 IN USAGE Usage,
181 OUT PHIDP_VALUE_CAPS ValueCaps,
182 IN OUT PULONG ValueCapsLength,
183 IN PHIDP_PREPARSED_DATA PreparsedData)
184 {
185 HID_PARSER Parser;
186
187 //
188 // sanity check
189 //
190 ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
191
192 //
193 // init parser
194 //
195 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
196
197 //
198 // get value caps
199 //
200 return HidParser_GetSpecificValueCaps(&Parser, PreparsedData, ReportType, UsagePage, LinkCollection, Usage, ValueCaps, ValueCapsLength);
201 }
202
203 HIDAPI
204 NTSTATUS
205 NTAPI
206 HidP_GetUsages(
207 IN HIDP_REPORT_TYPE ReportType,
208 IN USAGE UsagePage,
209 IN USHORT LinkCollection OPTIONAL,
210 OUT USAGE *UsageList,
211 IN OUT ULONG *UsageLength,
212 IN PHIDP_PREPARSED_DATA PreparsedData,
213 IN PCHAR Report,
214 IN ULONG ReportLength)
215 {
216 HID_PARSER Parser;
217
218 //
219 // sanity check
220 //
221 ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
222
223 //
224 // init parser
225 //
226 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
227
228 //
229 // get usages
230 //
231 return HidParser_GetUsages(&Parser, PreparsedData, ReportType, UsagePage, LinkCollection, UsageList, UsageLength, Report, ReportLength);
232 }
233
234
235 #undef HidP_GetButtonCaps
236
237 HIDAPI
238 NTSTATUS
239 NTAPI
240 HidP_UsageListDifference(
241 IN PUSAGE PreviousUsageList,
242 IN PUSAGE CurrentUsageList,
243 OUT PUSAGE BreakUsageList,
244 OUT PUSAGE MakeUsageList,
245 IN ULONG UsageListLength)
246 {
247 return HidParser_UsageListDifference(PreviousUsageList, CurrentUsageList, BreakUsageList, MakeUsageList, UsageListLength);
248 }
249
250 HIDAPI
251 NTSTATUS
252 NTAPI
253 HidP_GetUsagesEx(
254 IN HIDP_REPORT_TYPE ReportType,
255 IN USHORT LinkCollection,
256 OUT PUSAGE_AND_PAGE ButtonList,
257 IN OUT ULONG *UsageLength,
258 IN PHIDP_PREPARSED_DATA PreparsedData,
259 IN PCHAR Report,
260 IN ULONG ReportLength)
261 {
262 return HidP_GetUsages(ReportType, HID_USAGE_PAGE_UNDEFINED, LinkCollection, (PUSAGE)ButtonList, UsageLength, PreparsedData, Report, ReportLength);
263 }
264
265 HIDAPI
266 NTSTATUS
267 NTAPI
268 HidP_UsageAndPageListDifference(
269 IN PUSAGE_AND_PAGE PreviousUsageList,
270 IN PUSAGE_AND_PAGE CurrentUsageList,
271 OUT PUSAGE_AND_PAGE BreakUsageList,
272 OUT PUSAGE_AND_PAGE MakeUsageList,
273 IN ULONG UsageListLength)
274 {
275 return HidParser_UsageAndPageListDifference(PreviousUsageList, CurrentUsageList, BreakUsageList, MakeUsageList, UsageListLength);
276 }
277
278 HIDAPI
279 NTSTATUS
280 NTAPI
281 HidP_GetScaledUsageValue(
282 IN HIDP_REPORT_TYPE ReportType,
283 IN USAGE UsagePage,
284 IN USHORT LinkCollection OPTIONAL,
285 IN USAGE Usage,
286 OUT PLONG UsageValue,
287 IN PHIDP_PREPARSED_DATA PreparsedData,
288 IN PCHAR Report,
289 IN ULONG ReportLength)
290 {
291 HID_PARSER Parser;
292
293 //
294 // sanity check
295 //
296 ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
297
298 //
299 // init parser
300 //
301 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
302
303 //
304 // get scaled usage value
305 //
306 return HidParser_GetScaledUsageValue(&Parser, PreparsedData, ReportType, UsagePage, LinkCollection, Usage, UsageValue, Report, ReportLength);
307 }
308
309 HIDAPI
310 NTSTATUS
311 NTAPI
312 HidP_TranslateUsageAndPagesToI8042ScanCodes(
313 IN PUSAGE_AND_PAGE ChangedUsageList,
314 IN ULONG UsageListLength,
315 IN HIDP_KEYBOARD_DIRECTION KeyAction,
316 IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
317 IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
318 IN PVOID InsertCodesContext)
319 {
320 HID_PARSER Parser;
321
322 //
323 // init parser
324 //
325 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
326
327 //
328 // translate usage pages
329 //
330 return HidParser_TranslateUsageAndPagesToI8042ScanCodes(&Parser, ChangedUsageList, UsageListLength, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
331 }
332
333
334
335 HIDAPI
336 NTSTATUS
337 NTAPI
338 HidP_GetButtonCaps(
339 HIDP_REPORT_TYPE ReportType,
340 PHIDP_BUTTON_CAPS ButtonCaps,
341 PUSHORT ButtonCapsLength,
342 PHIDP_PREPARSED_DATA PreparsedData)
343 {
344 return HidP_GetSpecificButtonCaps(ReportType, HID_USAGE_PAGE_UNDEFINED, 0, 0, ButtonCaps, (PULONG)ButtonCapsLength, PreparsedData);
345 }
346
347 HIDAPI
348 NTSTATUS
349 NTAPI
350 HidP_GetSpecificButtonCaps(
351 IN HIDP_REPORT_TYPE ReportType,
352 IN USAGE UsagePage,
353 IN USHORT LinkCollection,
354 IN USAGE Usage,
355 OUT PHIDP_BUTTON_CAPS ButtonCaps,
356 IN OUT PULONG ButtonCapsLength,
357 IN PHIDP_PREPARSED_DATA PreparsedData)
358 {
359 UNIMPLEMENTED
360 ASSERT(FALSE);
361 return STATUS_NOT_IMPLEMENTED;
362 }
363
364 HIDAPI
365 NTSTATUS
366 NTAPI
367 HidP_GetData(
368 IN HIDP_REPORT_TYPE ReportType,
369 OUT PHIDP_DATA DataList,
370 IN OUT PULONG DataLength,
371 IN PHIDP_PREPARSED_DATA PreparsedData,
372 IN PCHAR Report,
373 IN ULONG ReportLength)
374 {
375 UNIMPLEMENTED
376 ASSERT(FALSE);
377 return STATUS_NOT_IMPLEMENTED;
378 }
379
380 HIDAPI
381 NTSTATUS
382 NTAPI
383 HidP_GetExtendedAttributes(
384 IN HIDP_REPORT_TYPE ReportType,
385 IN USAGE UsagePage,
386 IN PHIDP_PREPARSED_DATA PreparsedData,
387 OUT PHIDP_EXTENDED_ATTRIBUTES Attributes,
388 IN OUT PULONG LengthAttributes)
389 {
390 UNIMPLEMENTED
391 ASSERT(FALSE);
392 return STATUS_NOT_IMPLEMENTED;
393 }
394
395 HIDAPI
396 NTSTATUS
397 NTAPI
398 HidP_GetLinkCollectionNodes(
399 OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes,
400 IN OUT PULONG LinkCollectionNodesLength,
401 IN PHIDP_PREPARSED_DATA PreparsedData)
402 {
403 UNIMPLEMENTED
404 ASSERT(FALSE);
405 return STATUS_NOT_IMPLEMENTED;
406 }
407
408 HIDAPI
409 NTSTATUS
410 NTAPI
411 HidP_GetUsageValue(
412 IN HIDP_REPORT_TYPE ReportType,
413 IN USAGE UsagePage,
414 IN USHORT LinkCollection,
415 IN USAGE Usage,
416 OUT PULONG UsageValue,
417 IN PHIDP_PREPARSED_DATA PreparsedData,
418 IN PCHAR Report,
419 IN ULONG ReportLength)
420 {
421 UNIMPLEMENTED
422 ASSERT(FALSE);
423 return STATUS_NOT_IMPLEMENTED;
424 }
425
426 NTSTATUS
427 NTAPI
428 HidP_SysPowerEvent (
429 IN PCHAR HidPacket,
430 IN USHORT HidPacketLength,
431 IN PHIDP_PREPARSED_DATA Ppd,
432 OUT PULONG OutputBuffer)
433 {
434 UNIMPLEMENTED
435 ASSERT(FALSE);
436 return STATUS_NOT_IMPLEMENTED;
437 }
438
439 NTSTATUS
440 NTAPI
441 HidP_SysPowerCaps (
442 IN PHIDP_PREPARSED_DATA Ppd,
443 OUT PULONG OutputBuffer)
444 {
445 UNIMPLEMENTED
446 ASSERT(FALSE);
447 return STATUS_NOT_IMPLEMENTED;
448 }
449
450 HIDAPI
451 NTSTATUS
452 NTAPI
453 HidP_GetUsageValueArray(
454 IN HIDP_REPORT_TYPE ReportType,
455 IN USAGE UsagePage,
456 IN USHORT LinkCollection OPTIONAL,
457 IN USAGE Usage,
458 OUT PCHAR UsageValue,
459 IN USHORT UsageValueByteLength,
460 IN PHIDP_PREPARSED_DATA PreparsedData,
461 IN PCHAR Report,
462 IN ULONG ReportLength)
463 {
464 UNIMPLEMENTED
465 ASSERT(FALSE);
466 return STATUS_NOT_IMPLEMENTED;
467 }
468
469
470 HIDAPI
471 NTSTATUS
472 NTAPI
473 HidP_UnsetUsages(
474 IN HIDP_REPORT_TYPE ReportType,
475 IN USAGE UsagePage,
476 IN USHORT LinkCollection,
477 IN PUSAGE UsageList,
478 IN OUT PULONG UsageLength,
479 IN PHIDP_PREPARSED_DATA PreparsedData,
480 IN OUT PCHAR Report,
481 IN ULONG ReportLength)
482 {
483 UNIMPLEMENTED
484 ASSERT(FALSE);
485 return STATUS_NOT_IMPLEMENTED;
486 }
487
488 HIDAPI
489 NTSTATUS
490 NTAPI
491 HidP_TranslateUsagesToI8042ScanCodes(
492 IN PUSAGE ChangedUsageList,
493 IN ULONG UsageListLength,
494 IN HIDP_KEYBOARD_DIRECTION KeyAction,
495 IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
496 IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
497 IN PVOID InsertCodesContext)
498 {
499 UNIMPLEMENTED
500 ASSERT(FALSE);
501 return STATUS_NOT_IMPLEMENTED;
502 }
503
504 HIDAPI
505 NTSTATUS
506 NTAPI
507 HidP_SetUsages(
508 IN HIDP_REPORT_TYPE ReportType,
509 IN USAGE UsagePage,
510 IN USHORT LinkCollection,
511 IN PUSAGE UsageList,
512 IN OUT PULONG UsageLength,
513 IN PHIDP_PREPARSED_DATA PreparsedData,
514 IN OUT PCHAR Report,
515 IN ULONG ReportLength)
516 {
517 UNIMPLEMENTED
518 ASSERT(FALSE);
519 return STATUS_NOT_IMPLEMENTED;
520 }
521
522 HIDAPI
523 NTSTATUS
524 NTAPI
525 HidP_SetUsageValueArray(
526 IN HIDP_REPORT_TYPE ReportType,
527 IN USAGE UsagePage,
528 IN USHORT LinkCollection OPTIONAL,
529 IN USAGE Usage,
530 IN PCHAR UsageValue,
531 IN USHORT UsageValueByteLength,
532 IN PHIDP_PREPARSED_DATA PreparsedData,
533 OUT PCHAR Report,
534 IN ULONG ReportLength)
535 {
536 UNIMPLEMENTED
537 ASSERT(FALSE);
538 return STATUS_NOT_IMPLEMENTED;
539 }
540
541 HIDAPI
542 NTSTATUS
543 NTAPI
544 HidP_SetUsageValue(
545 IN HIDP_REPORT_TYPE ReportType,
546 IN USAGE UsagePage,
547 IN USHORT LinkCollection,
548 IN USAGE Usage,
549 IN ULONG UsageValue,
550 IN PHIDP_PREPARSED_DATA PreparsedData,
551 IN OUT PCHAR Report,
552 IN ULONG ReportLength)
553 {
554 UNIMPLEMENTED
555 ASSERT(FALSE);
556 return STATUS_NOT_IMPLEMENTED;
557 }
558
559 HIDAPI
560 NTSTATUS
561 NTAPI
562 HidP_SetScaledUsageValue(
563 IN HIDP_REPORT_TYPE ReportType,
564 IN USAGE UsagePage,
565 IN USHORT LinkCollection OPTIONAL,
566 IN USAGE Usage,
567 IN LONG UsageValue,
568 IN PHIDP_PREPARSED_DATA PreparsedData,
569 IN OUT PCHAR Report,
570 IN ULONG ReportLength)
571 {
572 UNIMPLEMENTED
573 ASSERT(FALSE);
574 return STATUS_NOT_IMPLEMENTED;
575 }
576
577 HIDAPI
578 NTSTATUS
579 NTAPI
580 HidP_SetData(
581 IN HIDP_REPORT_TYPE ReportType,
582 IN PHIDP_DATA DataList,
583 IN OUT PULONG DataLength,
584 IN PHIDP_PREPARSED_DATA PreparsedData,
585 IN OUT PCHAR Report,
586 IN ULONG ReportLength)
587 {
588 UNIMPLEMENTED
589 ASSERT(FALSE);
590 return STATUS_NOT_IMPLEMENTED;
591 }
592
593 HIDAPI
594 ULONG
595 NTAPI
596 HidP_MaxDataListLength(
597 IN HIDP_REPORT_TYPE ReportType,
598 IN PHIDP_PREPARSED_DATA PreparsedData)
599 {
600 UNIMPLEMENTED
601 ASSERT(FALSE);
602 return STATUS_NOT_IMPLEMENTED;
603 }
604
605 HIDAPI
606 NTSTATUS
607 NTAPI
608 HidP_InitializeReportForID(
609 IN HIDP_REPORT_TYPE ReportType,
610 IN UCHAR ReportID,
611 IN PHIDP_PREPARSED_DATA PreparsedData,
612 IN OUT PCHAR Report,
613 IN ULONG ReportLength)
614 {
615 UNIMPLEMENTED
616 ASSERT(FALSE);
617 return STATUS_NOT_IMPLEMENTED;
618 }
619
620 #undef HidP_GetValueCaps
621
622 HIDAPI
623 NTSTATUS
624 NTAPI
625 HidP_GetValueCaps(
626 HIDP_REPORT_TYPE ReportType,
627 PHIDP_VALUE_CAPS ValueCaps,
628 PULONG ValueCapsLength,
629 PHIDP_PREPARSED_DATA PreparsedData)
630 {
631 UNIMPLEMENTED
632 ASSERT(FALSE);
633 return STATUS_NOT_IMPLEMENTED;
634 }
635
636 NTSTATUS
637 NTAPI
638 DriverEntry(
639 IN PDRIVER_OBJECT DriverObject,
640 IN PUNICODE_STRING RegPath)
641 {
642
643 DPRINT1("********* HID PARSE *********\n");
644 return STATUS_SUCCESS;
645 }