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
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
16 HidP_FreeCollectionDescription (
17 IN PHIDP_DEVICE_DESC DeviceDescription
)
19 DPRINT1("HidP_FreeCollectionDescription DeviceDescription %p\n", DeviceDescription
);
24 ExFreePool(DeviceDescription
->CollectionDesc
);
29 ExFreePool(DeviceDescription
->ReportIDs
);
32 #undef HidP_GetButtonCaps
38 HIDP_REPORT_TYPE ReportType
,
39 PHIDP_BUTTON_CAPS ButtonCaps
,
40 PUSHORT ButtonCapsLength
,
41 PHIDP_PREPARSED_DATA PreparsedData
)
43 return HidP_GetSpecificButtonCaps(ReportType
, HID_USAGE_PAGE_UNDEFINED
, 0, 0, ButtonCaps
, (PULONG
)ButtonCapsLength
, PreparsedData
);
49 HidP_GetSpecificButtonCaps(
50 IN HIDP_REPORT_TYPE ReportType
,
52 IN USHORT LinkCollection
,
54 OUT PHIDP_BUTTON_CAPS ButtonCaps
,
55 IN OUT PULONG ButtonCapsLength
,
56 IN PHIDP_PREPARSED_DATA PreparsedData
)
60 return STATUS_NOT_IMPLEMENTED
;
68 IN PHIDP_PREPARSED_DATA PreparsedData
,
69 OUT PHIDP_CAPS Capabilities
)
73 return STATUS_NOT_IMPLEMENTED
;
78 HidP_GetCollectionDescription(
79 IN PHIDP_REPORT_DESCRIPTOR ReportDesc
,
81 IN POOL_TYPE PoolType
,
82 OUT PHIDP_DEVICE_DESC DeviceDescription
)
86 return STATUS_NOT_IMPLEMENTED
;
93 IN HIDP_REPORT_TYPE ReportType
,
94 OUT PHIDP_DATA DataList
,
95 IN OUT PULONG DataLength
,
96 IN PHIDP_PREPARSED_DATA PreparsedData
,
98 IN ULONG ReportLength
)
102 return STATUS_NOT_IMPLEMENTED
;
108 HidP_GetExtendedAttributes(
109 IN HIDP_REPORT_TYPE ReportType
,
111 IN PHIDP_PREPARSED_DATA PreparsedData
,
112 OUT PHIDP_EXTENDED_ATTRIBUTES Attributes
,
113 IN OUT PULONG LengthAttributes
)
117 return STATUS_NOT_IMPLEMENTED
;
123 HidP_GetLinkCollectionNodes(
124 OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes
,
125 IN OUT PULONG LinkCollectionNodesLength
,
126 IN PHIDP_PREPARSED_DATA PreparsedData
)
130 return STATUS_NOT_IMPLEMENTED
;
136 HidP_GetScaledUsageValue(
137 IN HIDP_REPORT_TYPE ReportType
,
139 IN USHORT LinkCollection OPTIONAL
,
141 OUT PLONG UsageValue
,
142 IN PHIDP_PREPARSED_DATA PreparsedData
,
144 IN ULONG ReportLength
)
148 return STATUS_NOT_IMPLEMENTED
;
155 IN HIDP_REPORT_TYPE ReportType
,
157 IN USHORT LinkCollection
,
159 OUT PULONG UsageValue
,
160 IN PHIDP_PREPARSED_DATA PreparsedData
,
162 IN ULONG ReportLength
)
166 return STATUS_NOT_IMPLEMENTED
;
174 HidP_UsageListDifference(
175 IN PUSAGE PreviousUsageList
,
176 IN PUSAGE CurrentUsageList
,
177 OUT PUSAGE BreakUsageList
,
178 OUT PUSAGE MakeUsageList
,
179 IN ULONG UsageListLength
)
181 ULONG Index
, SubIndex
, bFound
, BreakUsageIndex
= 0, MakeUsageIndex
= 0;
182 USAGE CurrentUsage
, Usage
;
189 /* get current usage */
190 CurrentUsage
= PreviousUsageList
[Index
];
192 /* is the end of list reached? */
196 /* start searching in current usage list */
201 /* get usage of current list */
202 Usage
= CurrentUsageList
[SubIndex
];
204 /* end of list reached? */
208 /* check if it matches the current one */
209 if (CurrentUsage
== Usage
)
216 /* move to next usage */
218 }while(SubIndex
< UsageListLength
);
220 /* was the usage found ?*/
223 /* store it in the break usage list */
224 BreakUsageList
[BreakUsageIndex
] = CurrentUsage
;
228 /* move to next usage */
231 }while(Index
< UsageListLength
);
233 /* now process the new items */
237 /* get current usage */
238 CurrentUsage
= CurrentUsageList
[Index
];
240 /* is the end of list reached? */
244 /* start searching in current usage list */
249 /* get usage of previous list */
250 Usage
= PreviousUsageList
[SubIndex
];
252 /* end of list reached? */
256 /* check if it matches the current one */
257 if (CurrentUsage
== Usage
)
264 /* move to next usage */
266 }while(SubIndex
< UsageListLength
);
268 /* was the usage found ?*/
271 /* store it in the make usage list */
272 MakeUsageList
[MakeUsageIndex
] = CurrentUsage
;
276 /* move to next usage */
279 }while(Index
< UsageListLength
);
282 /* does the break list contain empty entries */
283 if (BreakUsageIndex
< UsageListLength
)
285 /* zeroize entries */
286 RtlZeroMemory(&BreakUsageList
[BreakUsageIndex
], sizeof(USAGE
) * (UsageListLength
- BreakUsageIndex
));
289 /* does the make usage list contain empty entries */
290 if (MakeUsageIndex
< UsageListLength
)
292 /* zeroize entries */
293 RtlZeroMemory(&MakeUsageList
[MakeUsageIndex
], sizeof(USAGE
) * (UsageListLength
- MakeUsageIndex
));
297 return HIDP_STATUS_SUCCESS
;
303 HidP_GetSpecificValueCaps(
304 IN HIDP_REPORT_TYPE ReportType
,
306 IN USHORT LinkCollection
,
308 OUT PHIDP_VALUE_CAPS ValueCaps
,
309 IN OUT PULONG ValueCapsLength
,
310 IN PHIDP_PREPARSED_DATA PreparsedData
)
314 return STATUS_NOT_IMPLEMENTED
;
320 HidP_MaxUsageListLength(
321 IN HIDP_REPORT_TYPE ReportType
,
322 IN USAGE UsagePage OPTIONAL
,
323 IN PHIDP_PREPARSED_DATA PreparsedData
)
327 return STATUS_NOT_IMPLEMENTED
;
334 IN HIDP_REPORT_TYPE ReportType
,
336 IN USHORT LinkCollection OPTIONAL
,
337 OUT USAGE
*UsageList
,
338 IN OUT ULONG
*UsageLength
,
339 IN PHIDP_PREPARSED_DATA PreparsedData
,
341 IN ULONG ReportLength
)
345 return STATUS_NOT_IMPLEMENTED
;
352 IN USHORT HidPacketLength
,
353 IN PHIDP_PREPARSED_DATA Ppd
,
354 OUT PULONG OutputBuffer
)
358 return STATUS_NOT_IMPLEMENTED
;
364 IN PHIDP_PREPARSED_DATA Ppd
,
365 OUT PULONG OutputBuffer
)
369 return STATUS_NOT_IMPLEMENTED
;
375 HidP_GetUsageValueArray(
376 IN HIDP_REPORT_TYPE ReportType
,
378 IN USHORT LinkCollection OPTIONAL
,
380 OUT PCHAR UsageValue
,
381 IN USHORT UsageValueByteLength
,
382 IN PHIDP_PREPARSED_DATA PreparsedData
,
384 IN ULONG ReportLength
)
388 return STATUS_NOT_IMPLEMENTED
;
395 IN HIDP_REPORT_TYPE ReportType
,
396 IN USHORT LinkCollection
,
397 OUT PUSAGE_AND_PAGE ButtonList
,
398 IN OUT ULONG
*UsageLength
,
399 IN PHIDP_PREPARSED_DATA PreparsedData
,
401 IN ULONG ReportLength
)
403 return HidP_GetUsages(ReportType
, HID_USAGE_PAGE_UNDEFINED
, LinkCollection
, (PUSAGE
)ButtonList
, UsageLength
, PreparsedData
, Report
, ReportLength
);
410 HidP_UsageAndPageListDifference(
411 IN PUSAGE_AND_PAGE PreviousUsageList
,
412 IN PUSAGE_AND_PAGE CurrentUsageList
,
413 OUT PUSAGE_AND_PAGE BreakUsageList
,
414 OUT PUSAGE_AND_PAGE MakeUsageList
,
415 IN ULONG UsageListLength
)
417 ULONG Index
, SubIndex
, BreakUsageListIndex
= 0, MakeUsageListIndex
= 0, bFound
;
418 PUSAGE_AND_PAGE CurrentUsage
, Usage
;
422 /* process removed usages */
426 /* get usage from current index */
427 CurrentUsage
= &PreviousUsageList
[Index
];
429 /* end of list reached? */
430 if (CurrentUsage
->Usage
== 0 && CurrentUsage
->UsagePage
== 0)
433 /* search in current list */
439 Usage
= &CurrentUsageList
[SubIndex
];
441 /* end of list reached? */
442 if (Usage
->Usage
== 0 && Usage
->UsagePage
== 0)
446 if (Usage
->Usage
== CurrentUsage
->Usage
&& Usage
->UsagePage
== CurrentUsage
->UsagePage
)
452 /* move to next index */
455 }while(SubIndex
< UsageListLength
);
459 /* store it in break usage list */
460 BreakUsageList
[BreakUsageListIndex
].Usage
= CurrentUsage
->Usage
;
461 BreakUsageList
[BreakUsageListIndex
].UsagePage
= CurrentUsage
->UsagePage
;
462 BreakUsageListIndex
++;
465 /* move to next index */
468 }while(Index
< UsageListLength
);
470 /* process new usages */
474 /* get usage from current index */
475 CurrentUsage
= &CurrentUsageList
[Index
];
477 /* end of list reached? */
478 if (CurrentUsage
->Usage
== 0 && CurrentUsage
->UsagePage
== 0)
481 /* search in current list */
487 Usage
= &PreviousUsageList
[SubIndex
];
489 /* end of list reached? */
490 if (Usage
->Usage
== 0 && Usage
->UsagePage
== 0)
494 if (Usage
->Usage
== CurrentUsage
->Usage
&& Usage
->UsagePage
== CurrentUsage
->UsagePage
)
500 /* move to next index */
503 }while(SubIndex
< UsageListLength
);
507 /* store it in break usage list */
508 MakeUsageList
[MakeUsageListIndex
].Usage
= CurrentUsage
->Usage
;
509 MakeUsageList
[MakeUsageListIndex
].UsagePage
= CurrentUsage
->UsagePage
;
510 MakeUsageListIndex
++;
513 /* move to next index */
515 }while(Index
< UsageListLength
);
518 /* are there remaining free list entries */
519 if (BreakUsageListIndex
< UsageListLength
)
522 RtlZeroMemory(&BreakUsageList
[BreakUsageListIndex
], (UsageListLength
- BreakUsageListIndex
) * sizeof(USAGE_AND_PAGE
));
525 /* are there remaining free list entries */
526 if (MakeUsageListIndex
< UsageListLength
)
529 RtlZeroMemory(&MakeUsageList
[MakeUsageListIndex
], (UsageListLength
- MakeUsageListIndex
) * sizeof(USAGE_AND_PAGE
));
533 return HIDP_STATUS_SUCCESS
;
540 IN HIDP_REPORT_TYPE ReportType
,
542 IN USHORT LinkCollection
,
544 IN OUT PULONG UsageLength
,
545 IN PHIDP_PREPARSED_DATA PreparsedData
,
547 IN ULONG ReportLength
)
551 return STATUS_NOT_IMPLEMENTED
;
557 HidP_TranslateUsagesToI8042ScanCodes(
558 IN PUSAGE ChangedUsageList
,
559 IN ULONG UsageListLength
,
560 IN HIDP_KEYBOARD_DIRECTION KeyAction
,
561 IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState
,
562 IN PHIDP_INSERT_SCANCODES InsertCodesProcedure
,
563 IN PVOID InsertCodesContext
)
567 return STATUS_NOT_IMPLEMENTED
;
573 HidP_TranslateUsageAndPagesToI8042ScanCodes(
574 IN PUSAGE_AND_PAGE ChangedUsageList
,
575 IN ULONG UsageListLength
,
576 IN HIDP_KEYBOARD_DIRECTION KeyAction
,
577 IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState
,
578 IN PHIDP_INSERT_SCANCODES InsertCodesProcedure
,
579 IN PVOID InsertCodesContext
)
583 return STATUS_NOT_IMPLEMENTED
;
590 IN HIDP_REPORT_TYPE ReportType
,
592 IN USHORT LinkCollection
,
594 IN OUT PULONG UsageLength
,
595 IN PHIDP_PREPARSED_DATA PreparsedData
,
597 IN ULONG ReportLength
)
601 return STATUS_NOT_IMPLEMENTED
;
607 HidP_SetUsageValueArray(
608 IN HIDP_REPORT_TYPE ReportType
,
610 IN USHORT LinkCollection OPTIONAL
,
613 IN USHORT UsageValueByteLength
,
614 IN PHIDP_PREPARSED_DATA PreparsedData
,
616 IN ULONG ReportLength
)
620 return STATUS_NOT_IMPLEMENTED
;
627 IN HIDP_REPORT_TYPE ReportType
,
629 IN USHORT LinkCollection
,
632 IN PHIDP_PREPARSED_DATA PreparsedData
,
634 IN ULONG ReportLength
)
638 return STATUS_NOT_IMPLEMENTED
;
644 HidP_SetScaledUsageValue(
645 IN HIDP_REPORT_TYPE ReportType
,
647 IN USHORT LinkCollection OPTIONAL
,
650 IN PHIDP_PREPARSED_DATA PreparsedData
,
652 IN ULONG ReportLength
)
656 return STATUS_NOT_IMPLEMENTED
;
663 IN HIDP_REPORT_TYPE ReportType
,
664 IN PHIDP_DATA DataList
,
665 IN OUT PULONG DataLength
,
666 IN PHIDP_PREPARSED_DATA PreparsedData
,
668 IN ULONG ReportLength
)
672 return STATUS_NOT_IMPLEMENTED
;
678 HidP_MaxDataListLength(
679 IN HIDP_REPORT_TYPE ReportType
,
680 IN PHIDP_PREPARSED_DATA PreparsedData
)
684 return STATUS_NOT_IMPLEMENTED
;
690 HidP_InitializeReportForID(
691 IN HIDP_REPORT_TYPE ReportType
,
693 IN PHIDP_PREPARSED_DATA PreparsedData
,
695 IN ULONG ReportLength
)
699 return STATUS_NOT_IMPLEMENTED
;
702 #undef HidP_GetValueCaps
708 HIDP_REPORT_TYPE ReportType
,
709 PHIDP_VALUE_CAPS ValueCaps
,
710 PULONG ValueCapsLength
,
711 PHIDP_PREPARSED_DATA PreparsedData
)
715 return STATUS_NOT_IMPLEMENTED
;
721 IN PDRIVER_OBJECT DriverObject
,
722 IN PUNICODE_STRING RegPath
)
725 DPRINT1("********* HID PARSE *********\n");
726 return STATUS_SUCCESS
;