Added support for Streamdeck Pedal and updated UI to better fit the Packed UI style

This commit is contained in:
2026-02-27 22:47:08 +01:00
committed by erik
parent 5a70f775f1
commit 93faae5cc8
1463 changed files with 306917 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
add_executable(hid_report_reconstructor_test hid_report_reconstructor_test.c)
set_target_properties(hid_report_reconstructor_test
PROPERTIES
C_STANDARD 11
C_STANDARD_REQUIRED TRUE
)
target_link_libraries(hid_report_reconstructor_test
PRIVATE hidapi_include hidapi_winapi
)
# Each test case requires 2 files:
# <name>.pp_data - textual representation of HIDP_PREPARSED_DATA;
# <name>_expected.rpt_desc - reconstructed HID Report Descriptor out of .pp_data file;
#
# (Non-required by test):
# <name>_real.dpt_desc - the original report rescriptor used to create a test case;
set(HID_DESCRIPTOR_RECONSTRUCT_TEST_CASES
046D_C52F_0001_000C
046D_C52F_0001_FF00
046D_C52F_0002_0001
046D_C52F_0002_FF00
17CC_1130_0000_FF01
046D_0A37_0001_000C
046A_0011_0006_0001
046D_C077_0002_0001
046D_C283_0004_0001
046D_B010_0006_0001
046D_B010_0002_FF00
046D_B010_0002_0001
046D_B010_0001_FF00
046D_B010_0001_000C
046D_C534_0001_000C
046D_C534_0001_FF00
046D_C534_0002_0001
046D_C534_0002_FF00
046D_C534_0006_0001
046D_C534_0080_0001
047F_C056_0001_000C
047F_C056_0003_FFA0
047F_C056_0005_000B
045E_02FF_0005_0001
1532_00A3_0002_0001
)
set(CMAKE_VERSION_SUPPORTS_ENVIRONMENT_MODIFICATION "3.22")
if(HIDAPI_ENABLE_ASAN AND MSVC)
if(CMAKE_VERSION VERSION_LESS CMAKE_VERSION_SUPPORTS_ENVIRONMENT_MODIFICATION)
message("CTest/ASAN: Make sure to run ctest from MSVC Command Prompt")
endif()
endif()
foreach(TEST_CASE ${HID_DESCRIPTOR_RECONSTRUCT_TEST_CASES})
set(TEST_PP_DATA "${CMAKE_CURRENT_LIST_DIR}/data/${TEST_CASE}.pp_data")
if(NOT EXISTS "${TEST_PP_DATA}")
message(FATAL_ERROR "Missing '${TEST_PP_DATA}' file for '${TEST_CASE}' test case")
endif()
set(TEST_EXPECTED_DESCRIPTOR "${CMAKE_CURRENT_LIST_DIR}/data/${TEST_CASE}_expected.rpt_desc")
if(NOT EXISTS "${TEST_EXPECTED_DESCRIPTOR}")
message(FATAL_ERROR "Missing '${TEST_EXPECTED_DESCRIPTOR}' file for '${TEST_CASE}' test case")
endif()
add_test(NAME "WinHidReportReconstructTest_${TEST_CASE}"
COMMAND hid_report_reconstructor_test "${TEST_PP_DATA}" "${TEST_EXPECTED_DESCRIPTOR}"
WORKING_DIRECTORY "$<TARGET_FILE_DIR:hidapi_winapi>"
)
if(HIDAPI_ENABLE_ASAN)
if(MSVC)
if(NOT CMAKE_VERSION VERSION_LESS CMAKE_VERSION_SUPPORTS_ENVIRONMENT_MODIFICATION)
get_filename_component(MSVC_BUILD_TOOLS_DIR "${CMAKE_LINKER}" DIRECTORY)
set_property(TEST "WinHidReportReconstructTest_${TEST_CASE}" PROPERTY ENVIRONMENT_MODIFICATION "PATH=path_list_append:${MSVC_BUILD_TOOLS_DIR}")
endif()
endif()
set_property(TEST "WinHidReportReconstructTest_${TEST_CASE}" PROPERTY ENVIRONMENT "ASAN_SAVE_DUMPS=AsanDump_${TEST_CASE}.dmp")
endif()
endforeach()

View File

@@ -0,0 +1,420 @@
# HIDAPI device info struct:
dev->vendor_id = 0x045E
dev->product_id = 0x02FF
dev->manufacturer_string = ""
dev->product_string = "Controller (Xbox One For Windows)"
dev->release_number = 0x0000
dev->interface_number = -1
dev->usage = 0x0005
dev->usage_page = 0x0001
dev->path = "\\?\HID#VID_045E&PID_02FF&IG_00#7&5ea4a81&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0005
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 7
pp_data->caps_info[0]->NumberOfCaps = 7
pp_data->caps_info[0]->ReportByteLength = 16
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 7
pp_data->caps_info[1]->LastCap = 7
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 7
pp_data->caps_info[2]->LastCap = 7
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x02D8
pp_data->NumberLinkCollectionNodes = 4
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0001
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 16
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0003
pp_data->cap[0]->BitCount = 16
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0005
pp_data->cap[0]->LinkCollection = 0x0001
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0000
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 0
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0031
pp_data->cap[0]->NotRange.Reserved1 = 0x0031
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->NotButton.HasNull = 0
pp_data->cap[0]->NotButton.Reserved4 = 0x000000
pp_data->cap[0]->NotButton.LogicalMin = 0
pp_data->cap[0]->NotButton.LogicalMax = -1
pp_data->cap[0]->NotButton.PhysicalMin = 0
pp_data->cap[0]->NotButton.PhysicalMax = -1
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 16
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 16
pp_data->cap[1]->BitField = 0x02
pp_data->cap[1]->NextBytePosition = 0x0003
pp_data->cap[1]->LinkCollection = 0x0001
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0000
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0030
pp_data->cap[1]->NotRange.Reserved1 = 0x0030
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 1
pp_data->cap[1]->NotRange.Reserved4 = 1
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = 0
pp_data->cap[1]->NotButton.LogicalMax = -1
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = -1
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 16
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0007
pp_data->cap[2]->BitCount = 16
pp_data->cap[2]->BitField = 0x02
pp_data->cap[2]->NextBytePosition = 0x0009
pp_data->cap[2]->LinkCollection = 0x0002
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0000
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0034
pp_data->cap[2]->NotRange.Reserved1 = 0x0034
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 2
pp_data->cap[2]->NotRange.Reserved4 = 2
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = 0
pp_data->cap[2]->NotButton.LogicalMax = -1
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = -1
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x00
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 16
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0005
pp_data->cap[3]->BitCount = 16
pp_data->cap[3]->BitField = 0x02
pp_data->cap[3]->NextBytePosition = 0x0007
pp_data->cap[3]->LinkCollection = 0x0002
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0000
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 1
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0033
pp_data->cap[3]->NotRange.Reserved1 = 0x0033
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 3
pp_data->cap[3]->NotRange.Reserved4 = 3
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = 0
pp_data->cap[3]->NotButton.LogicalMax = -1
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = -1
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x0001
pp_data->cap[4]->ReportID = 0x00
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 16
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0009
pp_data->cap[4]->BitCount = 16
pp_data->cap[4]->BitField = 0x02
pp_data->cap[4]->NextBytePosition = 0x000B
pp_data->cap[4]->LinkCollection = 0x0003
pp_data->cap[4]->LinkUsagePage = 0x0001
pp_data->cap[4]->LinkUsage = 0x0000
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 1
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0032
pp_data->cap[4]->NotRange.Reserved1 = 0x0032
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 4
pp_data->cap[4]->NotRange.Reserved4 = 4
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = 0
pp_data->cap[4]->NotButton.LogicalMax = -1
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = -1
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
pp_data->cap[5]->UsagePage = 0x0009
pp_data->cap[5]->ReportID = 0x00
pp_data->cap[5]->BitPosition = 0
pp_data->cap[5]->BitSize = 1
pp_data->cap[5]->ReportCount = 16
pp_data->cap[5]->BytePosition = 0x000B
pp_data->cap[5]->BitCount = 16
pp_data->cap[5]->BitField = 0x02
pp_data->cap[5]->NextBytePosition = 0x000D
pp_data->cap[5]->LinkCollection = 0x0000
pp_data->cap[5]->LinkUsagePage = 0x0001
pp_data->cap[5]->LinkUsage = 0x0005
pp_data->cap[5]->IsMultipleItemsForArray = 0
pp_data->cap[5]->IsButtonCap = 1
pp_data->cap[5]->IsPadding = 0
pp_data->cap[5]->IsAbsolute = 1
pp_data->cap[5]->IsRange = 1
pp_data->cap[5]->IsAlias = 0
pp_data->cap[5]->IsStringRange = 0
pp_data->cap[5]->IsDesignatorRange = 0
pp_data->cap[5]->Reserved1 = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[5]->Range.UsageMin = 0x0001
pp_data->cap[5]->Range.UsageMax = 0x0010
pp_data->cap[5]->Range.StringMin = 0
pp_data->cap[5]->Range.StringMax = 0
pp_data->cap[5]->Range.DesignatorMin = 0
pp_data->cap[5]->Range.DesignatorMax = 0
pp_data->cap[5]->Range.DataIndexMin = 5
pp_data->cap[5]->Range.DataIndexMax = 20
pp_data->cap[5]->Button.LogicalMin = 0
pp_data->cap[5]->Button.LogicalMax = 0
pp_data->cap[5]->Units = 0
pp_data->cap[5]->UnitsExp = 0
pp_data->cap[6]->UsagePage = 0x0001
pp_data->cap[6]->ReportID = 0x00
pp_data->cap[6]->BitPosition = 0
pp_data->cap[6]->BitSize = 4
pp_data->cap[6]->ReportCount = 1
pp_data->cap[6]->BytePosition = 0x000D
pp_data->cap[6]->BitCount = 4
pp_data->cap[6]->BitField = 0x42
pp_data->cap[6]->NextBytePosition = 0x000E
pp_data->cap[6]->LinkCollection = 0x0000
pp_data->cap[6]->LinkUsagePage = 0x0001
pp_data->cap[6]->LinkUsage = 0x0005
pp_data->cap[6]->IsMultipleItemsForArray = 0
pp_data->cap[6]->IsButtonCap = 0
pp_data->cap[6]->IsPadding = 0
pp_data->cap[6]->IsAbsolute = 1
pp_data->cap[6]->IsRange = 0
pp_data->cap[6]->IsAlias = 0
pp_data->cap[6]->IsStringRange = 0
pp_data->cap[6]->IsDesignatorRange = 0
pp_data->cap[6]->Reserved1 = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[6]->NotRange.Usage = 0x0039
pp_data->cap[6]->NotRange.Reserved1 = 0x0039
pp_data->cap[6]->NotRange.StringIndex = 0
pp_data->cap[6]->NotRange.Reserved2 = 0
pp_data->cap[6]->NotRange.DesignatorIndex = 0
pp_data->cap[6]->NotRange.Reserved3 = 0
pp_data->cap[6]->NotRange.DataIndex = 21
pp_data->cap[6]->NotRange.Reserved4 = 21
pp_data->cap[6]->NotButton.HasNull = 1
pp_data->cap[6]->NotButton.Reserved4 = 0x000000
pp_data->cap[6]->NotButton.LogicalMin = 1
pp_data->cap[6]->NotButton.LogicalMax = 8
pp_data->cap[6]->NotButton.PhysicalMin = 0
pp_data->cap[6]->NotButton.PhysicalMax = 4155
pp_data->cap[6]->Units = 14
pp_data->cap[6]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0005
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 3
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 3
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0000
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 0
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000
pp_data->LinkCollectionArray[2]->LinkUsage = 0x0000
pp_data->LinkCollectionArray[2]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[2]->Parent = 0
pp_data->LinkCollectionArray[2]->NumberOfChildren = 0
pp_data->LinkCollectionArray[2]->NextSibling = 1
pp_data->LinkCollectionArray[2]->FirstChild = 0
pp_data->LinkCollectionArray[2]->CollectionType = 0
pp_data->LinkCollectionArray[2]->IsAlias = 0
pp_data->LinkCollectionArray[2]->Reserved = 0x00000000
pp_data->LinkCollectionArray[3]->LinkUsage = 0x0000
pp_data->LinkCollectionArray[3]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[3]->Parent = 0
pp_data->LinkCollectionArray[3]->NumberOfChildren = 0
pp_data->LinkCollectionArray[3]->NextSibling = 2
pp_data->LinkCollectionArray[3]->FirstChild = 0
pp_data->LinkCollectionArray[3]->CollectionType = 0
pp_data->LinkCollectionArray[3]->IsAlias = 0
pp_data->LinkCollectionArray[3]->Reserved = 0x00000000

View File

@@ -0,0 +1,12 @@
0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x09, 0x00, 0xA1, 0x00,
0x09, 0x30, 0x09, 0x31, 0x15, 0x00, 0x25, 0xFF, 0x35, 0x00,
0x45, 0xFF, 0x75, 0x10, 0x95, 0x02, 0x81, 0x02, 0xC0, 0x09,
0x00, 0xA1, 0x00, 0x09, 0x33, 0x09, 0x34, 0x15, 0x00, 0x25,
0xFF, 0x75, 0x10, 0x95, 0x02, 0x81, 0x02, 0xC0, 0x09, 0x00,
0xA1, 0x00, 0x09, 0x32, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x10,
0x95, 0x01, 0x81, 0x02, 0xC0, 0x05, 0x09, 0x19, 0x01, 0x29,
0x10, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x10, 0x45,
0x00, 0x81, 0x02, 0x05, 0x01, 0x09, 0x39, 0x15, 0x01, 0x25,
0x08, 0x35, 0x00, 0x46, 0x3B, 0x10, 0x65, 0x0E, 0x75, 0x04,
0x95, 0x01, 0x81, 0x42, 0x75, 0x04, 0x95, 0x01, 0x81, 0x03,
0x75, 0x08, 0x95, 0x02, 0x81, 0x03, 0xC0,

View File

@@ -0,0 +1,64 @@
// Special cases of this device:
// 2 full padding bytes at the end
// Multiple child collections inside of the same report (byte position of Input items defines collection order)
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x05, // Usage (Game Pad)
0xA1, 0x01, // Collection (Application)
0xA1, 0x00, // Collection (Physical)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0xFF, // Logical Maximum (-1)
0x35, 0x00, // Physical Minimum (0)
0x46, 0xFF, 0xFF, // Physical Maximum (-1)
0x95, 0x02, // Report Count (2)
0x75, 0x10, // Report Size (16)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0xA1, 0x00, // Collection (Physical)
0x09, 0x33, // Usage (Rx)
0x09, 0x34, // Usage (Ry)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0xFF, // Logical Maximum (-1)
0x35, 0x00, // Physical Minimum (0)
0x46, 0xFF, 0xFF, // Physical Maximum (-1)
0x95, 0x02, // Report Count (2)
0x75, 0x10, // Report Size (16)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0xA1, 0x00, // Collection (Physical)
0x09, 0x32, // Usage (Z)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0xFF, // Logical Maximum (-1)
0x35, 0x00, // Physical Minimum (0)
0x46, 0xFF, 0xFF, // Physical Maximum (-1)
0x95, 0x01, // Report Count (1)
0x75, 0x10, // Report Size (16)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (0x01)
0x29, 0x10, // Usage Maximum (0x10)
0x95, 0x10, // Report Count (16)
0x75, 0x01, // Report Size (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x39, // Usage (Hat switch)
0x15, 0x01, // Logical Minimum (1)
0x25, 0x08, // Logical Maximum (8)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x3B, 0x10, // Physical Maximum (4155)
0x66, 0x0E, 0x00, // Unit (None)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x75, 0x08, // Report Size (8)
0x95, 0x02, // Report Count (2)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 120 bytes

View File

@@ -0,0 +1,183 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046A
dev->product_id = 0x0011
dev->manufacturer_string = "dev->product_string = "dev->release_number = 0x0100
dev->interface_number = -1
dev->usage = 0x0006
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046a&pid_0011#7&2c7fd0a5&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0006
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 2
pp_data->caps_info[0]->NumberOfCaps = 2
pp_data->caps_info[0]->ReportByteLength = 9
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 2
pp_data->caps_info[1]->LastCap = 3
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 2
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 3
pp_data->caps_info[2]->LastCap = 3
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0138
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0007
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 8
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0006
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x00E0
pp_data->cap[0]->Range.UsageMax = 0x00E7
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 7
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0007
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 6
pp_data->cap[1]->BytePosition = 0x0003
pp_data->cap[1]->BitCount = 48
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0009
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0006
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 1
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->Range.UsageMin = 0x0000
pp_data->cap[1]->Range.UsageMax = 0x00DD
pp_data->cap[1]->Range.StringMin = 0
pp_data->cap[1]->Range.StringMax = 0
pp_data->cap[1]->Range.DesignatorMin = 0
pp_data->cap[1]->Range.DesignatorMax = 0
pp_data->cap[1]->Range.DataIndexMin = 8
pp_data->cap[1]->Range.DataIndexMax = 229
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 221
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[2]->UsagePage = 0x0008
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 1
pp_data->cap[2]->ReportCount = 3
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 3
pp_data->cap[2]->BitField = 0x02
pp_data->cap[2]->NextBytePosition = 0x0002
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0006
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 1
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->Range.UsageMin = 0x0001
pp_data->cap[2]->Range.UsageMax = 0x0003
pp_data->cap[2]->Range.StringMin = 0
pp_data->cap[2]->Range.StringMax = 0
pp_data->cap[2]->Range.DesignatorMin = 0
pp_data->cap[2]->Range.DesignatorMax = 0
pp_data->cap[2]->Range.DataIndexMin = 0
pp_data->cap[2]->Range.DataIndexMax = 2
pp_data->cap[2]->Button.LogicalMin = 0
pp_data->cap[2]->Button.LogicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0006
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,7 @@
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0,
0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08,
0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03, 0x19, 0x00,
0x29, 0xDD, 0x15, 0x00, 0x26, 0xDD, 0x00, 0x75, 0x08, 0x95,
0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x15,
0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x03, 0x91, 0x02, 0x75,
0x05, 0x95, 0x01, 0x91, 0x03, 0xC0,

View File

@@ -0,0 +1,7 @@
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0,
0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08,
0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03, 0x19, 0x00,
0x29, 0xDD, 0x15, 0x00, 0x26, 0xDD, 0x00, 0x75, 0x08, 0x95,
0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x15,
0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x03, 0x91, 0x02, 0x75,
0x05, 0x95, 0x01, 0x91, 0x03, 0xC0,

View File

