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

63
node_modules/node-hid/hidapi/windows/CMakeLists.txt generated vendored Normal file
View File

@@ -0,0 +1,63 @@
list(APPEND HIDAPI_PUBLIC_HEADERS "hidapi_winapi.h")
set(SOURCES
hid.c
hidapi_cfgmgr32.h
hidapi_descriptor_reconstruct.c
hidapi_descriptor_reconstruct.h
hidapi_hidclass.h
hidapi_hidpi.h
hidapi_hidsdi.h
)
if(BUILD_SHARED_LIBS)
list(APPEND SOURCES hidapi.rc)
endif()
add_library(hidapi_winapi
${HIDAPI_PUBLIC_HEADERS}
${SOURCES}
)
target_link_libraries(hidapi_winapi
PUBLIC hidapi_include
)
if(NOT BUILD_SHARED_LIBS)
target_compile_definitions(hidapi_winapi
# prevent marking functions as __declspec(dllexport) for static library build
# #480: this should be refactored for v1.0
PUBLIC HID_API_NO_EXPORT_DEFINE
)
endif()
set_target_properties(hidapi_winapi
PROPERTIES
EXPORT_NAME "winapi"
OUTPUT_NAME "hidapi"
VERSION ${PROJECT_VERSION}
PUBLIC_HEADER "${HIDAPI_PUBLIC_HEADERS}"
)
# compatibility with find_package()
add_library(hidapi::winapi ALIAS hidapi_winapi)
# compatibility with raw library link
add_library(hidapi ALIAS hidapi_winapi)
if(HIDAPI_INSTALL_TARGETS)
install(TARGETS hidapi_winapi EXPORT hidapi
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hidapi"
)
endif()
hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi.pc.in")
if(HIDAPI_WITH_TESTS)
add_subdirectory(test)
endif()
if(DEFINED HIDAPI_BUILD_PP_DATA_DUMP AND HIDAPI_BUILD_PP_DATA_DUMP)
add_subdirectory(pp_data_dump)
endif()

14
node_modules/node-hid/hidapi/windows/Makefile-manual generated vendored Normal file
View File

@@ -0,0 +1,14 @@
OS=$(shell uname)
ifneq (,$(findstring MINGW,$(OS)))
FILE=Makefile.mingw
endif
ifeq ($(FILE), )
all:
$(error Your platform ${OS} is not supported at this time.)
endif
include $(FILE)

15
node_modules/node-hid/hidapi/windows/Makefile.am generated vendored Normal file
View File

@@ -0,0 +1,15 @@
lib_LTLIBRARIES = libhidapi.la
libhidapi_la_SOURCES = hid.c
libhidapi_la_LDFLAGS = $(LTLDFLAGS)
AM_CPPFLAGS = -I$(top_srcdir)/hidapi/
libhidapi_la_LIBADD = $(LIBS)
hdrdir = $(includedir)/hidapi
hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h
EXTRA_DIST = \
hidapi.vcproj \
hidtest.vcproj \
Makefile-manual \
Makefile.mingw \
hidapi.sln

30
node_modules/node-hid/hidapi/windows/Makefile.mingw generated vendored Normal file
View File

