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>
RIOJoy
Modern Windows 10/11 interface between the cockpit RIO (Remote Input/Output) board and Windows, as a virtual joystick / keyboard / mouse — the successor to the legacy vJoy-based app, with no vJoy dependency.
The RIO has 72 digital inputs and outputs (lighted buttons) and 5 analog axes (joystick X/Y, throttle, left pedal, right pedal), connected over RS-232 at 9600 8N1. RIOJoy exposes these to games that don't natively know about the cockpit hardware, with per-game profiles. (The native games — Firestorm, Red Planet — talk to the RIO directly and do not use this app.)
Repository layout
| Path | Contents |
|---|---|
src/RioJoy.Core |
Protocol, profile model, input mapper, HID feeder (class library) |
src/RioJoy.Tray |
Background tray application |
tests/RioJoy.Core.Tests |
xUnit tests for the protocol core |
driver/ |
RioGamepad virtual HID driver (KMDF + VHF) — replaces vJoy |
tools/RioJoySmokeTest |
On-cabinet end-to-end check of the feeder → driver path |
tools/XcfRegionExtract |
Extracts cockpit label regions from riojoy.xcf → regions.json |
docs/PLAN.md |
Full modernization plan (7 phases) |
docs/PROTOCOL.md |
RIO wire format + iRIO input-map reference |
docs/reference/ |
Cockpit overlay art & the legacy labeling pipeline |
legacy/ |
Original C++/vJoy implementation, kept as reference |
Building
Requires the .NET SDK (8.0 or newer) plus the .NET Framework 4.8
targeting/developer pack, on Windows. The apps target .NET Framework 4.8,
which is in-box on every Windows 10/11 machine — so deployed builds are
framework-dependent and need no runtime install on the target. The driver
builds separately with the WDK (see driver/README.md).
dotnet build RioJoy.sln -c Release
dotnet test RioJoy.sln
Status
Phases 1–5 are implemented and tested (241 unit tests). The RioGamepad virtual
HID driver is built (KMDF + VHF), test-signed, installed, and verified: it
enumerates in joy.cpl, and the C# HID feeder (DeviceIoControl →
RioGamepad.sys) drives its axes, buttons, and hat end-to-end (see
tools/RioJoySmokeTest). The C# side covers the serial
- RIO protocol core, input mapping + output routing, axis calibration + plasma
display, the tray app + profiles (JSON config,
RIO.iniimporter, three-state auto-switch), and the HID report packer that matches the driver's wire format. Remaining work is on-cabinet (real RIO serial/axis/plasma/auto-switch verification) plus packaging (Phase 6) and the profile editor + overlay generator (Phase 7). Seedocs/PLAN.mdfor the full roadmap.