[HIDPARSE]
[reactos.git] / reactos / 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 = ExAllocatePoolWithTag(NonPagedPool, ItemSize, HIDPARSE_TAG);
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 ExFreePoolWithTag(Item, HIDPARSE_TAG);
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, &ButtonList->Usage, 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_GetUsageValue(
313 IN HIDP_REPORT_TYPE ReportType,
314 IN USAGE UsagePage,
315 IN USHORT LinkCollection,
316 IN USAGE Usage,
317 OUT PULONG UsageValue,
318 IN PHIDP_PREPARSED_DATA PreparsedData,
319 IN PCHAR Report,
320 IN ULONG ReportLength)
321 {
322 HID_PARSER Parser;
323
324 //
325 // sanity check
326 //
327 ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
328
329 //
330 // init parser
331 //
332 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
333
334 //
335 // get scaled usage value
336 //
337 return HidParser_GetUsageValue(&Parser, PreparsedData, ReportType, UsagePage, LinkCollection, Usage, UsageValue, Report, ReportLength);
338 }
339
340
341 HIDAPI
342 NTSTATUS
343 NTAPI
344 HidP_TranslateUsageAndPagesToI8042ScanCodes(
345 IN PUSAGE_AND_PAGE ChangedUsageList,
346 IN ULONG UsageListLength,
347 IN HIDP_KEYBOARD_DIRECTION KeyAction,
348 IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
349 IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
350 IN PVOID InsertCodesContext)
351 {
352 HID_PARSER Parser;
353
354 //
355 // init parser
356 //
357 HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, &Parser);
358
359 //
360 // translate usage pages
361 //
362 return HidParser_TranslateUsageAndPagesToI8042ScanCodes(&Parser, ChangedUsageList, UsageListLength, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
363 }
364
365 HIDAPI
366 NTSTATUS
367 NTAPI
368 HidP_GetButtonCaps(
369 HIDP_REPORT_TYPE ReportType,
370 PHIDP_BUTTON_CAPS ButtonCaps,
371 PUSHORT ButtonCapsLength,
372 PHIDP_PREPARSED_DATA PreparsedData)
373 {
374 return HidP_GetSpecificButtonCaps(ReportType, HID_USAGE_PAGE_UNDEFINED, 0, 0, ButtonCaps, (PULONG)ButtonCapsLength, PreparsedData);
375 }
376
377 HIDAPI
378 NTSTATUS
379 NTAPI
380 HidP_GetSpecificButtonCaps(
381 IN HIDP_REPORT_TYPE ReportType,
382 IN USAGE UsagePage,
383 IN USHORT LinkCollection,
384 IN USAGE Usage,
385 OUT PHIDP_BUTTON_CAPS ButtonCaps,
386 IN OUT PULONG ButtonCapsLength,
387 IN PHIDP_PREPARSED_DATA PreparsedData)
388 {
389 UNIMPLEMENTED
390 ASSERT(FALSE);
391 return STATUS_NOT_IMPLEMENTED;
392 }
393
394 HIDAPI
395 NTSTATUS
396 NTAPI
397 HidP_GetData(
398 IN HIDP_REPORT_TYPE ReportType,
399 OUT PHIDP_DATA DataList,
400 IN OUT PULONG DataLength,
401 IN PHIDP_PREPARSED_DATA PreparsedData,
402 IN PCHAR Report,
403 IN ULONG ReportLength)
404 {
405 UNIMPLEMENTED
406 ASSERT(FALSE);
407 return STATUS_NOT_IMPLEMENTED;
408 }
409
410 HIDAPI
411 NTSTATUS
412 NTAPI
413 HidP_GetExtendedAttributes(
414 IN HIDP_REPORT_TYPE ReportType,
415 IN USAGE UsagePage,
416 IN PHIDP_PREPARSED_DATA PreparsedData,
417 OUT PHIDP_EXTENDED_ATTRIBUTES Attributes,
418 IN OUT PULONG LengthAttributes)
419 {
420 UNIMPLEMENTED
421 ASSERT(FALSE);
422 return STATUS_NOT_IMPLEMENTED;
423 }
424
425 HIDAPI
426 NTSTATUS
427 NTAPI
428 HidP_GetLinkCollectionNodes(
429 OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes,
430 IN OUT PULONG LinkCollectionNodesLength,
431 IN PHIDP_PREPARSED_DATA PreparsedData)
432 {
433 UNIMPLEMENTED
434 ASSERT(FALSE);
435 return STATUS_NOT_IMPLEMENTED;
436 }
437
438 NTSTATUS
439 NTAPI
440 HidP_SysPowerEvent(
441 IN PCHAR HidPacket,
442 IN USHORT HidPacketLength,
443 IN PHIDP_PREPARSED_DATA Ppd,
444 OUT PULONG OutputBuffer)
445 {
446 UNIMPLEMENTED
447 ASSERT(FALSE);
448 return STATUS_NOT_IMPLEMENTED;
449 }
450
451 NTSTATUS
452 NTAPI
453 HidP_SysPowerCaps(
454 IN PHIDP_PREPARSED_DATA Ppd,
455 OUT PULONG OutputBuffer)
456 {
457 UNIMPLEMENTED
458 ASSERT(FALSE);
459 return STATUS_NOT_IMPLEMENTED;
460 }
461
462 HIDAPI
463 NTSTATUS
464 NTAPI
465 HidP_GetUsageValueArray(
466 IN HIDP_REPORT_TYPE ReportType,
467 IN USAGE UsagePage,
468 IN USHORT LinkCollection OPTIONAL,
469 IN USAGE Usage,
470 OUT PCHAR UsageValue,
471 IN USHORT UsageValueByteLength,
472 IN PHIDP_PREPARSED_DATA PreparsedData,
473 IN PCHAR Report,
474 IN ULONG ReportLength)
475 {
476 UNIMPLEMENTED
477 ASSERT(FALSE);
478 return STATUS_NOT_IMPLEMENTED;
479 }
480
481
482 HIDAPI
483 NTSTATUS
484 NTAPI
485 HidP_UnsetUsages(
486 IN HIDP_REPORT_TYPE ReportType,
487 IN USAGE UsagePage,
488 IN USHORT LinkCollection,
489 IN PUSAGE UsageList,
490 IN OUT PULONG UsageLength,
491 IN PHIDP_PREPARSED_DATA PreparsedData,
492 IN OUT PCHAR Report,
493 IN ULONG ReportLength)
494 {
495 UNIMPLEMENTED
496 ASSERT(FALSE);
497 return STATUS_NOT_IMPLEMENTED;
498 }
499
500 HIDAPI
501 NTSTATUS
502 NTAPI
503 HidP_TranslateUsagesToI8042ScanCodes(
504 IN PUSAGE ChangedUsageList,
505 IN ULONG UsageListLength,
506 IN HIDP_KEYBOARD_DIRECTION KeyAction,
507 IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
508 IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
509 IN PVOID InsertCodesContext)
510 {
511 UNIMPLEMENTED
512 ASSERT(FALSE);
513 return STATUS_NOT_IMPLEMENTED;
514 }
515
516 HIDAPI
517 NTSTATUS
518 NTAPI
519 HidP_SetUsages(
520 IN HIDP_REPORT_TYPE ReportType,
521 IN USAGE UsagePage,
522 IN USHORT LinkCollection,
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 UNIMPLEMENTED
530 ASSERT(FALSE);
531 return STATUS_NOT_IMPLEMENTED;
532 }
533
534 HIDAPI
535 NTSTATUS
536 NTAPI
537 HidP_SetUsageValueArray(
538 IN HIDP_REPORT_TYPE ReportType,
539 IN USAGE UsagePage,
540 IN USHORT LinkCollection OPTIONAL,
541 IN USAGE Usage,
542 IN PCHAR UsageValue,
543 IN USHORT UsageValueByteLength,
544 IN PHIDP_PREPARSED_DATA PreparsedData,
545 OUT PCHAR Report,
546 IN ULONG ReportLength)
547 {
548 UNIMPLEMENTED
549 ASSERT(FALSE);
550 return STATUS_NOT_IMPLEMENTED;
551 }
552
553 HIDAPI
554 NTSTATUS
555 NTAPI
556 HidP_SetUsageValue(
557 IN HIDP_REPORT_TYPE ReportType,
558 IN USAGE UsagePage,
559 IN USHORT LinkCollection,
560 IN USAGE Usage,
561 IN ULONG UsageValue,
562 IN PHIDP_PREPARSED_DATA PreparsedData,
563 IN OUT PCHAR Report,
564 IN ULONG ReportLength)
565 {
566 UNIMPLEMENTED
567 ASSERT(FALSE);
568 return STATUS_NOT_IMPLEMENTED;
569 }
570
571 HIDAPI
572 NTSTATUS
573 NTAPI
574 HidP_SetScaledUsageValue(
575 IN HIDP_REPORT_TYPE ReportType,
576 IN USAGE UsagePage,
577 IN USHORT LinkCollection OPTIONAL,
578 IN USAGE Usage,
579 IN LONG UsageValue,
580 IN PHIDP_PREPARSED_DATA PreparsedData,
581 IN OUT PCHAR Report,
582 IN ULONG ReportLength)
583 {
584 UNIMPLEMENTED
585 ASSERT(FALSE);
586 return STATUS_NOT_IMPLEMENTED;
587 }
588
589 HIDAPI
590 NTSTATUS
591 NTAPI
592 HidP_SetData(
593 IN HIDP_REPORT_TYPE ReportType,
594 IN PHIDP_DATA DataList,
595 IN OUT PULONG DataLength,
596 IN PHIDP_PREPARSED_DATA PreparsedData,
597 IN OUT PCHAR Report,
598 IN ULONG ReportLength)
599 {
600 UNIMPLEMENTED
601 ASSERT(FALSE);
602 return STATUS_NOT_IMPLEMENTED;
603 }
604
605 HIDAPI
606 ULONG
607 NTAPI
608 HidP_MaxDataListLength(
609 IN HIDP_REPORT_TYPE ReportType,
610 IN PHIDP_PREPARSED_DATA PreparsedData)
611 {
612 UNIMPLEMENTED
613 ASSERT(FALSE);
614 return STATUS_NOT_IMPLEMENTED;
615 }
616
617 HIDAPI
618 NTSTATUS
619 NTAPI
620 HidP_InitializeReportForID(
621 IN HIDP_REPORT_TYPE ReportType,
622 IN UCHAR ReportID,
623 IN PHIDP_PREPARSED_DATA PreparsedData,
624 IN OUT PCHAR Report,
625 IN ULONG ReportLength)
626 {
627 UNIMPLEMENTED
628 ASSERT(FALSE);
629 return STATUS_NOT_IMPLEMENTED;
630 }
631
632 #undef HidP_GetValueCaps
633
634 HIDAPI
635 NTSTATUS
636 NTAPI
637 HidP_GetValueCaps(
638 HIDP_REPORT_TYPE ReportType,
639 PHIDP_VALUE_CAPS ValueCaps,
640 PULONG ValueCapsLength,
641 PHIDP_PREPARSED_DATA PreparsedData)
642 {
643 UNIMPLEMENTED
644 ASSERT(FALSE);
645 return STATUS_NOT_IMPLEMENTED;
646 }
647
648 NTSTATUS
649 NTAPI
650 DriverEntry(
651 IN PDRIVER_OBJECT DriverObject,
652 IN PUNICODE_STRING RegPath)
653 {
654 DPRINT("********* HID PARSE *********\n");
655 return STATUS_SUCCESS;
656 }