@@ -0,0 +1,30 @@
###########################################
# Simple Makefile for HIDAPI test program
#
# Alan Ott
# Signal 11 Software
# 2010-06-01
###########################################
all: hidtest libhidapi.dll
CC=gcc
COBJS=hid.o ../hidtest/test.o
OBJS=$(COBJS)
CFLAGS=-I../hidapi -I. -g -c
LIBS=
DLL_LDFLAGS = -mwindows
hidtest: $(OBJS)
$(CC) -g $^ $(LIBS) -o hidtest
libhidapi.dll: $(OBJS)
$(CC) -g $^ $(DLL_LDFLAGS) -o libhidapi.dll
$(COBJS): %.o: %.c
$(CC) $(CFLAGS) $< -o $@
clean:
rm *.o ../hidtest/*.o hidtest.exe
.PHONY: clean

1605
node_modules/node-hid/hidapi/windows/hid.c generated vendored Normal file

File diff suppressed because it is too large Load Diff

35
node_modules/node-hid/hidapi/windows/hidapi.rc generated vendored Normal file
View File

@@ -0,0 +1,35 @@
#include "winresrc.h"
#include "hidapi.h"
// English
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
VS_VERSION_INFO VERSIONINFO
FILEVERSION HID_API_VERSION_MAJOR,HID_API_VERSION_MINOR,HID_API_VERSION_PATCH,0
PRODUCTVERSION HID_API_VERSION_MAJOR,HID_API_VERSION_MINOR,HID_API_VERSION_PATCH,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
#ifdef _DEBUG
| VS_FF_DEBUG
#endif
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_DLL
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "04090000"
BEGIN
VALUE "CompanyName", "libusb/hidapi Team"
VALUE "FileDescription", "A multi-platform library to interface with HID devices (USB, Bluetooth, etc.)"
VALUE "FileVersion", HID_API_VERSION_STR
VALUE "ProductName", "HIDAPI"
VALUE "ProductVersion", HID_API_VERSION_STR
VALUE "Licence", "https://github.com/libusb/hidapi/blob/master/LICENSE.txt"
VALUE "Comments", "https://github.com/libusb/hidapi"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 0
END
END

41
node_modules/node-hid/hidapi/windows/hidapi.sln generated vendored Normal file
View File

@@ -0,0 +1,41 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.136
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hidapi", "hidapi.vcxproj", "{A107C21C-418A-4697-BB10-20C3AA60E2E4}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hidtest", "hidtest.vcxproj", "{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Debug|Win32.ActiveCfg = Debug|Win32
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Debug|Win32.Build.0 = Debug|Win32
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Debug|x64.ActiveCfg = Debug|x64
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Debug|x64.Build.0 = Debug|x64
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Release|Win32.ActiveCfg = Release|Win32
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Release|Win32.Build.0 = Release|Win32
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Release|x64.ActiveCfg = Release|x64
{A107C21C-418A-4697-BB10-20C3AA60E2E4}.Release|x64.Build.0 = Release|x64
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Debug|Win32.ActiveCfg = Debug|Win32
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Debug|Win32.Build.0 = Debug|Win32
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Debug|x64.ActiveCfg = Debug|x64
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Debug|x64.Build.0 = Debug|x64
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Release|Win32.ActiveCfg = Release|Win32
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Release|Win32.Build.0 = Release|Win32
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Release|x64.ActiveCfg = Release|x64
{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8749E535-9C65-4A89-840E-78D7578C7866}
EndGlobalSection
EndGlobal

200
node_modules/node-hid/hidapi/windows/hidapi.vcproj generated vendored Normal file
View File

@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="hidapi"
ProjectGUID="{A107C21C-418A-4697-BB10-20C3AA60E2E4}"
RootNamespace="hidapi"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\hidapi"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="..\hidapi"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="setupapi.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\hid.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\hidapi\hidapi.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

200
node_modules/node-hid/hidapi/windows/hidapi.vcxproj generated vendored Normal file
View File

@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{A107C21C-418A-4697-BB10-20C3AA60E2E4}</ProjectGuid>
<RootNamespace>hidapi</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>14.0.25431.1</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\hidapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>..\hidapi</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\hidapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>..\hidapi</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\hidapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>..\hidapi</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\hidapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>..\hidapi</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="hid.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\hidapi\hidapi.h" />
<ClInclude Include="hidapi_winapi.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="hidapi.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

75
node_modules/node-hid/hidapi/windows/hidapi_cfgmgr32.h generated vendored Normal file
View File

@@ -0,0 +1,75 @@
/*******************************************************
HIDAPI - Multi-Platform library for
communication with HID devices.
libusb/hidapi Team
Copyright 2022, All Rights Reserved.
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
These files may also be found in the public source
code repository located at:
https://github.com/libusb/hidapi .
********************************************************/
#ifndef HIDAPI_CFGMGR32_H
#define HIDAPI_CFGMGR32_H
#ifdef HIDAPI_USE_DDK
#include <cfgmgr32.h>
#include <initguid.h>
#include <devpkey.h>
#include <propkey.h>
#else
/* This part of the header mimics cfgmgr32.h,
but only what is used by HIDAPI */
#include <initguid.h>
#include <devpropdef.h>
#include <propkeydef.h>
typedef DWORD RETURN_TYPE;
typedef RETURN_TYPE CONFIGRET;
typedef DWORD DEVNODE, DEVINST;
typedef DEVNODE* PDEVNODE, * PDEVINST;
typedef WCHAR* DEVNODEID_W, * DEVINSTID_W;
#define CR_SUCCESS (0x00000000)
#define CR_BUFFER_SMALL (0x0000001A)
#define CR_FAILURE (0x00000013)
#define CM_LOCATE_DEVNODE_NORMAL 0x00000000
#define CM_GET_DEVICE_INTERFACE_LIST_PRESENT (0x00000000)
typedef CONFIGRET(__stdcall* CM_Locate_DevNodeW_)(PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags);
typedef CONFIGRET(__stdcall* CM_Get_Parent_)(PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags);
typedef CONFIGRET(__stdcall* CM_Get_DevNode_PropertyW_)(DEVINST dnDevInst, CONST DEVPROPKEY* PropertyKey, DEVPROPTYPE* PropertyType, PBYTE PropertyBuffer, PULONG PropertyBufferSize, ULONG ulFlags);
typedef CONFIGRET(__stdcall* CM_Get_Device_Interface_PropertyW_)(LPCWSTR pszDeviceInterface, CONST DEVPROPKEY* PropertyKey, DEVPROPTYPE* PropertyType, PBYTE PropertyBuffer, PULONG PropertyBufferSize, ULONG ulFlags);
typedef CONFIGRET(__stdcall* CM_Get_Device_Interface_List_SizeW_)(PULONG pulLen, LPGUID InterfaceClassGuid, DEVINSTID_W pDeviceID, ULONG ulFlags);
typedef CONFIGRET(__stdcall* CM_Get_Device_Interface_ListW_)(LPGUID InterfaceClassGuid, DEVINSTID_W pDeviceID, PZZWSTR Buffer, ULONG BufferLen, ULONG ulFlags);
// from devpkey.h
DEFINE_DEVPROPKEY(DEVPKEY_NAME, 0xb725f130, 0x47ef, 0x101a, 0xa5, 0xf1, 0x02, 0x60, 0x8c, 0x9e, 0xeb, 0xac, 10); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_InstanceId, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 256); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_HardwareIds, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 3); // DEVPROP_TYPE_STRING_LIST
DEFINE_DEVPROPKEY(DEVPKEY_Device_CompatibleIds, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 4); // DEVPROP_TYPE_STRING_LIST
DEFINE_DEVPROPKEY(DEVPKEY_Device_ContainerId, 0x8c7ed206, 0x3f8a, 0x4827, 0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c, 2); // DEVPROP_TYPE_GUID
// from propkey.h
DEFINE_PROPERTYKEY(PKEY_DeviceInterface_Bluetooth_DeviceAddress, 0x2BD67D8B, 0x8BEB, 0x48D5, 0x87, 0xE0, 0x6C, 0xDA, 0x34, 0x28, 0x04, 0x0A, 1); // DEVPROP_TYPE_STRING
DEFINE_PROPERTYKEY(PKEY_DeviceInterface_Bluetooth_Manufacturer, 0x2BD67D8B, 0x8BEB, 0x48D5, 0x87, 0xE0, 0x6C, 0xDA, 0x34, 0x28, 0x04, 0x0A, 4); // DEVPROP_TYPE_STRING
DEFINE_PROPERTYKEY(PKEY_DeviceInterface_Bluetooth_ModelNumber, 0x2BD67D8B, 0x8BEB, 0x48D5, 0x87, 0xE0, 0x6C, 0xDA, 0x34, 0x28, 0x04, 0x0A, 5); // DEVPROP_TYPE_STRING
#endif
#endif /* HIDAPI_CFGMGR32_H */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,247 @@
/*******************************************************
HIDAPI - Multi-Platform library for
communication with HID devices.
libusb/hidapi Team
Copyright 2022, All Rights Reserved.
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
These files may also be found in the public source
code repository located at:
https://github.com/libusb/hidapi .
********************************************************/
#ifndef HIDAPI_DESCRIPTOR_RECONSTRUCT_H__
#define HIDAPI_DESCRIPTOR_RECONSTRUCT_H__
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
/* Do not warn about wcsncpy usage.
https://docs.microsoft.com/cpp/c-runtime-library/security-features-in-the-crt */
#define _CRT_SECURE_NO_WARNINGS
#endif
#include "hidapi_winapi.h"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4200)
#pragma warning(disable: 4201)
#pragma warning(disable: 4214)
#endif
#include <windows.h>
#include "hidapi_hidsdi.h"
#include <assert.h>
#define NUM_OF_HIDP_REPORT_TYPES 3
typedef enum rd_items_ {
rd_main_input = 0x80, /* 1000 00 nn */
rd_main_output = 0x90, /* 1001 00 nn */
rd_main_feature = 0xB0, /* 1011 00 nn */
rd_main_collection = 0xA0, /* 1010 00 nn */
rd_main_collection_end = 0xC0, /* 1100 00 nn */
rd_global_usage_page = 0x04, /* 0000 01 nn */
rd_global_logical_minimum = 0x14, /* 0001 01 nn */
rd_global_logical_maximum = 0x24, /* 0010 01 nn */
rd_global_physical_minimum = 0x34, /* 0011 01 nn */
rd_global_physical_maximum = 0x44, /* 0100 01 nn */
rd_global_unit_exponent = 0x54, /* 0101 01 nn */
rd_global_unit = 0x64, /* 0110 01 nn */
rd_global_report_size = 0x74, /* 0111 01 nn */
rd_global_report_id = 0x84, /* 1000 01 nn */
rd_global_report_count = 0x94, /* 1001 01 nn */
rd_global_push = 0xA4, /* 1010 01 nn */
rd_global_pop = 0xB4, /* 1011 01 nn */
rd_local_usage = 0x08, /* 0000 10 nn */
rd_local_usage_minimum = 0x18, /* 0001 10 nn */
rd_local_usage_maximum = 0x28, /* 0010 10 nn */
rd_local_designator_index = 0x38, /* 0011 10 nn */
rd_local_designator_minimum = 0x48, /* 0100 10 nn */
rd_local_designator_maximum = 0x58, /* 0101 10 nn */
rd_local_string = 0x78, /* 0111 10 nn */
rd_local_string_minimum = 0x88, /* 1000 10 nn */
rd_local_string_maximum = 0x98, /* 1001 10 nn */
rd_local_delimiter = 0xA8 /* 1010 10 nn */
} rd_items;
typedef enum rd_main_items_ {
rd_input = HidP_Input,
rd_output = HidP_Output,
rd_feature = HidP_Feature,
rd_collection,
rd_collection_end,
rd_delimiter_open,
rd_delimiter_usage,
rd_delimiter_close,
} rd_main_items;
typedef struct rd_bit_range_ {
int FirstBit;
int LastBit;
} rd_bit_range;
typedef enum rd_item_node_type_ {
rd_item_node_cap,
rd_item_node_padding,
rd_item_node_collection,
} rd_node_type;
struct rd_main_item_node {
int FirstBit; /* Position of first bit in report (counting from 0) */
int LastBit; /* Position of last bit in report (counting from 0) */
rd_node_type TypeOfNode; /* Information if caps index refers to the array of button caps, value caps,
or if the node is just a padding element to fill unused bit positions.
The node can also be a collection node without any bits in the report. */
int CapsIndex; /* Index in the array of caps */
int CollectionIndex; /* Index in the array of link collections */
rd_main_items MainItemType; /* Input, Output, Feature, Collection or Collection End */
unsigned char ReportID;
struct rd_main_item_node* next;
};
typedef struct hid_pp_caps_info_ {
USHORT FirstCap;
USHORT NumberOfCaps; // Includes empty caps after LastCap
USHORT LastCap;
USHORT ReportByteLength;
} hid_pp_caps_info, *phid_pp_caps_info;
typedef struct hid_pp_link_collection_node_ {
USAGE LinkUsage;
USAGE LinkUsagePage;
USHORT Parent;
USHORT NumberOfChildren;
USHORT NextSibling;
USHORT FirstChild;
ULONG CollectionType : 8;
ULONG IsAlias : 1;
ULONG Reserved : 23;
// Same as the public API structure HIDP_LINK_COLLECTION_NODE, but without PVOID UserContext at the end
} hid_pp_link_collection_node, *phid_pp_link_collection_node;
// Note: This is risk-reduction-measure for this specific struct, as it has ULONG bit-field.
// Although very unlikely, it might still be possible that the compiler creates a memory layout that is
// not binary compatile.
// Other structs are not checked at the time of writing.
static_assert(sizeof(struct hid_pp_link_collection_node_) == 16,
"Size of struct hid_pp_link_collection_node_ not as expected. This might break binary compatibility");
typedef struct hidp_unknown_token_ {
UCHAR Token; /* Specifies the one-byte prefix of a global item. */
UCHAR Reserved[3];
ULONG BitField; /* Specifies the data part of the global item. */
} hidp_unknown_token, * phidp_unknown_token;
typedef struct hid_pp_cap_ {
USAGE UsagePage;
UCHAR ReportID;
UCHAR BitPosition;
USHORT ReportSize; // WIN32 term for this is BitSize
USHORT ReportCount;
USHORT BytePosition;
USHORT BitCount;
ULONG BitField;
USHORT NextBytePosition;
USHORT LinkCollection;
USAGE LinkUsagePage;
USAGE LinkUsage;
// Start of 8 Flags in one byte
BOOLEAN IsMultipleItemsForArray:1;
BOOLEAN IsPadding:1;
BOOLEAN IsButtonCap:1;
BOOLEAN IsAbsolute:1;
BOOLEAN IsRange:1;
BOOLEAN IsAlias:1; // IsAlias is set to TRUE in the first n-1 capability structures added to the capability array. IsAlias set to FALSE in the nth capability structure.
BOOLEAN IsStringRange:1;
BOOLEAN IsDesignatorRange:1;
// End of 8 Flags in one byte
BOOLEAN Reserved1[3];
hidp_unknown_token UnknownTokens[4]; // 4 x 8 Byte
union {
struct {
USAGE UsageMin;
USAGE UsageMax;
USHORT StringMin;
USHORT StringMax;
USHORT DesignatorMin;
USHORT DesignatorMax;
USHORT DataIndexMin;
USHORT DataIndexMax;
} Range;
struct {
USAGE Usage;
USAGE Reserved1;
USHORT StringIndex;
USHORT Reserved2;
USHORT DesignatorIndex;
USHORT Reserved3;
USHORT DataIndex;
USHORT Reserved4;
} NotRange;
};
union {
struct {
LONG LogicalMin;
LONG LogicalMax;
} Button;
struct {
BOOLEAN HasNull;
UCHAR Reserved4[3];
LONG LogicalMin;
LONG LogicalMax;
LONG PhysicalMin;
LONG PhysicalMax;
} NotButton;
};
ULONG Units;
ULONG UnitsExp;
} hid_pp_cap, *phid_pp_cap;
typedef struct hidp_preparsed_data_ {
UCHAR MagicKey[8];
USAGE Usage;
USAGE UsagePage;
USHORT Reserved[2];
// CAPS structure for Input, Output and Feature
hid_pp_caps_info caps_info[3];
USHORT FirstByteOfLinkCollectionArray;
USHORT NumberLinkCollectionNodes;
#ifndef _MSC_VER
// MINGW fails with: Flexible array member in union not supported
// Solution: https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
union {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
hid_pp_cap caps[0];
hid_pp_link_collection_node LinkCollectionArray[0];
#pragma GCC diagnostic pop
};
#else
union {
hid_pp_cap caps[];
hid_pp_link_collection_node LinkCollectionArray[];
};
#endif
} hidp_preparsed_data;
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif

