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