1237 lines
58 KiB
C
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");
|
|
}
|
|
|