56
node_modules/node-hid/hidapi/windows/hidapi_hidclass.h generated vendored Normal file
View File

@@ -0,0 +1,56 @@
/*******************************************************
HIDAPI - Multi-Platform library for
communication with HID devices.
libusb/hidapi Team
Copyright 2022, All Rights Reserved.
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
These files may also be found in the public source
code repository located at:
https://github.com/libusb/hidapi .
********************************************************/
#ifndef HIDAPI_HIDCLASS_H
#define HIDAPI_HIDCLASS_H
#ifdef HIDAPI_USE_DDK
#include <hidclass.h>
#else
/* This part of the header mimics hidclass.h,
but only what is used by HIDAPI */
#ifndef FILE_DEVICE_KEYBOARD
#define FILE_DEVICE_KEYBOARD 0x0000000b
#endif
#ifndef METHOD_OUT_DIRECT
#define METHOD_OUT_DIRECT 2
#endif
#ifndef FILE_ANY_ACCESS
#define FILE_ANY_ACCESS 0
#endif
#ifndef CTL_CODE
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
#endif
#define HID_OUT_CTL_CODE(id) CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100)
#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104)
#endif
#endif /* HIDAPI_HIDCLASS_H */

72
node_modules/node-hid/hidapi/windows/hidapi_hidpi.h generated vendored Normal file
View File

