--- /dev/null
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/hidparse/hidparse.c
+ * PURPOSE: HID Parser
+ * PROGRAMMERS:
+ * Michael Martin (michael.martin@reactos.org)
+ * Johannes Anderwald (johannes.anderwald@reactos.org)
+ */
+
+#include "hidparse.h"
+
+
+VOID
+NTAPI
+HidP_FreeCollectionDescription (
+ IN PHIDP_DEVICE_DESC DeviceDescription)
+{
+ DPRINT1("HidP_FreeCollectionDescription DeviceDescription %p\n", DeviceDescription);
+
+ //
+ // free collection
+ //
+ ExFreePool(DeviceDescription->CollectionDesc);
+
+ //
+ // free report ids
+ //
+ ExFreePool(DeviceDescription->ReportIDs);
+}
+
+#undef HidP_GetButtonCaps
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetButtonCaps(
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_BUTTON_CAPS ButtonCaps,
+ PUSHORT ButtonCapsLength,
+ PHIDP_PREPARSED_DATA PreparsedData)
+{
+ return HidP_GetSpecificButtonCaps(ReportType, HID_USAGE_PAGE_UNDEFINED, 0, 0, ButtonCaps, (PULONG)ButtonCapsLength, PreparsedData);
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetSpecificButtonCaps(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection,
+ IN USAGE Usage,
+ OUT PHIDP_BUTTON_CAPS ButtonCaps,
+ IN OUT PULONG ButtonCapsLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetCaps(
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ OUT PHIDP_CAPS Capabilities)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HidP_GetCollectionDescription(
+ IN PHIDP_REPORT_DESCRIPTOR ReportDesc,
+ IN ULONG DescLength,
+ IN POOL_TYPE PoolType,
+ OUT PHIDP_DEVICE_DESC DeviceDescription)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetData(
+ IN HIDP_REPORT_TYPE ReportType,
+ OUT PHIDP_DATA DataList,
+ IN OUT PULONG DataLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetExtendedAttributes(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USHORT DataIndex,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ OUT PHIDP_EXTENDED_ATTRIBUTES Attributes,
+ IN OUT PULONG LengthAttributes)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetLinkCollectionNodes(
+ OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes,
+ IN OUT PULONG LinkCollectionNodesLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetScaledUsageValue(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection OPTIONAL,
+ IN USAGE Usage,
+ OUT PLONG UsageValue,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetUsageValue(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection,
+ IN USAGE Usage,
+ OUT PULONG UsageValue,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_UsageListDifference(
+ IN PUSAGE PreviousUsageList,
+ IN PUSAGE CurrentUsageList,
+ OUT PUSAGE BreakUsageList,
+ OUT PUSAGE MakeUsageList,
+ IN ULONG UsageListLength)
+{
+ ULONG Index, SubIndex, bFound, BreakUsageIndex = 0, MakeUsageIndex = 0;
+ USAGE CurrentUsage, Usage;
+
+ if (UsageListLength)
+ {
+ Index = 0;
+ do
+ {
+ /* get current usage */
+ CurrentUsage = PreviousUsageList[Index];
+
+ /* is the end of list reached? */
+ if (!CurrentUsage)
+ break;
+
+ /* start searching in current usage list */
+ SubIndex = 0;
+ bFound = FALSE;
+ do
+ {
+ /* get usage of current list */
+ Usage = CurrentUsageList[SubIndex];
+
+ /* end of list reached? */
+ if (!Usage)
+ break;
+
+ /* check if it matches the current one */
+ if (CurrentUsage == Usage)
+ {
+ /* it does */
+ bFound = TRUE;
+ break;
+ }
+
+ /* move to next usage */
+ SubIndex++;
+ }while(SubIndex < UsageListLength);
+
+ /* was the usage found ?*/
+ if (!bFound)
+ {
+ /* store it in the break usage list */
+ BreakUsageList[BreakUsageIndex] = CurrentUsage;
+ BreakUsageIndex++;
+ }
+
+ /* move to next usage */
+ Index++;
+
+ }while(Index < UsageListLength);
+
+ /* now process the new items */
+ Index = 0;
+ do
+ {
+ /* get current usage */
+ CurrentUsage = CurrentUsageList[Index];
+
+ /* is the end of list reached? */
+ if (!CurrentUsage)
+ break;
+
+ /* start searching in current usage list */
+ SubIndex = 0;
+ bFound = FALSE;
+ do
+ {
+ /* get usage of previous list */
+ Usage = PreviousUsageList[SubIndex];
+
+ /* end of list reached? */
+ if (!Usage)
+ break;
+
+ /* check if it matches the current one */
+ if (CurrentUsage == Usage)
+ {
+ /* it does */
+ bFound = TRUE;
+ break;
+ }
+
+ /* move to next usage */
+ SubIndex++;
+ }while(SubIndex < UsageListLength);
+
+ /* was the usage found ?*/
+ if (!bFound)
+ {
+ /* store it in the make usage list */
+ MakeUsageList[MakeUsageIndex] = CurrentUsage;
+ MakeUsageIndex++;
+ }
+
+ /* move to next usage */
+ Index++;
+
+ }while(Index < UsageListLength);
+ }
+
+ /* does the break list contain empty entries */
+ if (BreakUsageIndex < UsageListLength)
+ {
+ /* zeroize entries */
+ RtlZeroMemory(&BreakUsageList[BreakUsageIndex], sizeof(USAGE) * (UsageListLength - BreakUsageIndex));
+ }
+
+ /* does the make usage list contain empty entries */
+ if (MakeUsageIndex < UsageListLength)
+ {
+ /* zeroize entries */
+ RtlZeroMemory(&MakeUsageList[MakeUsageIndex], sizeof(USAGE) * (UsageListLength - MakeUsageIndex));
+ }
+
+ /* done */
+ return HIDP_STATUS_SUCCESS;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetSpecificValueCaps(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection,
+ IN USAGE Usage,
+ OUT PHIDP_VALUE_CAPS ValueCaps,
+ IN OUT PULONG ValueCapsLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+ULONG
+NTAPI
+HidP_MaxUsageListLength(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage OPTIONAL,
+ IN PHIDP_PREPARSED_DATA PreparsedData)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetUsages(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection OPTIONAL,
+ OUT USAGE *UsageList,
+ IN OUT ULONG *UsageLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HidP_SysPowerEvent (
+ IN PCHAR HidPacket,
+ IN USHORT HidPacketLength,
+ IN PHIDP_PREPARSED_DATA Ppd,
+ OUT PULONG OutputBuffer)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HidP_SysPowerCaps (
+ IN PHIDP_PREPARSED_DATA Ppd,
+ OUT PULONG OutputBuffer)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetUsageValueArray(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection OPTIONAL,
+ IN USAGE Usage,
+ OUT PCHAR UsageValue,
+ IN USHORT UsageValueByteLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetUsagesEx(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USHORT LinkCollection,
+ OUT PUSAGE_AND_PAGE ButtonList,
+ IN OUT ULONG *UsageLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN PCHAR Report,
+ IN ULONG ReportLength)
+{
+ return HidP_GetUsages(ReportType, HID_USAGE_PAGE_UNDEFINED, LinkCollection, (PUSAGE)ButtonList, UsageLength, PreparsedData, Report, ReportLength);
+}
+
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_UsageAndPageListDifference(
+ IN PUSAGE_AND_PAGE PreviousUsageList,
+ IN PUSAGE_AND_PAGE CurrentUsageList,
+ OUT PUSAGE_AND_PAGE BreakUsageList,
+ OUT PUSAGE_AND_PAGE MakeUsageList,
+ IN ULONG UsageListLength)
+{
+ ULONG Index, SubIndex, BreakUsageListIndex = 0, MakeUsageListIndex = 0, bFound;
+ PUSAGE_AND_PAGE CurrentUsage, Usage;
+
+ if (UsageListLength)
+ {
+ /* process removed usages */
+ Index = 0;
+ do
+ {
+ /* get usage from current index */
+ CurrentUsage = &PreviousUsageList[Index];
+
+ /* end of list reached? */
+ if (CurrentUsage->Usage == 0 && CurrentUsage->UsagePage == 0)
+ break;
+
+ /* search in current list */
+ SubIndex = 0;
+ bFound = FALSE;
+ do
+ {
+ /* get usage */
+ Usage = &CurrentUsageList[SubIndex];
+
+ /* end of list reached? */
+ if (Usage->Usage == 0 && Usage->UsagePage == 0)
+ break;
+
+ /* does it match */
+ if (Usage->Usage == CurrentUsage->Usage && Usage->UsagePage == CurrentUsage->UsagePage)
+ {
+ /* found match */
+ bFound = TRUE;
+ }
+
+ /* move to next index */
+ SubIndex++;
+
+ }while(SubIndex < UsageListLength);
+
+ if (!bFound)
+ {
+ /* store it in break usage list */
+ BreakUsageList[BreakUsageListIndex].Usage = CurrentUsage->Usage;
+ BreakUsageList[BreakUsageListIndex].UsagePage = CurrentUsage->UsagePage;
+ BreakUsageListIndex++;
+ }
+
+ /* move to next index */
+ Index++;
+
+ }while(Index < UsageListLength);
+
+ /* process new usages */
+ Index = 0;
+ do
+ {
+ /* get usage from current index */
+ CurrentUsage = &CurrentUsageList[Index];
+
+ /* end of list reached? */
+ if (CurrentUsage->Usage == 0 && CurrentUsage->UsagePage == 0)
+ break;
+
+ /* search in current list */
+ SubIndex = 0;
+ bFound = FALSE;
+ do
+ {
+ /* get usage */
+ Usage = &PreviousUsageList[SubIndex];
+
+ /* end of list reached? */
+ if (Usage->Usage == 0 && Usage->UsagePage == 0)
+ break;
+
+ /* does it match */
+ if (Usage->Usage == CurrentUsage->Usage && Usage->UsagePage == CurrentUsage->UsagePage)
+ {
+ /* found match */
+ bFound = TRUE;
+ }
+
+ /* move to next index */
+ SubIndex++;
+
+ }while(SubIndex < UsageListLength);
+
+ if (!bFound)
+ {
+ /* store it in break usage list */
+ MakeUsageList[MakeUsageListIndex].Usage = CurrentUsage->Usage;
+ MakeUsageList[MakeUsageListIndex].UsagePage = CurrentUsage->UsagePage;
+ MakeUsageListIndex++;
+ }
+
+ /* move to next index */
+ Index++;
+ }while(Index < UsageListLength);
+ }
+
+ /* are there remaining free list entries */
+ if (BreakUsageListIndex < UsageListLength)
+ {
+ /* zero them */
+ RtlZeroMemory(&BreakUsageList[BreakUsageListIndex], (UsageListLength - BreakUsageListIndex) * sizeof(USAGE_AND_PAGE));
+ }
+
+ /* are there remaining free list entries */
+ if (MakeUsageListIndex < UsageListLength)
+ {
+ /* zero them */
+ RtlZeroMemory(&MakeUsageList[MakeUsageListIndex], (UsageListLength - MakeUsageListIndex) * sizeof(USAGE_AND_PAGE));
+ }
+
+ /* done */
+ return HIDP_STATUS_SUCCESS;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_UnsetUsages(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection,
+ IN PUSAGE UsageList,
+ IN OUT PULONG UsageLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_TranslateUsagesToI8042ScanCodes(
+ IN PUSAGE ChangedUsageList,
+ IN ULONG UsageListLength,
+ IN HIDP_KEYBOARD_DIRECTION KeyAction,
+ IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
+ IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
+ IN PVOID InsertCodesContext)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_TranslateUsageAndPagesToI8042ScanCodes(
+ IN PUSAGE_AND_PAGE ChangedUsageList,
+ IN ULONG UsageListLength,
+ IN HIDP_KEYBOARD_DIRECTION KeyAction,
+ IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
+ IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
+ IN PVOID InsertCodesContext)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_SetUsages(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection,
+ IN PUSAGE UsageList,
+ IN OUT PULONG UsageLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_SetUsageValueArray(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection OPTIONAL,
+ IN USAGE Usage,
+ IN PCHAR UsageValue,
+ IN USHORT UsageValueByteLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_SetUsageValue(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection,
+ IN USAGE Usage,
+ IN ULONG UsageValue,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_SetScaledUsageValue(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN USAGE UsagePage,
+ IN USHORT LinkCollection OPTIONAL,
+ IN USAGE Usage,
+ IN LONG UsageValue,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_SetData(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN PHIDP_DATA DataList,
+ IN OUT PULONG DataLength,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+ULONG
+NTAPI
+HidP_MaxDataListLength(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN PHIDP_PREPARSED_DATA PreparsedData)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_InitializeReportForID(
+ IN HIDP_REPORT_TYPE ReportType,
+ IN UCHAR ReportID,
+ IN PHIDP_PREPARSED_DATA PreparsedData,
+ IN OUT PCHAR Report,
+ IN ULONG ReportLength)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+#undef HidP_GetValueCaps
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidP_GetValueCaps(
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_VALUE_CAPS ValueCaps,
+ PULONG ValueCapsLength,
+ PHIDP_PREPARSED_DATA PreparsedData)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+DriverEntry(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegPath)
+{
+
+ DPRINT1("********* HID PARSE *********\n");
+ return STATUS_SUCCESS;
+}