/*++ 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"