@@ -0,0 +1,72 @@
/*******************************************************
HIDAPI - Multi-Platform library for
communication with HID devices.
libusb/hidapi Team
Copyright 2022, All Rights Reserved.
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
These files may also be found in the public source
code repository located at:
https://github.com/libusb/hidapi .
********************************************************/
#ifndef HIDAPI_HIDPI_H
#define HIDAPI_HIDPI_H
#ifdef HIDAPI_USE_DDK
#include <hidpi.h>
#else
/* This part of the header mimics hidpi.h,
but only what is used by HIDAPI */
typedef enum _HIDP_REPORT_TYPE
{
HidP_Input,
HidP_Output,
HidP_Feature
} HIDP_REPORT_TYPE;
typedef struct _HIDP_PREPARSED_DATA * PHIDP_PREPARSED_DATA;
typedef struct _HIDP_CAPS
{
USAGE Usage;
USAGE UsagePage;
USHORT InputReportByteLength;
USHORT OutputReportByteLength;
USHORT FeatureReportByteLength;
USHORT Reserved[17];
USHORT NumberLinkCollectionNodes;
USHORT NumberInputButtonCaps;
USHORT NumberInputValueCaps;
USHORT NumberInputDataIndices;
USHORT NumberOutputButtonCaps;
USHORT NumberOutputValueCaps;
USHORT NumberOutputDataIndices;
USHORT NumberFeatureButtonCaps;
USHORT NumberFeatureValueCaps;
USHORT NumberFeatureDataIndices;
} HIDP_CAPS, *PHIDP_CAPS;
#define HIDP_STATUS_SUCCESS 0x00110000
#define HIDP_STATUS_INVALID_PREPARSED_DATA 0xc0110001
typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, PHIDP_CAPS caps);
#endif
#endif /* HIDAPI_HIDPI_H */

59
node_modules/node-hid/hidapi/windows/hidapi_hidsdi.h generated vendored Normal file
View File

@@ -0,0 +1,59 @@
/*******************************************************
HIDAPI - Multi-Platform library for
communication with HID devices.
libusb/hidapi Team
Copyright 2022, All Rights Reserved.
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
These files may also be found in the public source
code repository located at:
https://github.com/libusb/hidapi .
********************************************************/
#ifndef HIDAPI_HIDSDI_H
#define HIDAPI_HIDSDI_H
#ifdef HIDAPI_USE_DDK
#include <hidsdi.h>
#else
/* This part of the header mimics hidsdi.h,
but only what is used by HIDAPI */
typedef USHORT USAGE;
#include "hidapi_hidpi.h"
typedef struct _HIDD_ATTRIBUTES{
ULONG Size;
USHORT VendorID;
USHORT ProductID;
USHORT VersionNumber;
} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
typedef void (__stdcall *HidD_GetHidGuid_)(LPGUID hid_guid);
typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib);
typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len);
typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len);
typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len);
typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length);
typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length);
typedef BOOLEAN (__stdcall* HidD_SetOutputReport_)(HANDLE handle, PVOID data, ULONG length);
typedef BOOLEAN (__stdcall *HidD_GetInputReport_)(HANDLE handle, PVOID data, ULONG length);
typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len);
typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data);
typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data);
typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers);
#endif
#endif /* HIDAPI_HIDSDI_H */

