Author the custom virtual HID gamepad that replaces vJoy, and pin its wire format on both sides. Builds clean to RioGamepad.sys against the EWDK (KMDF 1.15 + VHF, x64, warnings-as-errors). driver/RioGamepad/: - ReportDescriptor.h: 6x16-bit axes (X,Y,Z,Rx,Ry,Rz), one 4-direction hat with null state, and 96 buttons — the legacy vJoy layout. 25-byte input report. - Device.c/Driver.c: KMDF root-enumerated device that creates the VHF virtual HID device (VhfCreate in DeviceAdd, VhfStart in D0Entry, VhfDelete on cleanup) and exposes a device interface + IOCTL_RIO_SUBMIT_REPORT that forwards the caller's report bytes to VhfReadReportSubmit. Thin relay: no report logic in the kernel. - Public.h: device-interface GUID, IOCTL, and the report byte layout shared with the C# client. RioGamepad.inf + build.cmd (EWDK build, catalog/sign disabled). src/RioJoy.Core/Hid/RioHidReport.cs: packs AxisOutputs + hat + 96 buttons into the exact 25-byte report (LE axes, hat nibble with 0x0F=centered, button bitmap). 13 new xUnit tests (136 total). Remaining (deploy-side): test-sign + pnputil install + verify in joy.cpl, and wire the real DeviceIoControl feeder sink (replacing NullJoystickSink). The EWDK's in-build catalog task (DrvCat) can't load Microsoft.Kits.Logger on this image, so the .cat is produced with inf2cat/signtool at install time instead. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
37 lines
1.2 KiB
C
37 lines
1.2 KiB
C
/*++
|
|
RioGamepad — shared definitions for the virtual HID gamepad driver and its
|
|
user-mode client (the RIOJoy tray app's HID feeder).
|
|
|
|
The input report is fixed-size and has no report ID:
|
|
bytes 0..11 : 6 axes (X,Y,Z,Rx,Ry,Rz), each unsigned 16-bit little-endian
|
|
byte 12 : low nibble = hat (0..3; 0x0F = centered/null), high nibble pad
|
|
bytes 13..24 : 96 button bits (button N at byte 13 + (N-1)/8, bit (N-1)%8)
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
//
|
|
// Device interface GUID the user-mode client opens to submit reports.
|
|
// {b6a3f1c2-7e84-4d2a-9c1f-2a5e8d3b6071}
|
|
//
|
|
DEFINE_GUID(GUID_DEVINTERFACE_RIOGAMEPAD,
|
|
0xb6a3f1c2, 0x7e84, 0x4d2a, 0x9c, 0x1f, 0x2a, 0x5e, 0x8d, 0x3b, 0x60, 0x71);
|
|
|
|
//
|
|
// Custom IOCTL: submit one input report (input buffer = RIO_REPORT_SIZE bytes).
|
|
//
|
|
#define IOCTL_RIO_SUBMIT_REPORT \
|
|
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
|
|
|
//
|
|
// HID input report size in bytes: 6*2 (axes) + 1 (hat+pad) + 12 (96 buttons).
|
|
//
|
|
#define RIO_REPORT_SIZE 25
|
|
|
|
//
|
|
// Virtual device identity (matches the legacy vJoy layout's intent).
|
|
//
|
|
#define RIO_VENDOR_ID 0x1209 // pid.codes test/community VID
|
|
#define RIO_PRODUCT_ID 0x5249 // 'R','I'
|
|
#define RIO_VERSION 0x0100
|