windows-nt/Source/XPSP1/NT/drivers/wdm/input/hidparse/test/hidparse.c
2020-09-26 16:20:57 +08:00

1237 lines
58 KiB
C

typedef int POOL_TYPE;
#include <stdio.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <wtypes.h>
#include <hidpddi.h>
#include <hidparse.h>
#undef ASSERT
#define ASSERT( exp ) \
if (!(exp)) \
{ printf ("Assert Failed: %s \n %s \n %d \n", #exp, __FILE__, __LINE__ ); }
NTSTATUS __stdcall
HidP_SetUnsetOneUsage (
struct _CHANNEL_REPORT_HEADER *,
USAGE,
USHORT,
USAGE,
PHIDP_PREPARSED_DATA,
PCHAR,
BOOLEAN);
typedef union _HID_PPD_FLAGS {
struct {
ULONG InputChannels : 1;
ULONG OutputChannels : 1;
ULONG FeatureChannels : 1;
ULONG LinkCollections : 1;
ULONG FullChannelListing : 1;
ULONG ReportLocation : 1;
ULONG Reserved : 25;
ULONG IgnoreSignature : 1;
};
ULONG Flags;
} HID_PPD_FLAGS;
VOID HID_DumpPpd (PHIDP_PREPARSED_DATA Ppd, HID_PPD_FLAGS Flags);
void __cdecl main ()
{
HID_PPD_FLAGS flags;
ULONG i;
UCHAR desc[] = {0x05, 0x0C, 0x09, 0x01,
0xA1, 0x01, 0x85, 0x01,
0x09, 0x36, 0xA1, 0x02,
0x05, 0x09, 0x19, 0x01,
0x29, 0x10, 0x15, 0x00,
0x25, 0x01, 0x35, 0x00,
0x45, 0x01, 0x75, 0x01,
0x95, 0x10, 0x81, 0x02,
0xC0, 0x15, 0x01,
0x25, 0x03, 0x75, 0x02,
0x95, 0x01, 0x05, 0x0C,
0x09, 0xB0, 0xA1, 0x02,
0x05, 0x08, 0x09, 0x3C,
0xA1, 0x02, 0x09, 0x3D,
0x09, 0x3F, 0x09, 0x41,
0x91, 0x00, 0xC0,
0x09, 0x47, 0xA1, 0x02,
0x09, 0x48, 0x09, 0x49,
0x09, 0x4A, 0x91, 0x00,
0x91, 0x01, 0x91, 0x01,
0xC0, 0xC0,
0x05, 0x14, 0x15, 0x00,
0x09, 0x20, 0xA1, 0x02,
0x09, 0x35, 0x25, 0x03,
0x75, 0x03, 0x95, 0x01,
0xB1, 0x03, 0x09, 0x36,
0x25, 0x1F, 0x75, 0x05,
0xB1, 0x03, 0xC0,
0x09, 0x32, 0xA1, 0x02,
0x85, 0x02, 0x09, 0x33,
0x75, 0x03, 0x95, 0x01,
0x25, 0x07, 0xB1, 0x22,
0x09, 0x34, 0x75, 0x05,
0x25, 0x1F, 0xB1, 0x22,
0xC0, 0x09, 0x2B,
0xA1, 0x02, 0x09, 0x33,
0x75, 0x03, 0x95, 0x01,
0x25, 0x07, 0xB1, 0x22,
0x09, 0x34, 0x75, 0x05,
0x25, 0x1F, 0xB1, 0x22,
0x75, 0x08, 0x95, 0x04,
0x15, 0x20, 0x26, 0xFE, 0x00,
0x09, 0x2C, 0xB1, 0x02,
0xC0, 0xC0
};
unsigned char PwrReportDescriptor[] = {
0x05, 0x84, // USAGE_PAGE (Power Device)
0x09, 0x04, // USAGE (UPS)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x1e, // USAGE (Flow)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x1f, // USAGE (FlowID)
0x75, 0x04, // REPORT_SIZE (4)
0x95, 0x01, // REPORT_COUNT (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x0f, // LOGICAL_MAXIMUM (15)
0x65, 0x00, // UNIT (None)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x00, // USAGE (Undefined)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x01, // USAGE (iName)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x40, // USAGE (ConfigVoltage)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x67, 0x21, 0xd1, 0xf0, 0x00, // UNIT (SI Lin:Volts)
0x55, 0x07, // UNIT_EXPONENT (7)
0x26, 0xfe, 0x00, // LOGICAL_MAXIMUM (254)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x42, // USAGE (ConfigFrequency)
0x95, 0x01, // REPORT_COUNT (1)
0x66, 0x01, 0xf0, // UNIT (SI Lin:Hertz)
0x55, 0x00, // UNIT_EXPONENT (0)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x43, // USAGE (ConfigApparentPower)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x66, 0x21, 0xd1, // UNIT (SI Lin:Power)
0x55, 0x07, // UNIT_EXPONENT (7)
0x27, 0xfe, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65534)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x65, 0x00, // UNIT (None)
0xc0, // END_COLLECTION
0x09, 0x24, // USAGE (PowerSummary)
0xa1, 0x00, // COLLECTION (Physical)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x25, // USAGE (PowerSummaryID)
0x09, 0x1f, // USAGE (FlowID)
0x75, 0x04, // REPORT_SIZE (4)
0x95, 0x02, // REPORT_COUNT (2)
0x25, 0x0f, // LOGICAL_MAXIMUM (15)
0x65, 0x00, // UNIT (None)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x01, // USAGE (iName)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x25, 0x0f, // LOGICAL_MAXIMUM (15)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x0b, 0x2c, 0x00, 0x85, 0x00, // USAGE (Battery System:CapacityMode)
0x0b, 0x8b, 0x00, 0x85, 0x00, // USAGE (Battery System:Rechargable)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x02, // REPORT_COUNT (2)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x00, // USAGE (Undefined)
0x75, 0x06, // REPORT_SIZE (6)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x0b, 0x83, 0x00, 0x85, 0x00, // USAGE (Battery System:DesignCapacity)
0x0b, 0x67, 0x00, 0x85, 0x00, // USAGE (Battery System:FullChargeCapacity)
0x75, 0x18, // REPORT_SIZE (24)
0x95, 0x02, // REPORT_COUNT (2)
0x67, 0x01, 0x10, 0x10, 0x00, // UNIT (SI Lin:Battery Capacity)
0x27, 0xfe, 0xff, 0xff, 0x00, // LOGICAL_MAXIMUM (16777214)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x40, // USAGE (ConfigVoltage)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x67, 0x21, 0xd1, 0xf0, 0x00, // UNIT (SI Lin:Volts)
0x55, 0x05, // UNIT_EXPONENT (5)
0x27, 0xfe, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65534)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x0b, 0x8c, 0x00, 0x85, 0x00, // USAGE (Battery System:WarningCapacityLimit)
0x0b, 0x29, 0x00, 0x85, 0x00, // USAGE (Battery System:RemainingCapacityLimit)
0x0b, 0x8d, 0x00, 0x85, 0x00, // USAGE (Battery System:CapacityGranularity1)
0x0b, 0x8e, 0x00, 0x85, 0x00, // USAGE (Battery System:CapacityGranularity2)
0x75, 0x18, // REPORT_SIZE (24)
0x95, 0x04, // REPORT_COUNT (4)
0x67, 0x01, 0x10, 0x10, 0x00, // UNIT (SI Lin:Battery Capacity)
0x55, 0x00, // UNIT_EXPONENT (0)
0x27, 0xfe, 0xff, 0xff, 0x00, // LOGICAL_MAXIMUM (16777214)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0xfe, // USAGE (iProduct)
0x09, 0xff, // USAGE (iSerialNumber)
0x0b, 0x89, 0x00, 0x85, 0x00, // USAGE (Battery System:iDeviceChemistery)
0x0b, 0x87, 0x00, 0x85, 0x00, // USAGE (Battery System:iManufacturerName)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x04, // REPORT_COUNT (4)
0x25, 0x0f, // LOGICAL_MAXIMUM (15)
0x65, 0x00, // UNIT (None)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x30, // USAGE (Voltage)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x67, 0x21, 0xd1, 0xf0, 0x00, // UNIT (SI Lin:Volts)
0x55, 0x05, // UNIT_EXPONENT (5)
0x27, 0xfe, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65534)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x31, // USAGE (Current)
0x95, 0x01, // REPORT_COUNT (1)
0x67, 0x01, 0x00, 0x10, 0x00, // UNIT (SI Lin:Amps)
0x55, 0x0e, // UNIT_EXPONENT (-2)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x0b, 0x66, 0x00, 0x85, 0x00, // USAGE (Battery System:RemainingCapacity)
0x75, 0x18, // REPORT_SIZE (24)
0x95, 0x01, // REPORT_COUNT (1)
0x67, 0x01, 0x10, 0x10, 0x00, // UNIT (SI Lin:Battery Capacity)
0x55, 0x00, // UNIT_EXPONENT (0)
0x27, 0xfe, 0xff, 0xff, 0x00, // LOGICAL_MAXIMUM (16777214)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x0b, 0x68, 0x00, 0x85, 0x00, // USAGE (Battery System:RunTimeToEmpty)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x66, 0x01, 0x10, // UNIT (SI Lin:Time)
0x55, 0x00, // UNIT_EXPONENT (0)
0x27, 0xfe, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65534)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x35, // USAGE (PercentLoad)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x26, 0xfe, 0x00, // LOGICAL_MAXIMUM (254)
0x65, 0x00, // UNIT (None)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x02, // USAGE (PresentStatus)
0xa1, 0x02, // COLLECTION (Logical)
0x05, 0x85, // USAGE_PAGE (Battery System)
0x09, 0xd0, // USAGE (ACPresent)
0x09, 0x42, // USAGE (BelowRemainingCapacityLimit)
0x09, 0x44, // USAGE (Charging)
0x09, 0x45, // USAGE (Discharging)
0x0b, 0x69, 0x00, 0x84, 0x00, // USAGE (Power Device:ShutdownImminent)
0x0b, 0x65, 0x00, 0x84, 0x00, // USAGE (Power Device:Overload)
0x09, 0x00, // USAGE (Undefined)
0x09, 0x00, // USAGE (Undefined)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
UCHAR rawDesc[] = {
0x05, 0x80, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x01,
0x75, 0x08, 0x95, 0x80, 0x15, 0x00, 0x26, 0xFF,
0x00, 0x09, 0x02, 0xB2, 0x02, 0x01, 0x85, 0x02,
0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x27, 0xFF,
0xFF, 0x00, 0x00, 0x09, 0x04, 0xB1, 0x02, 0x85,
0x03, 0x09, 0x09, 0xA1, 0x02, 0x05, 0x81, 0x09,
0x01, 0x25, 0x01, 0x75, 0x08, 0x95, 0x01, 0xB1,
0x40, 0xC0, 0x05, 0x82, 0x85, 0x04, 0x09, 0x20,
0x09, 0x22, 0x09, 0x30, 0x09, 0x32, 0x09, 0x24,
0x75, 0x08, 0x95, 0x05, 0x26, 0xFF, 0x00, 0xB1,
0x62, 0x09, 0x20, 0x09, 0x22, 0x09, 0x30, 0x09,
0x32, 0x09, 0x24, 0x81, 0x62, 0x85, 0x05, 0x09,
0x26, 0x09, 0x3A, 0x09, 0x40, 0x09, 0x42, 0x09,
0x44, 0x95, 0x05, 0xB1, 0x62, 0x09, 0x26, 0x09,
0x3A, 0x09, 0x40, 0x09, 0x42, 0x09, 0x44, 0x81,
0x62, 0x85, 0x06, 0x09, 0x10, 0x09, 0x12, 0x09,
0x16, 0x09, 0x18, 0x09, 0x1A, 0x95, 0x05, 0xB1,
0x62, 0x09, 0x10, 0x09, 0x12, 0x09, 0x16, 0x09,
0x18, 0x09, 0x1A, 0x81, 0x62, 0x85, 0x07, 0x09,
0x6C, 0x09, 0x6E, 0x09, 0x70, 0x95, 0x03, 0xB1,
0x62, 0x09, 0x6C, 0x09, 0x6E, 0x09, 0x70, 0x81,
0x62, 0x85, 0x08, 0x09, 0x5E, 0xA1, 0x02, 0x05,
0x81, 0x09, 0x03, 0x75, 0x08, 0x95, 0x01, 0x25,
0x01, 0xB1, 0x40, 0xC0, 0x05, 0x82, 0x09, 0x60,
0xA1, 0x02, 0x05, 0x81, 0x09, 0x01, 0x75, 0x08,
0x25, 0x01, 0xB1, 0x40, 0xC0, 0x05, 0x83, 0x85,
0x09, 0x09, 0x02, 0x75, 0x08, 0x25, 0x01, 0xB1,
0x02, 0x09, 0x01, 0xA1, 0x02, 0x05, 0x81, 0x09,
0x02, 0x09, 0x04, 0x75, 0x08, 0x25, 0x02, 0xB1, 0x40, 0xC0, 0xC0
};
UCHAR anotherRawDesc[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 05 01
0x09, 0x02, // USAGE (Mouse) 09 02
0xA1, 0x01, // COLLECTION (Application) A1 01
0x05, 0x09, // USAGE_PAGE (Button) 05 09
0x19, 0x01, // USAGE_MINIMUM (Button 1) 19 01
0x29, 0x02, // USAGE_MAXIMUM (Button 2) 29 02
0x09, 0x0C, // USAGE (Button 12) 09 0C
0x15, 0x81, // LOGICAL_MINIMUM (-127) 15 81
0x25, 0x7F, // LOGICAL_MAXIMUM (127) 25 7F
0x75, 0x08, // REPORT_SIZE (8) 75 08
0x95, 0x03, // REPORT_COUNT (3) 95 03
0x81, 0x02, // INPUT (Data,Var,Abs) 81 02
0xC0 // END_COLLECTION C0
};
UCHAR yetAnotherRawDesc[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 05 01
0x09, 0x02, // USAGE (Mouse) 09 02
0xA1, 0x01, // COLLECTION (Application) A1 01
0x05, 0x09, // USAGE_PAGE (Button) 05 09
0x19, 0x01, // USAGE_MINIMUM (Button 1) 19 01
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x09, 0x0C, // USAGE (Button 12) 09 0C
0x19, 0x30, // USAGE_MINIMUM (Button 30) 19 30
0x29, 0x32, // USAGE_MAXIMUM (Button 32)
0x15, 0x81, // LOGICAL_MINIMUM (-127) 15 81
0x25, 0x7F, // LOGICAL_MAXIMUM (127) 25 7F
0x75, 0x04, // REPORT_SIZE (4)
0x95, 0x10, // REPORT_COUNT (10) 95 10
0x81, 0x00, // INPUT (Data,Var,Array) 81 00
0xC0 // END_COLLECTION C0
};
UCHAR yard[] = {
0x05, 0x01, 0x09, 0x05, 0x95, 0x00, 0xa1, 0x01,
0x05, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x09, 0x30,
0x09, 0x31, 0x15, 0x81, 0x25, 0x7f, 0x35, 0x00,
0x45, 0xff, 0x66, 0x00, 0x00, 0x75, 0x08, 0x95,
0x02, 0x81, 0x02, 0xc0, 0x05, 0x09, 0x15, 0x00,
0x25, 0x01, 0x35, 0x00, 0x45, 0x01, 0x66, 0x00,
0x00, 0x75, 0x01, 0x95, 0x0a, 0x19, 0x01, 0x29,
0x0a, 0x81, 0x02, 0x06, 0x00, 0xff, 0x15, 0x00,
0x25, 0x01, 0x35, 0x00, 0x45, 0x01, 0x66, 0x00,
0x00, 0x75, 0x01, 0x95, 0x04, 0x19, 0x01, 0x29,
0x04, 0x81, 0x02, 0x75, 0x01, 0x95, 0x02, 0x81,
0x01, 0xc0
};
UCHAR yard2[236] = {
0x05, 0x80, // USAGE_PAGE (Monitor)
0x09, 0x01, // USAGE (Monitor Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x80, // REPORT_COUNT (128)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x09, 0x02, // USAGE (EDID Information)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
0x85, 0x02, // REPORT_ID (2)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535)
0x09, 0x04, // USAGE (VESA Version)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x85, 0x03, // REPORT_ID (3)
0x09, 0x09, // USAGE (Sync Type)
0xa1, 0x02, // COLLECTION (Logical)
0x05, 0x81, // USAGE_PAGE (Monitor Enumerated Values)
0x09, 0x01, // USAGE (ENUM 0)
0x09, 0x02, // USAGE (ENUM 1)
0x09, 0x03, // USAGE (ENUM 2)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x25, 0x02, // LOGICAL_MAXIMUM (2)
0xb1, 0x40, // FEATURE (Data,Ary,Abs,Null)
0xc0, // END_COLLECTION
0x85, 0x04, // REPORT_ID (4)
0x05, 0x82, // USAGE_PAGE (VESA Virtual Controls)
0x09, 0x20, // USAGE (Horizontal Position )
0x09, 0x22, // USAGE (Horizontal Size )
0x09, 0x30, // USAGE (Vertical Position )
0x09, 0x32, // USAGE (Vertical Size )
0x09, 0x24, // USAGE (Horizontal Pincushion )
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x05, // REPORT_COUNT (5)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf)
0x09, 0x20, // USAGE (Horizontal Position )
0x09, 0x22, // USAGE (Horizontal Size )
0x09, 0x30, // USAGE (Vertical Position )
0x09, 0x32, // USAGE (Vertical Size )
0x09, 0x24, // USAGE (Horizontal Pincushion )
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0x85, 0x05, // REPORT_ID (5)
0x09, 0x26, // USAGE (Horizontal Pincushion Balance )
0x09, 0x3a, // USAGE (Vertical Linearity )
0x09, 0x40, // USAGE (Parallelogram Distortion)
0x09, 0x42, // USAGE (Trapezoidal Distortion)
0x09, 0x44, // USAGE (Tilt)
0x95, 0x05, // REPORT_COUNT (5)
0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf)
0x09, 0x26, // USAGE (Horizontal Pincushion Balance )
0x09, 0x3a, // USAGE (Vertical Linearity )
0x09, 0x40, // USAGE (Parallelogram Distortion)
0x09, 0x42, // USAGE (Trapezoidal Distortion)
0x09, 0x44, // USAGE (Tilt)
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0x85, 0x06, // REPORT_ID (6)
0x09, 0x10, // USAGE (Brightness)
0x09, 0x12, // USAGE (Contrast)
0x09, 0x16, // USAGE (Video Gain Red)
0x09, 0x18, // USAGE (Video Gain Green)
0x09, 0x1a, // USAGE (Video Gain Blue)
0x95, 0x05, // REPORT_COUNT (5)
0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf)
0x09, 0x10, // USAGE (Brightness)
0x09, 0x12, // USAGE (Contrast)
0x09, 0x16, // USAGE (Video Gain Red)
0x09, 0x18, // USAGE (Video Gain Green)
0x09, 0x1a, // USAGE (Video Gain Blue)
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0x85, 0x07, // REPORT_ID (7)
0x09, 0x6c, // USAGE (Video Black Level Red)
0x09, 0x6e, // USAGE (Video Black Level Green)
0x09, 0x70, // USAGE (Video Black Level Blue)
0x95, 0x03, // REPORT_COUNT (3)
0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf)
0x09, 0x6c, // USAGE (Video Black Level Red)
0x09, 0x6e, // USAGE (Video Black Level Green)
0x09, 0x70, // USAGE (Video Black Level Blue)
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0x85, 0x08, // REPORT_ID (8)
0x09, 0x5e, // USAGE (Input Level Select)
0xa1, 0x02, // COLLECTION (Logical)
0x05, 0x81, // USAGE_PAGE (Monitor Enumerated Values)
0x09, 0x02, // USAGE (ENUM 1)
0x09, 0x03, // USAGE (ENUM 2)
0x09, 0x04, // USAGE (ENUM 3)
0x09, 0x05, // USAGE (ENUM 4)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x25, 0x04, // LOGICAL_MAXIMUM (4)
0xb1, 0x40, // FEATURE (Data,Ary,Abs,Null)
0xc0, // END_COLLECTION
0x09, 0x60, // USAGE (ENUM 95)
0xa1, 0x02, // COLLECTION (Logical)
0x05, 0x81, // USAGE_PAGE (Monitor Enumerated Values)
0x09, 0x01, // USAGE (ENUM 0)
0x09, 0x02, // USAGE (ENUM 1)
0x09, 0x04, // USAGE (ENUM 3)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0x06, // LOGICAL_MAXIMUM (6)
0xb1, 0x40, // FEATURE (Data,Ary,Abs,Null)
0xc0, // END_COLLECTION
0x85, 0x09, // REPORT_ID (9)
0x05, 0x83, // USAGE_PAGE (VESA Command)
0x09, 0x00, // USAGE (Undefined)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x09, 0x01, // USAGE (Settings)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0x03, // LOGICAL_MAXIMUM (3)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
UCHAR anotherDescriptorWhichBreaksTheParser [] = {
0x09, 0x02, // USAGE (PresentStatus)
0xa1, 0x02, // COLLECTION (Logical)
0x05, 0x85, // USAGE_PAGE (Battery System)
0x09, 0xd0, // USAGE (ACPresent)
0x09, 0x42, // USAGE (BelowRemainingCapacityLimit)
0x09, 0x44, // USAGE (Charging)
0x09, 0x45, // USAGE (Discharging)
0x0b, 0x69, 0x00, 0x84, 0x00, // USAGE (Power Device:ShutdownImminent)
0x0b, 0x65, 0x00, 0x84, 0x00, // USAGE (Power Device:Overload)
0x0b, 0x00, 0x00, 0x84, 0x00, // USAGE (Power Device:Undefined)
0x0b, 0x00, 0x00, 0x84, 0x00, // USAGE (Power Device:Undefined)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x81, 0x83, // INPUT (Cnst,Var,Abs,Vol)
0xc0
};
UCHAR afd [] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x06, // INPUT (Data,Var,Rel)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
UCHAR afd2 [] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x09, 0x00, // USAGE (Undefined)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x01, // USAGE_MAXIMUM (Button 1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
0x66, 0x00, 0x00, // UNIT (None)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x62, // INPUT (Data,Var,Abs,NPrf,Null)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x07, // REPORT_COUNT (7)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x16, 0x00, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x00, 0x10, // LOGICAL_MAXIMUM (4096)
0x36, 0x00, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)
0x66, 0x00, 0x00, // UNIT (None)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x62, // INPUT (Data,Var,Abs,NPrf,Null)
0x09, 0x3b, // USAGE (Byte Count)
0x16, 0x00, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x00, 0x01, // LOGICAL_MAXIMUM (256)
0x36, 0x00, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0x00, 0x01, // PHYSICAL_MAXIMUM (256)
0x66, 0x00, 0x00, // UNIT (None)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x62, // INPUT (Data,Var,Abs,NPrf,Null)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
UCHAR adwbtp2 [] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
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)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x03, // USAGE_MAXIMUM (Scroll Lock)
0x29, 0x03, // USAGE_MAXIMUM (Scroll Lock)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x01, // OUTPUT (Cnst,Ary,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0xc0 // END_COLLECTION
};
UCHAR vendorDescriptorsSometimeRequireSpecialCode[] = {
0x05, 0x01, 0x09, 0x04,
0xA1, 0x01, 0x85, 0x01,
0x09, 0x01, 0xA1, 0x00,
0x95, 0x01, 0x75, 0x04,
0x15, 0x00, 0x25, 0x07,
0x35, 0x00, 0x46, 0x3B,
0x01, 0x66, 0x14, 0x00,
0x09, 0x39, 0x81, 0x42,
0x95, 0x04, 0x75, 0x01,
0x15, 0x00, 0x25, 0x01,
0x35, 0x00, 0x45, 0x01,
0x66, 0x00, 0x00, 0x05,
0x09, 0x19, 0x01, 0x29,
0x04, 0xA4, 0x81, 0x02,
0x95, 0x02, 0x75, 0x0A,
0x16, 0x00, 0xFE, 0x26,
0xFF, 0x01, 0x35, 0x00,
0x46, 0xFF, 0x03, 0x05,
0x01, 0x09, 0x30, 0x09,
0x31, 0x81, 0x02, 0x95,
0x04, 0x75, 0x01, 0x81,
0x01, 0xC0, 0xB4, 0x05,
0x09, 0x95, 0x07, 0x19,
0x05, 0x29, 0x0B, 0x81,
0x02, 0x95, 0x01, 0x81,
0x01, 0x75, 0x06, 0x15,
0xE0, 0x25, 0x1F, 0x35,
0x00, 0x45, 0x3F, 0x05,
0x01, 0x09, 0x36, 0x81,
0x02, 0x06, 0x01, 0xFF,
0x0A, 0x01, 0x00, 0x75,
0x02, 0x81, 0x02, 0xC0
};
UCHAR ReportDescriptor[] = {
0x05, 0x84, // USAGE_PAGE (Power Device)
0x09, 0x04, // USAGE (UPS)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x84, // USAGE_PAGE (Power Device)
0x09, 0x24, // USAGE (PowerSummary)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x85, // USAGE_PAGE (Battery System)
0x85, 0x01, // REPORT_ID (1)
0x67, 0x01, 0x10, 0x10, 0x00, // UNIT (SI Lin:Battery Capacity)
0x95, 0x03, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (1)
0x09, 0x65, // USAGE
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x66, // USAGE (RemainingCapacity)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x18, // REPORT_SIZE (24)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x67, // USAGE
0x75, 0x07, // REPORT_SIZE (7)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x68, // USAGE
0x75, 0x18, // REPORT_SIZE (24)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
UCHAR Rd[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 05 01
0x09, 0x06, // USAGE (Keyboard)
0xA1, 0x01, // COLLECTION (Application)
0x09, 0x30, // USAGE (X)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x82, 0x02, 0x01, // INPUT (Data,Var,Abs,Buf)
0x09, 0x31, // USAGE (Y)
0x95, 0x02, // REPORT_COUNT (2)
0x82, 0x02, 0x01, // INPUT (Data,Var,Abs,Buf)
0x09, 0x32, // USAGE (Z)
0x09, 0x38, // USAGE (Wheel)
0x82, 0x02, 0x01, // INPUT (Data,Var,Abs,Buf)
0x19, 0x33, // USAGE Min (Rx)
0x29, 0x34, // USAGE Max (Ry)
0x95, 0x04, // REPORT_COUNT (4)
0x82, 0x02, 0x01, // INPUT (Data,Var,Abs,Buf)
0x09, 0x35, // USAGE (Rz)
0x09, 0x36, // USAGE (Slider)
0x75, 0x07, // REPORT_SIZE (7)
0x95, 0x04, // REPORT_COUNT (4)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x04, // REPORT_SIZE (4)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0xC0 // END_COLLECTION
};
UCHAR Rd2 [50] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x75, 0x0F, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x15, 0x0b, // LOGICAL_MINIMUM (11)
0x25, 0x1c, // LOGICAL_MAXIMUM (28)
0x09, 0x30, // USAGE (X)
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x32, // USAGE (Z)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x85, 0x01, // REPORT_ID (1)
0x75, 0x09, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x03, // LOGICAL_MAXIMUM (3)
0x09, 0x31, // USAGE (Y)
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0xc0 // END_COLLECTION
};
UCHAR Rd3[40] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x15, 0x0b, // LOGICAL_MINIMUM (11)
0x25, 0x1c, // LOGICAL_MAXIMUM (28)
0x09, 0x30, // USAGE (X)
0x81, 0x22, // INPUT (Data,Var,Abs,NPrf)
0xc0, // END_COLLECTION
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x40, // LOGICAL_MAXIMUM (64)
0x09, 0x31, // USAGE (Y)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
UCHAR Rd4[] = {
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x01,
0x09, 0x01, 0xa1, 0x00, 0x05, 0x09, 0x19, 0x01,
0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05,
0x81, 0x01, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x15, 0x81, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x02,
0x81, 0x06, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x80,
0xa1, 0x01, 0x85, 0x02, 0x19, 0x81, 0x29, 0x83,
0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x03,
0x81, 0x06, 0x95, 0x05, 0x81, 0x01, 0x75, 0x08,
0x95, 0x02, 0x81, 0x01, 0xc0, 0x05, 0x0c, 0x09,
0x01, 0xa1, 0x01, 0x85, 0x03, 0x09, 0xcd, 0x09,
0xb7, 0x09, 0xb5, 0x09, 0xb6, 0x0a, 0x23, 0x02,
0x0a, 0x8a, 0x01, 0x15, 0x00, 0x25, 0x01, 0x75,
0x01, 0x95, 0x06, 0x81, 0x06, 0x75, 0x01, 0x95,
0x02, 0x81, 0x01, 0x09, 0xe2, 0x09, 0xe9, 0x09,
0xea, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95,
0x03, 0x81, 0x06, 0x75, 0x01, 0x95, 0x05, 0x81,
0x01, 0x75, 0x08, 0x95, 0x01, 0x81, 0x01, 0xc0,
0x06, 0x46, 0xff, 0x09, 0x04, 0xa1, 0x01, 0x85,
0x04,
0x09, 0xcd, // here we have 6 usages in a row.
0x09, 0xb7,
0x09, 0xb5,
0x09, 0xb6,
0x0a, 0x23, 0x02,
0x0a, 0x8a, 0x01,
0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x06,
0x81, 0x06, // here we have a main item of count 6 that uses them all up.
0x75, 0x01, 0x95, 0x02, 0x81, 0x01, // here we have a constant input item with no usages.
0x75, 0x08, 0x95, 0x02, 0x81, 0x01, // here we have another constant input item with no usages; then usage min 0, max FF,
0x19, 0x00, 0x29, 0xff, // usage Min 00, Max FF
0x15, 0x81, 0x25, 0x7f, // logical min -127, max 127
0x75, 0x08, 0x95, 0x01, // size 8, count 1
0xb1, 0x02, 0xc0 // finally a feature item.
};
UCHAR Rd5[] = {
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, // Top level collection
0x05, 0x07, 0x19, 0xE0, 0x29, 0xE7, // Page 5, Min e0, max e7
0x15, 0x00, 0x25, 0x01, // log min/max
0x75, 0x01, 0x95, 0x08, 0x81, 0x02, // size 1, Count 8, MAIN
0x75, 0x08, 0x95, 0x01, 0x81, 0x01, // size 8, Count 1, MAIN Cnst.
0x95, 0x05, 0x75, 0x01, // Count 5, size 1
0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x29, 0x03, // Page 5, Min 1, Max 3
// max 3, A 2ND Mi/Ma!
0x91, 0x02, // Output
0x95, 0x01, 0x75, 0x03, 0x75, 0x03, // Count 1, Size 3
0x91, 0x01, // Output Cnst.
0x95, 0x06, 0x75, 0x08, // Count 6, Size 8
0x15, 0x00, 0x25, 0x65, // log min/max
0x05, 0x07, 0x19, 0x00, 0x29, 0x65, // Page 7, min 0, max 65
0x81, 0x00, // Array
0xC0
};
UCHAR Rd6[] = {
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, // Top level Collection
0x05, 0x07, 0x19, 0xE0, 0x29, 0xE7, // Page 5, Min e0, max e7
0x15, 0x00, 0x25, 0x01, // log min/max
0x75, 0x01, 0x95, 0x08, 0x81, 0x02, // size 1, Cnt 8, MAIN
0x95, 0x01, 0x75, 0x08, 0x81, 0x01, // size 8, Cnt 1, MAIN
0x95, 0x05, 0x75, 0x01, // Count 5, size 1
0x05, 0x08, 0x19, 0x01, 0x29, 0x03, // page 5, min 1, max 3, NO DOUBLE
0x91, 0x02, // output
0x95, 0x01, 0x75, 0x03, // Count 1, Size 3
0x91, 0x01, // output cnst.
0x95, 0x06, 0x75, 0x08, // Count 6, Size 8
0x15, 0x00, 0x25, 0x65, //log min/max
0x05, 0x07, 0x19, 0x00, 0x29, 0x65, // Page 7, min 0 max 65
0x81, 0x00, // Array
0xC0
};
UCHAR Rd7[] = {
0x05, 0x03, 0x09, 0x03, 0xa1, 0x01, 0x05, 0x01,
0x0a, 0xc8, 0x60, 0x05, 0x03, 0x0a, 0x6a, 0x32,
0x85, 0x2d, 0x16, 0xcb, 0x24, 0x26, 0xae, 0x2e,
0x75, 0x0e, 0x95, 0x05, 0x91, 0x22, 0x05, 0x02,
0x1a, 0xfe, 0x31, 0x2a, 0x01, 0x32, 0x85, 0x2d,
0x16, 0x6b, 0xff, 0x25, 0x62, 0x75, 0x09, 0x95,
0x05, 0x81, 0x22, 0x05, 0x01, 0x0a, 0x86, 0x2c,
0x85, 0x2d, 0x16, 0x5c, 0xfd, 0x26, 0xf5, 0x02,
0x75, 0x0c, 0x95, 0x07, 0x91, 0x22, 0x05, 0x03,
0x0a, 0xff, 0x52, 0x05, 0x02, 0x0a, 0x60, 0x62,
0x85, 0x2d, 0x15, 0xe9, 0x25, 0x16, 0x75, 0x06,
0x95, 0x10, 0xb1, 0x22, 0x05, 0x01, 0x0a, 0xf8,
0x5d, 0x05, 0x02, 0x1a, 0xc4, 0x69, 0x2a, 0xc7,
0x69, 0x05, 0x01, 0x0a, 0x65, 0x34, 0x05, 0x03,
0x0a, 0x22, 0x6d, 0x05, 0x01, 0x0a, 0x01, 0x3a,
0x05, 0x03, 0x0a, 0x04, 0x24, 0x05, 0x01, 0x0a,
0xa9, 0x69, 0x85, 0x2d, 0x16, 0x39, 0xf1, 0x26,
0x48, 0x04, 0x75, 0x0e, 0x95, 0x0d, 0x81, 0x22,
0x05, 0x01, 0x0a, 0xbc, 0x33, 0x05, 0x03, 0x1a,
0x35, 0x1e, 0x2a, 0x36, 0x1e, 0x85, 0x2d, 0x15,
0x03, 0x25, 0x07, 0x75, 0x03, 0x95, 0x0e, 0x81,
0x22, 0x75, 0x03, 0x95, 0x01, 0x85, 0x2d, 0x81,
0x01, 0x75, 0x06, 0x95, 0x01, 0x85, 0x2d, 0x91,
0x01, 0xc0, 0x05, 0x01, 0x09, 0x03, 0xa1, 0x01,
0x05, 0x01, 0x1a, 0xe6, 0x79, 0x2a, 0xe9, 0x79,
0x05, 0x01, 0x0a, 0x23, 0x67, 0x05, 0x03, 0x1a,
0x86, 0x03, 0x2a, 0x87, 0x03, 0x05, 0x03, 0x1a,
0x21, 0x25, 0x2a, 0x23, 0x25, 0x85, 0x75, 0x16,
0x09, 0x02, 0x26, 0x0b, 0x35, 0x75, 0x0e, 0x95,
0x0a, 0x81, 0x22, 0x05, 0x01, 0x0a, 0x80, 0x11,
0x05, 0x02, 0x0a, 0x32, 0x1b, 0x05, 0x02, 0x0a,
0x7f, 0x61, 0x85, 0x75, 0x16, 0x92, 0x0e, 0x26,
0x26, 0x0f, 0x75, 0x0c, 0x95, 0x03, 0xb1, 0x22,
0x05, 0x02, 0x0a, 0xe1, 0x10, 0x05, 0x01, 0x0a,
0xce, 0x61, 0x05, 0x01, 0x0a, 0xf2, 0x20, 0x05,
0x03, 0x1a, 0x63, 0x6d, 0x2a, 0x65, 0x6d, 0x05,
0x01, 0x0a, 0x3b, 0x17, 0x85, 0x75, 0x16, 0x66,
0x02, 0x26, 0x00, 0x04, 0x75, 0x0b, 0x95, 0x0b,
0x91, 0x22, 0x05, 0x03, 0x1a, 0xd1, 0x74, 0x2a,
0xd5, 0x74, 0x05, 0x02, 0x0a, 0xbd, 0x5e, 0x05,
0x02, 0x0a, 0x1a, 0x4f, 0x05, 0x02, 0x0a, 0x43,
0x31, 0x85, 0x75, 0x16, 0xfc, 0x14, 0x26, 0xc9,
0x33, 0x75, 0x0f, 0x95, 0x0f, 0x81, 0x22, 0x05,
0x03, 0x1a, 0x18, 0x0b, 0x2a, 0x19, 0x0b, 0x05,
0x03, 0x0a, 0xb6, 0x5b, 0x05, 0x01, 0x0a, 0x3f,
0x4b, 0x05, 0x02, 0x0a, 0xa5, 0x21, 0x05, 0x02,
0x0a, 0x3b, 0x55, 0x05, 0x02, 0x1a, 0x2f, 0x0b,
0x2a, 0x31, 0x0b, 0x05, 0x03, 0x1a, 0x9a, 0x0a,
0x2a, 0x9d, 0x0a, 0x85, 0x75, 0x16, 0xb6, 0x01,
0x26, 0x12, 0x02, 0x75, 0x0d, 0x95, 0x0d, 0x81,
0x22, 0x05, 0x01, 0x1a, 0xcb, 0x7a, 0x2a, 0xcc,
0x7a, 0x85, 0x75, 0x15, 0x07, 0x25, 0x08, 0x75,
0x05, 0x95, 0x03, 0x81, 0x22, 0x05, 0x03, 0x0a,
0x24, 0x6e, 0x05, 0x03, 0x1a, 0xb0, 0x77, 0x2a,
0xb2, 0x77, 0x85, 0x75, 0x16, 0xc5, 0xed, 0x26,
0x7b, 0x5d, 0x75, 0x10, 0x95, 0x0f, 0x91, 0x22,
0x05, 0x02, 0x1a, 0x6e, 0x1e, 0x2a, 0x71, 0x1e,
0x05, 0x03, 0x1a, 0x83, 0x3d, 0x2a, 0x84, 0x3d,
0x05, 0x02, 0x1a, 0x13, 0x5d, 0x2a, 0x14, 0x5d,
0x85, 0x75, 0x15, 0x13, 0x25, 0x17, 0x75, 0x06,
0x95, 0x0d, 0x91, 0x22, 0x05, 0x02, 0x1a, 0x68,
0x5d, 0x2a, 0x6a, 0x5d, 0x05, 0x03, 0x1a, 0x2f,
0x21, 0x2a, 0x30, 0x21, 0x05, 0x02, 0x0a, 0xbd,
0x04, 0x85, 0x75, 0x16, 0x5c, 0x14, 0x26, 0x43,
0x19, 0x75, 0x0d, 0x95, 0x08, 0xb1, 0x22, 0x05,
0x01, 0x0a, 0xf1, 0x57, 0x05, 0x02, 0x1a, 0x00,
0x64, 0x2a, 0x09, 0x64, 0x05, 0x03, 0x1a, 0x43,
0x30, 0x2a, 0x46, 0x30, 0x85, 0x75, 0x15, 0xd4,
0x25, 0x37, 0x75, 0x07, 0x95, 0x10, 0x81, 0x22,
0x75, 0x03, 0x95, 0x01, 0x85, 0x75, 0x81, 0x01,
0x75, 0x01, 0x95, 0x01, 0x85, 0x75, 0x91, 0x01,
0x75, 0x04, 0x95, 0x01, 0x85, 0x75, 0xb1, 0x01,
0xc0, 0x05, 0x02, 0x09, 0x03, 0xa1, 0x01, 0x05,
0x03, 0x1a, 0xbc, 0x47, 0x2a, 0xc0, 0x47, 0x85,
0x86, 0x16, 0x69, 0xfd, 0x26, 0xc0, 0x02, 0x75,
0x0b, 0x95, 0x06, 0xb1, 0x22, 0x75, 0x06, 0x95,
0x01, 0x85, 0x86, 0xb1, 0x01, 0xc0, 0x05, 0x01,
0x09, 0x01, 0xa1, 0x01, 0x05, 0x01, 0x1a, 0x57,
0x52, 0x2a, 0x58, 0x52, 0x85, 0x6c, 0x16, 0x46,
0x1c, 0x26, 0xbd, 0x1c, 0x75, 0x0e, 0x95, 0x03,
0xb1, 0x22, 0x05, 0x02, 0x0a, 0xbd, 0x43, 0x05,
0x02, 0x0a, 0x3c, 0x4e, 0x05, 0x03, 0x1a, 0x2a,
0x20, 0x2a, 0x2b, 0x20, 0x05, 0x02, 0x1a, 0xd7,
0x0b, 0x2a, 0xd9, 0x0b, 0x85, 0x6c, 0x15, 0x05,
0x25, 0x07, 0x75, 0x03, 0x95, 0x07, 0x91, 0x22,
0x05, 0x01, 0x0a, 0x1f, 0x77, 0x05, 0x03, 0x0a,
0x20, 0x30, 0x85, 0x6c, 0x15, 0x08, 0x25, 0x0c,
0x75, 0x05, 0x95, 0x04, 0xb1, 0x22, 0x05, 0x01,
0x1a, 0xa8, 0x53, 0x2a, 0xa9, 0x53, 0x05, 0x01,
0x0a, 0x7c, 0x5d, 0x05, 0x02, 0x0a, 0x7b, 0x4c,
0x85, 0x6c, 0x15, 0x67, 0x25, 0x6f, 0x75, 0x08,
0x95, 0x0f, 0x81, 0x22, 0x05, 0x03, 0x0a, 0xde,
0x64, 0x85, 0x6c, 0x15, 0xbe, 0x25, 0xfb, 0x75,
0x08, 0x95, 0x05, 0x91, 0x22, 0x05, 0x03, 0x1a,
0xf5, 0x69, 0x2a, 0xf6, 0x69, 0x85, 0x6c, 0x15,
0xee, 0x25, 0xf4, 0x75, 0x08, 0x95, 0x04, 0x91,
0x22, 0x05, 0x02, 0x0a, 0x60, 0x24, 0x05, 0x03,
0x1a, 0xcc, 0x6e, 0x2a, 0xcd, 0x6e, 0x85, 0x6c,
0x16, 0xbf, 0xfd, 0x26, 0xa1, 0x0f, 0x75, 0x0d,
0x95, 0x06, 0xb1, 0x22, 0x05, 0x01, 0x0a, 0x17,
0x78, 0x05, 0x02, 0x0a, 0x66, 0x72, 0x85, 0x6c,
0x16, 0x34, 0x02, 0x26, 0x4c, 0x02, 0x75, 0x0a,
0x95, 0x02, 0x91, 0x22, 0x05, 0x01, 0x0a, 0xf7,
0x41, 0x05, 0x03, 0x1a, 0xf2, 0x55, 0x2a, 0xf3,
0x55, 0x05, 0x02, 0x0a, 0x4e, 0x5e, 0x85, 0x6c,
0x16, 0x27, 0x2b, 0x26, 0x1c, 0x3e, 0x75, 0x0f,
0x95, 0x0a, 0x81, 0x22, 0x05, 0x01, 0x1a, 0xa0,
0x6c, 0x2a, 0xa1, 0x6c, 0x85, 0x6c, 0x16, 0x06,
0x01, 0x26, 0xe3, 0x02, 0x75, 0x0b, 0x95, 0x0e,
0x91, 0x22, 0x75, 0x02, 0x95, 0x01, 0x85, 0x6c,
0x81, 0x01, 0x75, 0x05, 0x95, 0x01, 0x85, 0x6c,
0x91, 0x01, 0x75, 0x04, 0x95, 0x01, 0x85, 0x6c,
0xb1, 0x01, 0xc0
};
UCHAR Rd8 [] = {
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x01,
0x09, 0x01, 0xa1, 0x00, 0x05, 0x09, 0x19, 0x01,
0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05,
0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xcd, 0xef, 0x08, 0x1d, 0x00, 0x06, 0x80, 0x01,
0x55, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x44, 0x03, 0xff, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00
};
UCHAR Rd9 [] = {
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x01,
0x09, 0x01, 0xa1, 0x00, 0x05, 0x09, 0x19, 0x01,
0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05,
0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x09, 0x38, 0x15, 0x81, 0x25, 0x7f, 0x75, 0x08,
0x95, 0x03, 0x81, 0x06, 0xc0, 0xc0, 0x05, 0x01,
0x09, 0x80, 0xa1, 0x01, 0x85, 0x02, 0x09, 0x83,
0x09, 0x82, 0x09, 0x81, 0x25, 0x01, 0x15, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xcd, 0xef, 0x05, 0x00, 0x00
};
HIDP_DATA data [] = { {2,0,1},
{2,0,0},
};
ULONG status, colLen, repLen;
HIDP_DEVICE_DESC devDesc;
USAGE usages [] = { 0x4, 0x2, 0x30, 0x32, 0x32, 0x07 };
UCHAR report [0x8];
ULONG usagesLength = sizeof usages / sizeof (USAGE);
memset (report, 0, sizeof report);
status = HidP_GetCollectionDescription (Rd9,
sizeof Rd9,
0,
&devDesc);
for (i=0; i<devDesc.CollectionDescLength; i++) {
printf("______________Collection %d___________\n", i);
printf("----------------VV %d VV---------------\n", i);
flags.Flags = 0xF;
HID_DumpPpd (devDesc.CollectionDesc[i].PreparsedData, flags);
printf("----------------- %d ------------------\n", i);
flags.Flags = 0xFF;
HID_DumpPpd (devDesc.CollectionDesc[i].PreparsedData, flags);
printf("---------------^^ %d ^^----------------\n", i);
}
#if 0
HidP_SetUsageValue (HidP_Feature,
(USAGE) 0x85,
0,
0x66,
0xFFFFFFFF,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
HidP_GetUsageValue (HidP_Feature,
(USAGE) 0x85,
0,
0x66,
&i,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
i = 0;
HidP_SetUsageValue (HidP_Feature,
(USAGE) 0x85,
0,
0x67,
0xFFFFFFFF,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
HidP_GetUsageValue (HidP_Feature,
(USAGE) 0x85,
0,
0x67,
&i,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
i = 0;
HidP_SetUsageValue (HidP_Feature,
(USAGE) 0x85,
0,
0x68,
0xFFFFFFFF,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
HidP_GetUsageValue (HidP_Feature,
(USAGE) 0x85,
0,
0x68,
&i,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
HidP_UnsetUsages (HidP_Input,
(USHORT) 0x09,
0,
usages,
&usagesLength,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
usagesLength = 2;
HidP_SetData (HidP_Feature,
data,
&usagesLength,
devDesc.CollectionDesc[i].PreparsedData,
report,
sizeof report);
#endif
printf("Hello world\n");
}
VOID
HID_DumpChannel (
PHIDP_CHANNEL_DESC Channel,
HID_PPD_FLAGS Flags
)
{
printf ("-------CHANNEL---------\n");
printf ("P %x ID %x Col %x Sz %x Cnt %x UMin %x UMax %x ",
Channel->UsagePage,
Channel->ReportID,
Channel->LinkCollection,
Channel->ReportSize,
Channel->ReportCount,
Channel->Range.UsageMin,
Channel->Range.UsageMax);
if (Channel->MoreChannels) {
printf ("MoreChannels ");
}
if (Channel->IsConst) {
printf ("Const ");
}
if (Channel->IsButton) {
printf ("Button ");
} else {
printf ("Value ");
}
if (Channel->IsAbsolute) {
printf ("Absolute ");
}
if (Channel->IsAlias) {
printf ("ALIAS! ");
}
printf ("\n");
if (Flags.FullChannelListing) {
printf ("LinkUP %x LinkU %x SMin %x SMax %x "
"DMin %x DMax %x IndexMin %x IndexMax %x\n",
Channel->LinkUsagePage,
Channel->LinkUsage,
Channel->Range.StringMin,
Channel->Range.StringMax,
Channel->Range.DesignatorMin,
Channel->Range.DesignatorMax,
Channel->Range.DataIndexMin,
Channel->Range.DataIndexMax);
if (!Channel->IsButton) {
if (Channel->Data.HasNull) {
printf ("Has Null ");
}
printf ("LMin %x LMax %x PMin %x PMax %x \n",
Channel->Data.LogicalMin,
Channel->Data.LogicalMax,
Channel->Data.PhysicalMin,
Channel->Data.PhysicalMax);
}
}
if (Flags.ReportLocation) {
printf ("ByteOffset %x BitOffset %x BitLength %x ByteEnd %x\n",
Channel->ByteOffset,
Channel->BitOffset,
Channel->BitLength,
Channel->ByteEnd);
}
}
VOID
HID_DumpLink (
ULONG LinkNo,
PHIDP_LINK_COLLECTION_NODE Node
)
{
printf ("Link %x: U %x P %x Par %x #C %x NxSib %x 1stC %x ",
LinkNo,
Node->LinkUsage,
Node->LinkUsagePage,
Node->Parent,
Node->NumberOfChildren,
Node->NextSibling,
Node->FirstChild);
if (Node->IsAlias) {
printf (" ALIAS\n");
} else {
printf ("\n");
}
}
VOID
HID_DumpPpd (
PHIDP_PREPARSED_DATA Ppd,
HID_PPD_FLAGS Flags
)
{
ULONG i;
PHIDP_CHANNEL_DESC channel;
PHIDP_LINK_COLLECTION_NODE node;
if (!Flags.IgnoreSignature) {
if ((HIDP_PREPARSED_DATA_SIGNATURE1 != Ppd->Signature1) ||
(HIDP_PREPARSED_DATA_SIGNATURE2 != Ppd->Signature2)) {
printf("Preparsed Data signature does not match, probably aint\n");
return;
}
}
if (Flags.InputChannels) {
printf ("\n========== Input Channels =========\n");
for (i = Ppd->Input.Offset; i < Ppd->Input.Index; i++) {
channel = &Ppd->Data [i];
HID_DumpChannel (channel, Flags);
}
} else {
printf ("Input channels: off %x sz %x indx %x bytelen %x\n",
Ppd->Input.Offset,
Ppd->Input.Size,
Ppd->Input.Index,
Ppd->Input.ByteLen);
}
if (Flags.OutputChannels) {
printf ("\n========== Output Channels =========\n");
for (i = Ppd->Output.Offset; i < Ppd->Output.Index; i++) {
channel = &Ppd->Data [i];
HID_DumpChannel (channel, Flags);
}
} else {
printf ("Output channels: off %x sz %x indx %x bytelen %x\n",
Ppd->Output.Offset,
Ppd->Output.Size,
Ppd->Output.Index,
Ppd->Output.ByteLen);
}
if (Flags.FeatureChannels) {
printf ("\n========== Feature Channels =========\n");
for (i = Ppd->Feature.Offset; i < Ppd->Feature.Index; i++) {
channel = &Ppd->Data [i];
HID_DumpChannel (channel, Flags);
}
} else {
printf ("Feature channels: off %x sz %x indx %x bytelen %x\n",
Ppd->Feature.Offset,
Ppd->Feature.Size,
Ppd->Feature.Index,
Ppd->Feature.ByteLen);
}
if (Flags.LinkCollections) {
printf ("\n========== Link Collections =========\n");
node = (PHIDP_LINK_COLLECTION_NODE)
(Ppd->RawBytes + Ppd->LinkCollectionArrayOffset);
for (i = 0; i < Ppd->LinkCollectionArrayLength; i++, node++) {
HID_DumpLink (i, node);
}
} else {
printf ("Link Collections: %x \n",
Ppd->LinkCollectionArrayLength);
}
printf ("\n");
}