94
node_modules/node-hid/hidapi/windows/hidapi_winapi.h generated vendored Normal file
View File

@@ -0,0 +1,94 @@
/*******************************************************
HIDAPI - Multi-Platform library for
communication with HID devices.
libusb/hidapi Team
Copyright 2022, All Rights Reserved.
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
These files may also be found in the public source
code repository located at:
https://github.com/libusb/hidapi .
********************************************************/
/** @file
* @defgroup API hidapi API
*
* Since version 0.12.0, @ref HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
*/
#ifndef HIDAPI_WINAPI_H__
#define HIDAPI_WINAPI_H__
#include <stdint.h>
#include <guiddef.h>
#include "hidapi.h"
#ifdef __cplusplus
extern "C" {
#endif
/** @brief Get the container ID for a HID device.
Since version 0.12.0, @ref HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
This function returns the `DEVPKEY_Device_ContainerId` property of
the given device. This can be used to correlate different
interfaces/ports on the same hardware device.
@ingroup API
@param dev A device handle returned from hid_open().
@param container_id The device's container ID on return.
@returns
This function returns 0 on success and -1 on error.
*/
int HID_API_EXPORT_CALL hid_winapi_get_container_id(hid_device *dev, GUID *container_id);
/**
* @brief Reconstructs a HID Report Descriptor from a Win32 HIDP_PREPARSED_DATA structure.
* This reconstructed report descriptor is logical identical to the real report descriptor,
* but not byte wise identical.
*
* @param[in] hidp_preparsed_data Pointer to the HIDP_PREPARSED_DATA to read, i.e.: the value of PHIDP_PREPARSED_DATA,
* as returned by HidD_GetPreparsedData WinAPI function.
* @param buf Pointer to the buffer where the report descriptor should be stored.
* @param[in] buf_size Size of the buffer. The recommended size for the buffer is @ref HID_API_MAX_REPORT_DESCRIPTOR_SIZE bytes.
*
* @return Returns size of reconstructed report descriptor if successful, -1 for error.
*/
int HID_API_EXPORT_CALL hid_winapi_descriptor_reconstruct_pp_data(void *hidp_preparsed_data, unsigned char *buf, size_t buf_size);
/**
* @brief Sets the timeout for hid_write operation.
*
* Since version 0.15.0, @ref HID_API_VERSION >= HID_API_MAKE_VERSION(0, 15, 0)
*
* The default timeout is 1sec for winapi backend.
*
* In case if 1sec is not enough, on in case of multi-platform development,
* the recommended value is 5sec, e.g. to match (unconfigurable) 5sec timeout
* set for hidraw (linux kernel) implementation.
*
* When the timeout is set to 0, hid_write function becomes non-blocking and would exit immediately.
* When the timeout is set to INFINITE ((DWORD)-1), the function will not exit,
* until the write operation is performed or an error occured.
* See dwMilliseconds parameter documentation of WaitForSingleObject function.
*
* @param timeout New timeout value in milliseconds.
*/
void HID_API_EXPORT_CALL hid_winapi_set_write_timeout(hid_device *dev, unsigned long timeout);
#ifdef __cplusplus
}
#endif
#endif

196
node_modules/node-hid/hidapi/windows/hidtest.vcproj generated vendored Normal file
View File

@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="hidtest"
ProjectGUID="{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}"
RootNamespace="hidtest"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\hidapi;."
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="hidapi.lib"
AdditionalLibraryDirectories="..\windows\Debug"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description="Copying hidapi.dll to the local directory."
CommandLine=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="..\hidapi;."
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="hidapi.lib"
AdditionalLibraryDirectories="..\windows\Release"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description="Copying hidapi.dll to the local directory."
CommandLine=""
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\hidtest\test.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

176
node_modules/node-hid/hidapi/windows/hidtest.vcxproj generated vendored Normal file
View File

@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}</ProjectGuid>
<RootNamespace>hidtest</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='11'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='12'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='14'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17'">v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>14.0.25431.1</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\hidapi;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>hidapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\hidapi;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>hidapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\hidapi;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>hidapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\hidapi;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>hidapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\hidtest\test.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="hidapi.vcxproj">
<Project>{a107c21c-418a-4697-bb10-20c3aa60e2e4}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -0,0 +1,15 @@
project(pp_data_dump C)
add_executable(pp_data_dump pp_data_dump.c)
set_target_properties(pp_data_dump
PROPERTIES
C_STANDARD 11
C_STANDARD_REQUIRED TRUE
)
target_link_libraries(pp_data_dump
PRIVATE hidapi_winapi
)
install(TARGETS pp_data_dump
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
)

View File

