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