The XP flavor of our own virtual joystick (no third-party driver), built with WDK 7.1.0 to x86/subsystem-5.01. Exposes the identical Public.h contract as the modern KMDF+VHF driver — same GUID, IOCTL_RIO_SUBMIT_REPORT, 25-byte report, VID/PID — so HidFeederJoystickSink drives both. Design (driver/RioGamepadXP/rioxp.c): - WDM HID minidriver via HidRegisterMinidriver presenting the 6-axis/hat/ 96-button joystick. POLLED mode (DevicesArePolled=TRUE): hidclass paces IOCTL_HID_READ_REPORT and we complete each synchronously from a cached report — no pending-IRP or cancel-routine machinery (the usual crash surface in a virtual HID driver). - Named sideband control device (\Device\RioGamepadXP + \DosDevices symlink) takes IOCTL_RIO_SUBMIT_REPORT and updates the cache under a spinlock. - hidclass overwrites our CREATE/CLOSE/DEVICE_CONTROL during registration; we save its pointers and reinstall wrappers that route the control device's IRPs to us and forward the HID FDO's to hidclass. Packaging/install: - Root-enumerated, so install uses devcon (built from the same WDK) — InstallHinfSection can't create the devnode. install-core.bat runs "devcon install RioGamepadXP.inf root\RioGamepadXP"; unsigned is fine (XP x86 enforces no kernel signing). Bundled into vendor\xp\. - net40 feeder opens the driver by name (\.\RioGamepadXP); XP can't put a device interface on a bare control device (no PDO) — the one nuance. Static build only: compiles clean but runtime bring-up (joy.cpl enumeration, report flow) needs a real XP target — that's 8E. 275 tests still green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
57 lines
2.2 KiB
C
57 lines
2.2 KiB
C
/*++
|
|
RioGamepadXP — shared definitions for the Windows XP virtual HID gamepad driver
|
|
and its user-mode client (the RIOJoy net40 tray app's HID feeder).
|
|
|
|
This is the XP-flavor sibling of driver/RioGamepad/Public.h. The contract is
|
|
IDENTICAL — same interface GUID, same IOCTL_RIO_SUBMIT_REPORT, same 25-byte
|
|
report layout, same VID/PID — so RioJoy.Core's HidFeederJoystickSink drives
|
|
either driver with only the device-open path differing.
|
|
|
|
The one XP difference: XP-era hidclass minidrivers cannot register a device
|
|
interface on a bare control device (IoRegisterDeviceInterface needs a PDO), so
|
|
the sideband control device is reachable by a fixed symbolic-link name instead
|
|
of by interface GUID. The net40 feeder opens RIO_XP_USERMODE_PATH directly; the
|
|
net48 feeder keeps using SetupDi + GUID_DEVINTERFACE_RIOGAMEPAD.
|
|
|
|
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 (same as the modern driver; kept for parity, and used
|
|
// if a future XP build ever exposes an interface). {b6a3f1c2-...}
|
|
//
|
|
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).
|
|
// Identical code to the modern driver.
|
|
//
|
|
#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 modern driver).
|
|
//
|
|
#define RIO_VENDOR_ID 0x1209 // pid.codes test/community VID
|
|
#define RIO_PRODUCT_ID 0x5249 // 'R','I'
|
|
#define RIO_VERSION 0x0100
|
|
|
|
//
|
|
// Sideband control-device names. The kernel object and its DOS-device symlink;
|
|
// the user-mode client opens RIO_XP_USERMODE_PATH.
|
|
//
|
|
#define RIO_XP_DEVICE_NAME L"\\Device\\RioGamepadXP"
|
|
#define RIO_XP_SYMLINK_NAME L"\\DosDevices\\RioGamepadXP"
|
|
#define RIO_XP_USERMODE_PATH "\\\\.\\RioGamepadXP"
|