@@ -0,0 +1,122 @@
## pp_data_dump.exe for Windows
pp_data_dump.exe is a small command line tool for Windows, which dumps the content of the [Preparsed Data](https://learn.microsoft.com/en-us/windows-hardware/drivers/hid/preparsed-data) structure, provided by the Windows HID subsystem, into a file.
The generated file is in a text format, which is readable for human, as by the hid_report_reconstructor_test.exe unit test executable of the HIDAPI project. This unit test allows it to test the HIDAPIs report descriptor reconstructor - offline, without the hardware device connected.
pp_data_dump.exe has no arguments, just connect you HID device and execute pp_data_dump.exe. It will generate one file with the name
```
<vendor_id>_<product_id>_<usage>_<usage_table>.pp_data
```
for each top-level collection, of each connected HID device.
## File content
The content of such a .pp_data file looks like the struct, which HIDAPI uses internally to represent the Preparsed Data.
*NOTE:
Windows parses HID report descriptors into opaque `_HIDP_PREPARSED_DATA` objects.
The internal structure of `_HIDP_PREPARSED_DATA` is reserved for internal system use.\
Microsoft doesn't document this structure. [hid_preparsed_data.cc](https://chromium.googlesource.com/chromium/src/+/73fdaaf605bb60caf34d5f30bb84a417688aa528/services/device/hid/hid_preparsed_data.cc) is taken as a reference for its parsing.*
```
# 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,238 @@
#if defined(__MINGW32__)
// Needed for %hh
#define __USE_MINGW_ANSI_STDIO 1
#endif
#include <hid.c>
#include <../windows/hidapi_descriptor_reconstruct.h>
#include <hidapi.h>
void dump_hid_pp_cap(FILE* file, phid_pp_cap pp_cap, unsigned int cap_idx) {
fprintf(file, "pp_data->cap[%u]->UsagePage = 0x%04hX\n", cap_idx, pp_cap->UsagePage);
fprintf(file, "pp_data->cap[%u]->ReportID = 0x%02hhX\n", cap_idx, pp_cap->ReportID);
fprintf(file, "pp_data->cap[%u]->BitPosition = %hhu\n", cap_idx, pp_cap->BitPosition);
fprintf(file, "pp_data->cap[%u]->BitSize = %hu\n", cap_idx, pp_cap->ReportSize);
fprintf(file, "pp_data->cap[%u]->ReportCount = %hu\n", cap_idx, pp_cap->ReportCount);
fprintf(file, "pp_data->cap[%u]->BytePosition = 0x%04hX\n", cap_idx, pp_cap->BytePosition);
fprintf(file, "pp_data->cap[%u]->BitCount = %hu\n", cap_idx, pp_cap->BitCount);
fprintf(file, "pp_data->cap[%u]->BitField = 0x%02lX\n", cap_idx, pp_cap->BitField);
fprintf(file, "pp_data->cap[%u]->NextBytePosition = 0x%04hX\n", cap_idx, pp_cap->NextBytePosition);
fprintf(file, "pp_data->cap[%u]->LinkCollection = 0x%04hX\n", cap_idx, pp_cap->LinkCollection);
fprintf(file, "pp_data->cap[%u]->LinkUsagePage = 0x%04hX\n", cap_idx, pp_cap->LinkUsagePage);
fprintf(file, "pp_data->cap[%u]->LinkUsage = 0x%04hX\n", cap_idx, pp_cap->LinkUsage);
// 8 Flags in one byte
fprintf(file, "pp_data->cap[%u]->IsMultipleItemsForArray = %hhu\n", cap_idx, pp_cap->IsMultipleItemsForArray);
fprintf(file, "pp_data->cap[%u]->IsButtonCap = %hhu\n", cap_idx, pp_cap->IsButtonCap);
fprintf(file, "pp_data->cap[%u]->IsPadding = %hhu\n", cap_idx, pp_cap->IsPadding);
fprintf(file, "pp_data->cap[%u]->IsAbsolute = %hhu\n", cap_idx, pp_cap->IsAbsolute);
fprintf(file, "pp_data->cap[%u]->IsRange = %hhu\n", cap_idx, pp_cap->IsRange);
fprintf(file, "pp_data->cap[%u]->IsAlias = %hhu\n", cap_idx, pp_cap->IsAlias);
fprintf(file, "pp_data->cap[%u]->IsStringRange = %hhu\n", cap_idx, pp_cap->IsStringRange);
fprintf(file, "pp_data->cap[%u]->IsDesignatorRange = %hhu\n", cap_idx, pp_cap->IsDesignatorRange);
fprintf(file, "pp_data->cap[%u]->Reserved1 = 0x%02hhX%02hhX%02hhX\n", cap_idx, pp_cap->Reserved1[0], pp_cap->Reserved1[1], pp_cap->Reserved1[2]);
for (int token_idx = 0; token_idx < 4; token_idx++) {
fprintf(file, "pp_data->cap[%u]->pp_cap->UnknownTokens[%d].Token = 0x%02hhX\n", cap_idx, token_idx, pp_cap->UnknownTokens[token_idx].Token);
fprintf(file, "pp_data->cap[%u]->pp_cap->UnknownTokens[%d].Reserved = 0x%02hhX%02hhX%02hhX\n", cap_idx, token_idx, pp_cap->UnknownTokens[token_idx].Reserved[0], pp_cap->UnknownTokens[token_idx].Reserved[1], pp_cap->UnknownTokens[token_idx].Reserved[2]);
fprintf(file, "pp_data->cap[%u]->pp_cap->UnknownTokens[%d].BitField = 0x%08lX\n", cap_idx, token_idx, pp_cap->UnknownTokens[token_idx].BitField);
}
if (pp_cap->IsRange) {
fprintf(file, "pp_data->cap[%u]->Range.UsageMin = 0x%04hX\n", cap_idx, pp_cap->Range.UsageMin);
fprintf(file, "pp_data->cap[%u]->Range.UsageMax = 0x%04hX\n", cap_idx, pp_cap->Range.UsageMax);
fprintf(file, "pp_data->cap[%u]->Range.StringMin = %hu\n", cap_idx, pp_cap->Range.StringMin);
fprintf(file, "pp_data->cap[%u]->Range.StringMax = %hu\n", cap_idx, pp_cap->Range.StringMax);
fprintf(file, "pp_data->cap[%u]->Range.DesignatorMin = %hu\n", cap_idx, pp_cap->Range.DesignatorMin);
fprintf(file, "pp_data->cap[%u]->Range.DesignatorMax = %hu\n", cap_idx, pp_cap->Range.DesignatorMax);
fprintf(file, "pp_data->cap[%u]->Range.DataIndexMin = %hu\n", cap_idx, pp_cap->Range.DataIndexMin);
fprintf(file, "pp_data->cap[%u]->Range.DataIndexMax = %hu\n", cap_idx, pp_cap->Range.DataIndexMax);
}
else {
fprintf(file, "pp_data->cap[%u]->NotRange.Usage = 0x%04hX\n", cap_idx, pp_cap->NotRange.Usage);
fprintf(file, "pp_data->cap[%u]->NotRange.Reserved1 = 0x%04hX\n", cap_idx, pp_cap->NotRange.Reserved1);
fprintf(file, "pp_data->cap[%u]->NotRange.StringIndex = %hu\n", cap_idx, pp_cap->NotRange.StringIndex);
fprintf(file, "pp_data->cap[%u]->NotRange.Reserved2 = %hu\n", cap_idx, pp_cap->NotRange.Reserved2);
fprintf(file, "pp_data->cap[%u]->NotRange.DesignatorIndex = %hu\n", cap_idx, pp_cap->NotRange.DesignatorIndex);
fprintf(file, "pp_data->cap[%u]->NotRange.Reserved3 = %hu\n", cap_idx, pp_cap->NotRange.Reserved3);
fprintf(file, "pp_data->cap[%u]->NotRange.DataIndex = %hu\n", cap_idx, pp_cap->NotRange.DataIndex);
fprintf(file, "pp_data->cap[%u]->NotRange.Reserved4 = %hu\n", cap_idx, pp_cap->NotRange.Reserved4);
}
if (pp_cap->IsButtonCap) {
fprintf(file, "pp_data->cap[%u]->Button.LogicalMin = %ld\n", cap_idx, pp_cap->Button.LogicalMin);
fprintf(file, "pp_data->cap[%u]->Button.LogicalMax = %ld\n", cap_idx, pp_cap->Button.LogicalMax);
}
else
{
fprintf(file, "pp_data->cap[%u]->NotButton.HasNull = %hhu\n", cap_idx, pp_cap->NotButton.HasNull);
fprintf(file, "pp_data->cap[%u]->NotButton.Reserved4 = 0x%02hhX%02hhX%02hhX\n", cap_idx, pp_cap->NotButton.Reserved4[0], pp_cap->NotButton.Reserved4[1], pp_cap->NotButton.Reserved4[2]);
fprintf(file, "pp_data->cap[%u]->NotButton.LogicalMin = %ld\n", cap_idx, pp_cap->NotButton.LogicalMin);
fprintf(file, "pp_data->cap[%u]->NotButton.LogicalMax = %ld\n", cap_idx, pp_cap->NotButton.LogicalMax);
fprintf(file, "pp_data->cap[%u]->NotButton.PhysicalMin = %ld\n", cap_idx, pp_cap->NotButton.PhysicalMin);
fprintf(file, "pp_data->cap[%u]->NotButton.PhysicalMax = %ld\n", cap_idx, pp_cap->NotButton.PhysicalMax);
};
fprintf(file, "pp_data->cap[%u]->Units = %lu\n", cap_idx, pp_cap->Units);
fprintf(file, "pp_data->cap[%u]->UnitsExp = %lu\n", cap_idx, pp_cap->UnitsExp);
}
void dump_hidp_link_collection_node(FILE* file, phid_pp_link_collection_node pcoll, unsigned int coll_idx) {
fprintf(file, "pp_data->LinkCollectionArray[%u]->LinkUsage = 0x%04hX\n", coll_idx, pcoll->LinkUsage);
fprintf(file, "pp_data->LinkCollectionArray[%u]->LinkUsagePage = 0x%04hX\n", coll_idx, pcoll->LinkUsagePage);
fprintf(file, "pp_data->LinkCollectionArray[%u]->Parent = %hu\n", coll_idx, pcoll->Parent);
fprintf(file, "pp_data->LinkCollectionArray[%u]->NumberOfChildren = %hu\n", coll_idx, pcoll->NumberOfChildren);
fprintf(file, "pp_data->LinkCollectionArray[%u]->NextSibling = %hu\n", coll_idx, pcoll->NextSibling);
fprintf(file, "pp_data->LinkCollectionArray[%u]->FirstChild = %hu\n", coll_idx, pcoll->FirstChild);
// The compilers are not consistent on ULONG-bit-fields: They lose the unsinged or define them as int.
// Thus just always cast them to unsinged int, which should be fine, as the biggest bit-field is 28 bit
fprintf(file, "pp_data->LinkCollectionArray[%u]->CollectionType = %u\n", coll_idx, (unsigned int)(pcoll->CollectionType));
fprintf(file, "pp_data->LinkCollectionArray[%u]->IsAlias = %u\n", coll_idx, (unsigned int)(pcoll->IsAlias));
fprintf(file, "pp_data->LinkCollectionArray[%u]->Reserved = 0x%08X\n", coll_idx, (unsigned int)(pcoll->Reserved));
}
int dump_pp_data(FILE* file, hid_device* dev)
{
BOOL res;
hidp_preparsed_data* pp_data = NULL;
res = HidD_GetPreparsedData(dev->device_handle, (PHIDP_PREPARSED_DATA*) &pp_data);
if (!res) {
printf("ERROR: HidD_GetPreparsedData failed!");
return -1;
}
else {
fprintf(file, "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]);
fprintf(file, "pp_data->Usage = 0x%04hX\n", pp_data->Usage);
fprintf(file, "pp_data->UsagePage = 0x%04hX\n", pp_data->UsagePage);
fprintf(file, "pp_data->Reserved = 0x%04hX%04hX\n", pp_data->Reserved[0], pp_data->Reserved[1]);
fprintf(file, "# Input caps_info struct:\n");
fprintf(file, "pp_data->caps_info[0]->FirstCap = %hu\n", pp_data->caps_info[0].FirstCap);
fprintf(file, "pp_data->caps_info[0]->LastCap = %hu\n", pp_data->caps_info[0].LastCap);
fprintf(file, "pp_data->caps_info[0]->NumberOfCaps = %hu\n", pp_data->caps_info[0].NumberOfCaps);
fprintf(file, "pp_data->caps_info[0]->ReportByteLength = %hu\n", pp_data->caps_info[0].ReportByteLength);
fprintf(file, "# Output caps_info struct:\n");
fprintf(file, "pp_data->caps_info[1]->FirstCap = %hu\n", pp_data->caps_info[1].FirstCap);
fprintf(file, "pp_data->caps_info[1]->LastCap = %hu\n", pp_data->caps_info[1].LastCap);
fprintf(file, "pp_data->caps_info[1]->NumberOfCaps = %hu\n", pp_data->caps_info[1].NumberOfCaps);
fprintf(file, "pp_data->caps_info[1]->ReportByteLength = %hu\n", pp_data->caps_info[1].ReportByteLength);
fprintf(file, "# Feature caps_info struct:\n");
fprintf(file, "pp_data->caps_info[2]->FirstCap = %hu\n", pp_data->caps_info[2].FirstCap);
fprintf(file, "pp_data->caps_info[2]->LastCap = %hu\n", pp_data->caps_info[2].LastCap);
fprintf(file, "pp_data->caps_info[2]->NumberOfCaps = %hu\n", pp_data->caps_info[2].NumberOfCaps);
fprintf(file, "pp_data->caps_info[2]->ReportByteLength = %hu\n", pp_data->caps_info[2].ReportByteLength);
fprintf(file, "# LinkCollectionArray Offset & Size:\n");
fprintf(file, "pp_data->FirstByteOfLinkCollectionArray = 0x%04hX\n", pp_data->FirstByteOfLinkCollectionArray);
fprintf(file, "pp_data->NumberLinkCollectionNodes = %hu\n", pp_data->NumberLinkCollectionNodes);
phid_pp_cap pcap = (phid_pp_cap)(((unsigned char*)pp_data) + offsetof(hidp_preparsed_data, caps));
fprintf(file, "# Input hid_pp_cap struct:\n");
for (int caps_idx = pp_data->caps_info[0].FirstCap; caps_idx < pp_data->caps_info[0].LastCap; caps_idx++) {
dump_hid_pp_cap(file, pcap + caps_idx, caps_idx);
fprintf(file, "\n");
}
fprintf(file, "# Output hid_pp_cap struct:\n");
for (int caps_idx = pp_data->caps_info[1].FirstCap; caps_idx < pp_data->caps_info[1].LastCap; caps_idx++) {
dump_hid_pp_cap(file, pcap + caps_idx, caps_idx);
fprintf(file, "\n");
}
fprintf(file, "# Feature hid_pp_cap struct:\n");
for (int caps_idx = pp_data->caps_info[2].FirstCap; caps_idx < pp_data->caps_info[2].LastCap; caps_idx++) {
dump_hid_pp_cap(file, pcap + caps_idx, caps_idx);
fprintf(file, "\n");
}
phid_pp_link_collection_node pcoll = (phid_pp_link_collection_node)(((unsigned char*)pcap) + pp_data->FirstByteOfLinkCollectionArray);
fprintf(file, "# Link Collections:\n");
for (int coll_idx = 0; coll_idx < pp_data->NumberLinkCollectionNodes; coll_idx++) {
dump_hidp_link_collection_node(file, pcoll + coll_idx, coll_idx);
}
HidD_FreePreparsedData((PHIDP_PREPARSED_DATA) pp_data);
return 0;
}
}
int main(int argc, char* argv[])
{
(void)argc;
(void)argv;
#define MAX_STR 255
struct hid_device_info *devs, *cur_dev;
printf("pp_data_dump tool. Compiled with hidapi version %s, runtime version %s.\n", HID_API_VERSION_STR, hid_version_str());
if (hid_version()->major == HID_API_VERSION_MAJOR && hid_version()->minor == HID_API_VERSION_MINOR && hid_version()->patch == HID_API_VERSION_PATCH) {
printf("Compile-time version matches runtime version of hidapi.\n\n");
}
else {
printf("Compile-time version is different than runtime version of hidapi.\n]n");
}
if (hid_init())
return -1;
devs = hid_enumerate(0x0, 0x0);
cur_dev = devs;
while (cur_dev) {
printf("Device Found\n type: %04hx %04hx\n path: %s\n serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
printf("\n");
printf(" Manufacturer: %ls\n", cur_dev->manufacturer_string);
printf(" Product: %ls\n", cur_dev->product_string);
printf(" Release: %hX\n", cur_dev->release_number);
printf(" Interface: %d\n", cur_dev->interface_number);
printf(" Usage (page): %02X (%02X)\n", cur_dev->usage, cur_dev->usage_page);
hid_device *device = hid_open_path(cur_dev->path);
if (device) {
char filename[MAX_STR];
FILE* file;
sprintf_s(filename, MAX_STR, "%04X_%04X_%04X_%04X.pp_data", cur_dev->vendor_id, cur_dev->product_id, cur_dev->usage, cur_dev->usage_page);
errno_t err = fopen_s(&file, filename, "w");
if (err == 0) {
fprintf(file, "# HIDAPI device info struct:\n");
fprintf(file, "dev->vendor_id = 0x%04hX\n", cur_dev->vendor_id);
fprintf(file, "dev->product_id = 0x%04hX\n", cur_dev->product_id);
fprintf(file, "dev->manufacturer_string = \"%ls\"\n", cur_dev->manufacturer_string);
fprintf(file, "dev->product_string = \"%ls\"\n", cur_dev->product_string);
fprintf(file, "dev->release_number = 0x%04hX\n", cur_dev->release_number);
fprintf(file, "dev->interface_number = %d\n", cur_dev->interface_number);
fprintf(file, "dev->usage = 0x%04hX\n", cur_dev->usage);
fprintf(file, "dev->usage_page = 0x%04hX\n", cur_dev->usage_page);
fprintf(file, "dev->path = \"%s\"\n", cur_dev->path);
fprintf(file, "\n# Preparsed Data struct:\n");
int res = dump_pp_data(file, device);
if (res == 0) {
printf("Dumped Preparsed Data to %s\n", filename);
}
else {
printf("ERROR: Dump Preparsed Data to %s failed!\n", filename);
}
fclose(file);
}
hid_close(device);
}
else {
printf(" Device: not available.\n");
}
printf("\n");
cur_dev = cur_dev->next;
}
hid_free_enumeration(devs);
/* Free static HIDAPI objects. */
hid_exit();
//system("pause");
return 0;
}

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;
}