@@ -0,0 +1,532 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0x0A37
dev->manufacturer_string = "Logitech Inc "
dev->product_string = "Logitech USB Headset H540"
dev->release_number = 0x0122
dev->interface_number = 3
dev->usage = 0x0001
dev->usage_page = 0x000C
dev->path = "\\?\hid#vid_046d&pid_0a37&mi_03#8&1717f300&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0x000C
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 7
pp_data->caps_info[0]->NumberOfCaps = 9
pp_data->caps_info[0]->ReportByteLength = 33
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 9
pp_data->caps_info[1]->LastCap = 12
pp_data->caps_info[1]->NumberOfCaps = 3
pp_data->caps_info[1]->ReportByteLength = 37
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 12
pp_data->caps_info[2]->LastCap = 12
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x04E0
pp_data->NumberLinkCollectionNodes = 2
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x000C
pp_data->cap[0]->ReportID = 0x01
pp_data->cap[0]->BitPosition = 1
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 1
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x000C
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x00EA
pp_data->cap[0]->NotRange.Reserved1 = 0x00EA
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x000C
pp_data->cap[1]->ReportID = 0x01
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 1
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 1
pp_data->cap[1]->BitField = 0x02
pp_data->cap[1]->NextBytePosition = 0x0002
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x000C
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x00E9
pp_data->cap[1]->NotRange.Reserved1 = 0x00E9
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 1
pp_data->cap[1]->NotRange.Reserved4 = 1
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x000C
pp_data->cap[2]->ReportID = 0x01
pp_data->cap[2]->BitPosition = 2
pp_data->cap[2]->BitSize = 1
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 1
pp_data->cap[2]->BitField = 0x06
pp_data->cap[2]->NextBytePosition = 0x0002
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x000C
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 0
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x00E2
pp_data->cap[2]->NotRange.Reserved1 = 0x00E2
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 2
pp_data->cap[2]->NotRange.Reserved4 = 2
pp_data->cap[2]->Button.LogicalMin = 0
pp_data->cap[2]->Button.LogicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0009
pp_data->cap[3]->ReportID = 0x01
pp_data->cap[3]->BitPosition = 5
pp_data->cap[3]->BitSize = 2
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0001
pp_data->cap[3]->BitCount = 2
pp_data->cap[3]->BitField = 0x40
pp_data->cap[3]->NextBytePosition = 0x0002
pp_data->cap[3]->LinkCollection = 0x0001
pp_data->cap[3]->LinkUsagePage = 0x000C
pp_data->cap[3]->LinkUsage = 0x0036
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 1
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 1
pp_data->cap[3]->IsRange = 1
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->Range.UsageMin = 0x0001
pp_data->cap[3]->Range.UsageMax = 0x0002
pp_data->cap[3]->Range.StringMin = 0
pp_data->cap[3]->Range.StringMax = 0
pp_data->cap[3]->Range.DesignatorMin = 0
pp_data->cap[3]->Range.DesignatorMax = 0
pp_data->cap[3]->Range.DataIndexMin = 3
pp_data->cap[3]->Range.DataIndexMax = 4
pp_data->cap[3]->Button.LogicalMin = 1
pp_data->cap[3]->Button.LogicalMax = 2
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x000C
pp_data->cap[4]->ReportID = 0x02
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 1
pp_data->cap[4]->ReportCount = 16
pp_data->cap[4]->BytePosition = 0x0001
pp_data->cap[4]->BitCount = 16
pp_data->cap[4]->BitField = 0x02
pp_data->cap[4]->NextBytePosition = 0x0003
pp_data->cap[4]->LinkCollection = 0x0000
pp_data->cap[4]->LinkUsagePage = 0x000C
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 1
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 1
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0000
pp_data->cap[4]->NotRange.Reserved1 = 0x0000
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 5
pp_data->cap[4]->NotRange.Reserved4 = 5
pp_data->cap[4]->Button.LogicalMin = 0
pp_data->cap[4]->Button.LogicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
pp_data->cap[5]->UsagePage = 0x000C
pp_data->cap[5]->ReportID = 0x05
pp_data->cap[5]->BitPosition = 0
pp_data->cap[5]->BitSize = 8
pp_data->cap[5]->ReportCount = 32
pp_data->cap[5]->BytePosition = 0x0001
pp_data->cap[5]->BitCount = 256
pp_data->cap[5]->BitField = 0x02
pp_data->cap[5]->NextBytePosition = 0x0021
pp_data->cap[5]->LinkCollection = 0x0000
pp_data->cap[5]->LinkUsagePage = 0x000C
pp_data->cap[5]->LinkUsage = 0x0001
pp_data->cap[5]->IsMultipleItemsForArray = 0
pp_data->cap[5]->IsButtonCap = 0
pp_data->cap[5]->IsPadding = 0
pp_data->cap[5]->IsAbsolute = 1
pp_data->cap[5]->IsRange = 0
pp_data->cap[5]->IsAlias = 0
pp_data->cap[5]->IsStringRange = 0
pp_data->cap[5]->IsDesignatorRange = 0
pp_data->cap[5]->Reserved1 = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[5]->NotRange.Usage = 0x0000
pp_data->cap[5]->NotRange.Reserved1 = 0x0000
pp_data->cap[5]->NotRange.StringIndex = 0
pp_data->cap[5]->NotRange.Reserved2 = 0
pp_data->cap[5]->NotRange.DesignatorIndex = 0
pp_data->cap[5]->NotRange.Reserved3 = 0
pp_data->cap[5]->NotRange.DataIndex = 6
pp_data->cap[5]->NotRange.Reserved4 = 6
pp_data->cap[5]->NotButton.HasNull = 0
pp_data->cap[5]->NotButton.Reserved4 = 0x000000
pp_data->cap[5]->NotButton.LogicalMin = 0
pp_data->cap[5]->NotButton.LogicalMax = 1
pp_data->cap[5]->NotButton.PhysicalMin = 0
pp_data->cap[5]->NotButton.PhysicalMax = 0
pp_data->cap[5]->Units = 0
pp_data->cap[5]->UnitsExp = 0
pp_data->cap[6]->UsagePage = 0x000C
pp_data->cap[6]->ReportID = 0x07
pp_data->cap[6]->BitPosition = 0
pp_data->cap[6]->BitSize = 8
pp_data->cap[6]->ReportCount = 32
pp_data->cap[6]->BytePosition = 0x0001
pp_data->cap[6]->BitCount = 256
pp_data->cap[6]->BitField = 0x02
pp_data->cap[6]->NextBytePosition = 0x0021
pp_data->cap[6]->LinkCollection = 0x0000
pp_data->cap[6]->LinkUsagePage = 0x000C
pp_data->cap[6]->LinkUsage = 0x0001
pp_data->cap[6]->IsMultipleItemsForArray = 0
pp_data->cap[6]->IsButtonCap = 0
pp_data->cap[6]->IsPadding = 0
pp_data->cap[6]->IsAbsolute = 1
pp_data->cap[6]->IsRange = 0
pp_data->cap[6]->IsAlias = 0
pp_data->cap[6]->IsStringRange = 0
pp_data->cap[6]->IsDesignatorRange = 0
pp_data->cap[6]->Reserved1 = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[6]->NotRange.Usage = 0x0000
pp_data->cap[6]->NotRange.Reserved1 = 0x0000
pp_data->cap[6]->NotRange.StringIndex = 0
pp_data->cap[6]->NotRange.Reserved2 = 0
pp_data->cap[6]->NotRange.DesignatorIndex = 0
pp_data->cap[6]->NotRange.Reserved3 = 0
pp_data->cap[6]->NotRange.DataIndex = 7
pp_data->cap[6]->NotRange.Reserved4 = 7
pp_data->cap[6]->NotButton.HasNull = 0
pp_data->cap[6]->NotButton.Reserved4 = 0x000000
pp_data->cap[6]->NotButton.LogicalMin = 0
pp_data->cap[6]->NotButton.LogicalMax = 1
pp_data->cap[6]->NotButton.PhysicalMin = 0
pp_data->cap[6]->NotButton.PhysicalMax = 0
pp_data->cap[6]->Units = 0
pp_data->cap[6]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[9]->UsagePage = 0x000C
pp_data->cap[9]->ReportID = 0x03
pp_data->cap[9]->BitPosition = 0
pp_data->cap[9]->BitSize = 1
pp_data->cap[9]->ReportCount = 16
pp_data->cap[9]->BytePosition = 0x0001
pp_data->cap[9]->BitCount = 16
pp_data->cap[9]->BitField = 0x02
pp_data->cap[9]->NextBytePosition = 0x0003
pp_data->cap[9]->LinkCollection = 0x0000
pp_data->cap[9]->LinkUsagePage = 0x000C
pp_data->cap[9]->LinkUsage = 0x0001
pp_data->cap[9]->IsMultipleItemsForArray = 0
pp_data->cap[9]->IsButtonCap = 1
pp_data->cap[9]->IsPadding = 0
pp_data->cap[9]->IsAbsolute = 1
pp_data->cap[9]->IsRange = 0
pp_data->cap[9]->IsAlias = 0
pp_data->cap[9]->IsStringRange = 0
pp_data->cap[9]->IsDesignatorRange = 0
pp_data->cap[9]->Reserved1 = 0x000000
pp_data->cap[9]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[9]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[9]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[9]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[9]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[9]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[9]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[9]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[9]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[9]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[9]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[9]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[9]->NotRange.Usage = 0x0000
pp_data->cap[9]->NotRange.Reserved1 = 0x0000
pp_data->cap[9]->NotRange.StringIndex = 0
pp_data->cap[9]->NotRange.Reserved2 = 0
pp_data->cap[9]->NotRange.DesignatorIndex = 0
pp_data->cap[9]->NotRange.Reserved3 = 0
pp_data->cap[9]->NotRange.DataIndex = 0
pp_data->cap[9]->NotRange.Reserved4 = 0
pp_data->cap[9]->Button.LogicalMin = 0
pp_data->cap[9]->Button.LogicalMax = 0
pp_data->cap[9]->Units = 0
pp_data->cap[9]->UnitsExp = 0
pp_data->cap[10]->UsagePage = 0x000C
pp_data->cap[10]->ReportID = 0x04
pp_data->cap[10]->BitPosition = 0
pp_data->cap[10]->BitSize = 8
pp_data->cap[10]->ReportCount = 36
pp_data->cap[10]->BytePosition = 0x0001
pp_data->cap[10]->BitCount = 288
pp_data->cap[10]->BitField = 0x02
pp_data->cap[10]->NextBytePosition = 0x0025
pp_data->cap[10]->LinkCollection = 0x0000
pp_data->cap[10]->LinkUsagePage = 0x000C
pp_data->cap[10]->LinkUsage = 0x0001
pp_data->cap[10]->IsMultipleItemsForArray = 0
pp_data->cap[10]->IsButtonCap = 0
pp_data->cap[10]->IsPadding = 0
pp_data->cap[10]->IsAbsolute = 1
pp_data->cap[10]->IsRange = 0
pp_data->cap[10]->IsAlias = 0
pp_data->cap[10]->IsStringRange = 0
pp_data->cap[10]->IsDesignatorRange = 0
pp_data->cap[10]->Reserved1 = 0x000000
pp_data->cap[10]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[10]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[10]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[10]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[10]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[10]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[10]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[10]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[10]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[10]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[10]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[10]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[10]->NotRange.Usage = 0x0000
pp_data->cap[10]->NotRange.Reserved1 = 0x0000
pp_data->cap[10]->NotRange.StringIndex = 0
pp_data->cap[10]->NotRange.Reserved2 = 0
pp_data->cap[10]->NotRange.DesignatorIndex = 0
pp_data->cap[10]->NotRange.Reserved3 = 0
pp_data->cap[10]->NotRange.DataIndex = 1
pp_data->cap[10]->NotRange.Reserved4 = 1
pp_data->cap[10]->NotButton.HasNull = 0
pp_data->cap[10]->NotButton.Reserved4 = 0x000000
pp_data->cap[10]->NotButton.LogicalMin = 0
pp_data->cap[10]->NotButton.LogicalMax = 1
pp_data->cap[10]->NotButton.PhysicalMin = 0
pp_data->cap[10]->NotButton.PhysicalMax = 0
pp_data->cap[10]->Units = 0
pp_data->cap[10]->UnitsExp = 0
pp_data->cap[11]->UsagePage = 0x000C
pp_data->cap[11]->ReportID = 0x06
pp_data->cap[11]->BitPosition = 0
pp_data->cap[11]->BitSize = 8
pp_data->cap[11]->ReportCount = 36
pp_data->cap[11]->BytePosition = 0x0001
pp_data->cap[11]->BitCount = 288
pp_data->cap[11]->BitField = 0x02
pp_data->cap[11]->NextBytePosition = 0x0025
pp_data->cap[11]->LinkCollection = 0x0000
pp_data->cap[11]->LinkUsagePage = 0x000C
pp_data->cap[11]->LinkUsage = 0x0001
pp_data->cap[11]->IsMultipleItemsForArray = 0
pp_data->cap[11]->IsButtonCap = 0
pp_data->cap[11]->IsPadding = 0
pp_data->cap[11]->IsAbsolute = 1
pp_data->cap[11]->IsRange = 0
pp_data->cap[11]->IsAlias = 0
pp_data->cap[11]->IsStringRange = 0
pp_data->cap[11]->IsDesignatorRange = 0
pp_data->cap[11]->Reserved1 = 0x000000
pp_data->cap[11]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[11]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[11]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[11]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[11]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[11]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[11]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[11]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[11]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[11]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[11]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[11]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[11]->NotRange.Usage = 0x0000
pp_data->cap[11]->NotRange.Reserved1 = 0x0000
pp_data->cap[11]->NotRange.StringIndex = 0
pp_data->cap[11]->NotRange.Reserved2 = 0
pp_data->cap[11]->NotRange.DesignatorIndex = 0
pp_data->cap[11]->NotRange.Reserved3 = 0
pp_data->cap[11]->NotRange.DataIndex = 2
pp_data->cap[11]->NotRange.Reserved4 = 2
pp_data->cap[11]->NotButton.HasNull = 0
pp_data->cap[11]->NotButton.Reserved4 = 0x000000
pp_data->cap[11]->NotButton.LogicalMin = 0
pp_data->cap[11]->NotButton.LogicalMax = 1
pp_data->cap[11]->NotButton.PhysicalMin = 0
pp_data->cap[11]->NotButton.PhysicalMax = 0
pp_data->cap[11]->Units = 0
pp_data->cap[11]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x000C
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 1
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 1
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0036
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x000C
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 2
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000

View File

@@ -0,0 +1,16 @@
0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x01, 0x09, 0xE9,
0x09, 0xEA, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x02,
0x81, 0x02, 0x09, 0xE2, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x01, 0x81, 0x06, 0x75, 0x02, 0x95, 0x01, 0x81, 0x03,
0x09, 0x36, 0xA1, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x02,
0x15, 0x01, 0x25, 0x02, 0x75, 0x02, 0x95, 0x01, 0x81, 0x40,
0x75, 0x01, 0x95, 0x01, 0x81, 0x03, 0xC0, 0x85, 0x02, 0x05,
0x0C, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95,
0x10, 0x81, 0x02, 0x85, 0x05, 0x09, 0x00, 0x15, 0x00, 0x25,
0x01, 0x75, 0x08, 0x95, 0x20, 0x81, 0x02, 0x85, 0x07, 0x09,
0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x81,
0x02, 0x85, 0x03, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75,
0x01, 0x95, 0x10, 0x91, 0x02, 0x85, 0x04, 0x09, 0x00, 0x15,
0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x24, 0x91, 0x02, 0x85,
0x06, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95,
0x24, 0x91, 0x02, 0xC0,

View File

@@ -0,0 +1,61 @@
Usage Page (Consumer Devices) 05 0C
Usage (Consumer Control) 09 01
Collection (Application) A1 01
Report ID (1) 85 01
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Usage (Volume Increment) 09 E9
Usage (Volume Decrement) 09 EA
Report Size (1) 75 01
Report Count (2) 95 02
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Usage (Mute) 09 E2
Report Count (1) 95 01
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
Usage (Undefined) 09 00
Report Count (2) 95 02
Input (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 03
Usage (Function Buttons) 09 36
Collection (Logical) A1 02
Usage Page (Button) 05 09
Usage Minimum (Button 1) 19 01
Usage Maximum (Button 2) 29 02
Report Size (2) 75 02
Report Count (1) 95 01
Logical Minimum (1) 15 01
Logical Maximum (2) 25 02
Input (Data,Ary,Abs) 81 40
End Collection C0
Usage Page (Consumer Devices) 05 0C
Usage (Undefined) 09 00
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Size (1) 75 01
Report Count (1) 95 01
Input (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 03
Report ID (2) 85 02
Usage Page (Consumer Devices) 05 0C
Usage (Undefined) 09 00
Report Count (16) 95 10
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Report ID (3) 85 03
Usage (Undefined) 09 00
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
Report ID (4) 85 04
Usage (Undefined) 09 00
Report Size (8) 75 08
Report Count (36) 95 24
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
Report ID (5) 85 05
Usage (Undefined) 09 00
Report Count (32) 95 20
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Report ID (6) 85 06
Usage (Undefined) 09 00
Report Count (36) 95 24
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
Report ID (7) 85 07
Usage (Undefined) 09 00
Report Count (32) 95 20
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
End Collection C0

View File

@@ -0,0 +1,97 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xB010
dev->manufacturer_string = "Logitech"
dev->product_string = "Logitech Bluetooth Wireless Mouse"
dev->release_number = 0x0000
dev->interface_number = -1
dev->usage = 0x0001
dev->usage_page = 0x000C
dev->path = "\\?\hid#{00001124-0000-1000-8000-00805f9b34fb}_vid&0002046d_pid&b010&col02#8&1cf1c1b9&3&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0x000C
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 2
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 1
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 1
pp_data->caps_info[2]->LastCap = 1
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0068
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0006
pp_data->cap[0]->ReportID = 0x03
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x000C
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 0
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0020
pp_data->cap[0]->NotRange.Reserved1 = 0x0020
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->NotButton.HasNull = 0
pp_data->cap[0]->NotButton.Reserved4 = 0x000000
pp_data->cap[0]->NotButton.LogicalMin = 0
pp_data->cap[0]->NotButton.LogicalMax = 100
pp_data->cap[0]->NotButton.PhysicalMin = 0
pp_data->cap[0]->NotButton.PhysicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x000C
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,3 @@
0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x03, 0x05, 0x06,
0x09, 0x20, 0x15, 0x00, 0x25, 0x64, 0x75, 0x08, 0x95, 0x01,
0x81, 0x02, 0xC0,

View File

@@ -0,0 +1,38 @@
mac-hid-dump on  main ./mac-hid-dump
mac-hid-dump:
...
046D B010: Unknown - Bluetooth Mouse M557
DESCRIPTOR:
05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01
29 08 15 00 25 01 75 01 95 08 81 02 05 01 09 30
09 31 16 01 f8 26 ff 07 75 0c 95 02 81 06 09 38
15 81 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 75
08 95 01 81 06 c0 c0 05 0c 09 01 a1 01 85 03 05
06 09 20 15 00 26 64 00 75 08 95 01 81 02 c0 06
00 ff 09 01 a1 01 85 10 75 08 95 06 15 00 26 ff
00 09 01 81 00 09 01 91 00 c0 06 00 ff 09 02 a1
01 85 11 75 08 95 13 15 00 26 ff 00 09 02 81 00
09 02 91 00 c0 05 01 09 06 a1 01 85 04 75 01 95
08 05 07 19 e0 29 e7 15 00 25 01 81 02 95 01 75
08 81 03 95 05 75 01 05 08 19 01 29 05 91 02 95
01 75 03 91 03 95 06 75 08 15 00 26 ff 00 05 07
19 00 29 ff 81 00 c0 05 0c 09 01 a1 01 85 05 15
00 25 01 75 01 95 02 0a 25 02 0a 24 02 81 02 95
01 75 06 81 03 c0
(246 bytes)
Parser output:
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x03, // Report ID (3)
0x05, 0x06, // Usage Page (Generic Dev Ctrls)
0x09, 0x20, // Usage (Battery Strength)
0x15, 0x00, // Logical Minimum (0)
0x26, 0x64, 0x00, // Logical Maximum (100)
0x75, 0x08, // Report Size (8)
0x95, 0x01, // Report Count (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection

View File

@@ -0,0 +1,139 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xB010
dev->manufacturer_string = "Logitech"
dev->product_string = "Logitech Bluetooth Wireless Mouse"
dev->release_number = 0x0000
dev->interface_number = -1
dev->usage = 0x0001
dev->usage_page = 0xFF00
dev->path = "\\?\hid#{00001124-0000-1000-8000-00805f9b34fb}_vid&0002046d_pid&b010&col03#8&1cf1c1b9&3&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0xFF00
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 7
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 2
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 7
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 2
pp_data->caps_info[2]->LastCap = 2
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x00D0
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0xFF00
pp_data->cap[0]->ReportID = 0x10
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 6
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 48
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0007
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0xFF00
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0001
pp_data->cap[0]->NotRange.Reserved1 = 0x0001
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x10
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 6
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 48
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0007
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0xFF00
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0001
pp_data->cap[1]->NotRange.Reserved1 = 0x0001
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 0
pp_data->cap[1]->NotRange.Reserved4 = 0
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x10, 0x09,
0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x06,
0x81, 0x00, 0x09, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x06, 0x91, 0x00, 0xC0,

View File

@@ -0,0 +1,39 @@
mac-hid-dump on  main ./mac-hid-dump
mac-hid-dump:
...
046D B010: Unknown - Bluetooth Mouse M557
DESCRIPTOR:
05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01
29 08 15 00 25 01 75 01 95 08 81 02 05 01 09 30
09 31 16 01 f8 26 ff 07 75 0c 95 02 81 06 09 38
15 81 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 75
08 95 01 81 06 c0 c0 05 0c 09 01 a1 01 85 03 05
06 09 20 15 00 26 64 00 75 08 95 01 81 02 c0 06
00 ff 09 01 a1 01 85 10 75 08 95 06 15 00 26 ff
00 09 01 81 00 09 01 91 00 c0 06 00 ff 09 02 a1
01 85 11 75 08 95 13 15 00 26 ff 00 09 02 81 00
09 02 91 00 c0 05 01 09 06 a1 01 85 04 75 01 95
08 05 07 19 e0 29 e7 15 00 25 01 81 02 95 01 75
08 81 03 95 05 75 01 05 08 19 01 29 05 91 02 95
01 75 03 91 03 95 06 75 08 15 00 26 ff 00 05 07
19 00 29 ff 81 00 c0 05 0c 09 01 a1 01 85 05 15
00 25 01 75 01 95 02 0a 25 02 0a 24 02 81 02 95
01 75 06 81 03 c0
(246 bytes)
Parser output:
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
0x09, 0x01, // Usage (0x01)
0xA1, 0x01, // Collection (Application)
0x85, 0x10, // Report ID (16)
0x75, 0x08, // Report Size (8)
0x95, 0x06, // Report Count (6)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x09, 0x01, // Usage (0x01)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x01, // Usage (0x01)
0x91, 0x00, // Output (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0, // End Collection

View File

@@ -0,0 +1,302 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xB010
dev->manufacturer_string = "Logitech"
dev->product_string = "Logitech Bluetooth Wireless Mouse"
dev->release_number = 0x0000
dev->interface_number = -1
dev->usage = 0x0002
dev->usage_page = 0x0001
dev->path = "\\?\hid#{00001124-0000-1000-8000-00805f9b34fb}_vid&0002046d_pid&b010&col01#8&1cf1c1b9&3&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 5
pp_data->caps_info[0]->NumberOfCaps = 5
pp_data->caps_info[0]->ReportByteLength = 7
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 5
pp_data->caps_info[1]->LastCap = 5
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 5
pp_data->caps_info[2]->LastCap = 5
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0208
pp_data->NumberLinkCollectionNodes = 2
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0009
pp_data->cap[0]->ReportID = 0x02
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 8
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0001
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x0008
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 7
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x02
pp_data->cap[1]->BitPosition = 4
pp_data->cap[1]->BitSize = 12
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0003
pp_data->cap[1]->BitCount = 12
pp_data->cap[1]->BitField = 0x06
pp_data->cap[1]->NextBytePosition = 0x0005
pp_data->cap[1]->LinkCollection = 0x0001
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 0
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0031
pp_data->cap[1]->NotRange.Reserved1 = 0x0031
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 8
pp_data->cap[1]->NotRange.Reserved4 = 8
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = -2047
pp_data->cap[1]->NotButton.LogicalMax = 2047
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x02
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 12
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0002
pp_data->cap[2]->BitCount = 12
pp_data->cap[2]->BitField = 0x06
pp_data->cap[2]->NextBytePosition = 0x0004
pp_data->cap[2]->LinkCollection = 0x0001
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 0
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0030
pp_data->cap[2]->NotRange.Reserved1 = 0x0030
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 9
pp_data->cap[2]->NotRange.Reserved4 = 9
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = -2047
pp_data->cap[2]->NotButton.LogicalMax = 2047
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x02
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 8
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0005
pp_data->cap[3]->BitCount = 8
pp_data->cap[3]->BitField = 0x06
pp_data->cap[3]->NextBytePosition = 0x0006
pp_data->cap[3]->LinkCollection = 0x0001
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 0
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0038
pp_data->cap[3]->NotRange.Reserved1 = 0x0038
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 10
pp_data->cap[3]->NotRange.Reserved4 = 10
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = -127
pp_data->cap[3]->NotButton.LogicalMax = 127
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x000C
pp_data->cap[4]->ReportID = 0x02
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 8
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0006
pp_data->cap[4]->BitCount = 8
pp_data->cap[4]->BitField = 0x06
pp_data->cap[4]->NextBytePosition = 0x0007
pp_data->cap[4]->LinkCollection = 0x0001
pp_data->cap[4]->LinkUsagePage = 0x0001
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 0
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0238
pp_data->cap[4]->NotRange.Reserved1 = 0x0238
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 11
pp_data->cap[4]->NotRange.Reserved4 = 11
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = -127
pp_data->cap[4]->NotButton.LogicalMax = 127
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 1
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 1
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 0
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000

View File

@@ -0,0 +1,8 @@
0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00,
0x85, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x08, 0x15, 0x00,
0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x05, 0x01,
0x09, 0x30, 0x09, 0x31, 0x16, 0x01, 0xF8, 0x26, 0xFF, 0x07,
0x75, 0x0C, 0x95, 0x02, 0x81, 0x06, 0x09, 0x38, 0x15, 0x81,
0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81, 0x06, 0x05, 0x0C,
0x0A, 0x38, 0x02, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95,
0x01, 0x81, 0x06, 0xC0, 0xC0,

View File

@@ -0,0 +1,61 @@
mac-hid-dump on  main ./mac-hid-dump
mac-hid-dump:
...
046D B010: Unknown - Bluetooth Mouse M557
DESCRIPTOR:
05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01
29 08 15 00 25 01 75 01 95 08 81 02 05 01 09 30
09 31 16 01 f8 26 ff 07 75 0c 95 02 81 06 09 38
15 81 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 75
08 95 01 81 06 c0 c0 05 0c 09 01 a1 01 85 03 05
06 09 20 15 00 26 64 00 75 08 95 01 81 02 c0 06
00 ff 09 01 a1 01 85 10 75 08 95 06 15 00 26 ff
00 09 01 81 00 09 01 91 00 c0 06 00 ff 09 02 a1
01 85 11 75 08 95 13 15 00 26 ff 00 09 02 81 00
09 02 91 00 c0 05 01 09 06 a1 01 85 04 75 01 95
08 05 07 19 e0 29 e7 15 00 25 01 81 02 95 01 75
08 81 03 95 05 75 01 05 08 19 01 29 05 91 02 95
01 75 03 91 03 95 06 75 08 15 00 26 ff 00 05 07
19 00 29 ff 81 00 c0 05 0c 09 01 a1 01 85 05 15
00 25 01 75 01 95 02 0a 25 02 0a 24 02 81 02 95
01 75 06 81 03 c0
(246 bytes)
Parser output:
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID (2)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection (Physical)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (0x01)
0x29, 0x08, // Usage Maximum (0x08)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x16, 0x01, 0xF8, // Logical Minimum (-2047)
0x26, 0xFF, 0x07, // Logical Maximum (2047)
0x75, 0x0C, // Report Size (12)
0x95, 0x02, // Report Count (2)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x38, // Usage (Wheel)
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
0x75, 0x08, // Report Size (8)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x0C, // Usage Page (Consumer)
0x0A, 0x38, 0x02, // Usage (AC Pan)
0x75, 0x08, // Report Size (8)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0xC0, // End Collection

View File

@@ -0,0 +1,139 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xB010
dev->manufacturer_string = "Logitech"
dev->product_string = "Logitech Bluetooth Wireless Mouse"
dev->release_number = 0x0000
dev->interface_number = -1
dev->usage = 0x0002
dev->usage_page = 0xFF00
dev->path = "\\?\hid#{00001124-0000-1000-8000-00805f9b34fb}_vid&0002046d_pid&b010&col04#8&1cf1c1b9&3&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0xFF00
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 20
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 2
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 20
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 2
pp_data->caps_info[2]->LastCap = 2
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x00D0
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0xFF00
pp_data->cap[0]->ReportID = 0x11
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 19
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 152
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0014
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0xFF00
pp_data->cap[0]->LinkUsage = 0x0002
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0002
pp_data->cap[0]->NotRange.Reserved1 = 0x0002
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x11
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 19
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 152
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0014
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0xFF00
pp_data->cap[1]->LinkUsage = 0x0002
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0002
pp_data->cap[1]->NotRange.Reserved1 = 0x0002
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 0
pp_data->cap[1]->NotRange.Reserved4 = 0
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x09,
0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x13,
0x81, 0x00, 0x09, 0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x13, 0x91, 0x00, 0xC0,

View File

@@ -0,0 +1,39 @@
mac-hid-dump on  main ./mac-hid-dump
mac-hid-dump:
...
046D B010: Unknown - Bluetooth Mouse M557
DESCRIPTOR:
05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01
29 08 15 00 25 01 75 01 95 08 81 02 05 01 09 30
09 31 16 01 f8 26 ff 07 75 0c 95 02 81 06 09 38
15 81 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 75
08 95 01 81 06 c0 c0 05 0c 09 01 a1 01 85 03 05
06 09 20 15 00 26 64 00 75 08 95 01 81 02 c0 06
00 ff 09 01 a1 01 85 10 75 08 95 06 15 00 26 ff
00 09 01 81 00 09 01 91 00 c0 06 00 ff 09 02 a1
01 85 11 75 08 95 13 15 00 26 ff 00 09 02 81 00
09 02 91 00 c0 05 01 09 06 a1 01 85 04 75 01 95
08 05 07 19 e0 29 e7 15 00 25 01 81 02 95 01 75
08 81 03 95 05 75 01 05 08 19 01 29 05 91 02 95
01 75 03 91 03 95 06 75 08 15 00 26 ff 00 05 07
19 00 29 ff 81 00 c0 05 0c 09 01 a1 01 85 05 15
00 25 01 75 01 95 02 0a 25 02 0a 24 02 81 02 95
01 75 06 81 03 c0
(246 bytes)
Parser output:
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
0x09, 0x02, // Usage (0x02)
0xA1, 0x01, // Collection (Application)
0x85, 0x11, // Report ID (17)
0x75, 0x08, // Report Size (8)
0x95, 0x13, // Report Count (19)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x09, 0x02, // Usage (0x02)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x02, // Usage (0x02)
0x91, 0x00, // Output (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0, // End Collection

View File

@@ -0,0 +1,185 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xB010
dev->manufacturer_string = "Logitech"
dev->product_string = "Logitech Bluetooth Wireless Mouse"
dev->release_number = 0x0000
dev->interface_number = -1
dev->usage = 0x0006
dev->usage_page = 0x0001
dev->path = "\\?\hid#{00001124-0000-1000-8000-00805f9b34fb}_vid&0002046d_pid&b010&col05#8&1cf1c1b9&3&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}\kbd"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0006
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 2
pp_data->caps_info[0]->NumberOfCaps = 2
pp_data->caps_info[0]->ReportByteLength = 9
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 2
pp_data->caps_info[1]->LastCap = 3
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 2
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 3
pp_data->caps_info[2]->LastCap = 3
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0138
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0007
pp_data->cap[0]->ReportID = 0x04
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 8
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0006
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x00E0
pp_data->cap[0]->Range.UsageMax = 0x00E7
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 7
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0007
pp_data->cap[1]->ReportID = 0x04
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 6
pp_data->cap[1]->BytePosition = 0x0003
pp_data->cap[1]->BitCount = 48
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0009
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0006
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 1
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->Range.UsageMin = 0x0000
pp_data->cap[1]->Range.UsageMax = 0x00FF
pp_data->cap[1]->Range.StringMin = 0
pp_data->cap[1]->Range.StringMax = 0
pp_data->cap[1]->Range.DesignatorMin = 0
pp_data->cap[1]->Range.DesignatorMax = 0
pp_data->cap[1]->Range.DataIndexMin = 8
pp_data->cap[1]->Range.DataIndexMax = 263
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[2]->UsagePage = 0x0008
pp_data->cap[2]->ReportID = 0x04
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 1
pp_data->cap[2]->ReportCount = 5
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 5
pp_data->cap[2]->BitField = 0x02
pp_data->cap[2]->NextBytePosition = 0x0002
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0006
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 1
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->Range.UsageMin = 0x0001
pp_data->cap[2]->Range.UsageMax = 0x0005
pp_data->cap[2]->Range.StringMin = 0
pp_data->cap[2]->Range.StringMax = 0
pp_data->cap[2]->Range.DesignatorMin = 0
pp_data->cap[2]->Range.DesignatorMax = 0
pp_data->cap[2]->Range.DataIndexMin = 0
pp_data->cap[2]->Range.DataIndexMax = 4
pp_data->cap[2]->Button.LogicalMin = 0
pp_data->cap[2]->Button.LogicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0006
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,7 @@
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x85, 0x04, 0x05, 0x07,
0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x08, 0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03,
0x19, 0x00, 0x29, 0xFF, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29,
0x05, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x05, 0x91,
0x02, 0x75, 0x03, 0x95, 0x01, 0x91, 0x03, 0xC0,

View File

@@ -0,0 +1,58 @@
mac-hid-dump on  main ./mac-hid-dump
mac-hid-dump:
...
046D B010: Unknown - Bluetooth Mouse M557
DESCRIPTOR:
05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01
29 08 15 00 25 01 75 01 95 08 81 02 05 01 09 30
09 31 16 01 f8 26 ff 07 75 0c 95 02 81 06 09 38
15 81 25 7f 75 08 95 01 81 06 05 0c 0a 38 02 75
08 95 01 81 06 c0 c0 05 0c 09 01 a1 01 85 03 05
06 09 20 15 00 26 64 00 75 08 95 01 81 02 c0 06
00 ff 09 01 a1 01 85 10 75 08 95 06 15 00 26 ff
00 09 01 81 00 09 01 91 00 c0 06 00 ff 09 02 a1
01 85 11 75 08 95 13 15 00 26 ff 00 09 02 81 00
09 02 91 00 c0 05 01 09 06 a1 01 85 04 75 01 95
08 05 07 19 e0 29 e7 15 00 25 01 81 02 95 01 75
08 81 03 95 05 75 01 05 08 19 01 29 05 91 02 95
01 75 03 91 03 95 06 75 08 15 00 26 ff 00 05 07
19 00 29 ff 81 00 c0 05 0c 09 01 a1 01 85 05 15
00 25 01 75 01 95 02 0a 25 02 0a 24 02 81 02 95
01 75 06 81 03 c0
(246 bytes)
Parser output:
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x85, 0x04, // Report ID (4)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
0x05, 0x08, // Usage Page (LEDs)
0x19, 0x01, // Usage Minimum (Num Lock)
0x29, 0x05, // Usage Maximum (Kana)
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x29, 0xFF, // Usage Maximum (0xFF)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection

View File

@@ -0,0 +1,252 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC077
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Optical Mouse"
dev->release_number = 0x7200
dev->interface_number = -1
dev->usage = 0x0002
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046d&pid_c077#7&1875dbae&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 4
pp_data->caps_info[0]->NumberOfCaps = 4
pp_data->caps_info[0]->ReportByteLength = 5
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 4
pp_data->caps_info[1]->LastCap = 4
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 4
pp_data->caps_info[2]->LastCap = 4
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x01A0
pp_data->NumberLinkCollectionNodes = 2
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0009
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 8
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0001
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x0003
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 2
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0004
pp_data->cap[1]->BitCount = 8
pp_data->cap[1]->BitField = 0x06
pp_data->cap[1]->NextBytePosition = 0x0005
pp_data->cap[1]->LinkCollection = 0x0001
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 0
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0038
pp_data->cap[1]->NotRange.Reserved1 = 0x0038
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 3
pp_data->cap[1]->NotRange.Reserved4 = 3
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = -127
pp_data->cap[1]->NotButton.LogicalMax = 127
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 8
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0003
pp_data->cap[2]->BitCount = 8
pp_data->cap[2]->BitField = 0x06
pp_data->cap[2]->NextBytePosition = 0x0004
pp_data->cap[2]->LinkCollection = 0x0001
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 0
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0031
pp_data->cap[2]->NotRange.Reserved1 = 0x0031
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 4
pp_data->cap[2]->NotRange.Reserved4 = 4
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = -127
pp_data->cap[2]->NotButton.LogicalMax = 127
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x00
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 8
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0002
pp_data->cap[3]->BitCount = 8
pp_data->cap[3]->BitField = 0x06
pp_data->cap[3]->NextBytePosition = 0x0003
pp_data->cap[3]->LinkCollection = 0x0001
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 0
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0030
pp_data->cap[3]->NotRange.Reserved1 = 0x0030
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 5
pp_data->cap[3]->NotRange.Reserved4 = 5
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = -127
pp_data->cap[3]->NotButton.LogicalMax = 127
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 1
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 1
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 0
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000

View File

@@ -0,0 +1,5 @@
0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00,
0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x05, 0x01, 0x09, 0x30,
0x09, 0x31, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08,
0x95, 0x03, 0x81, 0x06, 0xC0, 0xC0,

View File

@@ -0,0 +1,24 @@
Usage Page (Generic Desktop) 05 01
Usage (Mouse) 09 02
Collection (Application) A1 01
Usage (Pointer) 09 01
Collection (Physical) A1 00
Usage Page (Button) 05 09
Usage Minimum (Button 1) 19 01
Usage Maximum (Button 3) 29 03
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Count (8) 95 08
Report Size (1) 75 01
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Usage Page (Generic Desktop) 05 01
Usage (X) 09 30
Usage (Y) 09 31
Usage (Wheel) 09 38
Logical Minimum (-127) 15 81
Logical Maximum (127) 25 7F
Report Size (8) 75 08
Report Count (3) 95 03
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
End Collection C0
End Collection C0

View File

@@ -0,0 +1,520 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC283
dev->manufacturer_string = "Logitech Inc."
dev->product_string = "WingMan Force 3D"
dev->release_number = 0x0106
dev->interface_number = -1
dev->usage = 0x0004
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046d&pid_c283#7&d7fb4bf&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0004
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 8
pp_data->caps_info[0]->NumberOfCaps = 8
pp_data->caps_info[0]->ReportByteLength = 8
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 8
pp_data->caps_info[1]->LastCap = 9
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 9
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 9
pp_data->caps_info[2]->LastCap = 9
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x03A8
pp_data->NumberLinkCollectionNodes = 4
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0001
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0002
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0003
pp_data->cap[0]->LinkCollection = 0x0002
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 0
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0031
pp_data->cap[0]->NotRange.Reserved1 = 0x0031
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->NotButton.HasNull = 0
pp_data->cap[0]->NotButton.Reserved4 = 0x000000
pp_data->cap[0]->NotButton.LogicalMin = 0
pp_data->cap[0]->NotButton.LogicalMax = 255
pp_data->cap[0]->NotButton.PhysicalMin = 0
pp_data->cap[0]->NotButton.PhysicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 8
pp_data->cap[1]->BitField = 0x02
pp_data->cap[1]->NextBytePosition = 0x0002
pp_data->cap[1]->LinkCollection = 0x0002
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0030
pp_data->cap[1]->NotRange.Reserved1 = 0x0030
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 1
pp_data->cap[1]->NotRange.Reserved4 = 1
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = 0
pp_data->cap[1]->NotButton.LogicalMax = 255
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0xFF00
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 4
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0003
pp_data->cap[2]->BitCount = 4
pp_data->cap[2]->BitField = 0x02
pp_data->cap[2]->NextBytePosition = 0x0004
pp_data->cap[2]->LinkCollection = 0x0002
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0001
pp_data->cap[2]->NotRange.Reserved1 = 0x0001
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 2
pp_data->cap[2]->NotRange.Reserved4 = 2
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = 0
pp_data->cap[2]->NotButton.LogicalMax = 15
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = 255
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x00
pp_data->cap[3]->BitPosition = 4
pp_data->cap[3]->BitSize = 4
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0003
pp_data->cap[3]->BitCount = 4
pp_data->cap[3]->BitField = 0x42
pp_data->cap[3]->NextBytePosition = 0x0004
pp_data->cap[3]->LinkCollection = 0x0002
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 1
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0039
pp_data->cap[3]->NotRange.Reserved1 = 0x0039
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 3
pp_data->cap[3]->NotRange.Reserved4 = 3
pp_data->cap[3]->NotButton.HasNull = 1
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = 0
pp_data->cap[3]->NotButton.LogicalMax = 7
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 315
pp_data->cap[3]->Units = 20
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x0001
pp_data->cap[4]->ReportID = 0x00
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 8
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0004
pp_data->cap[4]->BitCount = 8
pp_data->cap[4]->BitField = 0x02
pp_data->cap[4]->NextBytePosition = 0x0005
pp_data->cap[4]->LinkCollection = 0x0002
pp_data->cap[4]->LinkUsagePage = 0x0001
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 1
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0035
pp_data->cap[4]->NotRange.Reserved1 = 0x0035
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 4
pp_data->cap[4]->NotRange.Reserved4 = 4
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = 0
pp_data->cap[4]->NotButton.LogicalMax = 255
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = 255
pp_data->cap[4]->Units = 20
pp_data->cap[4]->UnitsExp = 0
pp_data->cap[5]->UsagePage = 0x0009
pp_data->cap[5]->ReportID = 0x00
pp_data->cap[5]->BitPosition = 0
pp_data->cap[5]->BitSize = 1
pp_data->cap[5]->ReportCount = 7
pp_data->cap[5]->BytePosition = 0x0005
pp_data->cap[5]->BitCount = 7
pp_data->cap[5]->BitField = 0x02
pp_data->cap[5]->NextBytePosition = 0x0006
pp_data->cap[5]->LinkCollection = 0x0001
pp_data->cap[5]->LinkUsagePage = 0x0001
pp_data->cap[5]->LinkUsage = 0x0000
pp_data->cap[5]->IsMultipleItemsForArray = 0
pp_data->cap[5]->IsButtonCap = 1
pp_data->cap[5]->IsPadding = 0
pp_data->cap[5]->IsAbsolute = 1
pp_data->cap[5]->IsRange = 1
pp_data->cap[5]->IsAlias = 0
pp_data->cap[5]->IsStringRange = 0
pp_data->cap[5]->IsDesignatorRange = 0
pp_data->cap[5]->Reserved1 = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[5]->Range.UsageMin = 0x0001
pp_data->cap[5]->Range.UsageMax = 0x0007
pp_data->cap[5]->Range.StringMin = 0
pp_data->cap[5]->Range.StringMax = 0
pp_data->cap[5]->Range.DesignatorMin = 0
pp_data->cap[5]->Range.DesignatorMax = 0
pp_data->cap[5]->Range.DataIndexMin = 5
pp_data->cap[5]->Range.DataIndexMax = 11
pp_data->cap[5]->Button.LogicalMin = 0
pp_data->cap[5]->Button.LogicalMax = 0
pp_data->cap[5]->Units = 0
pp_data->cap[5]->UnitsExp = 0
pp_data->cap[6]->UsagePage = 0x0001
pp_data->cap[6]->ReportID = 0x00
pp_data->cap[6]->BitPosition = 0
pp_data->cap[6]->BitSize = 8
pp_data->cap[6]->ReportCount = 1
pp_data->cap[6]->BytePosition = 0x0006
pp_data->cap[6]->BitCount = 8
pp_data->cap[6]->BitField = 0x02
pp_data->cap[6]->NextBytePosition = 0x0007
pp_data->cap[6]->LinkCollection = 0x0001
pp_data->cap[6]->LinkUsagePage = 0x0001
pp_data->cap[6]->LinkUsage = 0x0000
pp_data->cap[6]->IsMultipleItemsForArray = 0
pp_data->cap[6]->IsButtonCap = 0
pp_data->cap[6]->IsPadding = 0
pp_data->cap[6]->IsAbsolute = 1
pp_data->cap[6]->IsRange = 0
pp_data->cap[6]->IsAlias = 0
pp_data->cap[6]->IsStringRange = 0
pp_data->cap[6]->IsDesignatorRange = 0
pp_data->cap[6]->Reserved1 = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[6]->NotRange.Usage = 0x0036
pp_data->cap[6]->NotRange.Reserved1 = 0x0036
pp_data->cap[6]->NotRange.StringIndex = 0
pp_data->cap[6]->NotRange.Reserved2 = 0
pp_data->cap[6]->NotRange.DesignatorIndex = 0
pp_data->cap[6]->NotRange.Reserved3 = 0
pp_data->cap[6]->NotRange.DataIndex = 12
pp_data->cap[6]->NotRange.Reserved4 = 12
pp_data->cap[6]->NotButton.HasNull = 0
pp_data->cap[6]->NotButton.Reserved4 = 0x000000
pp_data->cap[6]->NotButton.LogicalMin = 0
pp_data->cap[6]->NotButton.LogicalMax = 255
pp_data->cap[6]->NotButton.PhysicalMin = 0
pp_data->cap[6]->NotButton.PhysicalMax = 255
pp_data->cap[6]->Units = 0
pp_data->cap[6]->UnitsExp = 0
pp_data->cap[7]->UsagePage = 0xFF00
pp_data->cap[7]->ReportID = 0x00
pp_data->cap[7]->BitPosition = 0
pp_data->cap[7]->BitSize = 8
pp_data->cap[7]->ReportCount = 1
pp_data->cap[7]->BytePosition = 0x0007
pp_data->cap[7]->BitCount = 8
pp_data->cap[7]->BitField = 0x02
pp_data->cap[7]->NextBytePosition = 0x0008
pp_data->cap[7]->LinkCollection = 0x0001
pp_data->cap[7]->LinkUsagePage = 0x0001
pp_data->cap[7]->LinkUsage = 0x0000
pp_data->cap[7]->IsMultipleItemsForArray = 0
pp_data->cap[7]->IsButtonCap = 0
pp_data->cap[7]->IsPadding = 0
pp_data->cap[7]->IsAbsolute = 1
pp_data->cap[7]->IsRange = 0
pp_data->cap[7]->IsAlias = 0
pp_data->cap[7]->IsStringRange = 0
pp_data->cap[7]->IsDesignatorRange = 0
pp_data->cap[7]->Reserved1 = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[7]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[7]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[7]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[7]->NotRange.Usage = 0x0001
pp_data->cap[7]->NotRange.Reserved1 = 0x0001
pp_data->cap[7]->NotRange.StringIndex = 0
pp_data->cap[7]->NotRange.Reserved2 = 0
pp_data->cap[7]->NotRange.DesignatorIndex = 0
pp_data->cap[7]->NotRange.Reserved3 = 0
pp_data->cap[7]->NotRange.DataIndex = 13
pp_data->cap[7]->NotRange.Reserved4 = 13
pp_data->cap[7]->NotButton.HasNull = 0
pp_data->cap[7]->NotButton.Reserved4 = 0x000000
pp_data->cap[7]->NotButton.LogicalMin = 0
pp_data->cap[7]->NotButton.LogicalMax = 255
pp_data->cap[7]->NotButton.PhysicalMin = 0
pp_data->cap[7]->NotButton.PhysicalMax = 255
pp_data->cap[7]->Units = 0
pp_data->cap[7]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[8]->UsagePage = 0xFF00
pp_data->cap[8]->ReportID = 0x00
pp_data->cap[8]->BitPosition = 0
pp_data->cap[8]->BitSize = 8
pp_data->cap[8]->ReportCount = 8
pp_data->cap[8]->BytePosition = 0x0001
pp_data->cap[8]->BitCount = 64
pp_data->cap[8]->BitField = 0x02
pp_data->cap[8]->NextBytePosition = 0x0009
pp_data->cap[8]->LinkCollection = 0x0003
pp_data->cap[8]->LinkUsagePage = 0xFF00
pp_data->cap[8]->LinkUsage = 0x0000
pp_data->cap[8]->IsMultipleItemsForArray = 0
pp_data->cap[8]->IsButtonCap = 0
pp_data->cap[8]->IsPadding = 0
pp_data->cap[8]->IsAbsolute = 1
pp_data->cap[8]->IsRange = 0
pp_data->cap[8]->IsAlias = 0
pp_data->cap[8]->IsStringRange = 0
pp_data->cap[8]->IsDesignatorRange = 0
pp_data->cap[8]->Reserved1 = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[8]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[8]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[8]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[8]->NotRange.Usage = 0x0002
pp_data->cap[8]->NotRange.Reserved1 = 0x0002
pp_data->cap[8]->NotRange.StringIndex = 0
pp_data->cap[8]->NotRange.Reserved2 = 0
pp_data->cap[8]->NotRange.DesignatorIndex = 0
pp_data->cap[8]->NotRange.Reserved3 = 0
pp_data->cap[8]->NotRange.DataIndex = 0
pp_data->cap[8]->NotRange.Reserved4 = 0
pp_data->cap[8]->NotButton.HasNull = 0
pp_data->cap[8]->NotButton.Reserved4 = 0x000000
pp_data->cap[8]->NotButton.LogicalMin = 0
pp_data->cap[8]->NotButton.LogicalMax = 255
pp_data->cap[8]->NotButton.PhysicalMin = 0
pp_data->cap[8]->NotButton.PhysicalMax = 255
pp_data->cap[8]->Units = 0
pp_data->cap[8]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0004
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 2
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 3
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0000
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 1
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 2
pp_data->LinkCollectionArray[1]->CollectionType = 2
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000
pp_data->LinkCollectionArray[2]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[2]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[2]->Parent = 1
pp_data->LinkCollectionArray[2]->NumberOfChildren = 0
pp_data->LinkCollectionArray[2]->NextSibling = 0
pp_data->LinkCollectionArray[2]->FirstChild = 0
pp_data->LinkCollectionArray[2]->CollectionType = 0
pp_data->LinkCollectionArray[2]->IsAlias = 0
pp_data->LinkCollectionArray[2]->Reserved = 0x00000000
pp_data->LinkCollectionArray[3]->LinkUsage = 0x0000
pp_data->LinkCollectionArray[3]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[3]->Parent = 0
pp_data->LinkCollectionArray[3]->NumberOfChildren = 0
pp_data->LinkCollectionArray[3]->NextSibling = 1
pp_data->LinkCollectionArray[3]->FirstChild = 0
pp_data->LinkCollectionArray[3]->CollectionType = 2
pp_data->LinkCollectionArray[3]->IsAlias = 0
pp_data->LinkCollectionArray[3]->Reserved = 0x00000000

View File

@@ -0,0 +1,18 @@
0x05, 0x01, 0x09, 0x04, 0xA1, 0x01, 0x09, 0x00, 0xA1, 0x02,
0x09, 0x01, 0xA1, 0x00, 0x09, 0x30, 0x09, 0x31, 0x15, 0x00,
0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75, 0x08,
0x95, 0x02, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x01, 0x15,
0x00, 0x25, 0x0F, 0x75, 0x04, 0x95, 0x01, 0x81, 0x02, 0x05,
0x01, 0x09, 0x39, 0x15, 0x00, 0x25, 0x07, 0x35, 0x00, 0x46,
0x3B, 0x01, 0x65, 0x14, 0x75, 0x04, 0x95, 0x01, 0x81, 0x42,
0x09, 0x35, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46,
0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02, 0xC0, 0x05,
0x09, 0x19, 0x01, 0x29, 0x07, 0x15, 0x00, 0x25, 0x01, 0x75,
0x01, 0x95, 0x07, 0x45, 0x00, 0x65, 0x00, 0x81, 0x02, 0x75,
0x01, 0x95, 0x01, 0x81, 0x03, 0x05, 0x01, 0x09, 0x36, 0x15,
0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x01, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x01,
0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81,
0x02, 0xC0, 0x09, 0x00, 0xA1, 0x02, 0x09, 0x02, 0x15, 0x00,
0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x08, 0x91, 0x02, 0xC0,
0xC0,

View File

@@ -0,0 +1,18 @@
0x05, 0x01, 0x09, 0x04, 0xA1, 0x01, 0x09, 0x00, 0xA1, 0x02,
0x09, 0x01, 0xA1, 0x00, 0x09, 0x30, 0x09, 0x31, 0x15, 0x00,
0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75, 0x08,
0x95, 0x02, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x01, 0x15,
0x00, 0x25, 0x0F, 0x75, 0x04, 0x95, 0x01, 0x81, 0x02, 0x05,
0x01, 0x09, 0x39, 0x15, 0x00, 0x25, 0x07, 0x35, 0x00, 0x46,
0x3B, 0x01, 0x65, 0x14, 0x75, 0x04, 0x95, 0x01, 0x81, 0x42,
0x09, 0x35, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46,
0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02, 0xC0, 0x05,
0x09, 0x19, 0x01, 0x29, 0x07, 0x15, 0x00, 0x25, 0x01, 0x75,
0x01, 0x95, 0x07, 0x45, 0x00, 0x65, 0x00, 0x81, 0x02, 0x75,
0x01, 0x95, 0x01, 0x81, 0x03, 0x05, 0x01, 0x09, 0x36, 0x15,
0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x01, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x01,
0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81,
0x02, 0xC0, 0x09, 0x00, 0xA1, 0x02, 0x09, 0x02, 0x15, 0x00,
0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x08, 0x91, 0x02, 0xC0,
0xC0,

View File

@@ -0,0 +1,93 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC52F
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2200
dev->interface_number = 1
dev->usage = 0x0001
dev->usage_page = 0x000C
dev->path = "\\?\hid#vid_046d&pid_c52f&mi_01&col01#8&28ca146b&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0x000C
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 5
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 1
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 1
pp_data->caps_info[2]->LastCap = 1
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0068
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x000C
pp_data->cap[0]->ReportID = 0x03
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 16
pp_data->cap[0]->ReportCount = 2
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 32
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0005
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x000C
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x028C
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 651
pp_data->cap[0]->Button.LogicalMin = 1
pp_data->cap[0]->Button.LogicalMax = 652
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x000C
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,3 @@
0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x03, 0x19, 0x01,
0x2A, 0x8C, 0x02, 0x15, 0x01, 0x26, 0x8C, 0x02, 0x75, 0x10,
0x95, 0x02, 0x81, 0x00, 0xC0,

View File

@@ -0,0 +1,12 @@
Usage Page (Consumer Devices) 05 0C
Usage (Consumer Control) 09 01
Collection (Application) A1 01
Report ID (3) 85 03
Report Size (16) 75 10
Report Count (2) 95 02
Logical Minimum (1) 15 01
Logical Maximum (652) 26 8C 02
Usage Minimum (Consumer Control) 19 01
Usage Maximum (AC Send) 2A 8C 02
Input (Data,Ary,Abs) 81 00
End Collection C0

View File

@@ -0,0 +1,139 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC52F
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2200
dev->interface_number = 1
dev->usage = 0x0001
dev->usage_page = 0xFF00
dev->path = "\\?\hid#vid_046d&pid_c52f&mi_01&col02#8&28ca146b&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0xFF00
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 7
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 2
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 7
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 2
pp_data->caps_info[2]->LastCap = 2
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x00D0
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0xFF00
pp_data->cap[0]->ReportID = 0x10
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 6
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 48
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0007
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0xFF00
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0001
pp_data->cap[0]->NotRange.Reserved1 = 0x0001
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x10
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 6
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 48
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0007
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0xFF00
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0001
pp_data->cap[1]->NotRange.Reserved1 = 0x0001
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 0
pp_data->cap[1]->NotRange.Reserved4 = 0
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x10, 0x09,
0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x06,
0x81, 0x00, 0x09, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x06, 0x91, 0x00, 0xC0,

View File

@@ -0,0 +1,13 @@
Usage Page (Vendor-Defined 1) 06 00 FF
Usage (Vendor-Defined 1) 09 01
Collection (Application) A1 01
Report ID (16) 85 10
Report Size (8) 75 08
Report Count (6) 95 06
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Usage (Vendor-Defined 1) 09 01
Input (Data,Ary,Abs) 81 00
Usage (Vendor-Defined 1) 09 01
Output (Data,Ary,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 00
End Collection C0

View File

@@ -0,0 +1,302 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC52F
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2200
dev->interface_number = 0
dev->usage = 0x0002
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046d&pid_c52f&mi_00#8&1599f82d&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 5
pp_data->caps_info[0]->NumberOfCaps = 5
pp_data->caps_info[0]->ReportByteLength = 9
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 5
pp_data->caps_info[1]->LastCap = 5
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 5
pp_data->caps_info[2]->LastCap = 5
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0208
pp_data->NumberLinkCollectionNodes = 2
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0009
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 16
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 16
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0003
pp_data->cap[0]->LinkCollection = 0x0001
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x0010
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 15
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 16
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0005
pp_data->cap[1]->BitCount = 16
pp_data->cap[1]->BitField = 0x06
pp_data->cap[1]->NextBytePosition = 0x0007
pp_data->cap[1]->LinkCollection = 0x0001
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 0
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0031
pp_data->cap[1]->NotRange.Reserved1 = 0x0031
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 16
pp_data->cap[1]->NotRange.Reserved4 = 16
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = -32767
pp_data->cap[1]->NotButton.LogicalMax = 32767
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 16
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0003
pp_data->cap[2]->BitCount = 16
pp_data->cap[2]->BitField = 0x06
pp_data->cap[2]->NextBytePosition = 0x0005
pp_data->cap[2]->LinkCollection = 0x0001
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 0
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0030
pp_data->cap[2]->NotRange.Reserved1 = 0x0030
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 17
pp_data->cap[2]->NotRange.Reserved4 = 17
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = -32767
pp_data->cap[2]->NotButton.LogicalMax = 32767
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x00
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 8
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0007
pp_data->cap[3]->BitCount = 8
pp_data->cap[3]->BitField = 0x06
pp_data->cap[3]->NextBytePosition = 0x0008
pp_data->cap[3]->LinkCollection = 0x0001
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 0
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0038
pp_data->cap[3]->NotRange.Reserved1 = 0x0038
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 18
pp_data->cap[3]->NotRange.Reserved4 = 18
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = -127
pp_data->cap[3]->NotButton.LogicalMax = 127
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x000C
pp_data->cap[4]->ReportID = 0x00
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 8
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0008
pp_data->cap[4]->BitCount = 8
pp_data->cap[4]->BitField = 0x06
pp_data->cap[4]->NextBytePosition = 0x0009
pp_data->cap[4]->LinkCollection = 0x0001
pp_data->cap[4]->LinkUsagePage = 0x0001
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 0
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0238
pp_data->cap[4]->NotRange.Reserved1 = 0x0238
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 19
pp_data->cap[4]->NotRange.Reserved4 = 19
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = -127
pp_data->cap[4]->NotButton.LogicalMax = 127
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 1
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 1
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 0
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000

View File

@@ -0,0 +1,8 @@
0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00,
0x05, 0x09, 0x19, 0x01, 0x29, 0x10, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x10, 0x81, 0x02, 0x05, 0x01, 0x09, 0x30,
0x09, 0x31, 0x16, 0x01, 0x80, 0x26, 0xFF, 0x7F, 0x75, 0x10,
0x95, 0x02, 0x81, 0x06, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F,
0x75, 0x08, 0x95, 0x01, 0x81, 0x06, 0x05, 0x0C, 0x0A, 0x38,
0x02, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81,
0x06, 0xC0, 0xC0,

View File

@@ -0,0 +1,33 @@
Usage Page (Generic Desktop) 05 01
Usage (Mouse) 09 02
Collection (Application) A1 01
Usage (Pointer) 09 01
Collection (Physical) A1 00
Usage Page (Button) 05 09
Usage Minimum (Button 1) 19 01
Usage Maximum (Button 16) 29 10
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Count (16) 95 10
Report Size (1) 75 01
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Usage Page (Generic Desktop) 05 01
Logical Minimum (-32767) 16 01 80
Logical Maximum (32767) 26 FF 7F
Report Size (16) 75 10
Report Count (2) 95 02
Usage (X) 09 30
Usage (Y) 09 31
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
Logical Minimum (-127) 15 81
Logical Maximum (127) 25 7F
Report Size (8) 75 08
Report Count (1) 95 01
Usage (Wheel) 09 38
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
Usage Page (Consumer Devices) 05 0C
Usage (AC Pan) 0A 38 02
Report Count (1) 95 01
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
End Collection C0
End Collection C0

View File

@@ -0,0 +1,139 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC52F
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2200
dev->interface_number = 1
dev->usage = 0x0002
dev->usage_page = 0xFF00
dev->path = "\\?\hid#vid_046d&pid_c52f&mi_01&col03#8&28ca146b&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0xFF00
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 20
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 2
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 20
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 2
pp_data->caps_info[2]->LastCap = 2
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x00D0
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0xFF00
pp_data->cap[0]->ReportID = 0x11
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 19
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 152
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0014
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0xFF00
pp_data->cap[0]->LinkUsage = 0x0002
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0002
pp_data->cap[0]->NotRange.Reserved1 = 0x0002
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x11
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 19
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 152
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0014
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0xFF00
pp_data->cap[1]->LinkUsage = 0x0002
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0002
pp_data->cap[1]->NotRange.Reserved1 = 0x0002
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 0
pp_data->cap[1]->NotRange.Reserved4 = 0
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x09,
0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x13,
0x81, 0x00, 0x09, 0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x13, 0x91, 0x00, 0xC0,

View File

@@ -0,0 +1,13 @@
Usage Page (Vendor-Defined 1) 06 00 FF
Usage (Vendor-Defined 2) 09 02
Collection (Application) A1 01
Report ID (17) 85 11
Report Size (8) 75 08
Report Count (19) 95 13
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Usage (Vendor-Defined 2) 09 02
Input (Data,Ary,Abs) 81 00
Usage (Vendor-Defined 2) 09 02
Output (Data,Ary,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 00
End Collection C0

View File

@@ -0,0 +1,93 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC534
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2901
dev->interface_number = 1
dev->usage = 0x0001
dev->usage_page = 0x000C
dev->path = "\\?\hid#vid_046d&pid_c534&mi_01&col02#7&1ebb799e&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0x000C
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 5
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 1
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 1
pp_data->caps_info[2]->LastCap = 1
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0068
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x000C
pp_data->cap[0]->ReportID = 0x03
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 16
pp_data->cap[0]->ReportCount = 2
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 32
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0005
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x000C
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x028C
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 651
pp_data->cap[0]->Button.LogicalMin = 1
pp_data->cap[0]->Button.LogicalMax = 652
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x000C
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,3 @@
0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x03, 0x19, 0x01,
0x2A, 0x8C, 0x02, 0x15, 0x01, 0x26, 0x8C, 0x02, 0x75, 0x10,
0x95, 0x02, 0x81, 0x00, 0xC0,

View File

@@ -0,0 +1,18 @@
macOS USB prober output for Logitech USB Receiver
05 0C 09 01 A1 01
85 03 75 10 95 02 15 01 26 8C 02 19 01 2A 8C 02 81 00
C0
Parser output:
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x03, // Report ID (3)
0x75, 0x10, // Report Size (16)
0x95, 0x02, // Report Count (2)
0x15, 0x01, // Logical Minimum (1)
0x26, 0x8C, 0x02, // Logical Maximum (652)
0x19, 0x01, // Usage Minimum (Consumer Control)
0x2A, 0x8C, 0x02, // Usage Maximum (AC Send)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection

View File

@@ -0,0 +1,139 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC534
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2901
dev->interface_number = 1
dev->usage = 0x0001
dev->usage_page = 0xFF00
dev->path = "\\?\hid#vid_046d&pid_c534&mi_01&col04#7&1ebb799e&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0xFF00
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 7
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 2
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 7
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 2
pp_data->caps_info[2]->LastCap = 2
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x00D0
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0xFF00
pp_data->cap[0]->ReportID = 0x10
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 6
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 48
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0007
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0xFF00
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0001
pp_data->cap[0]->NotRange.Reserved1 = 0x0001
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x10
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 6
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 48
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0007
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0xFF00
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0001
pp_data->cap[1]->NotRange.Reserved1 = 0x0001
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 0
pp_data->cap[1]->NotRange.Reserved4 = 0
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x10, 0x09,
0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x06,
0x81, 0x00, 0x09, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x06, 0x91, 0x00, 0xC0,

View File

@@ -0,0 +1,20 @@
macOS USB prober output for Logitech USB Receiver
06 00 FF 09 01 A1 01 85 10 75 08 95 06
15 00 26 FF 00 09 01 81
00 09 01 91 00 C0
Parser Output:
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
0x09, 0x01, // Usage (0x01)
0xA1, 0x01, // Collection (Application)
0x85, 0x10, // Report ID (16)
0x75, 0x08, // Report Size (8)
0x95, 0x06, // Report Count (6)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x09, 0x01, // Usage (0x01)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x01, // Usage (0x01)
0x91, 0x00, // Output (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0, // End Collection

View File

@@ -0,0 +1,302 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC534
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2901
dev->interface_number = 1
dev->usage = 0x0002
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046d&pid_c534&mi_01&col01#7&1ebb799e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 5
pp_data->caps_info[0]->NumberOfCaps = 5
pp_data->caps_info[0]->ReportByteLength = 8
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 5
pp_data->caps_info[1]->LastCap = 5
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 5
pp_data->caps_info[2]->LastCap = 5
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0208
pp_data->NumberLinkCollectionNodes = 2
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0009
pp_data->cap[0]->ReportID = 0x02
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 16
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 16
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0003
pp_data->cap[0]->LinkCollection = 0x0001
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x0010
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 15
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x02
pp_data->cap[1]->BitPosition = 4
pp_data->cap[1]->BitSize = 12
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0004
pp_data->cap[1]->BitCount = 12
pp_data->cap[1]->BitField = 0x06
pp_data->cap[1]->NextBytePosition = 0x0006
pp_data->cap[1]->LinkCollection = 0x0001
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 0
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0031
pp_data->cap[1]->NotRange.Reserved1 = 0x0031
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 16
pp_data->cap[1]->NotRange.Reserved4 = 16
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = -2047
pp_data->cap[1]->NotButton.LogicalMax = 2047
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x02
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 12
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0003
pp_data->cap[2]->BitCount = 12
pp_data->cap[2]->BitField = 0x06
pp_data->cap[2]->NextBytePosition = 0x0005
pp_data->cap[2]->LinkCollection = 0x0001
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 0
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0030
pp_data->cap[2]->NotRange.Reserved1 = 0x0030
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 17
pp_data->cap[2]->NotRange.Reserved4 = 17
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = -2047
pp_data->cap[2]->NotButton.LogicalMax = 2047
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x02
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 8
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0006
pp_data->cap[3]->BitCount = 8
pp_data->cap[3]->BitField = 0x06
pp_data->cap[3]->NextBytePosition = 0x0007
pp_data->cap[3]->LinkCollection = 0x0001
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 0
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0038
pp_data->cap[3]->NotRange.Reserved1 = 0x0038
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 18
pp_data->cap[3]->NotRange.Reserved4 = 18
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = -127
pp_data->cap[3]->NotButton.LogicalMax = 127
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x000C
pp_data->cap[4]->ReportID = 0x02
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 8
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0007
pp_data->cap[4]->BitCount = 8
pp_data->cap[4]->BitField = 0x06
pp_data->cap[4]->NextBytePosition = 0x0008
pp_data->cap[4]->LinkCollection = 0x0001
pp_data->cap[4]->LinkUsagePage = 0x0001
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 0
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0238
pp_data->cap[4]->NotRange.Reserved1 = 0x0238
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 19
pp_data->cap[4]->NotRange.Reserved4 = 19
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = -127
pp_data->cap[4]->NotButton.LogicalMax = 127
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 1
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 1
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 0
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000

View File

@@ -0,0 +1,8 @@
0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00,
0x85, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x10, 0x15, 0x00,
0x25, 0x01, 0x75, 0x01, 0x95, 0x10, 0x81, 0x02, 0x05, 0x01,
0x09, 0x30, 0x09, 0x31, 0x16, 0x01, 0xF8, 0x26, 0xFF, 0x07,
0x75, 0x0C, 0x95, 0x02, 0x81, 0x06, 0x09, 0x38, 0x15, 0x81,
0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81, 0x06, 0x05, 0x0C,
0x0A, 0x38, 0x02, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95,
0x01, 0x81, 0x06, 0xC0, 0xC0,

View File

@@ -0,0 +1,44 @@
05 01 09 02 A1 01 85 02 09 01 A1 00 05 09 19 01
29 10 15 00 25 01 95 10 75 01 81 02 05 01 16 01
F8 26 FF 07 75 0C 95 02 09 30 09 31 81 06 15 81
25 7F 75 08 95 01 09 38 81 06 05 0C 0A 38 02 95
01 81 06 C0 C0
Parser Output:
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID (2)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection (Physical)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (0x01)
0x29, 0x10, // Usage Maximum (0x10)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x95, 0x10, // Report Count (16)
0x75, 0x01, // Report Size (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x16, 0x01, 0xF8, // Logical Minimum (-2047)
0x26, 0xFF, 0x07, // Logical Maximum (2047)
0x75, 0x0C, // Report Size (12)
0x95, 0x02, // Report Count (2)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
0x75, 0x08, // Report Size (8)
0x95, 0x01, // Report Count (1)
0x09, 0x38, // Usage (Wheel)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x0C, // Usage Page (Consumer)
0x0A, 0x38, 0x02, // Usage (AC Pan)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0xC0, // End Collection
// 69 bytes

View File

@@ -0,0 +1,139 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC534
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2901
dev->interface_number = 1
dev->usage = 0x0002
dev->usage_page = 0xFF00
dev->path = "\\?\hid#vid_046d&pid_c534&mi_01&col05#7&1ebb799e&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0xFF00
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 1
pp_data->caps_info[0]->NumberOfCaps = 1
pp_data->caps_info[0]->ReportByteLength = 20
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 1
pp_data->caps_info[1]->LastCap = 2
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 20
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 2
pp_data->caps_info[2]->LastCap = 2
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x00D0
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0xFF00
pp_data->cap[0]->ReportID = 0x11
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 8
pp_data->cap[0]->ReportCount = 19
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 152
pp_data->cap[0]->BitField = 0x00
pp_data->cap[0]->NextBytePosition = 0x0014
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0xFF00
pp_data->cap[0]->LinkUsage = 0x0002
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0002
pp_data->cap[0]->NotRange.Reserved1 = 0x0002
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 255
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x11
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 19
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 152
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0014
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0xFF00
pp_data->cap[1]->LinkUsage = 0x0002
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0002
pp_data->cap[1]->NotRange.Reserved1 = 0x0002
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 0
pp_data->cap[1]->NotRange.Reserved4 = 0
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 255
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0xFF00
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x09,
0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x13,
0x81, 0x00, 0x09, 0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x13, 0x91, 0x00, 0xC0,

View File

@@ -0,0 +1,22 @@
macOS USB prober output for Logitech USB Receiver
06 00 FF 09 02 A1 01 85 11
75 08 95 13 15 00 26 FF
00 09 02 81 00 09 02 91 00 C0
Parser output:
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
0x09, 0x02, // Usage (0x02)
0xA1, 0x01, // Collection (Application)
0x85, 0x11, // Report ID (17)
0x75, 0x08, // Report Size (8)
0x95, 0x13, // Report Count (19)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x09, 0x02, // Usage (0x02)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x02, // Usage (0x02)
0x91, 0x00, // Output (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0, // End Collection
// 27 bytes

View File

@@ -0,0 +1,185 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC534
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2901
dev->interface_number = 0
dev->usage = 0x0006
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046d&pid_c534&mi_00#7&51bc424&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\kbd"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0006
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 2
pp_data->caps_info[0]->NumberOfCaps = 2
pp_data->caps_info[0]->ReportByteLength = 9
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 2
pp_data->caps_info[1]->LastCap = 3
pp_data->caps_info[1]->NumberOfCaps = 1
pp_data->caps_info[1]->ReportByteLength = 2
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 3
pp_data->caps_info[2]->LastCap = 3
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0138
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0007
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 8
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 8
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0006
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x00E0
pp_data->cap[0]->Range.UsageMax = 0x00E7
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 7
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0007
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 6
pp_data->cap[1]->BytePosition = 0x0003
pp_data->cap[1]->BitCount = 48
pp_data->cap[1]->BitField = 0x00
pp_data->cap[1]->NextBytePosition = 0x0009
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0006
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 1
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->Range.UsageMin = 0x0000
pp_data->cap[1]->Range.UsageMax = 0x00A4
pp_data->cap[1]->Range.StringMin = 0
pp_data->cap[1]->Range.StringMax = 0
pp_data->cap[1]->Range.DesignatorMin = 0
pp_data->cap[1]->Range.DesignatorMax = 0
pp_data->cap[1]->Range.DataIndexMin = 8
pp_data->cap[1]->Range.DataIndexMax = 172
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 164
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[2]->UsagePage = 0x0008
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 1
pp_data->cap[2]->ReportCount = 5
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 5
pp_data->cap[2]->BitField = 0x02
pp_data->cap[2]->NextBytePosition = 0x0002
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0006
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 1
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->Range.UsageMin = 0x0001
pp_data->cap[2]->Range.UsageMax = 0x0005
pp_data->cap[2]->Range.StringMin = 0
pp_data->cap[2]->Range.StringMax = 0
pp_data->cap[2]->Range.DesignatorMin = 0
pp_data->cap[2]->Range.DesignatorMax = 0
pp_data->cap[2]->Range.DataIndexMin = 0
pp_data->cap[2]->Range.DataIndexMax = 4
pp_data->cap[2]->Button.LogicalMin = 0
pp_data->cap[2]->Button.LogicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0006
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,7 @@
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0,
0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08,
0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03, 0x19, 0x00,
0x29, 0xA4, 0x15, 0x00, 0x26, 0xA4, 0x00, 0x75, 0x08, 0x95,
0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x15,
0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x05, 0x91, 0x02, 0x75,
0x03, 0x95, 0x01, 0x91, 0x03, 0xC0,

View File

@@ -0,0 +1,42 @@
macOS USB prober output for Logitech USB Receiver
Type: 0x22 (Report Descriptor)
Length (and contents): 59
Raw Descriptor (hex) 0000: 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
Raw Descriptor (hex) 0010: 75 01 95 08 81 02 81 03 95 05 05 08 19 01 29 05
Raw Descriptor (hex) 0020: 91 02 95 01 75 03 91 01 95 06 75 08 15 00 26 A4
Raw Descriptor (hex) 0030: 00 05 07 19 00 2A A4 00 81 00 C0
Parser output:
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x05, // Report Count (5)
0x05, 0x08, // Usage Page (LEDs)
0x19, 0x01, // Usage Minimum (Num Lock)
0x29, 0x05, // Usage Maximum (Kana)
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xA4, 0x00, // Logical Maximum (164)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x2A, 0xA4, 0x00, // Usage Maximum (0xA4)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 59 bytes

View File

@@ -0,0 +1,185 @@
# HIDAPI device info struct:
dev->vendor_id = 0x046D
dev->product_id = 0xC534
dev->manufacturer_string = "Logitech"
dev->product_string = "USB Receiver"
dev->release_number = 0x2901
dev->interface_number = 1
dev->usage = 0x0080
dev->usage_page = 0x0001
dev->path = "\\?\hid#vid_046d&pid_c534&mi_01&col03#7&1ebb799e&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0080
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00038000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 3
pp_data->caps_info[0]->NumberOfCaps = 3
pp_data->caps_info[0]->ReportByteLength = 2
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 3
pp_data->caps_info[1]->LastCap = 3
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 3
pp_data->caps_info[2]->LastCap = 3
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0138
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0001
pp_data->cap[0]->ReportID = 0x04
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 2
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 2
pp_data->cap[0]->BitField = 0x60
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0080
pp_data->cap[0]->IsMultipleItemsForArray = 1
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x0083
pp_data->cap[0]->NotRange.Reserved1 = 0x0083
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 2
pp_data->cap[0]->NotRange.Reserved4 = 2
pp_data->cap[0]->Button.LogicalMin = 1
pp_data->cap[0]->Button.LogicalMax = 3
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x0001
pp_data->cap[1]->ReportID = 0x04
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 2
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 2
pp_data->cap[1]->BitField = 0x60
pp_data->cap[1]->NextBytePosition = 0x0002
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0080
pp_data->cap[1]->IsMultipleItemsForArray = 1
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0081
pp_data->cap[1]->NotRange.Reserved1 = 0x0081
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 1
pp_data->cap[1]->NotRange.Reserved4 = 1
pp_data->cap[1]->Button.LogicalMin = 1
pp_data->cap[1]->Button.LogicalMax = 3
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x04
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 2
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 2
pp_data->cap[2]->BitField = 0x60
pp_data->cap[2]->NextBytePosition = 0x0002
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0080
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0082
pp_data->cap[2]->NotRange.Reserved1 = 0x0082
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 0
pp_data->cap[2]->NotRange.Reserved4 = 0
pp_data->cap[2]->Button.LogicalMin = 1
pp_data->cap[2]->Button.LogicalMax = 3
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0080
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,4 @@
0x05, 0x01, 0x09, 0x80, 0xA1, 0x01, 0x85, 0x04, 0x09, 0x82,
0x09, 0x81, 0x09, 0x83, 0x15, 0x01, 0x25, 0x03, 0x75, 0x02,
0x95, 0x01, 0x81, 0x60, 0x75, 0x06, 0x95, 0x01, 0x81, 0x03,
0xC0,

View File

@@ -0,0 +1,22 @@
05 01 09 80 A1 01 85 04 75 02 95 01 15 01 25 03
09 82 09 81 09 83 81 60 75 06 81 03 C0
Parser output:
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x80, // Usage (Sys Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x04, // Report ID (4)
0x75, 0x02, // Report Size (2)
0x95, 0x01, // Report Count (1)
0x15, 0x01, // Logical Minimum (1)
0x25, 0x03, // Logical Maximum (3)
0x09, 0x82, // Usage (Sys Sleep)
0x09, 0x81, // Usage (Sys Power Down)
0x09, 0x83, // Usage (Sys Wake Up)
0x81, 0x60, // Input (Data,Array,Abs,No Wrap,Linear,No Preferred State,Null State)
0x75, 0x06, // Report Size (6)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 29 bytes

View File

@@ -0,0 +1,385 @@
# HIDAPI device info struct:
dev->vendor_id = 0x047F
dev->product_id = 0xC056
dev->manufacturer_string = "Plantronics"
dev->product_string = "Plantronics Blackwire 3220 Series"
dev->release_number = 0x0210
dev->interface_number = 3
dev->usage = 0x0001
dev->usage_page = 0x000C
dev->path = "\\?\hid#vid_047f&pid_c056&mi_03&col01#f&39e6f119&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0001
pp_data->UsagePage = 0x000C
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 5
pp_data->caps_info[0]->NumberOfCaps = 5
pp_data->caps_info[0]->ReportByteLength = 33
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 5
pp_data->caps_info[1]->LastCap = 7
pp_data->caps_info[1]->NumberOfCaps = 2
pp_data->caps_info[1]->ReportByteLength = 37
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 7
pp_data->caps_info[2]->LastCap = 7
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x02D8
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x000C
pp_data->cap[0]->ReportID = 0x01
pp_data->cap[0]->BitPosition = 1
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 1
pp_data->cap[0]->BitField = 0x06
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x000C
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 0
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x00EA
pp_data->cap[0]->NotRange.Reserved1 = 0x00EA
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x000C
pp_data->cap[1]->ReportID = 0x01
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 1
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 1
pp_data->cap[1]->BitField = 0x06
pp_data->cap[1]->NextBytePosition = 0x0002
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x000C
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 0
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x00E9
pp_data->cap[1]->NotRange.Reserved1 = 0x00E9
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 1
pp_data->cap[1]->NotRange.Reserved4 = 1
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x000C
pp_data->cap[2]->ReportID = 0x02
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 1
pp_data->cap[2]->ReportCount = 16
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 16
pp_data->cap[2]->BitField = 0x02
pp_data->cap[2]->NextBytePosition = 0x0003
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x000C
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0000
pp_data->cap[2]->NotRange.Reserved1 = 0x0000
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 2
pp_data->cap[2]->NotRange.Reserved4 = 2
pp_data->cap[2]->Button.LogicalMin = 0
pp_data->cap[2]->Button.LogicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x000C
pp_data->cap[3]->ReportID = 0x05
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 8
pp_data->cap[3]->ReportCount = 32
pp_data->cap[3]->BytePosition = 0x0001
pp_data->cap[3]->BitCount = 256
pp_data->cap[3]->BitField = 0x02
pp_data->cap[3]->NextBytePosition = 0x0021
pp_data->cap[3]->LinkCollection = 0x0000
pp_data->cap[3]->LinkUsagePage = 0x000C
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 1
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0000
pp_data->cap[3]->NotRange.Reserved1 = 0x0000
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 3
pp_data->cap[3]->NotRange.Reserved4 = 3
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = 0
pp_data->cap[3]->NotButton.LogicalMax = 1
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x000C
pp_data->cap[4]->ReportID = 0x07
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 8
pp_data->cap[4]->ReportCount = 32
pp_data->cap[4]->BytePosition = 0x0001
pp_data->cap[4]->BitCount = 256
pp_data->cap[4]->BitField = 0x02
pp_data->cap[4]->NextBytePosition = 0x0021
pp_data->cap[4]->LinkCollection = 0x0000
pp_data->cap[4]->LinkUsagePage = 0x000C
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 1
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0000
pp_data->cap[4]->NotRange.Reserved1 = 0x0000
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 4
pp_data->cap[4]->NotRange.Reserved4 = 4
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = 0
pp_data->cap[4]->NotButton.LogicalMax = 1
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[5]->UsagePage = 0x000C
pp_data->cap[5]->ReportID = 0x04
pp_data->cap[5]->BitPosition = 0
pp_data->cap[5]->BitSize = 8
pp_data->cap[5]->ReportCount = 36
pp_data->cap[5]->BytePosition = 0x0001
pp_data->cap[5]->BitCount = 288
pp_data->cap[5]->BitField = 0x02
pp_data->cap[5]->NextBytePosition = 0x0025
pp_data->cap[5]->LinkCollection = 0x0000
pp_data->cap[5]->LinkUsagePage = 0x000C
pp_data->cap[5]->LinkUsage = 0x0001
pp_data->cap[5]->IsMultipleItemsForArray = 0
pp_data->cap[5]->IsButtonCap = 0
pp_data->cap[5]->IsPadding = 0
pp_data->cap[5]->IsAbsolute = 1
pp_data->cap[5]->IsRange = 0
pp_data->cap[5]->IsAlias = 0
pp_data->cap[5]->IsStringRange = 0
pp_data->cap[5]->IsDesignatorRange = 0
pp_data->cap[5]->Reserved1 = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[5]->NotRange.Usage = 0x0000
pp_data->cap[5]->NotRange.Reserved1 = 0x0000
pp_data->cap[5]->NotRange.StringIndex = 0
pp_data->cap[5]->NotRange.Reserved2 = 0
pp_data->cap[5]->NotRange.DesignatorIndex = 0
pp_data->cap[5]->NotRange.Reserved3 = 0
pp_data->cap[5]->NotRange.DataIndex = 0
pp_data->cap[5]->NotRange.Reserved4 = 0
pp_data->cap[5]->NotButton.HasNull = 0
pp_data->cap[5]->NotButton.Reserved4 = 0x000000
pp_data->cap[5]->NotButton.LogicalMin = 0
pp_data->cap[5]->NotButton.LogicalMax = 1
pp_data->cap[5]->NotButton.PhysicalMin = 0
pp_data->cap[5]->NotButton.PhysicalMax = 0
pp_data->cap[5]->Units = 0
pp_data->cap[5]->UnitsExp = 0
pp_data->cap[6]->UsagePage = 0x000C
pp_data->cap[6]->ReportID = 0x06
pp_data->cap[6]->BitPosition = 0
pp_data->cap[6]->BitSize = 8
pp_data->cap[6]->ReportCount = 36
pp_data->cap[6]->BytePosition = 0x0001
pp_data->cap[6]->BitCount = 288
pp_data->cap[6]->BitField = 0x02
pp_data->cap[6]->NextBytePosition = 0x0025
pp_data->cap[6]->LinkCollection = 0x0000
pp_data->cap[6]->LinkUsagePage = 0x000C
pp_data->cap[6]->LinkUsage = 0x0001
pp_data->cap[6]->IsMultipleItemsForArray = 0
pp_data->cap[6]->IsButtonCap = 0
pp_data->cap[6]->IsPadding = 0
pp_data->cap[6]->IsAbsolute = 1
pp_data->cap[6]->IsRange = 0
pp_data->cap[6]->IsAlias = 0
pp_data->cap[6]->IsStringRange = 0
pp_data->cap[6]->IsDesignatorRange = 0
pp_data->cap[6]->Reserved1 = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[6]->NotRange.Usage = 0x0000
pp_data->cap[6]->NotRange.Reserved1 = 0x0000
pp_data->cap[6]->NotRange.StringIndex = 0
pp_data->cap[6]->NotRange.Reserved2 = 0
pp_data->cap[6]->NotRange.DesignatorIndex = 0
pp_data->cap[6]->NotRange.Reserved3 = 0
pp_data->cap[6]->NotRange.DataIndex = 1
pp_data->cap[6]->NotRange.Reserved4 = 1
pp_data->cap[6]->NotButton.HasNull = 0
pp_data->cap[6]->NotButton.Reserved4 = 0x000000
pp_data->cap[6]->NotButton.LogicalMin = 0
pp_data->cap[6]->NotButton.LogicalMax = 1
pp_data->cap[6]->NotButton.PhysicalMin = 0
pp_data->cap[6]->NotButton.PhysicalMax = 0
pp_data->cap[6]->Units = 0
pp_data->cap[6]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x000C
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,10 @@
0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x01, 0x09, 0xE9,
0x09, 0xEA, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x02,
0x81, 0x06, 0x75, 0x06, 0x95, 0x01, 0x81, 0x03, 0x85, 0x02,
0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x10,
0x81, 0x02, 0x85, 0x05, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01,
0x75, 0x08, 0x95, 0x20, 0x81, 0x02, 0x85, 0x07, 0x09, 0x00,
0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x81, 0x02,
0x85, 0x04, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08,
0x95, 0x24, 0x91, 0x02, 0x85, 0x06, 0x09, 0x00, 0x15, 0x00,
0x25, 0x01, 0x75, 0x08, 0x95, 0x24, 0x91, 0x02, 0xC0,

View File

@@ -0,0 +1,47 @@
macOS USB Prober about 0x047F/0xC056 "Plantronics Blackwire 3220 Series"
05 0C 09 01 A1 01 85 01 15 00 25 01 09 E9 09 EA
75 01 95 02 81 06 95 06 81 01 85 02 05 0C 09 00
95 10 81 02 85 04 09 00 75 08 95 24 91 02 85 05
09 00 95 20 81 02 85 06 09 00 95 24 91 02 85 07
09 00 95 20 81 02 C0
# Parser output:
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x09, 0xE9, // Usage (Volume Increment)
0x09, 0xEA, // Usage (Volume Decrement)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x06, // Report Count (6)
0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x02, // Report ID (2)
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x00, // Usage (Unassigned)
0x95, 0x10, // Report Count (16)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x04, // Report ID (4)
0x09, 0x00, // Usage (Unassigned)
0x75, 0x08, // Report Size (8)
0x95, 0x24, // Report Count (36)
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x05, // Report ID (5)
0x09, 0x00, // Usage (Unassigned)
0x95, 0x20, // Report Count (32)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x06, // Report ID (6)
0x09, 0x00, // Usage (Unassigned)
0x95, 0x24, // Report Count (36)
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x07, // Report ID (7)
0x09, 0x00, // Usage (Unassigned)
0x95, 0x20, // Report Count (32)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 71 bytes

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
0x06, 0xA0, 0xFF, 0x09, 0x03, 0xA1, 0x01, 0x85, 0x03, 0x09,
0x30, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x81,
0x02, 0x85, 0x14, 0x09, 0xB1, 0x09, 0xB2, 0x09, 0xB5, 0x09,
0xB7, 0x09, 0xB3, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95,
0x05, 0x81, 0x06, 0x75, 0x03, 0x95, 0x01, 0x81, 0x03, 0x85,
0x15, 0x09, 0x8C, 0x15, 0x00, 0x27, 0xFF, 0xFF, 0x00, 0x00,
0x75, 0x10, 0x95, 0x01, 0x81, 0x22, 0x85, 0x1F, 0x09, 0x9C,
0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x06,
0x75, 0x07, 0x95, 0x01, 0x81, 0x03, 0x85, 0x03, 0x09, 0x30,
0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x91, 0x02,
0x85, 0x19, 0x09, 0x8D, 0x09, 0x8F, 0x09, 0x9E, 0x09, 0xDC,
0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x04, 0x91, 0x22,
0x09, 0xD2, 0x09, 0xD9, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x02, 0x91, 0x06, 0x75, 0x02, 0x95, 0x01, 0x91, 0x03,
0x85, 0x1A, 0x09, 0xB5, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, 0x91, 0x03,
0x85, 0x1B, 0x09, 0xCF, 0x09, 0xB5, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x02, 0xB1, 0x22, 0x09, 0xDE, 0x15, 0x00,
0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0xB1, 0x23, 0x09, 0xD8,
0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0xB1, 0x22,
0x75, 0x04, 0x95, 0x01, 0xB1, 0x03, 0x09, 0x09, 0x09, 0x17,
0x09, 0x18, 0x09, 0x1E, 0x09, 0x20, 0x09, 0x2A, 0x15, 0x00,
0x25, 0x01, 0x75, 0x01, 0x95, 0x06, 0xB1, 0x22, 0x75, 0x02,
0x95, 0x01, 0xB1, 0x03, 0xC0,

View File

@@ -0,0 +1,113 @@
macOS USB Prober about 0x047F/0xC056 "Plantronics Blackwire 3220 Series"
06 A0 FF 09 03 A1 01 85 03 09 30 75
08 95 20 91 02 85 03 09 30 75 08 95 20 81 02 85
14 09 B1 09 B2 09 B5 09 B7 09 B3 15 00 25 01 75
01 95 05 81 06 95 03 81 01 85 15 09 8C 15 00 27
FF FF 00 00 75 10 95 01 81 22 85 19 09 8D 09 8F
09 9E 09 DC 15 00 25 01 75 01 95 04 91 22 09 D2
09 D9 15 00 25 01 75 01 95 02 91 06 95 02 91 01
85 1A 09 B5 15 00 25 01 75 01 95 01 91 22 95 07
91 01 85 1B 09 CF 09 B5 75 01 95 02 B1 22 09 DE
75 01 95 01 B1 23 09 D8 95 01 B1 22 95 04 B1 01
09 09 09 17 09 18 09 1E 09 20 09 2A 75 01 95 06
B1 22 95 02 B1 01 85 1F 09 9C 75 01 95 01 81 06
95 07 81 01 C0
Parser output:
0x06, 0xA0, 0xFF, // Usage Page (Vendor Defined 0xFFA0)
0x09, 0x03, // Usage (0x03)
0xA1, 0x01, // Collection (Application)
0x85, 0x03, // Report ID (3)
0x09, 0x30, // Usage (0x30)
0x75, 0x08, // Report Size (8)
0x95, 0x20, // Report Count (32)
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x03, // Report ID (3)
0x09, 0x30, // Usage (0x30)
0x75, 0x08, // Report Size (8)
0x95, 0x20, // Report Count (32)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x14, // Report ID (20)
0x09, 0xB1, // Usage (0xB1)
0x09, 0xB2, // Usage (0xB2)
0x09, 0xB5, // Usage (0xB5)
0x09, 0xB7, // Usage (0xB7)
0x09, 0xB3, // Usage (0xB3)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x05, // Report Count (5)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x03, // Report Count (3)
0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x15, // Report ID (21)
0x09, 0x8C, // Usage (0x8C)
0x15, 0x00, // Logical Minimum (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534)
0x75, 0x10, // Report Size (16)
0x95, 0x01, // Report Count (1)
0x81, 0x22, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x85, 0x19, // Report ID (25)
0x09, 0x8D, // Usage (0x8D)
0x09, 0x8F, // Usage (0x8F)
0x09, 0x9E, // Usage (0x9E)
0x09, 0xDC, // Usage (0xDC)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x04, // Report Count (4)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x09, 0xD2, // Usage (0xD2)
0x09, 0xD9, // Usage (0xD9)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x91, 0x06, // Output (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x02, // Report Count (2)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x1A, // Report ID (26)
0x09, 0xB5, // Usage (0xB5)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x1B, // Report ID (27)
0x09, 0xCF, // Usage (0xCF)
0x09, 0xB5, // Usage (0xB5)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0xB1, 0x22, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x09, 0xDE, // Usage (0xDE)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x09, 0xD8, // Usage (0xD8)
0x95, 0x01, // Report Count (1)
0xB1, 0x22, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x04, // Report Count (4)
0xB1, 0x01, // Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x09, 0x09, // Usage (0x09)
0x09, 0x17, // Usage (0x17)
0x09, 0x18, // Usage (0x18)
0x09, 0x1E, // Usage (0x1E)
0x09, 0x20, // Usage (0x20)
0x09, 0x2A, // Usage (0x2A)
0x75, 0x01, // Report Size (1)
0x95, 0x06, // Report Count (6)
0xB1, 0x22, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x02, // Report Count (2)
0xB1, 0x01, // Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x1F, // Report ID (31)
0x09, 0x9C, // Usage (0x9C)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x07, // Report Count (7)
0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 193 bytes

View File

@@ -0,0 +1,461 @@
# HIDAPI device info struct:
dev->vendor_id = 0x047F
dev->product_id = 0xC056
dev->manufacturer_string = "Plantronics"
dev->product_string = "Plantronics Blackwire 3220 Series"
dev->release_number = 0x0210
dev->interface_number = 3
dev->usage = 0x0005
dev->usage_page = 0x000B
dev->path = "\\?\hid#vid_047f&pid_c056&mi_03&col02#f&39e6f119&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0005
pp_data->UsagePage = 0x000B
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 3
pp_data->caps_info[0]->NumberOfCaps = 3
pp_data->caps_info[0]->ReportByteLength = 2
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 3
pp_data->caps_info[1]->LastCap = 9
pp_data->caps_info[1]->NumberOfCaps = 6
pp_data->caps_info[1]->ReportByteLength = 2
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 9
pp_data->caps_info[2]->LastCap = 9
pp_data->caps_info[2]->NumberOfCaps = 0
pp_data->caps_info[2]->ReportByteLength = 0
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x03A8
pp_data->NumberLinkCollectionNodes = 1
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x000B
pp_data->cap[0]->ReportID = 0x08
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 1
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 1
pp_data->cap[0]->BitField = 0x06
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0000
pp_data->cap[0]->LinkUsagePage = 0x000B
pp_data->cap[0]->LinkUsage = 0x0005
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 0
pp_data->cap[0]->IsRange = 0
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->NotRange.Usage = 0x002F
pp_data->cap[0]->NotRange.Reserved1 = 0x002F
pp_data->cap[0]->NotRange.StringIndex = 0
pp_data->cap[0]->NotRange.Reserved2 = 0
pp_data->cap[0]->NotRange.DesignatorIndex = 0
pp_data->cap[0]->NotRange.Reserved3 = 0
pp_data->cap[0]->NotRange.DataIndex = 0
pp_data->cap[0]->NotRange.Reserved4 = 0
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0x000B
pp_data->cap[1]->ReportID = 0x08
pp_data->cap[1]->BitPosition = 2
pp_data->cap[1]->BitSize = 1
pp_data->cap[1]->ReportCount = 1
pp_data->cap[1]->BytePosition = 0x0001
pp_data->cap[1]->BitCount = 1
pp_data->cap[1]->BitField = 0x22
pp_data->cap[1]->NextBytePosition = 0x0002
pp_data->cap[1]->LinkCollection = 0x0000
pp_data->cap[1]->LinkUsagePage = 0x000B
pp_data->cap[1]->LinkUsage = 0x0005
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 1
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0021
pp_data->cap[1]->NotRange.Reserved1 = 0x0021
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 1
pp_data->cap[1]->NotRange.Reserved4 = 1
pp_data->cap[1]->Button.LogicalMin = 0
pp_data->cap[1]->Button.LogicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x000B
pp_data->cap[2]->ReportID = 0x08
pp_data->cap[2]->BitPosition = 1
pp_data->cap[2]->BitSize = 1
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0001
pp_data->cap[2]->BitCount = 1
pp_data->cap[2]->BitField = 0x22
pp_data->cap[2]->NextBytePosition = 0x0002
pp_data->cap[2]->LinkCollection = 0x0000
pp_data->cap[2]->LinkUsagePage = 0x000B
pp_data->cap[2]->LinkUsage = 0x0005
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 1
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 1
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0020
pp_data->cap[2]->NotRange.Reserved1 = 0x0020
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 2
pp_data->cap[2]->NotRange.Reserved4 = 2
pp_data->cap[2]->Button.LogicalMin = 0
pp_data->cap[2]->Button.LogicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
# Output hid_pp_cap struct:
pp_data->cap[3]->UsagePage = 0x0008
pp_data->cap[3]->ReportID = 0x09
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 1
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0001
pp_data->cap[3]->BitCount = 1
pp_data->cap[3]->BitField = 0x22
pp_data->cap[3]->NextBytePosition = 0x0002
pp_data->cap[3]->LinkCollection = 0x0000
pp_data->cap[3]->LinkUsagePage = 0x000B
pp_data->cap[3]->LinkUsage = 0x0005
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 1
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 1
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0009
pp_data->cap[3]->NotRange.Reserved1 = 0x0009
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 0
pp_data->cap[3]->NotRange.Reserved4 = 0
pp_data->cap[3]->Button.LogicalMin = 0
pp_data->cap[3]->Button.LogicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x0008
pp_data->cap[4]->ReportID = 0x17
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 1
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0001
pp_data->cap[4]->BitCount = 1
pp_data->cap[4]->BitField = 0x22
pp_data->cap[4]->NextBytePosition = 0x0002
pp_data->cap[4]->LinkCollection = 0x0000
pp_data->cap[4]->LinkUsagePage = 0x000B
pp_data->cap[4]->LinkUsage = 0x0005
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 1
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 1
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0017
pp_data->cap[4]->NotRange.Reserved1 = 0x0017
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 1
pp_data->cap[4]->NotRange.Reserved4 = 1
pp_data->cap[4]->Button.LogicalMin = 0
pp_data->cap[4]->Button.LogicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
pp_data->cap[5]->UsagePage = 0x0008
pp_data->cap[5]->ReportID = 0x18
pp_data->cap[5]->BitPosition = 0
pp_data->cap[5]->BitSize = 1
pp_data->cap[5]->ReportCount = 1
pp_data->cap[5]->BytePosition = 0x0001
pp_data->cap[5]->BitCount = 1
pp_data->cap[5]->BitField = 0x22
pp_data->cap[5]->NextBytePosition = 0x0002
pp_data->cap[5]->LinkCollection = 0x0000
pp_data->cap[5]->LinkUsagePage = 0x000B
pp_data->cap[5]->LinkUsage = 0x0005
pp_data->cap[5]->IsMultipleItemsForArray = 0
pp_data->cap[5]->IsButtonCap = 1
pp_data->cap[5]->IsPadding = 0
pp_data->cap[5]->IsAbsolute = 1
pp_data->cap[5]->IsRange = 0
pp_data->cap[5]->IsAlias = 0
pp_data->cap[5]->IsStringRange = 0
pp_data->cap[5]->IsDesignatorRange = 0
pp_data->cap[5]->Reserved1 = 0x000
pp_data->cap[5]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[5]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[5]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[5]->NotRange.Usage = 0x0018
pp_data->cap[5]->NotRange.Reserved1 = 0x0018
pp_data->cap[5]->NotRange.StringIndex = 0
pp_data->cap[5]->NotRange.Reserved2 = 0
pp_data->cap[5]->NotRange.DesignatorIndex = 0
pp_data->cap[5]->NotRange.Reserved3 = 0
pp_data->cap[5]->NotRange.DataIndex = 2
pp_data->cap[5]->NotRange.Reserved4 = 2
pp_data->cap[5]->Button.LogicalMin = 0
pp_data->cap[5]->Button.LogicalMax = 0
pp_data->cap[5]->Units = 0
pp_data->cap[5]->UnitsExp = 0
pp_data->cap[6]->UsagePage = 0x0008
pp_data->cap[6]->ReportID = 0x1E
pp_data->cap[6]->BitPosition = 0
pp_data->cap[6]->BitSize = 1
pp_data->cap[6]->ReportCount = 1
pp_data->cap[6]->BytePosition = 0x0001
pp_data->cap[6]->BitCount = 1
pp_data->cap[6]->BitField = 0x22
pp_data->cap[6]->NextBytePosition = 0x0002
pp_data->cap[6]->LinkCollection = 0x0000
pp_data->cap[6]->LinkUsagePage = 0x000B
pp_data->cap[6]->LinkUsage = 0x0005
pp_data->cap[6]->IsMultipleItemsForArray = 0
pp_data->cap[6]->IsButtonCap = 1
pp_data->cap[6]->IsPadding = 0
pp_data->cap[6]->IsAbsolute = 1
pp_data->cap[6]->IsRange = 0
pp_data->cap[6]->IsAlias = 0
pp_data->cap[6]->IsStringRange = 0
pp_data->cap[6]->IsDesignatorRange = 0
pp_data->cap[6]->Reserved1 = 0x000
pp_data->cap[6]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[6]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[6]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[6]->NotRange.Usage = 0x001E
pp_data->cap[6]->NotRange.Reserved1 = 0x001E
pp_data->cap[6]->NotRange.StringIndex = 0
pp_data->cap[6]->NotRange.Reserved2 = 0
pp_data->cap[6]->NotRange.DesignatorIndex = 0
pp_data->cap[6]->NotRange.Reserved3 = 0
pp_data->cap[6]->NotRange.DataIndex = 3
pp_data->cap[6]->NotRange.Reserved4 = 3
pp_data->cap[6]->Button.LogicalMin = 0
pp_data->cap[6]->Button.LogicalMax = 0
pp_data->cap[6]->Units = 0
pp_data->cap[6]->UnitsExp = 0
pp_data->cap[7]->UsagePage = 0x0008
pp_data->cap[7]->ReportID = 0x20
pp_data->cap[7]->BitPosition = 0
pp_data->cap[7]->BitSize = 1
pp_data->cap[7]->ReportCount = 1
pp_data->cap[7]->BytePosition = 0x0001
pp_data->cap[7]->BitCount = 1
pp_data->cap[7]->BitField = 0x22
pp_data->cap[7]->NextBytePosition = 0x0002
pp_data->cap[7]->LinkCollection = 0x0000
pp_data->cap[7]->LinkUsagePage = 0x000B
pp_data->cap[7]->LinkUsage = 0x0005
pp_data->cap[7]->IsMultipleItemsForArray = 0
pp_data->cap[7]->IsButtonCap = 1
pp_data->cap[7]->IsPadding = 0
pp_data->cap[7]->IsAbsolute = 1
pp_data->cap[7]->IsRange = 0
pp_data->cap[7]->IsAlias = 0
pp_data->cap[7]->IsStringRange = 0
pp_data->cap[7]->IsDesignatorRange = 0
pp_data->cap[7]->Reserved1 = 0x000
pp_data->cap[7]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[7]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[7]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[7]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[7]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[7]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[7]->NotRange.Usage = 0x0020
pp_data->cap[7]->NotRange.Reserved1 = 0x0020
pp_data->cap[7]->NotRange.StringIndex = 0
pp_data->cap[7]->NotRange.Reserved2 = 0
pp_data->cap[7]->NotRange.DesignatorIndex = 0
pp_data->cap[7]->NotRange.Reserved3 = 0
pp_data->cap[7]->NotRange.DataIndex = 4
pp_data->cap[7]->NotRange.Reserved4 = 4
pp_data->cap[7]->Button.LogicalMin = 0
pp_data->cap[7]->Button.LogicalMax = 0
pp_data->cap[7]->Units = 0
pp_data->cap[7]->UnitsExp = 0
pp_data->cap[8]->UsagePage = 0x0008
pp_data->cap[8]->ReportID = 0x2A
pp_data->cap[8]->BitPosition = 0
pp_data->cap[8]->BitSize = 1
pp_data->cap[8]->ReportCount = 1
pp_data->cap[8]->BytePosition = 0x0001
pp_data->cap[8]->BitCount = 1
pp_data->cap[8]->BitField = 0x22
pp_data->cap[8]->NextBytePosition = 0x0002
pp_data->cap[8]->LinkCollection = 0x0000
pp_data->cap[8]->LinkUsagePage = 0x000B
pp_data->cap[8]->LinkUsage = 0x0005
pp_data->cap[8]->IsMultipleItemsForArray = 0
pp_data->cap[8]->IsButtonCap = 1
pp_data->cap[8]->IsPadding = 0
pp_data->cap[8]->IsAbsolute = 1
pp_data->cap[8]->IsRange = 0
pp_data->cap[8]->IsAlias = 0
pp_data->cap[8]->IsStringRange = 0
pp_data->cap[8]->IsDesignatorRange = 0
pp_data->cap[8]->Reserved1 = 0x000
pp_data->cap[8]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[8]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[8]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[8]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[8]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[8]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[8]->NotRange.Usage = 0x002A
pp_data->cap[8]->NotRange.Reserved1 = 0x002A
pp_data->cap[8]->NotRange.StringIndex = 0
pp_data->cap[8]->NotRange.Reserved2 = 0
pp_data->cap[8]->NotRange.DesignatorIndex = 0
pp_data->cap[8]->NotRange.Reserved3 = 0
pp_data->cap[8]->NotRange.DataIndex = 5
pp_data->cap[8]->NotRange.Reserved4 = 5
pp_data->cap[8]->Button.LogicalMin = 0
pp_data->cap[8]->Button.LogicalMax = 0
pp_data->cap[8]->Units = 0
pp_data->cap[8]->UnitsExp = 0
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0005
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x000B
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 0
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 0
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000

View File

@@ -0,0 +1,17 @@
0x05, 0x0B, 0x09, 0x05, 0xA1, 0x01, 0x85, 0x08, 0x09, 0x2F,
0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x06,
0x09, 0x20, 0x09, 0x21, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x02, 0x81, 0x22, 0x75, 0x05, 0x95, 0x01, 0x81, 0x03,
0x85, 0x09, 0x05, 0x08, 0x09, 0x09, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01,
0x91, 0x03, 0x85, 0x17, 0x09, 0x17, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01,
0x91, 0x03, 0x85, 0x18, 0x09, 0x18, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01,
0x91, 0x03, 0x85, 0x1E, 0x09, 0x1E, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01,
0x91, 0x03, 0x85, 0x20, 0x09, 0x20, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01,
0x91, 0x03, 0x85, 0x2A, 0x09, 0x2A, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01,
0x91, 0x03, 0xC0,

View File

@@ -0,0 +1,68 @@
macOS USB Prober about 0x047F/0xC056 "Plantronics Blackwire 3220 Series"
05 0B 09 05 A1 01 85 08 15
00 25 01 09 2F 75 01 95 01 81 06 09 20 09 21 75
01 95 02 81 22 95 05 81 01 05 08 85 09 09 09 95
01 91 22 95 07 91 01 85 17 09 17 95 01 91 22 95
07 91 01 85 18 09 18 95 01 91 22 95 07 91 01 85
1E 09 1E 95 01 91 22 95 07 91 01 85 20 09 20 95
01 91 22 95 07 91 01 85 2A 09 2A 95 01 91 22 95
07 91 01 C0
Parser output:
0x05, 0x0B, // Usage Page (Telephony)
0x09, 0x05, // Usage (Headset)
0xA1, 0x01, // Collection (Application)
0x85, 0x08, // Report ID (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x09, 0x2F, // Usage (Phone Mute)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x20, // Usage (Hook Switch)
0x09, 0x21, // Usage (Flash)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x22, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x95, 0x05, // Report Count (5)
0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x08, // Usage Page (LEDs)
0x85, 0x09, // Report ID (9)
0x09, 0x09, // Usage (Mute)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x17, // Report ID (23)
0x09, 0x17, // Usage (Off-Hook)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x18, // Report ID (24)
0x09, 0x18, // Usage (Ring)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x1E, // Report ID (30)
0x09, 0x1E, // Usage (Speaker)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x20, // Report ID (32)
0x09, 0x20, // Usage (Hold)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x2A, // Report ID (42)
0x09, 0x2A, // Usage (On-Line)
0x95, 0x01, // Report Count (1)
0x91, 0x22, // Output (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x95, 0x07, // Report Count (7)
0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0, // End Collection
// 109 bytes

View File

@@ -0,0 +1,302 @@
# HIDAPI device info struct:
dev->vendor_id = 0x1532
dev->product_id = 0x00A3
dev->manufacturer_string = "Razer"
dev->product_string = "Razer Cobra"
dev->release_number = 0x0200
dev->interface_number = 0
dev->usage = 0x0002
dev->usage_page = 0x0001
dev->path = "\\?\HID#VID_1532&PID_00A3&MI_00#7&370ad372&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
# Preparsed Data struct:
pp_data->MagicKey = 0x48696450204B4452
pp_data->Usage = 0x0002
pp_data->UsagePage = 0x0001
pp_data->Reserved = 0x00000000
# Input caps_info struct:
pp_data->caps_info[0]->FirstCap = 0
pp_data->caps_info[0]->LastCap = 5
pp_data->caps_info[0]->NumberOfCaps = 5
pp_data->caps_info[0]->ReportByteLength = 9
# Output caps_info struct:
pp_data->caps_info[1]->FirstCap = 5
pp_data->caps_info[1]->LastCap = 5
pp_data->caps_info[1]->NumberOfCaps = 0
pp_data->caps_info[1]->ReportByteLength = 0
# Feature caps_info struct:
pp_data->caps_info[2]->FirstCap = 5
pp_data->caps_info[2]->LastCap = 5
pp_data->caps_info[2]->NumberOfCaps = 1
pp_data->caps_info[2]->ReportByteLength = 91
# LinkCollectionArray Offset & Size:
pp_data->FirstByteOfLinkCollectionArray = 0x0270
pp_data->NumberLinkCollectionNodes = 2
# Input hid_pp_cap struct:
pp_data->cap[0]->UsagePage = 0x0009
pp_data->cap[0]->ReportID = 0x00
pp_data->cap[0]->BitPosition = 0
pp_data->cap[0]->BitSize = 1
pp_data->cap[0]->ReportCount = 5
pp_data->cap[0]->BytePosition = 0x0001
pp_data->cap[0]->BitCount = 5
pp_data->cap[0]->BitField = 0x02
pp_data->cap[0]->NextBytePosition = 0x0002
pp_data->cap[0]->LinkCollection = 0x0001
pp_data->cap[0]->LinkUsagePage = 0x0001
pp_data->cap[0]->LinkUsage = 0x0001
pp_data->cap[0]->IsMultipleItemsForArray = 0
pp_data->cap[0]->IsButtonCap = 1
pp_data->cap[0]->IsPadding = 0
pp_data->cap[0]->IsAbsolute = 1
pp_data->cap[0]->IsRange = 1
pp_data->cap[0]->IsAlias = 0
pp_data->cap[0]->IsStringRange = 0
pp_data->cap[0]->IsDesignatorRange = 0
pp_data->cap[0]->Reserved1 = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[0]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[0]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[0]->Range.UsageMin = 0x0001
pp_data->cap[0]->Range.UsageMax = 0x0005
pp_data->cap[0]->Range.StringMin = 0
pp_data->cap[0]->Range.StringMax = 0
pp_data->cap[0]->Range.DesignatorMin = 0
pp_data->cap[0]->Range.DesignatorMax = 0
pp_data->cap[0]->Range.DataIndexMin = 0
pp_data->cap[0]->Range.DataIndexMax = 4
pp_data->cap[0]->Button.LogicalMin = 0
pp_data->cap[0]->Button.LogicalMax = 0
pp_data->cap[0]->Units = 0
pp_data->cap[0]->UnitsExp = 0
pp_data->cap[1]->UsagePage = 0xFF00
pp_data->cap[1]->ReportID = 0x00
pp_data->cap[1]->BitPosition = 0
pp_data->cap[1]->BitSize = 8
pp_data->cap[1]->ReportCount = 2
pp_data->cap[1]->BytePosition = 0x0002
pp_data->cap[1]->BitCount = 16
pp_data->cap[1]->BitField = 0x02
pp_data->cap[1]->NextBytePosition = 0x0004
pp_data->cap[1]->LinkCollection = 0x0001
pp_data->cap[1]->LinkUsagePage = 0x0001
pp_data->cap[1]->LinkUsage = 0x0001
pp_data->cap[1]->IsMultipleItemsForArray = 0
pp_data->cap[1]->IsButtonCap = 0
pp_data->cap[1]->IsPadding = 0
pp_data->cap[1]->IsAbsolute = 1
pp_data->cap[1]->IsRange = 0
pp_data->cap[1]->IsAlias = 0
pp_data->cap[1]->IsStringRange = 0
pp_data->cap[1]->IsDesignatorRange = 0
pp_data->cap[1]->Reserved1 = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[1]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[1]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[1]->NotRange.Usage = 0x0040
pp_data->cap[1]->NotRange.Reserved1 = 0x0040
pp_data->cap[1]->NotRange.StringIndex = 0
pp_data->cap[1]->NotRange.Reserved2 = 0
pp_data->cap[1]->NotRange.DesignatorIndex = 0
pp_data->cap[1]->NotRange.Reserved3 = 0
pp_data->cap[1]->NotRange.DataIndex = 5
pp_data->cap[1]->NotRange.Reserved4 = 5
pp_data->cap[1]->NotButton.HasNull = 0
pp_data->cap[1]->NotButton.Reserved4 = 0x000000
pp_data->cap[1]->NotButton.LogicalMin = -127
pp_data->cap[1]->NotButton.LogicalMax = 127
pp_data->cap[1]->NotButton.PhysicalMin = 0
pp_data->cap[1]->NotButton.PhysicalMax = 0
pp_data->cap[1]->Units = 0
pp_data->cap[1]->UnitsExp = 0
pp_data->cap[2]->UsagePage = 0x0001
pp_data->cap[2]->ReportID = 0x00
pp_data->cap[2]->BitPosition = 0
pp_data->cap[2]->BitSize = 8
pp_data->cap[2]->ReportCount = 1
pp_data->cap[2]->BytePosition = 0x0004
pp_data->cap[2]->BitCount = 8
pp_data->cap[2]->BitField = 0x06
pp_data->cap[2]->NextBytePosition = 0x0005
pp_data->cap[2]->LinkCollection = 0x0001
pp_data->cap[2]->LinkUsagePage = 0x0001
pp_data->cap[2]->LinkUsage = 0x0001
pp_data->cap[2]->IsMultipleItemsForArray = 0
pp_data->cap[2]->IsButtonCap = 0
pp_data->cap[2]->IsPadding = 0
pp_data->cap[2]->IsAbsolute = 0
pp_data->cap[2]->IsRange = 0
pp_data->cap[2]->IsAlias = 0
pp_data->cap[2]->IsStringRange = 0
pp_data->cap[2]->IsDesignatorRange = 0
pp_data->cap[2]->Reserved1 = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[2]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[2]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[2]->NotRange.Usage = 0x0038
pp_data->cap[2]->NotRange.Reserved1 = 0x0038
pp_data->cap[2]->NotRange.StringIndex = 0
pp_data->cap[2]->NotRange.Reserved2 = 0
pp_data->cap[2]->NotRange.DesignatorIndex = 0
pp_data->cap[2]->NotRange.Reserved3 = 0
pp_data->cap[2]->NotRange.DataIndex = 6
pp_data->cap[2]->NotRange.Reserved4 = 6
pp_data->cap[2]->NotButton.HasNull = 0
pp_data->cap[2]->NotButton.Reserved4 = 0x000000
pp_data->cap[2]->NotButton.LogicalMin = -127
pp_data->cap[2]->NotButton.LogicalMax = 127
pp_data->cap[2]->NotButton.PhysicalMin = 0
pp_data->cap[2]->NotButton.PhysicalMax = 0
pp_data->cap[2]->Units = 0
pp_data->cap[2]->UnitsExp = 0
pp_data->cap[3]->UsagePage = 0x0001
pp_data->cap[3]->ReportID = 0x00
pp_data->cap[3]->BitPosition = 0
pp_data->cap[3]->BitSize = 16
pp_data->cap[3]->ReportCount = 1
pp_data->cap[3]->BytePosition = 0x0007
pp_data->cap[3]->BitCount = 16
pp_data->cap[3]->BitField = 0x06
pp_data->cap[3]->NextBytePosition = 0x0009
pp_data->cap[3]->LinkCollection = 0x0001
pp_data->cap[3]->LinkUsagePage = 0x0001
pp_data->cap[3]->LinkUsage = 0x0001
pp_data->cap[3]->IsMultipleItemsForArray = 0
pp_data->cap[3]->IsButtonCap = 0
pp_data->cap[3]->IsPadding = 0
pp_data->cap[3]->IsAbsolute = 0
pp_data->cap[3]->IsRange = 0
pp_data->cap[3]->IsAlias = 0
pp_data->cap[3]->IsStringRange = 0
pp_data->cap[3]->IsDesignatorRange = 0
pp_data->cap[3]->Reserved1 = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[3]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[3]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[3]->NotRange.Usage = 0x0031
pp_data->cap[3]->NotRange.Reserved1 = 0x0031
pp_data->cap[3]->NotRange.StringIndex = 0
pp_data->cap[3]->NotRange.Reserved2 = 0
pp_data->cap[3]->NotRange.DesignatorIndex = 0
pp_data->cap[3]->NotRange.Reserved3 = 0
pp_data->cap[3]->NotRange.DataIndex = 7
pp_data->cap[3]->NotRange.Reserved4 = 7
pp_data->cap[3]->NotButton.HasNull = 0
pp_data->cap[3]->NotButton.Reserved4 = 0x000000
pp_data->cap[3]->NotButton.LogicalMin = -32768
pp_data->cap[3]->NotButton.LogicalMax = 32767
pp_data->cap[3]->NotButton.PhysicalMin = 0
pp_data->cap[3]->NotButton.PhysicalMax = 0
pp_data->cap[3]->Units = 0
pp_data->cap[3]->UnitsExp = 0
pp_data->cap[4]->UsagePage = 0x0001
pp_data->cap[4]->ReportID = 0x00
pp_data->cap[4]->BitPosition = 0
pp_data->cap[4]->BitSize = 16
pp_data->cap[4]->ReportCount = 1
pp_data->cap[4]->BytePosition = 0x0005
pp_data->cap[4]->BitCount = 16
pp_data->cap[4]->BitField = 0x06
pp_data->cap[4]->NextBytePosition = 0x0007
pp_data->cap[4]->LinkCollection = 0x0001
pp_data->cap[4]->LinkUsagePage = 0x0001
pp_data->cap[4]->LinkUsage = 0x0001
pp_data->cap[4]->IsMultipleItemsForArray = 0
pp_data->cap[4]->IsButtonCap = 0
pp_data->cap[4]->IsPadding = 0
pp_data->cap[4]->IsAbsolute = 0
pp_data->cap[4]->IsRange = 0
pp_data->cap[4]->IsAlias = 0
pp_data->cap[4]->IsStringRange = 0
pp_data->cap[4]->IsDesignatorRange = 0
pp_data->cap[4]->Reserved1 = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[0].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[0].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[1].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[1].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[2].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[2].BitField = 0x00000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].Token = 0x00
pp_data->cap[4]->pp_cap->UnknownTokens[3].Reserved = 0x000000
pp_data->cap[4]->pp_cap->UnknownTokens[3].BitField = 0x00000000
pp_data->cap[4]->NotRange.Usage = 0x0030
pp_data->cap[4]->NotRange.Reserved1 = 0x0030
pp_data->cap[4]->NotRange.StringIndex = 0
pp_data->cap[4]->NotRange.Reserved2 = 0
pp_data->cap[4]->NotRange.DesignatorIndex = 0
pp_data->cap[4]->NotRange.Reserved3 = 0
pp_data->cap[4]->NotRange.DataIndex = 8
pp_data->cap[4]->NotRange.Reserved4 = 8
pp_data->cap[4]->NotButton.HasNull = 0
pp_data->cap[4]->NotButton.Reserved4 = 0x000000
pp_data->cap[4]->NotButton.LogicalMin = -32768
pp_data->cap[4]->NotButton.LogicalMax = 32767
pp_data->cap[4]->NotButton.PhysicalMin = 0
pp_data->cap[4]->NotButton.PhysicalMax = 0
pp_data->cap[4]->Units = 0
pp_data->cap[4]->UnitsExp = 0
# Output hid_pp_cap struct:
# Feature hid_pp_cap struct:
# Link Collections:
pp_data->LinkCollectionArray[0]->LinkUsage = 0x0002
pp_data->LinkCollectionArray[0]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[0]->Parent = 0
pp_data->LinkCollectionArray[0]->NumberOfChildren = 1
pp_data->LinkCollectionArray[0]->NextSibling = 0
pp_data->LinkCollectionArray[0]->FirstChild = 1
pp_data->LinkCollectionArray[0]->CollectionType = 1
pp_data->LinkCollectionArray[0]->IsAlias = 0
pp_data->LinkCollectionArray[0]->Reserved = 0x00000000
pp_data->LinkCollectionArray[1]->LinkUsage = 0x0001
pp_data->LinkCollectionArray[1]->LinkUsagePage = 0x0001
pp_data->LinkCollectionArray[1]->Parent = 0
pp_data->LinkCollectionArray[1]->NumberOfChildren = 0
pp_data->LinkCollectionArray[1]->NextSibling = 0
pp_data->LinkCollectionArray[1]->FirstChild = 0
pp_data->LinkCollectionArray[1]->CollectionType = 0
pp_data->LinkCollectionArray[1]->IsAlias = 0
pp_data->LinkCollectionArray[1]->Reserved = 0x00000000

View File

@@ -0,0 +1,9 @@
0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00,
0x05, 0x09, 0x19, 0x01, 0x29, 0x05, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x05, 0x81, 0x02, 0x75, 0x03, 0x95, 0x01,
0x81, 0x03, 0x06, 0x00, 0xFF, 0x09, 0x40, 0x15, 0x81, 0x25,
0x7F, 0x75, 0x08, 0x95, 0x02, 0x81, 0x02, 0x05, 0x01, 0x09,
0x38, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81,
0x06, 0x09, 0x30, 0x09, 0x31, 0x16, 0x00, 0x80, 0x26, 0xFF,
0x7F, 0x75, 0x10, 0x95, 0x02, 0x81, 0x06, 0xC0, 0x75, 0x08,
0x95, 0x5A, 0xB1, 0x03, 0xC0,

View File

@@ -0,0 +1,53 @@
HID report descriptor (dumped on Linux with hid-decode)
Source: https://github.com/libusb/hidapi/issues/703
# device 0:0
# 0x05, 0x01, // Usage Page (Generic Desktop) 0
# 0x09, 0x02, // Usage (Mouse) 2
# 0xa1, 0x01, // Collection (Application) 4
# 0x09, 0x01, // Usage (Pointer) 6
# 0xa1, 0x00, // Collection (Physical) 8
# 0x05, 0x09, // Usage Page (Button) 10
# 0x19, 0x01, // Usage Minimum (1) 12
# 0x29, 0x05, // Usage Maximum (5) 14
# 0x15, 0x00, // Logical Minimum (0) 16
# 0x25, 0x01, // Logical Maximum (1) 18
# 0x75, 0x01, // Report Size (1) 20
# 0x95, 0x05, // Report Count (5) 22
# 0x81, 0x02, // Input (Data,Var,Abs) 24
# 0x75, 0x01, // Report Size (1) 26
# 0x95, 0x03, // Report Count (3) 28
# 0x81, 0x03, // Input (Cnst,Var,Abs) 30
# 0x06, 0x00, 0xff, // Usage Page (Vendor Defined Page 1) 32
# 0x09, 0x40, // Usage (Vendor Usage 0x40) 35
# 0x75, 0x08, // Report Size (8) 37
# 0x95, 0x02, // Report Count (2) 39
# 0x15, 0x81, // Logical Minimum (-127) 41
# 0x25, 0x7f, // Logical Maximum (127) 43
# 0x81, 0x02, // Input (Data,Var,Abs) 45
# 0x05, 0x01, // Usage Page (Generic Desktop) 47
# 0x09, 0x38, // Usage (Wheel) 49
# 0x15, 0x81, // Logical Minimum (-127) 51
# 0x25, 0x7f, // Logical Maximum (127) 53
# 0x75, 0x08, // Report Size (8) 55
# 0x95, 0x01, // Report Count (1) 57
# 0x81, 0x06, // Input (Data,Var,Rel) 59
# 0x09, 0x30, // Usage (X) 61
# 0x09, 0x31, // Usage (Y) 63
# 0x16, 0x00, 0x80, // Logical Minimum (-32768) 65
# 0x26, 0xff, 0x7f, // Logical Maximum (32767) 68
# 0x75, 0x10, // Report Size (16) 71
# 0x95, 0x02, // Report Count (2) 73
# 0x81, 0x06, // Input (Data,Var,Rel) 75
# 0xc0, // End Collection 77
# 0x06, 0x00, 0xff, // Usage Page (Vendor Defined Page 1) 78
# 0x09, 0x02, // Usage (Vendor Usage 2) 81
# 0x15, 0x00, // Logical Minimum (0) 83
# 0x25, 0x01, // Logical Maximum (1) 85
# 0x75, 0x08, // Report Size (8) 87
# 0x95, 0x5a, // Report Count (90) 89
# 0xb1, 0x01, // Feature (Cnst,Arr,Abs) 91
# 0xc0, // End Collection 93
#
R: 94 05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 05 15 00 25 01 75 01 95 05 81 02 75 01 95 03 81 03 06 00 ff 09 40 75 08 95 02 15 81 25 7f 81 02 05 01 09 38 15 81 25 7f 75 08 95 01 81 06 09 30 09 31 16 00 80 26 ff 7f 75 10 95 02 81 06 c0 06 00 ff 09 02 15 00 25 01 75 08 95 5a b1 01 c0
N: device 0:0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,75 @@
0x06, 0x01, 0xFF, 0x09, 0x00, 0xA1, 0x01, 0x09, 0x01, 0xA1,
0x02, 0x85, 0x01, 0x09, 0x03, 0x09, 0x03, 0x09, 0x03, 0x09,
0x03, 0x15, 0x00, 0x25, 0x0F, 0x75, 0x04, 0x95, 0x04, 0x81,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x0B, 0x09,
0x0B, 0x09, 0x0B, 0x09, 0x0B, 0x09, 0x0B, 0x09, 0x0B, 0x09,
0x0B, 0x09, 0x0B, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95,
0x38, 0x81, 0x02, 0xC0, 0x09, 0x02, 0xA1, 0x02, 0x85, 0x02,
0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04,
0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04,
0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04,
0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04,
0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04,
0x09, 0x04, 0x15, 0x00, 0x26, 0xFF, 0x0F, 0x75, 0x10, 0x95,
0x1A, 0x81, 0x02, 0xC0, 0x09, 0x80, 0xA1, 0x02, 0x85, 0x80,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81,
0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x15, 0x00,
0x25, 0x7F, 0x75, 0x08, 0x95, 0x5E, 0x91, 0x02, 0xC0, 0x09,
0x80, 0xA1, 0x02, 0x85, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09,
0x81, 0x09, 0x81, 0x09, 0x81, 0x15, 0x00, 0x25, 0x7F, 0x75,
0x08, 0x95, 0x28, 0x91, 0x02, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD0, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD1, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD2, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD3, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD4, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD5, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD6, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD8, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xD9, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xF1, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75,
0x08, 0x95, 0x02, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02,
0x85, 0xF3, 0x09, 0xD1, 0x15, 0x00, 0x25, 0x7F, 0x75, 0x08,
0x95, 0x02, 0xB1, 0x82, 0xC0, 0xC0,

View File

@@ -0,0 +1,381 @@
Usage Page (Vendor-Defined 2) 06 01 FF
Usage (Undefined) 09 00
Collection (Application) A1 01
Usage (Vendor-Defined 1) 09 01
Collection (Logical) A1 02
Report ID (1) 85 01
Usage (Vendor-Defined 3) 09 03
Usage (Vendor-Defined 3) 09 03
Usage (Vendor-Defined 3) 09 03
Usage (Vendor-Defined 3) 09 03
Logical Minimum (0) 15 00
Logical Maximum (15) 25 0F
Report Size (4) 75 04
Report Count (4) 95 04
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Usage (Vendor-Defined 2) 09 02
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Size (1) 75 01
Report Count (48) 95 30
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Usage (Vendor-Defined 11) 09 0B
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Size (1) 75 01
Report Count (8) 95 08
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
End Collection C0
Usage (Vendor-Defined 2) 09 02
Collection (Logical) A1 02
Report ID (2) 85 02
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Usage (Vendor-Defined 4) 09 04
Logical Minimum (0) 15 00
Logical Maximum (4095) 26 FF 0F
Report Size (16) 75 10
Report Count (26) 95 1A
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
End Collection C0
Usage (Vendor-Defined 128) 09 80
Collection (Logical) A1 02
Report ID (128) 85 80
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Logical Minimum (0) 15 00
Logical Maximum (127) 25 7F
Report Count (94) 95 5E
Report Size (8) 75 08
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
End Collection C0
Usage (Vendor-Defined 128) 09 80
Collection (Logical) A1 02
Report ID (129) 85 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Usage (Vendor-Defined 129) 09 81
Logical Minimum (0) 15 00
Logical Maximum (127) 25 7F
Report Count (40) 95 28
Report Size (8) 75 08
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (208) 85 D0
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (209) 85 D1
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (210) 85 D2
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (211) 85 D3
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (212) 85 D4
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (213) 85 D5
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (214) 85 D6
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (216) 85 D8
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (217) 85 D9
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (32) 95 20
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (241) 85 F1
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Report Size (8) 75 08
Report Count (2) 95 02
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
Usage (Vendor-Defined 208) 09 D0
Collection (Logical) A1 02
Report ID (243) 85 F3
Usage (Vendor-Defined 209) 09 D1
Logical Minimum (0) 15 00
Logical Maximum (127) 25 7F
Report Size (8) 75 08
Report Count (2) 95 02
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) B1 82
End Collection C0
End Collection C0

View File

@@ -0,0 +1,563 @@
#if defined(__MINGW32__)
// Needed for %zu
#define __USE_MINGW_ANSI_STDIO 1
#endif
#include "../hidapi_descriptor_reconstruct.h"
#include <stddef.h>
#include <stdio.h>
#include <string.h>
static hidp_preparsed_data * alloc_preparsed_data_from_file(char* filename)
{
FILE* file;
errno_t err = fopen_s(&file, filename, "r");
if (err != 0) {
fprintf(stderr, "ERROR: Couldn't open file '%s' for reading: %s\n", filename, strerror(err));
return NULL;
}
char line[256];
{
unsigned short vendor_id = 0;
unsigned short product_id = 0;
unsigned short usage = 0;
unsigned short usage_page = 0;
unsigned short release_number = 0;
int interface_number = -1;
BOOLEAN header_read_success = FALSE;
char manufacturer_string[128];
manufacturer_string[0] = '\0';
char product_string[128];
product_string[0] = '\0';
// char path[128];
// path[0] = '\0';
while (fgets(line, sizeof(line), file) != NULL) {
if (line[0] == '\r' || line[0] == '\n') {
line[0] = '\0';
}
if (line[0] == '\0') {
// read the 'metadata' only until the first empty line
header_read_success = TRUE;
break;
}
if (sscanf(line, "dev->vendor_id = 0x%04hX\n", &vendor_id)) continue;
if (sscanf(line, "dev->product_id = 0x%04hX\n", &product_id)) continue;
if (sscanf(line, "dev->usage_page = 0x%04hX\n", &usage_page)) continue;
if (sscanf(line, "dev->usage = 0x%04hX\n", &usage)) continue;
if (sscanf(line, "dev->manufacturer_string = \"%127[^\"\n]", manufacturer_string)) continue;
if (sscanf(line, "dev->product_string = \"%127[^\"\n]", product_string)) continue;
if (sscanf(line, "dev->release_number = 0x%04hX\n", &release_number)) continue;
if (sscanf(line, "dev->interface_number = %d\n", &interface_number)) continue;
// if (sscanf(line, "dev->path = \"%127[^\"]\n", path)) continue;
}
if (!header_read_success) {
fprintf(stderr, "ERROR: Couldn't read PP Data header (missing newline)\n");
fclose(file);
return NULL;
}
printf("'Virtual' Device Read: %04hx %04hx\n", vendor_id, product_id);
if (manufacturer_string[0] != '\0') {
printf(" Manufacturer: %s\n", manufacturer_string);
}
if (product_string[0] != '\0') {
printf(" Product: %s\n", product_string);
}
printf(" Release: %hx\n", release_number);
printf(" Interface: %d\n", interface_number);
printf(" Usage (page): 0x%hx (0x%hx)\n", usage, usage_page);
}
hidp_preparsed_data static_pp_data;
memset(&static_pp_data, 0, sizeof(static_pp_data));
hidp_preparsed_data *pp_data = &static_pp_data;
unsigned int rt_idx;
unsigned int caps_idx;
unsigned int token_idx;
unsigned int coll_idx;
USAGE temp_usage;
BOOLEAN temp_boolean[3];
UCHAR temp_uchar[3];
USHORT temp_ushort;
ULONG temp_ulong;
LONG temp_long;
USHORT FirstByteOfLinkCollectionArray = 0;
USHORT NumberLinkCollectionNodes = 0;
while (fgets(line, sizeof(line), file) != NULL) {
if (line[0] == '#')
continue;
if (FirstByteOfLinkCollectionArray != 0 && NumberLinkCollectionNodes != 0) {
size_t size_of_preparsed_data = offsetof(hidp_preparsed_data, caps) + FirstByteOfLinkCollectionArray + (NumberLinkCollectionNodes * sizeof(hid_pp_link_collection_node));
pp_data->FirstByteOfLinkCollectionArray = FirstByteOfLinkCollectionArray;
pp_data->NumberLinkCollectionNodes = NumberLinkCollectionNodes;
FirstByteOfLinkCollectionArray = 0;
NumberLinkCollectionNodes = 0;
pp_data = malloc(size_of_preparsed_data);
memcpy(pp_data, &static_pp_data, sizeof(static_pp_data));
}
if (sscanf(line, "pp_data->MagicKey = 0x%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX\n", &pp_data->MagicKey[0], &pp_data->MagicKey[1], &pp_data->MagicKey[2], &pp_data->MagicKey[3], &pp_data->MagicKey[4], &pp_data->MagicKey[5], &pp_data->MagicKey[6], &pp_data->MagicKey[7])) continue;
if (sscanf(line, "pp_data->Usage = 0x%04hX\n", &pp_data->Usage)) continue;
if (sscanf(line, "pp_data->UsagePage = 0x%04hX\n", &pp_data->UsagePage)) continue;
if (sscanf(line, "pp_data->Reserved = 0x%04hX%04hX\n", &pp_data->Reserved[0], &pp_data->Reserved[1])) continue;
if (sscanf(line, "pp_data->caps_info[%u]", &rt_idx) == 1) {
const size_t caps_info_count = sizeof(pp_data->caps_info) / sizeof(pp_data->caps_info[0]);
if (rt_idx >= caps_info_count) {
fprintf(stderr, "Broken pp_data file, pp_data->caps_info[<idx>] can have at most %zu elements, accessing %ud, (%s)", caps_info_count, rt_idx, line);
continue;
}
if (sscanf(line, "pp_data->caps_info[%u]->FirstCap = %hu\n", &rt_idx, &temp_ushort) == 2) {
pp_data->caps_info[rt_idx].FirstCap = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->caps_info[%u]->LastCap = %hu\n", &rt_idx, &temp_ushort) == 2) {
pp_data->caps_info[rt_idx].LastCap = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->caps_info[%u]->NumberOfCaps = %hu\n", &rt_idx, &temp_ushort) == 2) {
pp_data->caps_info[rt_idx].NumberOfCaps = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->caps_info[%u]->ReportByteLength = %hu\n", &rt_idx, &temp_ushort) == 2) {
pp_data->caps_info[rt_idx].ReportByteLength = temp_ushort;
continue;
}
fprintf(stderr, "Ignoring unimplemented caps_info field: %s", line);
continue;
}
if (sscanf(line, "pp_data->FirstByteOfLinkCollectionArray = 0x%04hX\n", &FirstByteOfLinkCollectionArray)) {
continue;
}
if (sscanf(line, "pp_data->NumberLinkCollectionNodes = %hu\n", &NumberLinkCollectionNodes)) {
continue;
}
if (sscanf(line, "pp_data->cap[%u]", &caps_idx) == 1) {
if (pp_data->FirstByteOfLinkCollectionArray == 0) {
fprintf(stderr, "Error reading pp_data file (%s): FirstByteOfLinkCollectionArray is 0 or not reported yet\n", line);
continue;
}
if ((caps_idx + 1) * sizeof(hid_pp_cap) > pp_data->FirstByteOfLinkCollectionArray) {
fprintf(stderr, "Error reading pp_data file (%s): the caps index (%u) is out of pp_data bytes boundary (%hu vs %hu)\n", line, caps_idx, (unsigned short) ((caps_idx + 1) * sizeof(hid_pp_cap)), pp_data->FirstByteOfLinkCollectionArray);
continue;
}
if (sscanf(line, "pp_data->cap[%u]->UsagePage = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].UsagePage = temp_usage;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->ReportID = 0x%02hhX\n", &caps_idx, &temp_uchar[0]) == 2) {
pp_data->caps[caps_idx].ReportID = temp_uchar[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->BitPosition = %hhu\n", &caps_idx, &temp_uchar[0]) == 2) {
pp_data->caps[caps_idx].BitPosition = temp_uchar[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->BitSize = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].ReportSize = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->ReportCount = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].ReportCount = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->BytePosition = 0x%04hX\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].BytePosition = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->BitCount = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].BitCount = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->BitField = 0x%02lX\n", &caps_idx, &temp_ulong) == 2) {
pp_data->caps[caps_idx].BitField = temp_ulong;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NextBytePosition = 0x%04hX\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NextBytePosition = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->LinkCollection = 0x%04hX\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].LinkCollection = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->LinkUsagePage = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].LinkUsagePage = temp_usage;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->LinkUsage = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].LinkUsage = temp_usage;
continue;
}
// 8 Flags in one byte
if (sscanf(line, "pp_data->cap[%u]->IsMultipleItemsForArray = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsMultipleItemsForArray = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsButtonCap = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsButtonCap = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsPadding = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsPadding = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsAbsolute = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsAbsolute = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsRange = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsRange = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsAlias = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsAlias = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsStringRange = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsStringRange = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->IsDesignatorRange = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].IsDesignatorRange = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Reserved1 = 0x%hhu%hhu%hhu\n", &caps_idx, &temp_uchar[0], &temp_uchar[1], &temp_uchar[2]) == 4) {
pp_data->caps[caps_idx].Reserved1[0] = temp_uchar[0];
pp_data->caps[caps_idx].Reserved1[1] = temp_uchar[1];
pp_data->caps[caps_idx].Reserved1[2] = temp_uchar[2];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->pp_cap->UnknownTokens[%u]", &caps_idx, &token_idx) == 2) {
const size_t unknown_tokens_count = sizeof(pp_data->caps[0].UnknownTokens) / sizeof(pp_data->caps[0].UnknownTokens[0]);
if (token_idx >= unknown_tokens_count) {
fprintf(stderr, "Broken pp_data file, pp_data->caps[<idx>].UnknownTokens[<idx>] can have at most %zu elements, accessing %ud, (%s)", unknown_tokens_count, token_idx, line);
continue;
}
if (sscanf(line, "pp_data->cap[%u]->pp_cap->UnknownTokens[%u].Token = 0x%02hhX\n", &caps_idx, &token_idx, &temp_uchar[0]) == 3) {
pp_data->caps[caps_idx].UnknownTokens[token_idx].Token = temp_uchar[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->pp_cap->UnknownTokens[%u].Reserved = 0x%02hhX%02hhX%02hhX\n", &caps_idx, &token_idx, &temp_uchar[0], &temp_uchar[1], &temp_uchar[2]) == 5) {
pp_data->caps[caps_idx].UnknownTokens[token_idx].Reserved[0] = temp_uchar[0];
pp_data->caps[caps_idx].UnknownTokens[token_idx].Reserved[1] = temp_uchar[1];
pp_data->caps[caps_idx].UnknownTokens[token_idx].Reserved[2] = temp_uchar[2];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->pp_cap->UnknownTokens[%u].BitField = 0x%08lX\n", &caps_idx, &token_idx, &temp_ulong) == 3) {
pp_data->caps[caps_idx].UnknownTokens[token_idx].BitField = temp_ulong;
continue;
}
fprintf(stderr, "Ignoring unimplemented pp_data->cap[]->pp_cap->UnknownTokens field: %s", line);
continue;
}
// Range
if (sscanf(line, "pp_data->cap[%u]->Range.UsageMin = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].Range.UsageMin = temp_usage;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.UsageMax = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].Range.UsageMax = temp_usage;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.StringMin = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].Range.StringMin = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.StringMax = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].Range.StringMax = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.DesignatorMin = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].Range.DesignatorMin = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.DesignatorMax = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].Range.DesignatorMax = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.DataIndexMin = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].Range.DataIndexMin = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Range.DataIndexMax = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].Range.DataIndexMax = temp_ushort;
continue;
}
// NotRange
if (sscanf(line, "pp_data->cap[%u]->NotRange.Usage = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].NotRange.Usage = temp_usage;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.Reserved1 = 0x%04hX\n", &caps_idx, &temp_usage) == 2) {
pp_data->caps[caps_idx].NotRange.Reserved1 = temp_usage;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.StringIndex = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NotRange.StringIndex = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.Reserved2 = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NotRange.Reserved2 = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.DesignatorIndex = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NotRange.DesignatorIndex = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.Reserved3 = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NotRange.Reserved3 = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.DataIndex = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NotRange.DataIndex = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotRange.Reserved4 = %hu\n", &caps_idx, &temp_ushort) == 2) {
pp_data->caps[caps_idx].NotRange.Reserved4 = temp_ushort;
continue;
}
// Button
if (sscanf(line, "pp_data->cap[%u]->Button.LogicalMin = %ld\n", &caps_idx, &temp_long) == 2) {
pp_data->caps[caps_idx].Button.LogicalMin = temp_long;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Button.LogicalMax = %ld\n", &caps_idx, &temp_long) == 2) {
pp_data->caps[caps_idx].Button.LogicalMax = temp_long;
continue;
}
// NotButton
if (sscanf(line, "pp_data->cap[%u]->NotButton.HasNull = %hhu\n", &caps_idx, &temp_boolean[0]) == 2) {
pp_data->caps[caps_idx].NotButton.HasNull = temp_boolean[0];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotButton.Reserved4 = 0x%02hhX%02hhX%02hhX\n", &caps_idx, &temp_uchar[0], &temp_uchar[1], &temp_uchar[2]) == 4) {
pp_data->caps[caps_idx].NotButton.Reserved4[0] = temp_uchar[0];
pp_data->caps[caps_idx].NotButton.Reserved4[1] = temp_uchar[1];
pp_data->caps[caps_idx].NotButton.Reserved4[2] = temp_uchar[2];
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotButton.LogicalMin = %ld\n", &caps_idx, &temp_long) == 2) {
pp_data->caps[caps_idx].NotButton.LogicalMin = temp_long;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotButton.LogicalMax = %ld\n", &caps_idx, &temp_long) == 2) {
pp_data->caps[caps_idx].NotButton.LogicalMax = temp_long;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotButton.PhysicalMin = %ld\n", &caps_idx, &temp_long) == 2) {
pp_data->caps[caps_idx].NotButton.PhysicalMin = temp_long;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->NotButton.PhysicalMax = %ld\n", &caps_idx, &temp_long) == 2) {
pp_data->caps[caps_idx].NotButton.PhysicalMax = temp_long;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Units = %lu\n", &caps_idx, &temp_ulong) == 2) {
pp_data->caps[caps_idx].Units = temp_ulong;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->UnitsExp = %lu\n", &caps_idx, &temp_ulong) == 2) {
pp_data->caps[caps_idx].UnitsExp = temp_ulong;
continue;
}
if (sscanf(line, "pp_data->cap[%u]->Reserved1 = 0x%02hhu%02hhu%02hhu\n", &coll_idx, &temp_uchar[0], &temp_uchar[1], &temp_uchar[2]) == 4) {
pp_data->caps[caps_idx].Reserved1[0] = temp_uchar[0];
pp_data->caps[caps_idx].Reserved1[1] = temp_uchar[1];
pp_data->caps[caps_idx].Reserved1[2] = temp_uchar[2];
continue;
}
fprintf(stderr, "Ignoring unimplemented cap field: %s", line);
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]", &coll_idx) == 1) {
if (pp_data->FirstByteOfLinkCollectionArray == 0 || pp_data->NumberLinkCollectionNodes == 0) {
fprintf(stderr, "Error reading pp_data file (%s): FirstByteOfLinkCollectionArray or NumberLinkCollectionNodes is 0 or not reported yet\n", line);
continue;
}
if (coll_idx >= pp_data->NumberLinkCollectionNodes) {
fprintf(stderr, "Error reading pp_data file (%s): the LinkCollection index (%u) is out of boundary (%hu)\n", line, coll_idx, pp_data->NumberLinkCollectionNodes);
continue;
}
phid_pp_link_collection_node pcoll = (phid_pp_link_collection_node)(((unsigned char*)&pp_data->caps[0]) + pp_data->FirstByteOfLinkCollectionArray);
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->LinkUsage = 0x%04hX\n", &coll_idx, &temp_usage) == 2) {
pcoll[coll_idx].LinkUsage = temp_usage;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->LinkUsagePage = 0x%04hX\n", &coll_idx, &temp_usage) == 2) {
pcoll[coll_idx].LinkUsagePage = temp_usage;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->Parent = %hu\n", &coll_idx, &temp_ushort) == 2) {
pcoll[coll_idx].Parent = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->NumberOfChildren = %hu\n", &coll_idx, &temp_ushort) == 2) {
pcoll[coll_idx].NumberOfChildren = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->NextSibling = %hu\n", &coll_idx, &temp_ushort) == 2) {
pcoll[coll_idx].NextSibling = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->FirstChild = %hu\n", &coll_idx, &temp_ushort) == 2) {
pcoll[coll_idx].FirstChild = temp_ushort;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->CollectionType = %lu\n", &coll_idx, &temp_ulong) == 2) {
pcoll[coll_idx].CollectionType = temp_ulong;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->IsAlias = %lu\n", &coll_idx, &temp_ulong) == 2) {
pcoll[coll_idx].IsAlias = temp_ulong;
continue;
}
if (sscanf(line, "pp_data->LinkCollectionArray[%u]->Reserved = %lu\n", &coll_idx, &temp_ulong) == 2) {
pcoll[coll_idx].Reserved = temp_ulong;
continue;
}
fprintf(stderr, "Ignoring unimplemented LinkCollectionArray field: %s", line);
continue;
}
}
//end:
fclose(file);
if (pp_data == &static_pp_data) {
return NULL;
}
return pp_data;
}
static BOOLEAN read_hex_data_from_text_file(const char *filename, unsigned char *data_out, size_t data_size, size_t *actual_read)
{
size_t read_index = 0;
FILE* file = NULL;
errno_t err = fopen_s(&file, filename, "r");
if (err != 0) {
fprintf(stderr, "ERROR: Couldn't open file '%s' for reading: %s\n", filename, strerror(err));
return FALSE;
}
BOOLEAN result = TRUE;
unsigned int val;
char buf[16];
while (fscanf(file, "%15s", buf) == 1) {
if (sscanf(buf, "0x%X", &val) != 1) {
fprintf(stderr, "Invalid HEX text ('%s') file, got %s\n", filename, buf);
result = FALSE;
goto end;
}
if (read_index >= data_size) {
fprintf(stderr, "Buffer for file read is too small. Got only %zu bytes to read '%s'\n", data_size, filename);
result = FALSE;
goto end;
}
if (val > (unsigned char)-1) {
fprintf(stderr, "Invalid HEX text ('%s') file, got a value of: %u\n", filename, val);
result = FALSE;
goto end;
}
data_out[read_index] = (unsigned char) val;
read_index++;
}
if (!feof(file)) {
fprintf(stderr, "Invalid HEX text ('%s') file - failed to read all values\n", filename);
result = FALSE;
goto end;
}
*actual_read = read_index;
end:
fclose(file);
return result;
}
int main(int argc, char* argv[])
{
if (argc != 3) {
fprintf(stderr, "Expected 2 arguments for the test ('<>.pp_data' and '<>_expected.rpt_desc'), got: %d\n", argc - 1);
return EXIT_FAILURE;
}
printf("Checking: '%s' / '%s'\n", argv[1], argv[2]);
hidp_preparsed_data *pp_data = alloc_preparsed_data_from_file(argv[1]);
if (pp_data == NULL) {
return EXIT_FAILURE;
}
int result = EXIT_SUCCESS;
unsigned char report_descriptor[HID_API_MAX_REPORT_DESCRIPTOR_SIZE];
int res = hid_winapi_descriptor_reconstruct_pp_data(pp_data, report_descriptor, sizeof(report_descriptor));
if (res < 0) {
result = EXIT_FAILURE;
fprintf(stderr, "Failed to reconstruct descriptor");
goto end;
}
size_t report_descriptor_size = (size_t) res;
unsigned char expected_report_descriptor[HID_API_MAX_REPORT_DESCRIPTOR_SIZE];
size_t expected_report_descriptor_size = 0;
if (!read_hex_data_from_text_file(argv[2], expected_report_descriptor, sizeof(expected_report_descriptor), &expected_report_descriptor_size)) {
result = EXIT_FAILURE;
goto end;
}
if (report_descriptor_size == expected_report_descriptor_size) {
if (memcmp(report_descriptor, expected_report_descriptor, report_descriptor_size) == 0) {
printf("Reconstructed Report Descriptor matches the expected descriptor\n");
goto end;
}
else {
result = EXIT_FAILURE;
fprintf(stderr, "Reconstructed Report Descriptor has different content than expected\n");
}
}
else {
result = EXIT_FAILURE;
fprintf(stderr, "Reconstructed Report Descriptor has different size: %zu when expected %zu\n", report_descriptor_size, expected_report_descriptor_size);
}
printf(" Reconstructed Report Descriptor:\n");
for (int i = 0; i < res; i++) {
printf("0x%02X, ", report_descriptor[i]);
}
printf("\n");
fflush(stdout);
end:
free(pp_data);
return result;
}