From b0c82333d20e63a51237ad7ed5974d1933020927 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Mon, 22 Jun 2026 16:34:22 +0200 Subject: [PATCH] feat(gamepad): pure-user-mode Windows DualShock 4 + Xbox 360 (drop ViGEm) + installer + multi-pad Windows virtual gamepads now have zero external dependencies - ViGEmBus is removed. - DualShock 4: Windows UMDF backend (inject/dualshock4_windows.rs + dualshock4_proto.rs), reusing the DualSense SwDeviceCreate game-detection identity fix. The one UMDF driver serves the DS5 or DS4 identity/descriptor/features/strings per a device_type byte the host stamps into shared memory. Driver also gains IOCTL_HID_GET_STRING and a 41-byte calibration feature. - Xbox 360: a new UMDF2 XUSB companion driver (packaging/windows/xusb-driver/) that registers GUID_DEVINTERFACE_XUSB and answers the buffered XInput IOCTLs from a shared section, so classic XInputGetState/SetState work with no kernel bus driver. inject/gamepad_windows.rs is rewritten to drive it and the vigem-client dependency is removed. Xbox One folds to the 360 XInput path. - Installer: vendor + pnputil-install the three UMDF drivers (packaging/windows/gamepad-drivers/ + install-gamepad-drivers.ps1, wired into pack-host-installer.ps1 + punktfunk-host.iss). - Multi-pad: the host stamps each pad index into the device Location (pszDeviceLocation); the driver reads it via WdfDeviceAllocAndQueryProperty to map its own *-shm-, with UmdfHostProcessSharing=ProcessSharingDisabled giving each pad its own host (per-pad statics). Validated live on the Windows host: Cyberpunk native DualSense detection, DS4 identity + descriptor, XInputGetState + rumble round-trip, two pads -> two distinct XInput slots, and a full installer build. Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 21 +- Cargo.lock | 32 -- crates/punktfunk-host/Cargo.toml | 6 +- crates/punktfunk-host/src/inject.rs | 11 +- .../src/inject/dualsense_windows.rs | 214 +++++--- .../src/inject/dualshock4_proto.rs | 180 +++++++ .../src/inject/dualshock4_windows.rs | 300 ++++++++++++ .../src/inject/gamepad_windows.rs | 443 ++++++++++++----- crates/punktfunk-host/src/main.rs | 124 +++-- crates/punktfunk-host/src/punktfunk1.rs | 50 +- docs/windows-dualsense-game-detection.md | 127 ++++- .../windows/dualsense-driver/pf_dualsense.inx | 13 +- packaging/windows/dualsense-driver/src/lib.rs | 275 ++++++++++- .../windows/gamepad-drivers/pf_dualsense.cat | Bin 0 -> 2545 bytes .../windows/gamepad-drivers/pf_dualsense.dll | Bin 0 -> 361344 bytes .../windows/gamepad-drivers/pf_dualsense.inf | 82 ++++ packaging/windows/gamepad-drivers/pf_xusb.cat | Bin 0 -> 2417 bytes packaging/windows/gamepad-drivers/pf_xusb.dll | Bin 0 -> 343424 bytes packaging/windows/gamepad-drivers/pf_xusb.inf | 66 +++ .../gamepad-drivers/punktfunk-driver.cer | Bin 0 -> 780 bytes packaging/windows/install-gamepad-drivers.ps1 | 50 ++ packaging/windows/pack-host-installer.ps1 | 17 + packaging/windows/punktfunk-host.iss | 17 + packaging/windows/xusb-driver/Cargo.toml | 35 ++ packaging/windows/xusb-driver/Makefile.toml | 4 + packaging/windows/xusb-driver/README.md | 79 +++ packaging/windows/xusb-driver/build.rs | 5 + packaging/windows/xusb-driver/pf_xusb.inx | 64 +++ packaging/windows/xusb-driver/src/lib.rs | 462 ++++++++++++++++++ 29 files changed, 2389 insertions(+), 288 deletions(-) create mode 100644 crates/punktfunk-host/src/inject/dualshock4_proto.rs create mode 100644 crates/punktfunk-host/src/inject/dualshock4_windows.rs create mode 100644 packaging/windows/gamepad-drivers/pf_dualsense.cat create mode 100644 packaging/windows/gamepad-drivers/pf_dualsense.dll create mode 100644 packaging/windows/gamepad-drivers/pf_dualsense.inf create mode 100644 packaging/windows/gamepad-drivers/pf_xusb.cat create mode 100644 packaging/windows/gamepad-drivers/pf_xusb.dll create mode 100644 packaging/windows/gamepad-drivers/pf_xusb.inf create mode 100644 packaging/windows/gamepad-drivers/punktfunk-driver.cer create mode 100644 packaging/windows/install-gamepad-drivers.ps1 create mode 100644 packaging/windows/xusb-driver/Cargo.toml create mode 100644 packaging/windows/xusb-driver/Makefile.toml create mode 100644 packaging/windows/xusb-driver/README.md create mode 100644 packaging/windows/xusb-driver/build.rs create mode 100644 packaging/windows/xusb-driver/pf_xusb.inx create mode 100644 packaging/windows/xusb-driver/src/lib.rs diff --git a/CLAUDE.md b/CLAUDE.md index ee694e4..a4d0f05 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,10 +70,23 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc capability; impulse-trigger rumble is unreachable through a virtual pad), and the UHID `hid-playstation` pads — **DualSense** (adaptive triggers, lightbar, touchpad, motion) and **DualShock 4** (lightbar, touchpad, motion, rumble; DualSense minus adaptive triggers / player - LEDs / mute). The UHID pads need a Linux host; off Linux they (and One/Series) fold into Xbox 360. - Clients auto-resolve the type from the physical controller (DS5→DualSense, DS4→DualShock 4, - Xbox One→Xbox One). Windows-host DualShock 4 (ViGEm) is not yet wired — Windows clients asking for - DS4 get Xbox 360 for now. + LEDs / mute). DualSense and DualShock 4 each have a Linux (UHID `hid-playstation`) **and a Windows + (UMDF minidriver)** backend — `inject/dualsense_windows.rs` + `inject/dualshock4_windows.rs`, one + driver serving either identity per a `device_type` byte the host stamps into shared memory (the DS4 + reuses the same SwDeviceCreate game-detection identity fix as the DualSense). One/Series stays + Linux-only and folds into Xbox 360 off it. Clients auto-resolve the type from the physical controller + (DS5→DualSense, DS4→DualShock 4, Xbox One→Xbox One). **Windows uses ZERO external gamepad + dependencies — ViGEmBus is gone.** Xbox 360 (XInput) runs on a UMDF2 **XUSB companion** driver + (`packaging/windows/xusb-driver/`, `inject/gamepad_windows.rs`) that registers `GUID_DEVINTERFACE_XUSB` + and answers the buffered XInput IOCTLs from a shared section, so classic `XInputGetState`/`SetState` + work with no kernel bus driver (validated live: slot connected, state + rumble round-trip; Xbox One + folds to this 360 path). All three UMDF drivers (DualSense/DS4 + XUSB) are bundled + pnputil-installed + by the Inno Setup installer (`packaging/windows/gamepad-drivers/` + `install-gamepad-drivers.ps1`). + **Multi-pad ready**: the host stamps each pad's index into the device Location (`pszDeviceLocation`), + the driver reads it (`WdfDeviceAllocAndQueryProperty`) to map its own `*-shm-`, and + `UmdfHostProcessSharing=ProcessSharingDisabled` gives each pad its own host (per-pad statics) — + validated live with 2 distinct XInput slots + 2 DualSense pads. (Client-side multi-pad forwarding is + the remaining piece.) - **Windows host: implemented and shipping (all-vendor, x64-only).** `#[cfg(windows)]` backends behind the same traits as Linux — DXGI Desktop Duplication capture (`capture/dxgi.rs`), **SudoVDA** virtual display per session (`vdisplay/sudovda.rs`), GPU encode (NVENC `--features nvenc`; AMD/Intel diff --git a/Cargo.lock b/Cargo.lock index ca7153d..0469fd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2668,7 +2668,6 @@ dependencies = [ "utoipa", "utoipa-axum", "utoipa-scalar", - "vigem-client", "wasapi", "wayland-backend", "wayland-client", @@ -4072,15 +4071,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vigem-client" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b857e6f99efe1e1eb1e4dfb035de8ae7ec8ec56bd1928edcbd7c6e4427634d52" -dependencies = [ - "winapi", -] - [[package]] name = "wait-timeout" version = "0.2.1" @@ -4334,22 +4324,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.11" @@ -4359,12 +4333,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows" version = "0.62.2" diff --git a/crates/punktfunk-host/Cargo.toml b/crates/punktfunk-host/Cargo.toml index 8261b44..244e3e5 100644 --- a/crates/punktfunk-host/Cargo.toml +++ b/crates/punktfunk-host/Cargo.toml @@ -174,10 +174,8 @@ windows-service = "0.7" openh264 = "0.9" # WASAPI loopback audio capture (default render endpoint -> 48 kHz stereo f32 for the Opus path). wasapi = "0.23" -# Virtual Xbox 360 gamepad via ViGEmBus (the uinput-xpad analogue) — driver installed separately. -# `unstable_xtarget_notification` exposes the rumble/LED back-channel (the game's force-feedback → -# `request_notification`), the analogue of the Linux uinput EV_FF read path. -vigem-client = { version = "0.1", features = ["unstable_xtarget_notification"] } +# Virtual Xbox 360 gamepad: the in-tree XUSB companion UMDF driver (packaging/windows/xusb-driver), +# driven over shared memory from inject/gamepad_windows.rs — no ViGEmBus dependency. # NVENC hardware encoder (NVENC SDK, D3D11 input). The SDK pins `cudarc` with # `cuda-version-from-build-system` (a build-time CUDA-toolkit probe); its `ci-check` feature switches # cudarc to `dynamic-loading` (loads nvcuda.dll at runtime — nothing needed at build), which is how diff --git a/crates/punktfunk-host/src/inject.rs b/crates/punktfunk-host/src/inject.rs index 543fcad..e77e800 100644 --- a/crates/punktfunk-host/src/inject.rs +++ b/crates/punktfunk-host/src/inject.rs @@ -432,13 +432,20 @@ pub mod dualsense_proto; pub mod dualsense_windows; #[cfg(target_os = "linux")] pub mod dualshock4; +/// Transport-independent DualShock 4 HID codec used by the Windows UMDF-driver backend +/// ([`dualshock4_windows`]). (The Linux backend still carries its own copy — see the module FIXME.) +#[cfg(any(target_os = "linux", target_os = "windows"))] +pub mod dualshock4_proto; +/// Windows: virtual DualShock 4 via the same UMDF minidriver + shared-memory channel (device-type 1). +#[cfg(target_os = "windows")] +pub mod dualshock4_windows; #[cfg(target_os = "linux")] pub mod gamepad; -/// Windows: virtual Xbox 360 pads via ViGEmBus. +/// Windows: virtual Xbox 360 pads via the in-tree XUSB companion UMDF driver (classic XInput). #[cfg(target_os = "windows")] #[path = "inject/gamepad_windows.rs"] pub mod gamepad; -/// Stub — virtual gamepads need Linux uinput or Windows ViGEmBus; events are dropped elsewhere. +/// Stub — virtual gamepads need Linux uinput or the Windows UMDF drivers; events are dropped elsewhere. #[cfg(not(any(target_os = "linux", target_os = "windows")))] pub mod gamepad { #[derive(Default)] diff --git a/crates/punktfunk-host/src/inject/dualsense_windows.rs b/crates/punktfunk-host/src/inject/dualsense_windows.rs index eb3c15f..28b7ac0 100644 --- a/crates/punktfunk-host/src/inject/dualsense_windows.rs +++ b/crates/punktfunk-host/src/inject/dualsense_windows.rs @@ -25,7 +25,7 @@ use anyhow::{anyhow, Result}; use punktfunk_core::quic::{HidOutput, RichInput}; use std::ffi::c_void; use std::time::{Duration, Instant}; -use windows::core::{w, HRESULT, HSTRING, PCWSTR}; +use windows::core::{w, GUID, HRESULT, HSTRING, PCWSTR}; use windows::Win32::Devices::Enumeration::Pnp::{ SwDeviceClose, SwDeviceCreate, HSWDEVICE, SW_DEVICE_CREATE_INFO, }; @@ -40,12 +40,17 @@ use windows::Win32::System::Memory::{ }; use windows::Win32::System::Threading::{CreateEventW, SetEvent, WaitForSingleObject}; -/// Shared-section layout — must match `packaging/windows/dualsense-driver/src/lib.rs`. -const SHM_SIZE: usize = 256; -const SHM_MAGIC: u32 = 0x5046_4453; // "PFDS" -const OFF_INPUT: usize = 8; -const OFF_OUT_SEQ: usize = 72; -const OFF_OUTPUT: usize = 76; +/// Shared-section layout — must match `packaging/windows/dualsense-driver/src/lib.rs`. `pub(super)` +/// so the sibling DualShock 4 backend ([`super::dualshock4_windows`]) reuses the exact offsets. +pub(super) const SHM_SIZE: usize = 256; +pub(super) const SHM_MAGIC: u32 = 0x5046_4453; // "PFDS" +pub(super) const OFF_INPUT: usize = 8; +pub(super) const OFF_OUT_SEQ: usize = 72; +pub(super) const OFF_OUTPUT: usize = 76; +/// Device-type selector the driver reads to choose which HID identity/descriptor it serves: 0 = +/// DualSense (the default — the section is zeroed), 1 = DualShock 4. +pub(super) const OFF_DEVTYPE: usize = 140; +pub(super) const DEVTYPE_DUALSHOCK4: u8 = 1; /// A single virtual DualSense: the SwDeviceCreate'd `pf_pad_` software devnode (the driver /// loads on it and the HID DualSense appears to games) plus the shared-memory section the driver maps. @@ -86,31 +91,103 @@ unsafe extern "system" fn sw_create_cb( } } -/// Spawn the per-session virtual DualSense devnode for pad `index` under enumerator `punktfunk` -/// (instance `pf_pad_`, hardware id `pf_dualsense` which the INF matches). The returned -/// `HSWDEVICE` owns it — `SwDeviceClose` removes it on drop, so the pad appears/disappears with the -/// session and nothing persists. +/// The PnP identity for a virtual controller devnode — varies by controller type so the same +/// [`create_swdevice`] builds a DualSense (`VID_054C&PID_0CE6`) or a DualShock 4 +/// (`VID_054C&PID_09CC`). The fields map onto the `SW_DEVICE_CREATE_INFO` identity discussed below. +pub(super) struct SwDeviceProfile<'a> { + /// PnP instance id — distinct namespaces per type (`pf_pad_` vs `pf_ds4_`) so the two + /// never reuse the same devnode shell. + pub instance: &'a str, + /// Index for the deterministic per-pad ContainerId. + pub container_index: u8, + /// The INF-matched hardware id (`pf_dualsense` / `pf_dualshock4`), listed FIRST so the INF binds. + pub hwid: &'a str, + /// The USB VID&PID token (`VID_054C&PID_0CE6`) used to synthesize the USB hardware/compatible ids. + pub usb_vid_pid: &'a str, + /// Device description shown in Device Manager. + pub description: &'a str, +} + +/// Spawn the per-session virtual controller devnode under enumerator `punktfunk` (instance +/// `profile.instance`). The returned `HSWDEVICE` owns it — `SwDeviceClose` removes it on drop, so the +/// pad appears/disappears with the session and nothing persists. +/// +/// **Game-detection identity** (see `docs/windows-dualsense-game-detection.md`). `HIDD_ATTRIBUTES` +/// alone (VID/PID via the IOCTL) satisfies SDL/HIDAPI/RawInput, but a native PS5 path (libScePad- +/// style raw HID) classifies the *connection type* by walking from the HID child to its parent +/// (`CM_Get_Parent`) and string-matching `"USB"`/`"BTHENUM"` in that parent's +/// `DEVPKEY_Device_CompatibleIds`; with no bus identity the pad reads as `UNKNOWN` and the native +/// path rejects it. So we set, via `SW_DEVICE_CREATE_INFO` (NOT `pProperties` — bus/identity info is +/// create-time-only and a `DEVPROPERTY` write of these keys is ignored): +/// - `pszzCompatibleIds` starting with a `USB\` token → the parent walk resolves `bus_type = USB`. +/// - `pszzHardwareIds` = `pf_dualsense` **first** (so the INF still binds our UMDF driver) followed +/// by `USB\VID_054C&PID_0CE6[&REV_0100]`, which makes hidclass derive the real-DualSense child +/// hardware ids `HID\VID_054C&PID_0CE6[&REV_0100]` (the set a genuine USB DS5 exposes). +/// - a deterministic, non-sentinel per-pad `pContainerId` (groups the pad's devnodes; avoids the +/// null-sentinel ContainerId that trips an `xinput1_4` slot-skip bug). +/// +/// (Validated live on `.173`: the INF still binds, the child gains the `HID\VID&PID` ids, and the +/// parent walk reports USB. Remaining gap: GameInput parses VID/PID from the child *instance path* +/// `HID\punktfunk\…`, which only a real USB-bus instance path — a bus driver — would change.) /// /// Two requirements each yield E_INVALIDARG if violated: the enumerator name must not contain `_` /// (hence `punktfunk`, not `pf_dualsense`), and the completion callback is mandatory (the docs mark /// `pCallback` as `[in]`, not optional — a NULL callback is rejected). The caller must be /// Administrator (the host service runs as LocalSystem). -fn create_swdevice(index: u8) -> Result { - let hwids: Vec = "pf_dualsense".encode_utf16().chain([0u16, 0u16]).collect(); - let instid: Vec = format!("pf_pad_{index}") +pub(super) fn create_swdevice(p: &SwDeviceProfile) -> Result { + // Build a double-NUL-terminated UTF-16 multi-sz from a list of ids. + let multi_sz = |ids: &[&str]| -> Vec { + ids.iter() + .flat_map(|s| s.encode_utf16().chain(std::iter::once(0))) + .chain(std::iter::once(0)) + .collect() + }; + let usb_rev = format!("USB\\{}&REV_0100", p.usb_vid_pid); + let usb = format!("USB\\{}", p.usb_vid_pid); + let hwids = multi_sz(&[ + p.hwid, // FIRST → the INF binds our UMDF driver on this id + usb_rev.as_str(), + usb.as_str(), + ]); + let compat = multi_sz(&[ + usb.as_str(), // a `USB\` token → native bus-type detection resolves USB + "USB\\Class_03&SubClass_00&Prot_00", + "USB\\Class_03", + ]); + let instid: Vec = p + .instance .encode_utf16() .chain(std::iter::once(0)) .collect(); - let desc: Vec = "punktfunk Virtual DualSense" + let desc: Vec = p + .description .encode_utf16() .chain(std::iter::once(0)) .collect(); - // SAFETY: zeroed then the fields we use are set; cbSize identifies the struct version. + // The pad index, stamped into the device Location — the driver reads it to map `pfds-shm-` + // (multi-pad). The buffer outlives the SwDeviceCreate call (we wait on the event before return). + let loc: Vec = format!("{}", p.container_index) + .encode_utf16() + .chain(std::iter::once(0)) + .collect(); + // Deterministic per-pad ContainerId {50464453-0000-0000-0000-0000000000} ("PFDS"). + let container = GUID::from_values( + 0x5046_4453, + 0x0000, + 0x0000, + [0, 0, 0, 0, 0, 0, 0, p.container_index], + ); + + // SAFETY: zeroed then the fields we use are set; cbSize identifies the struct version. The id + // buffers and `container` outlive the SwDeviceCreate call (we wait on the event before return). let mut info: SW_DEVICE_CREATE_INFO = unsafe { std::mem::zeroed() }; info.cbSize = std::mem::size_of::() as u32; info.pszInstanceId = PCWSTR(instid.as_ptr()); info.pszzHardwareIds = PCWSTR(hwids.as_ptr()); + info.pszzCompatibleIds = PCWSTR(compat.as_ptr()); + info.pContainerId = &container; info.pszDeviceDescription = PCWSTR(desc.as_ptr()); + info.pszDeviceLocation = PCWSTR(loc.as_ptr()); info.CapabilityFlags = 0x0000_000B; // DriverRequired | SilentInstall | Removable // SAFETY: a manual-reset, initially-unsignaled, unnamed event. @@ -157,56 +234,66 @@ fn create_swdevice(index: u8) -> Result { Ok(hsw) } +/// Create + map the named section `Global\pfds-shm-`, zeroed, with a permissive DACL so the +/// WUDFHost (whatever account it runs as) can open it. Returns `(section handle, mapped base)`; the +/// caller stamps the device-type + initial input report and finally the magic. Shared by both Windows +/// pad backends (DualSense + DualShock 4). +pub(super) fn create_shm_section(index: u8) -> Result<(HANDLE, *mut u8)> { + let name = HSTRING::from(format!("Global\\pfds-shm-{index}")); + + let mut psd = PSECURITY_DESCRIPTOR::default(); + // SAFETY: the SDDL literal is valid; psd receives an allocated descriptor (freed by the OS when + // the process exits — acceptable for a host-lifetime object). + unsafe { + ConvertStringSecurityDescriptorToSecurityDescriptorW( + w!("D:(A;;GA;;;WD)"), + SDDL_REVISION_1, + &mut psd, + None, + )?; + } + let sa = SECURITY_ATTRIBUTES { + nLength: std::mem::size_of::() as u32, + lpSecurityDescriptor: psd.0, + bInheritHandle: false.into(), + }; + + // SAFETY: anonymous (pagefile-backed) section of SHM_SIZE bytes with the SDDL above. + let map = unsafe { + CreateFileMappingW( + INVALID_HANDLE_VALUE, + Some(&sa), + PAGE_READWRITE, + 0, + SHM_SIZE as u32, + PCWSTR(name.as_ptr()), + )? + }; + // SAFETY: map is a valid section handle; map the whole thing. + let view = unsafe { MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE) }; + if view.Value.is_null() { + // SAFETY: map is valid. + unsafe { + let _ = CloseHandle(map); + } + return Err(anyhow!("MapViewOfFile failed for {name}")); + } + let base = view.Value as *mut u8; + // SAFETY: base points at SHM_SIZE writable bytes. + unsafe { std::ptr::write_bytes(base, 0, SHM_SIZE) }; + Ok((map, base)) +} + impl DsWinPad { /// Create + map the section `Global\pfds-shm-`, stamp the magic, then spawn the /// `root\pf_dualsense` devnode (the driver loads on it and maps the section). The devnode lives /// for the pad's lifetime — dropping the pad removes it (`SwDeviceClose`). fn open(index: u8) -> Result { - let name = HSTRING::from(format!("Global\\pfds-shm-{index}")); - - // A permissive DACL so the WUDFHost (whatever account it runs as) can open the section. - let mut psd = PSECURITY_DESCRIPTOR::default(); - // SAFETY: the SDDL literal is valid; psd receives an allocated descriptor (freed by the OS - // when the process exits — acceptable for a host-lifetime object). - unsafe { - ConvertStringSecurityDescriptorToSecurityDescriptorW( - w!("D:(A;;GA;;;WD)"), - SDDL_REVISION_1, - &mut psd, - None, - )?; - } - let sa = SECURITY_ATTRIBUTES { - nLength: std::mem::size_of::() as u32, - lpSecurityDescriptor: psd.0, - bInheritHandle: false.into(), - }; - - // SAFETY: anonymous (pagefile-backed) section of SHM_SIZE bytes with the SDDL above. - let map = unsafe { - CreateFileMappingW( - INVALID_HANDLE_VALUE, - Some(&sa), - PAGE_READWRITE, - 0, - SHM_SIZE as u32, - PCWSTR(name.as_ptr()), - )? - }; - // SAFETY: map is a valid section handle; map the whole thing. - let view = unsafe { MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE) }; - if view.Value.is_null() { - // SAFETY: map is valid. - unsafe { - let _ = CloseHandle(map); - } - return Err(anyhow!("MapViewOfFile failed for {name}")); - } - let base = view.Value as *mut u8; - // Zero the section then stamp the magic LAST (the driver only accepts it once magic is set). + let (map, base) = create_shm_section(index)?; + // Stamp the neutral input report, then the magic LAST (the driver only accepts the section + // once magic is set). The device-type stays 0 (DualSense — the section is already zeroed). // SAFETY: base points at SHM_SIZE writable bytes. unsafe { - std::ptr::write_bytes(base, 0, SHM_SIZE); std::ptr::write_unaligned(base.add(OFF_INPUT) as *mut [u8; DS_INPUT_REPORT_LEN], { let mut r = [0u8; DS_INPUT_REPORT_LEN]; serialize_state(&mut r, &DsState::neutral(), 0, 0); @@ -217,7 +304,14 @@ impl DsWinPad { // Spawn the per-session devnode via SwDeviceCreate; `SwDeviceClose` removes it on drop. On the // rare failure we keep the section + data plane and fall back to an out-of-band `pf_dualsense` // devnode (installer / dev-box devgen). - let hsw = match create_swdevice(index) { + let inst = format!("pf_pad_{index}"); + let hsw = match create_swdevice(&SwDeviceProfile { + instance: &inst, + container_index: index, + hwid: "pf_dualsense", + usb_vid_pid: "VID_054C&PID_0CE6", + description: "punktfunk Virtual DualSense", + }) { Ok(h) => Some(h), Err(e) => { tracing::warn!(error = %format!("{e:#}"), "SwDeviceCreate failed; falling back to an out-of-band pf_dualsense devnode"); diff --git a/crates/punktfunk-host/src/inject/dualshock4_proto.rs b/crates/punktfunk-host/src/inject/dualshock4_proto.rs new file mode 100644 index 0000000..e3be66d --- /dev/null +++ b/crates/punktfunk-host/src/inject/dualshock4_proto.rs @@ -0,0 +1,180 @@ +//! Transport-independent DualShock 4 HID contract — the pure report codec used by the Windows +//! UMDF-driver backend ([`super::dualshock4_windows`]). +//! +//! FIXME(ds4-dedup): the Linux UHID backend ([`super::dualshock4`]) still carries its own byte- +//! identical copy of this codec (`serialize_state` / `parse_ds4_output` / `Ds4Feedback` / the touch +//! dims). Fold it onto this module once the Linux build can be re-validated (it is `cfg(linux)`, so +//! it can't be compile-checked from a Windows host). Keep the two in sync until then. +//! +//! The PS4 sibling of [`super::dualsense_proto`]: the pure report codec with no transport. The DS4 +//! reuses the DualSense [`DsState`] controller model + its `GameStream`/XInput mapper +//! ([`DsState::from_gamepad`]) — only the report *byte layout*, the touchpad resolution, and the +//! feedback report differ. The Linux backend writes report `0x01` to `/dev/uhid` and reads `0x05` via +//! `UHID_OUTPUT`; the Windows backend pushes `0x01` to the UMDF driver and pulls `0x05` back over its +//! shared-memory channel — both build/parse the exact same bytes here. +//! +//! Field offsets are the canonical real-DS4-USB layout the kernel `struct +//! dualshock4_input_report_usb` / `_output_report_common` parse. + +use super::dualsense_proto::{DsState, Touch}; +use punktfunk_core::quic::HidOutput; + +/// DualShock 4 v2 USB identity (Sony Interactive Entertainment / CUH-ZCT2). +pub const DS4_VENDOR: u16 = 0x054C; +pub const DS4_PRODUCT: u16 = 0x09CC; +/// USB input report `0x01` is 64 bytes total (report id + 63-byte body). +pub const DS4_INPUT_REPORT_LEN: usize = 64; +/// The DualShock 4 touchpad resolution the kernel advertises (ABS_MT 0..1919 / 0..941). Narrower +/// than the DualSense's 1920×1080. +pub const DS4_TOUCH_W: u16 = 1920; +pub const DS4_TOUCH_H: u16 = 942; + +/// Pack one touchpad contact into the DS4's 4-byte point (same bit layout as the DualSense's: +/// byte0 bit7 = NOT-active, bits0-6 = id; 12-bit X then 12-bit Y). +fn pack_touch(dst: &mut [u8], t: &Touch) { + dst[0] = (t.id & 0x7F) | if t.active { 0 } else { 0x80 }; + // Never emit the extent itself — the kernel advertises 0..=W-1 / 0..=H-1. + let (x, y) = (t.x.min(DS4_TOUCH_W - 1), t.y.min(DS4_TOUCH_H - 1)); + dst[1] = (x & 0xFF) as u8; + dst[2] = (((x >> 8) & 0x0F) as u8) | (((y & 0x0F) as u8) << 4); + dst[3] = ((y >> 4) & 0xFF) as u8; +} + +/// Serialize a full DS4 input report `0x01` (pure — unit-testable without a transport). Field offsets +/// per the kernel's `struct dualshock4_input_report_usb` { report_id; common; num_touch; touch[3]; +/// rsvd[3] } where `common` = { x,y,rx,ry; buttons[3]; z,rz; sensor_ts le16; temp; gyro[3] le16; +/// accel[3] le16; rsvd[5]; status[2]; rsvd }. The report id is byte 0, so a `common` field at struct +/// offset N sits at report byte N+1. +pub fn serialize_state(r: &mut [u8; DS4_INPUT_REPORT_LEN], st: &DsState, counter: u8, ts: u16) { + r[0] = 0x01; // report id + r[1] = st.lx; + r[2] = st.ly; + r[3] = st.rx; + r[4] = st.ry; + r[5] = (st.dpad & 0x0F) | (st.buttons[0] & 0xF0); // dpad hat (low) + face buttons (high) + r[6] = st.buttons[1]; // L1/R1, L2/R2 digital, Share/Options, L3/R3 + r[7] = (st.buttons[2] & 0x03) | ((counter & 0x3F) << 2); // PS + touchpad-click + report counter + r[8] = st.l2; // L2 analog (z) + r[9] = st.r2; // R2 analog (rz) + r[10..12].copy_from_slice(&ts.to_le_bytes()); // sensor_timestamp (struct off 9) + // r[12] temperature stays 0 + for (i, v) in st.gyro.iter().enumerate() { + r[13 + i * 2..15 + i * 2].copy_from_slice(&v.to_le_bytes()); // gyro at struct off 12 + } + for (i, v) in st.accel.iter().enumerate() { + r[19 + i * 2..21 + i * 2].copy_from_slice(&v.to_le_bytes()); // accel at struct off 18 + } + // r[25..30] reserved2. + // status[0] (struct off 29 → r[30]): bit4 = cable/wired, low nibble = battery capacity. Report + // wired + full (0x1B) so SteamOS / the kernel never warn "low battery" on a virtual pad. + r[30] = 0x10 | 0x0B; + // r[31] status[1] = 0 (no headphone/mic), r[32] reserved3 = 0. + r[33] = 1; // num_touch_reports: one frame carrying the two contacts (a real DS4 always sends one) + r[34] = ts as u8; // touch_reports[0].timestamp + pack_touch(&mut r[35..39], &st.touch[0]); // touch point 0 + pack_touch(&mut r[39..43], &st.touch[1]); // touch point 1 + // remaining touch frames (r[43..61]) + reserved (r[61..64]) stay zero +} + +/// What one feedback pass extracted from the device's HID output reports. Rumble rides the universal +/// 0xCA plane; the lightbar rides the HID-output 0xCD plane (DS4 has no player LEDs or adaptive +/// triggers, so those never appear). +#[derive(Default)] +pub struct Ds4Feedback { + pub hidout: Vec, + /// `(low, high)` motor levels (0..=0xFF00), if a report carried them. + pub rumble: Option<(u16, u16)>, + /// Lightbar RGB, if the report carried it (deduped by the manager). + pub led: Option<(u8, u8, u8)>, +} + +/// Parse a DualShock 4 USB output report (`0x05`) into a [`Ds4Feedback`]. Layout per the kernel +/// `struct dualshock4_output_report_common`: valid_flag0 (bit0 motor, bit1 LED, bit2 blink) at [1], +/// valid_flag1 [2], reserved [3], motor_right (weak/small) [4], motor_left (strong/large) [5], +/// lightbar R/G/B [6..9], blink on/off [9..11]. Gated on the valid-flags so a rumble-only write +/// doesn't masquerade as a lightbar change. +pub fn parse_ds4_output(data: &[u8], fb: &mut Ds4Feedback) { + if data.first() != Some(&0x05) || data.len() < 11 { + return; // not the USB output report (BT 0x11 is shifted) / too short + } + let flag0 = data[1]; + if flag0 & 0x01 != 0 { + // motor_left (strong/large/low-freq) at [5], motor_right (weak/small/high-freq) at [4]; + // scale 0..255 → 0..0xFF00, same (low, high) convention as the other backends. + let low = (data[5] as u16) << 8; + let high = (data[4] as u16) << 8; + fb.rumble = Some((low, high)); + } + if flag0 & 0x02 != 0 { + fb.led = Some((data[6], data[7], data[8])); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Report 0x01 places sticks/buttons/triggers/motion/touch at the kernel's DS4 offsets. + #[test] + fn serialize_offsets() { + use punktfunk_core::input::gamepad as gs; + let mut st = DsState::from_gamepad( + gs::BTN_A | gs::BTN_DPAD_UP | gs::BTN_LB, + 16384, // lx (right) + 0, + 0, + -32768, // ry (down) — inverted to 0xFF + 200, // L2 + 0, + ); + st.gyro = [0x0102, 0x0304, 0x0506]; + st.accel = [0x1112, 0x1314, 0x1516]; + st.touch[0] = Touch { + active: true, + id: 0, + x: 100, + y: 200, + }; + let mut r = [0u8; DS4_INPUT_REPORT_LEN]; + serialize_state(&mut r, &st, 0, 0); + assert_eq!(r[0], 0x01); // report id + assert_eq!(r[8], 200); // L2 analog at byte 8 (not the DualSense's byte 5) + assert_eq!(r[5] & 0x0F, 0); // dpad hat = N (up) + assert_eq!(r[5] & 0x20, 0x20); // Cross (A) face bit + assert_eq!(r[6] & 0x01, 0x01); // L1 + // gyro le16 at 13..19, accel le16 at 19..25. + assert_eq!(&r[13..19], &[0x02, 0x01, 0x04, 0x03, 0x06, 0x05]); + assert_eq!(&r[19..25], &[0x12, 0x11, 0x14, 0x13, 0x16, 0x15]); + assert_eq!(r[33], 1); // one touch frame + assert_eq!(r[35] & 0x80, 0); // contact 0 active (bit7 clear) + assert_eq!(r[35] & 0x7F, 0); // contact id 0 + assert_eq!(r[30] & 0x10, 0x10); // cable/wired bit set + } + + /// A DS4 USB output report (`0x05`) with motor + LED flags parses into rumble (0xCA) and a + /// lightbar `Led` (0xCD); a rumble-only report (no LED flag) leaves the lightbar untouched. + #[test] + fn parse_output_rumble_and_lightbar() { + let mut report = [0u8; 32]; + report[0] = 0x05; + report[1] = 0x01 | 0x02; // MOTOR | LED + report[4] = 0x40; // motor_right (weak/high) + report[5] = 0x80; // motor_left (strong/low) + report[6] = 0x11; // R + report[7] = 0x22; // G + report[8] = 0x33; // B + let mut fb = Ds4Feedback::default(); + parse_ds4_output(&report, &mut fb); + assert_eq!(fb.rumble, Some((0x8000, 0x4000))); // (low=strong, high=weak) + assert_eq!(fb.led, Some((0x11, 0x22, 0x33))); + + let mut motor_only = [0u8; 32]; + motor_only[0] = 0x05; + motor_only[1] = 0x01; // MOTOR only + motor_only[5] = 0x10; + let mut fb2 = Ds4Feedback::default(); + parse_ds4_output(&motor_only, &mut fb2); + assert!(fb2.rumble.is_some()); + assert_eq!(fb2.led, None); // lightbar not asserted → no spurious change + } +} diff --git a/crates/punktfunk-host/src/inject/dualshock4_windows.rs b/crates/punktfunk-host/src/inject/dualshock4_windows.rs new file mode 100644 index 0000000..918c59a --- /dev/null +++ b/crates/punktfunk-host/src/inject/dualshock4_windows.rs @@ -0,0 +1,300 @@ +//! Virtual Sony DualShock 4 on Windows via the UMDF minidriver — the PS4 sibling of +//! [`super::dualsense_windows`]. Same transport (a per-session `SwDeviceCreate` devnode + the +//! `Global\pfds-shm-` shared section the driver maps), same controller model ([`DsState`]); only +//! the PnP identity (`VID_054C&PID_09CC`, hardware id `pf_dualshock4`) and the report codec +//! ([`super::dualshock4_proto`]) differ. The host stamps `device_type = 1` (DualShock 4) into the +//! section so the one UMDF driver serves the DS4 descriptor / attributes / features instead of the +//! DualSense ones. Feedback is motor rumble (universal 0xCA plane) + the lightbar (0xCD `Led`); a DS4 +//! has no adaptive triggers / player LEDs. + +use super::dualsense_proto::DsState; +use super::dualsense_windows::{ + create_shm_section, create_swdevice, SwDeviceProfile, DEVTYPE_DUALSHOCK4, OFF_DEVTYPE, + OFF_INPUT, OFF_OUTPUT, OFF_OUT_SEQ, SHM_MAGIC, +}; +use super::dualshock4_proto::{ + parse_ds4_output, serialize_state, Ds4Feedback, DS4_INPUT_REPORT_LEN, DS4_TOUCH_H, DS4_TOUCH_W, +}; +use crate::gamestream::gamepad::{GamepadEvent, MAX_PADS}; +use anyhow::Result; +use punktfunk_core::quic::{HidOutput, RichInput}; +use std::ffi::c_void; +use std::time::{Duration, Instant}; +use windows::Win32::Devices::Enumeration::Pnp::{SwDeviceClose, HSWDEVICE}; +use windows::Win32::Foundation::{CloseHandle, HANDLE}; +use windows::Win32::System::Memory::{UnmapViewOfFile, MEMORY_MAPPED_VIEW_ADDRESS}; + +/// A single virtual DualShock 4: the `SwDeviceCreate`'d `pf_ds4_` devnode plus the mapped +/// shared section. Dropping it removes the devnode and unmaps + closes the section. +struct Ds4WinPad { + hsw: Option, + map: HANDLE, + view: *mut u8, + counter: u8, + ts: u16, + last_out_seq: u32, +} + +impl Ds4WinPad { + /// Create + map the section, stamp `device_type = DualShock 4` + a neutral report + the magic, + /// then spawn the `pf_ds4_` devnode (the driver loads on it and maps the section). + fn open(index: u8) -> Result { + let (map, base) = create_shm_section(index)?; + // device-type FIRST (so it's visible the moment magic is), neutral report, magic LAST. + // SAFETY: base points at SHM_SIZE writable bytes; OFF_DEVTYPE/OFF_INPUT are in range. + unsafe { + *base.add(OFF_DEVTYPE) = DEVTYPE_DUALSHOCK4; + std::ptr::write_unaligned(base.add(OFF_INPUT) as *mut [u8; DS4_INPUT_REPORT_LEN], { + let mut r = [0u8; DS4_INPUT_REPORT_LEN]; + serialize_state(&mut r, &DsState::neutral(), 0, 0); + r + }); + std::ptr::write_unaligned(base as *mut u32, SHM_MAGIC); + } + let inst = format!("pf_ds4_{index}"); + let hsw = match create_swdevice(&SwDeviceProfile { + instance: &inst, + container_index: index, + hwid: "pf_dualshock4", + usb_vid_pid: "VID_054C&PID_09CC", + description: "punktfunk Virtual DualShock 4", + }) { + Ok(h) => Some(h), + Err(e) => { + tracing::warn!(error = %format!("{e:#}"), "SwDeviceCreate failed; DualShock 4 devnode unavailable"); + None + } + }; + Ok(Ds4WinPad { + hsw, + map, + view: base, + counter: 0, + ts: 0, + last_out_seq: 0, + }) + } + + /// Serialize `st` into report `0x01` and publish it to the section's input slot. + fn write_state(&mut self, st: &DsState) { + self.counter = self.counter.wrapping_add(1); + self.ts = self.ts.wrapping_add(188); // ~1ms in the DS4's 5.33µs sensor-clock units + let mut r = [0u8; DS4_INPUT_REPORT_LEN]; + serialize_state(&mut r, st, self.counter, self.ts); + // SAFETY: view points at SHM_SIZE bytes; input slot is OFF_INPUT..OFF_INPUT+64. + unsafe { std::ptr::copy_nonoverlapping(r.as_ptr(), self.view.add(OFF_INPUT), r.len()) }; + } + + /// Poll the section's output slot; parse a new `0x05` report (rumble / lightbar) into a + /// [`Ds4Feedback`]. Returns empty feedback if the driver hasn't published anything new. + fn service(&mut self) -> Ds4Feedback { + let mut fb = Ds4Feedback::default(); + // SAFETY: view points at SHM_SIZE bytes. + let seq = unsafe { std::ptr::read_unaligned(self.view.add(OFF_OUT_SEQ) as *const u32) }; + if seq != self.last_out_seq { + self.last_out_seq = seq; + let mut out = [0u8; 64]; + // SAFETY: output slot is OFF_OUTPUT..OFF_OUTPUT+64 within the section. + unsafe { + std::ptr::copy_nonoverlapping(self.view.add(OFF_OUTPUT), out.as_mut_ptr(), 64) + }; + parse_ds4_output(&out, &mut fb); + } + fb + } +} + +impl Drop for Ds4WinPad { + fn drop(&mut self) { + // SAFETY: hsw (if any) owns the devnode; view/map from MapViewOfFile/CreateFileMappingW. + unsafe { + if let Some(h) = self.hsw { + SwDeviceClose(h); + } + let _ = UnmapViewOfFile(MEMORY_MAPPED_VIEW_ADDRESS { + Value: self.view as *mut c_void, + }); + let _ = CloseHandle(self.map); + } + } +} + +/// All virtual DualShock 4 pads of a session — the Windows analogue of +/// [`DualShock4Manager`](super::dualshock4::DualShock4Manager), with the same method surface as the +/// Windows DualSense manager so the session input thread drives either backend identically. +pub struct DualShock4WindowsManager { + pads: Vec>, + state: Vec, + last_rumble: Vec<(u16, u16)>, + last_led: Vec>, + last_write: Vec, + broken: bool, +} + +impl Default for DualShock4WindowsManager { + fn default() -> DualShock4WindowsManager { + DualShock4WindowsManager::new() + } +} + +impl DualShock4WindowsManager { + pub fn new() -> DualShock4WindowsManager { + DualShock4WindowsManager { + pads: (0..MAX_PADS).map(|_| None).collect(), + state: vec![DsState::neutral(); MAX_PADS], + last_rumble: vec![(0, 0); MAX_PADS], + last_led: vec![None; MAX_PADS], + last_write: vec![Instant::now(); MAX_PADS], + broken: false, + } + } + + /// Handle one decoded controller event (create/destroy by mask, then merge button/stick state). + pub fn handle(&mut self, ev: &GamepadEvent) { + match ev { + GamepadEvent::Arrival { index, kind, .. } => { + tracing::info!(index, kind, "controller arrival (DualShock 4/Windows)"); + self.ensure(*index as usize); + } + GamepadEvent::State(f) => { + let idx = f.index as usize; + if idx >= MAX_PADS { + return; + } + for (i, slot) in self.pads.iter_mut().enumerate() { + if slot.is_some() && f.active_mask & (1 << i) == 0 { + tracing::info!(index = i, "controller unplugged (DualShock 4/Windows)"); + *slot = None; + self.state[i] = DsState::neutral(); + self.last_rumble[i] = (0, 0); + self.last_led[i] = None; + } + } + if f.active_mask & (1 << idx) == 0 { + return; + } + self.ensure(idx); + let prev = self.state[idx]; + let mut s = DsState::from_gamepad( + f.buttons, + f.ls_x, + f.ls_y, + f.rs_x, + f.rs_y, + f.left_trigger, + f.right_trigger, + ); + s.touch = prev.touch; + s.gyro = prev.gyro; + s.accel = prev.accel; + self.state[idx] = s; + self.write(idx); + } + } + } + + /// Apply one rich client→host event (touchpad contact / motion sample) to an existing pad. + pub fn apply_rich(&mut self, rich: RichInput) { + let idx = match rich { + RichInput::Touchpad { pad, .. } | RichInput::Motion { pad, .. } => pad as usize, + }; + if idx >= MAX_PADS || self.pads[idx].is_none() { + return; + } + match rich { + RichInput::Touchpad { + finger, + active, + x, + y, + .. + } => { + let slot = (finger as usize).min(1); + let t = &mut self.state[idx].touch[slot]; + t.active = active; + t.id = slot as u8; + t.x = ((x as u32 * (DS4_TOUCH_W - 1) as u32) / u16::MAX as u32) as u16; + t.y = ((y as u32 * (DS4_TOUCH_H - 1) as u32) / u16::MAX as u32) as u16; + } + RichInput::Motion { gyro, accel, .. } => { + self.state[idx].gyro = gyro; + self.state[idx].accel = accel; + } + } + self.write(idx); + } + + fn write(&mut self, idx: usize) { + let st = self.state[idx]; + if let Some(pad) = self.pads[idx].as_mut() { + pad.write_state(&st); + } + self.last_write[idx] = Instant::now(); + } + + /// Re-emit each live pad's current report if it's been silent for `max_gap` (parity with the + /// other backends' heartbeat — keeps the section fresh). + pub fn heartbeat(&mut self, max_gap: Duration) { + let now = Instant::now(); + for i in 0..self.pads.len() { + if self.pads[i].is_some() && now.duration_since(self.last_write[i]) >= max_gap { + self.write(i); + } + } + } + + fn ensure(&mut self, idx: usize) { + if idx >= MAX_PADS || self.pads[idx].is_some() || self.broken { + return; + } + match Ds4WinPad::open(idx as u8) { + Ok(p) => { + tracing::info!( + index = idx, + "virtual DualShock 4 created (Windows UMDF shm channel)" + ); + self.pads[idx] = Some(p); + self.state[idx] = DsState::neutral(); + self.last_rumble[idx] = (0, 0); + self.last_led[idx] = None; + self.last_write[idx] = Instant::now(); + } + Err(e) => { + tracing::error!(error = %format!("{e:#}"), "virtual DualShock 4 creation failed — controller input disabled"); + self.broken = true; + } + } + } + + /// Service every pad: poll the section for a game's feedback. `rumble` fires `(index, low, high)` + /// only on change (universal 0xCA plane); `hidout` fires the lightbar (0xCD `Led`), deduped. + pub fn pump( + &mut self, + mut rumble: impl FnMut(u16, u16, u16), + mut hidout: impl FnMut(HidOutput), + ) { + for i in 0..self.pads.len() { + let Some(pad) = self.pads[i].as_mut() else { + continue; + }; + let fb = pad.service(); + if let Some(r) = fb.rumble { + if self.last_rumble[i] != r { + self.last_rumble[i] = r; + rumble(i as u16, r.0, r.1); + } + } + if let Some(rgb) = fb.led { + if self.last_led[i] != Some(rgb) { + self.last_led[i] = Some(rgb); + hidout(HidOutput::Led { + pad: i as u8, + r: rgb.0, + g: rgb.1, + b: rgb.2, + }); + } + } + } + } +} diff --git a/crates/punktfunk-host/src/inject/gamepad_windows.rs b/crates/punktfunk-host/src/inject/gamepad_windows.rs index 631e0a1..209fe92 100644 --- a/crates/punktfunk-host/src/inject/gamepad_windows.rs +++ b/crates/punktfunk-host/src/inject/gamepad_windows.rs @@ -1,137 +1,362 @@ -//! Windows virtual gamepad via ViGEmBus — the analogue of the Linux uinput Xbox-360 pad. -//! One virtual Xbox 360 controller per client pad index. GameStream/Moonlight already uses the -//! XInput button/stick/trigger conventions (low 16 button bits, sticks −32768..32767 +Y up, -//! triggers 0..255), so the mapping is ~1:1. +//! Windows virtual Xbox 360 gamepad via the punktfunk **XUSB companion** UMDF driver +//! (`packaging/windows/xusb-driver`) — the in-tree replacement for ViGEmBus. One virtual Xbox 360 +//! controller per client pad index, visible to classic **XInput** (`XInputGetState`) with no kernel +//! bus driver: each pad `SwDeviceCreate`s a `pf_xusb_` devnode (the driver loads on it and +//! registers `GUID_DEVINTERFACE_XUSB`) and the host pushes the XInput state into the shared section +//! `Global\pfxusb-shm-`. GameStream/Moonlight already speak the XInput conventions (low-16 +//! button bits, sticks −32768..32767 +Y up, triggers 0..255), so the state copy is ~1:1. //! -//! Needs the ViGEmBus driver installed (like SudoVDA for the display); absent → gamepad is disabled -//! and the session continues without it. Rumble flows back the *other* way: a game on the host writes -//! force-feedback to the virtual pad, ViGEm's notification API delivers it on a background thread, -//! and [`GamepadManager::pump_rumble`] relays level changes to the client (the universal 0xCA plane), -//! mirroring the Linux `EV_FF` read path. +//! Rumble flows back the other way: a game writes force-feedback via `XInputSetState`, the driver +//! parses the `SET_STATE` packet into the shared section, and [`GamepadManager::pump_rumble`] relays +//! level changes to the client (the universal 0xCA plane), mirroring the Linux `EV_FF` read path. +//! +//! NB: the driver currently maps `Global\pfxusb-shm-0` (hardcoded), so a single pad (index 0) is +//! fully correct; mixed multi-pad needs the driver to read its own index first (same limitation as +//! the DualSense backend). -use crate::gamestream::gamepad::GamepadEvent; -use std::collections::HashMap; -use std::sync::atomic::{AtomicU32, Ordering}; -use std::sync::Arc; -use std::thread::JoinHandle; -use vigem_client::{Client, TargetId, XButtons, XGamepad, Xbox360Wired}; +use crate::gamestream::gamepad::{GamepadEvent, MAX_PADS}; +use anyhow::{anyhow, Result}; +use std::ffi::c_void; +use windows::core::{w, GUID, HRESULT, HSTRING, PCWSTR}; +use windows::Win32::Devices::Enumeration::Pnp::{ + SwDeviceClose, SwDeviceCreate, HSWDEVICE, SW_DEVICE_CREATE_INFO, +}; +use windows::Win32::Foundation::{CloseHandle, HANDLE, INVALID_HANDLE_VALUE}; +use windows::Win32::Security::Authorization::{ + ConvertStringSecurityDescriptorToSecurityDescriptorW, SDDL_REVISION_1, +}; +use windows::Win32::Security::{PSECURITY_DESCRIPTOR, SECURITY_ATTRIBUTES}; +use windows::Win32::System::Memory::{ + CreateFileMappingW, MapViewOfFile, UnmapViewOfFile, FILE_MAP_ALL_ACCESS, + MEMORY_MAPPED_VIEW_ADDRESS, PAGE_READWRITE, +}; +use windows::Win32::System::Threading::{CreateEventW, SetEvent, WaitForSingleObject}; -/// A plugged virtual pad plus its rumble back-channel. The notification thread stores the latest -/// motor levels into `rumble` (packed `large << 8 | small`, both 0..255); [`GamepadManager::pump_rumble`] -/// reads it and emits level changes. Dropping `target` aborts the outstanding notification request, -/// so the thread's `poll` returns an error and it exits on its own — we detach it (per ViGEm's docs, -/// dropping the `JoinHandle` does not stop the thread, but the target-drop abort does). -struct PadEntry { - target: Xbox360Wired>, - rumble: Arc, - last_emitted: u32, - _notif_thread: Option>, +// Shared-section layout — must match `packaging/windows/xusb-driver/src/lib.rs`. +const SHM_SIZE: usize = 64; +const SHM_MAGIC: u32 = 0x5558_4650; // "PFXU" +const OFF_PACKET: usize = 4; +const OFF_BUTTONS: usize = 8; +const OFF_LT: usize = 10; +const OFF_RT: usize = 11; +const OFF_LX: usize = 12; +const OFF_LY: usize = 14; +const OFF_RX: usize = 16; +const OFF_RY: usize = 18; +const OFF_RUMBLE_SEQ: usize = 24; +const OFF_RUMBLE: usize = 28; // large @28, small @29 + +/// Context for the `SwDeviceCreate` completion callback: an event to signal + the HRESULT it reports. +#[repr(C)] +struct SwCreateCtx { + event: HANDLE, + result: HRESULT, } +/// `SwDeviceCreate` fires this once PnP has enumerated the device; stash the result + wake the creator. +unsafe extern "system" fn sw_create_cb( + _dev: HSWDEVICE, + result: HRESULT, + ctx: *const c_void, + _id: PCWSTR, +) { + if !ctx.is_null() { + // SAFETY: ctx is the &mut SwCreateCtx the creator passed; it outlives this callback. + unsafe { + let c = ctx as *mut SwCreateCtx; + (*c).result = result; + let _ = SetEvent((*c).event); + } + } +} + +/// Spawn the `pf_xusb_` companion devnode (hardware id `pf_xusb`, enumerator `punktfunk`). The +/// INF (System class) binds our UMDF driver, which registers the XUSB interface. Unlike the HID pads, +/// no USB compatible-ids are needed — XInput finds the device by the interface GUID, not VID/PID — but +/// we still pass a deterministic non-null `pContainerId` (the null-sentinel trips an `xinput1_4` +/// slot-skip bug). `SwDeviceClose` removes it on drop. +fn create_swdevice(index: u8) -> Result { + let hwids: Vec = "pf_xusb".encode_utf16().chain([0u16, 0u16]).collect(); + let instid: Vec = format!("pf_xusb_{index}") + .encode_utf16() + .chain(std::iter::once(0)) + .collect(); + let desc: Vec = "punktfunk Virtual Xbox 360 (XUSB)" + .encode_utf16() + .chain(std::iter::once(0)) + .collect(); + // The pad index, stamped into the device Location — the driver reads it to map `pfxusb-shm-` + // (multi-pad). The buffer must outlive the SwDeviceCreate call (it does; we wait on the event). + let loc: Vec = format!("{index}") + .encode_utf16() + .chain(std::iter::once(0)) + .collect(); + let container = GUID::from_values(0x5046_5855, 0x0000, 0x0000, [0, 0, 0, 0, 0, 0, 0, index]); + + // SAFETY: zeroed then the fields we use are set; the buffers + container outlive the call. + let mut info: SW_DEVICE_CREATE_INFO = unsafe { std::mem::zeroed() }; + info.cbSize = std::mem::size_of::() as u32; + info.pszInstanceId = PCWSTR(instid.as_ptr()); + info.pszzHardwareIds = PCWSTR(hwids.as_ptr()); + info.pContainerId = &container; + info.pszDeviceDescription = PCWSTR(desc.as_ptr()); + info.pszDeviceLocation = PCWSTR(loc.as_ptr()); + info.CapabilityFlags = 0x0000_000B; // DriverRequired | SilentInstall | Removable + + // SAFETY: a manual-reset, initially-unsignaled, unnamed event. + let event = unsafe { CreateEventW(None, true, false, PCWSTR::null())? }; + let mut ctx = SwCreateCtx { + event, + result: HRESULT(0), + }; + // SAFETY: info + buffers + ctx outlive the call (we wait on the event before returning). + let hsw = match unsafe { + SwDeviceCreate( + w!("punktfunk"), + w!("HTREE\\ROOT\\0"), + &info, + None, + Some(sw_create_cb), + Some(&mut ctx as *mut SwCreateCtx as *const c_void), + ) + } { + Ok(h) => h, + Err(e) => { + // SAFETY: event is valid. + unsafe { + let _ = CloseHandle(event); + } + return Err(anyhow!("SwDeviceCreate(pf_xusb) failed: {e}")); + } + }; + // SAFETY: event valid; block until PnP finishes enumerating, then check the callback result. + unsafe { + WaitForSingleObject(event, 10_000); + let _ = CloseHandle(event); + } + if ctx.result.is_err() { + // SAFETY: hsw is the handle SwDeviceCreate returned. + unsafe { SwDeviceClose(hsw) }; + return Err(anyhow!( + "SwDeviceCreate(pf_xusb) enumeration failed: {:?}", + ctx.result + )); + } + Ok(hsw) +} + +/// A single virtual Xbox 360 pad: the `pf_xusb_` devnode plus the mapped shared section. +struct XusbWinPad { + hsw: Option, + map: HANDLE, + view: *mut u8, + packet: u32, + last_rumble_seq: u32, +} + +impl XusbWinPad { + /// Create + map `Global\pfxusb-shm-`, stamp the magic, then spawn the devnode. + fn open(index: u8) -> Result { + let name = HSTRING::from(format!("Global\\pfxusb-shm-{index}")); + + // Permissive DACL so the WUDFHost (whatever account) can open the section. + let mut psd = PSECURITY_DESCRIPTOR::default(); + // SAFETY: SDDL literal valid; psd receives an OS-freed descriptor (host-lifetime — fine). + unsafe { + ConvertStringSecurityDescriptorToSecurityDescriptorW( + w!("D:(A;;GA;;;WD)"), + SDDL_REVISION_1, + &mut psd, + None, + )?; + } + let sa = SECURITY_ATTRIBUTES { + nLength: std::mem::size_of::() as u32, + lpSecurityDescriptor: psd.0, + bInheritHandle: false.into(), + }; + // SAFETY: anonymous (pagefile-backed) section of SHM_SIZE bytes with the SDDL above. + let map = unsafe { + CreateFileMappingW( + INVALID_HANDLE_VALUE, + Some(&sa), + PAGE_READWRITE, + 0, + SHM_SIZE as u32, + PCWSTR(name.as_ptr()), + )? + }; + // SAFETY: map is a valid section handle; map the whole thing. + let view = unsafe { MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE) }; + if view.Value.is_null() { + // SAFETY: map is valid. + unsafe { + let _ = CloseHandle(map); + } + return Err(anyhow!("MapViewOfFile failed for {name}")); + } + let base = view.Value as *mut u8; + // Zero the section then stamp the magic LAST (the driver only accepts it once magic is set). + // SAFETY: base points at SHM_SIZE writable bytes. + unsafe { + std::ptr::write_bytes(base, 0, SHM_SIZE); + std::ptr::write_unaligned(base as *mut u32, SHM_MAGIC); + } + let hsw = match create_swdevice(index) { + Ok(h) => Some(h), + Err(e) => { + tracing::warn!(error = %format!("{e:#}"), "SwDeviceCreate failed; XUSB devnode unavailable"); + None + } + }; + Ok(XusbWinPad { + hsw, + map, + view: base, + packet: 0, + last_rumble_seq: 0, + }) + } + + /// Publish the XInput state to the section and bump the packet number (XInput uses it to detect + /// change). `buttons` is the XINPUT_GAMEPAD_* bitmap; sticks are i16, triggers u8. + #[allow(clippy::too_many_arguments)] + fn write_state(&mut self, buttons: u16, lt: u8, rt: u8, lx: i16, ly: i16, rx: i16, ry: i16) { + self.packet = self.packet.wrapping_add(1); + // SAFETY: view points at SHM_SIZE bytes; all offsets are in range. + unsafe { + std::ptr::write_unaligned(self.view.add(OFF_BUTTONS) as *mut u16, buttons); + *self.view.add(OFF_LT) = lt; + *self.view.add(OFF_RT) = rt; + std::ptr::write_unaligned(self.view.add(OFF_LX) as *mut i16, lx); + std::ptr::write_unaligned(self.view.add(OFF_LY) as *mut i16, ly); + std::ptr::write_unaligned(self.view.add(OFF_RX) as *mut i16, rx); + std::ptr::write_unaligned(self.view.add(OFF_RY) as *mut i16, ry); + std::ptr::write_unaligned(self.view.add(OFF_PACKET) as *mut u32, self.packet); + } + } + + /// Poll the section for a game's rumble (the driver bumps `rumble_seq` on each SET_STATE). Returns + /// `(large, small)` motor levels (0..=255) when a new one arrived. + fn service(&mut self) -> Option<(u8, u8)> { + // SAFETY: view points at SHM_SIZE bytes. + let seq = unsafe { std::ptr::read_unaligned(self.view.add(OFF_RUMBLE_SEQ) as *const u32) }; + if seq == self.last_rumble_seq { + return None; + } + self.last_rumble_seq = seq; + // SAFETY: rumble bytes at OFF_RUMBLE / OFF_RUMBLE+1. + let (large, small) = + unsafe { (*self.view.add(OFF_RUMBLE), *self.view.add(OFF_RUMBLE + 1)) }; + Some((large, small)) + } +} + +impl Drop for XusbWinPad { + fn drop(&mut self) { + // SAFETY: hsw (if any) owns the devnode; view/map from MapViewOfFile/CreateFileMappingW. + unsafe { + if let Some(h) = self.hsw { + SwDeviceClose(h); + } + let _ = UnmapViewOfFile(MEMORY_MAPPED_VIEW_ADDRESS { + Value: self.view as *mut c_void, + }); + let _ = CloseHandle(self.map); + } + } +} + +/// All virtual Xbox 360 pads of a session — the Windows analogue of the Linux uinput-xpad manager, +/// now backed by the XUSB companion driver. Same method surface (`new`/`handle`/`pump_rumble`) the +/// session input thread already drives. pub struct GamepadManager { - client: Option>, - pads: HashMap, + pads: Vec>, + last_rumble: Vec<(u8, u8)>, + broken: bool, +} + +impl Default for GamepadManager { + fn default() -> GamepadManager { + GamepadManager::new() + } } impl GamepadManager { pub fn new() -> GamepadManager { - let client = match Client::connect() { - Ok(c) => { - tracing::info!("ViGEmBus connected (virtual Xbox 360 gamepads)"); - Some(Arc::new(c)) - } - Err(e) => { - tracing::warn!( - error = format!("{e:?}"), - "ViGEmBus unavailable — gamepad disabled (install ViGEmBus)" - ); - None - } - }; GamepadManager { - client, - pads: HashMap::new(), + pads: (0..MAX_PADS).map(|_| None).collect(), + last_rumble: vec![(0, 0); MAX_PADS], + broken: false, } } - /// Lazily plug pad `index` on its first event, arming the rumble notification thread. Returns - /// `None` if ViGEmBus is unavailable or the pad failed to plug. - fn ensure_pad(&mut self, index: u8) -> Option<&mut PadEntry> { - if !self.pads.contains_key(&index) { - let client = self.client.clone()?; - let mut target = Xbox360Wired::new(client, TargetId::XBOX360_WIRED); - if let Err(e) = target.plugin() { - tracing::warn!(error = format!("{e:?}"), "ViGEm pad plugin failed"); - return None; - } - let _ = target.wait_ready(); - // Arm the force-feedback back-channel: a background thread writes each notification's - // motor levels into the shared atomic; the input thread drains changes via pump_rumble. - let rumble = Arc::new(AtomicU32::new(0)); - let notif_thread = match target.request_notification() { - Ok(req) => { - let sink = rumble.clone(); - Some(req.spawn_thread(move |_req, n| { - sink.store( - ((n.large_motor as u32) << 8) | n.small_motor as u32, - Ordering::Relaxed, - ); - })) - } - Err(e) => { - tracing::warn!( - error = format!("{e:?}"), - "ViGEm rumble notification unavailable — pad runs without force feedback" - ); - None - } - }; - self.pads.insert( - index, - PadEntry { - target, - rumble, - last_emitted: 0, - _notif_thread: notif_thread, - }, - ); + fn ensure(&mut self, idx: usize) { + if idx >= MAX_PADS || self.pads[idx].is_some() || self.broken { + return; + } + match XusbWinPad::open(idx as u8) { + Ok(p) => { + tracing::info!( + index = idx, + "virtual Xbox 360 created (Windows XUSB companion)" + ); + self.pads[idx] = Some(p); + self.last_rumble[idx] = (0, 0); + } + Err(e) => { + tracing::error!(error = %format!("{e:#}"), "virtual Xbox 360 creation failed — controller input disabled (is the pf_xusb driver installed?)"); + self.broken = true; + } } - self.pads.get_mut(&index) } pub fn handle(&mut self, ev: &GamepadEvent) { let GamepadEvent::State(f) = ev else { return; // Arrival metadata — the pad is created lazily on the first State }; - let Some(entry) = self.ensure_pad(f.index.max(0) as u8) else { + let idx = f.index.max(0) as usize; + if idx >= MAX_PADS { return; - }; - let gp = XGamepad { - buttons: XButtons { - raw: (f.buttons & 0xffff) as u16, - }, - left_trigger: f.left_trigger, - right_trigger: f.right_trigger, - thumb_lx: f.ls_x, - thumb_ly: f.ls_y, - thumb_rx: f.rs_x, - thumb_ry: f.rs_y, - }; - let _ = entry.target.update(&gp); + } + // Unplugs: drop any allocated pad whose mask bit cleared. + for (i, slot) in self.pads.iter_mut().enumerate() { + if slot.is_some() && f.active_mask & (1 << i) == 0 { + tracing::info!(index = i, "controller unplugged (Xbox 360/Windows)"); + *slot = None; + self.last_rumble[i] = (0, 0); + } + } + if f.active_mask & (1 << idx) == 0 { + return; + } + self.ensure(idx); + if let Some(pad) = self.pads[idx].as_mut() { + pad.write_state( + (f.buttons & 0xffff) as u16, + f.left_trigger, + f.right_trigger, + f.ls_x, + f.ls_y, + f.rs_x, + f.rs_y, + ); + } } - /// Relay any changed rumble level to the client. The notification thread keeps `rumble` current; - /// we emit only on change (the input thread re-sends the steady state every 500 ms to heal drops). - /// ViGEm motors are 0..255; the wire carries 0..65535, so scale by 257 (255 → 65535). `large` - /// (low-frequency) maps to the universal datagram's `low`, `small` (high-frequency) to `high`. + /// Relay any changed rumble level to the client. XUSB motors are 0..255; the wire carries + /// 0..65535, so scale by 257. `large` (low-frequency) → the datagram's `low`, `small` + /// (high-frequency) → `high` — matching the other backends. pub fn pump_rumble(&mut self, mut send: impl FnMut(u16, u16, u16)) { - for (idx, entry) in self.pads.iter_mut() { - let packed = entry.rumble.load(Ordering::Relaxed); - if packed != entry.last_emitted { - entry.last_emitted = packed; - let large = ((packed >> 8) & 0xff) as u16; - let small = (packed & 0xff) as u16; - send(*idx as u16, large * 257, small * 257); + for i in 0..self.pads.len() { + let Some(pad) = self.pads[i].as_mut() else { + continue; + }; + if let Some((large, small)) = pad.service() { + if self.last_rumble[i] != (large, small) { + self.last_rumble[i] = (large, small); + send(i as u16, large as u16 * 257, small as u16 * 257); + } } } } diff --git a/crates/punktfunk-host/src/main.rs b/crates/punktfunk-host/src/main.rs index bd88883..4886019 100644 --- a/crates/punktfunk-host/src/main.rs +++ b/crates/punktfunk-host/src/main.rs @@ -209,7 +209,6 @@ fn real_main() -> Result<()> { #[cfg(target_os = "windows")] Some("dualsense-windows-test") => { use crate::gamestream::gamepad::{GamepadEvent, GamepadFrame}; - use inject::dualsense_windows::DualSenseWindowsManager; use std::time::{Duration, Instant}; let secs: u64 = args .iter() @@ -217,38 +216,95 @@ fn real_main() -> Result<()> { .nth(1) .and_then(|s| s.parse().ok()) .unwrap_or(20); - let mut mgr = DualSenseWindowsManager::new(); - // Arrival creates the pad (SwDeviceCreate + section); State pushes the report. - mgr.handle(&GamepadEvent::Arrival { - index: 0, - kind: 2, - capabilities: 0, - }); - println!( - "virtual DualSense up — cycling Cross + sweeping the left stick for {secs}s. Watch it \ - in joy.cpl / Steam / a game; any rumble / lightbar / trigger the game sends prints below." - ); - let deadline = Instant::now() + Duration::from_secs(secs); - let (mut i, mut last) = (0i32, Instant::now()); - while Instant::now() < deadline { - // Surface a game's feedback: rumble (universal) + lightbar / player-LED / adaptive - // triggers (DualSense-only) coming back over the shared section. - mgr.pump( - |pad, lo, hi| println!(" rumble from game: pad={pad} low={lo} high={hi}"), - |o| println!(" hid output from game: {o:?}"), + // `--index N` creates pad `pf_pad_N` (default 0) — use a spare index (e.g. 1) to test + // alongside a running host that already holds pad 0. `--ds4` drives the DualShock 4 + // backend instead of the DualSense one. + let idx: u8 = args + .iter() + .skip_while(|a| *a != "--index") + .nth(1) + .and_then(|s| s.parse().ok()) + .unwrap_or(0); + let ds4 = args.iter().any(|a| a == "--ds4"); + let xbox = args.iter().any(|a| a == "--xbox"); + // Same drive loop for either backend (identical method surface): Arrival creates the pad, + // State pushes a cycling report, pump surfaces a game's rumble/lightbar feedback. + macro_rules! drive { + ($mgr:expr, $label:expr) => {{ + let mut mgr = $mgr; + mgr.handle(&GamepadEvent::Arrival { + index: idx, + kind: 2, + capabilities: 0, + }); + println!( + "virtual {} up — cycling Cross + sweeping the left stick for {secs}s. Watch \ + it in joy.cpl / Steam / a game; any feedback the game sends prints below.", + $label + ); + let deadline = Instant::now() + Duration::from_secs(secs); + let (mut i, mut last) = (0i32, Instant::now()); + while Instant::now() < deadline { + mgr.pump( + |pad, lo, hi| { + println!(" rumble from game: pad={pad} low={lo} high={hi}") + }, + |o| println!(" hid output from game: {o:?}"), + ); + if last.elapsed() >= Duration::from_millis(400) { + last = Instant::now(); + i += 1; + let buttons = if i % 2 == 0 { + punktfunk_core::input::gamepad::BTN_A // Cross + } else { + 0 + }; + let lx = (((i % 64) - 32) * 1024) as i16; // sweep left stick X + mgr.handle(&GamepadEvent::State(GamepadFrame { + index: idx as i16, + active_mask: 1 << idx, + buttons, + left_trigger: 0, + right_trigger: 0, + ls_x: lx, + ls_y: 0, + rs_x: 0, + rs_y: 0, + })); + } + std::thread::sleep(Duration::from_millis(15)); + } + }}; + } + if xbox { + // Xbox 360 via the XUSB companion: a different surface (handle + pump_rumble, no + // HID-output plane), so drive it inline rather than via the macro. + let mut mgr = inject::gamepad::GamepadManager::new(); + mgr.handle(&GamepadEvent::Arrival { + index: idx, + kind: 1, + capabilities: 0, + }); + println!( + "virtual Xbox 360 (XUSB) up — sweeping LS + toggling A for {secs}s. Check with \ + an XInput game or xinputtest.exe." ); - if last.elapsed() >= Duration::from_millis(400) { - last = Instant::now(); - i += 1; - let buttons = if i % 2 == 0 { - punktfunk_core::input::gamepad::BTN_A // Cross + let deadline = Instant::now() + Duration::from_secs(secs); + let mut t = 0i32; + while Instant::now() < deadline { + mgr.pump_rumble(|pad, lo, hi| { + println!(" rumble from game: pad={pad} low={lo} high={hi}") + }); + t += 1; + let lx = (((t % 200) - 100) * 327).clamp(-32768, 32767) as i16; // sweep ±32700 + let buttons = if (t / 67) % 2 == 0 { + punktfunk_core::input::gamepad::BTN_A } else { 0 }; - let lx = (((i % 64) - 32) * 1024) as i16; // sweep left stick X mgr.handle(&GamepadEvent::State(GamepadFrame { - index: 0, - active_mask: 1, + index: idx as i16, + active_mask: 1 << idx, buttons, left_trigger: 0, right_trigger: 0, @@ -257,8 +313,18 @@ fn real_main() -> Result<()> { rs_x: 0, rs_y: 0, })); + std::thread::sleep(Duration::from_millis(15)); } - std::thread::sleep(Duration::from_millis(15)); + } else if ds4 { + drive!( + inject::dualshock4_windows::DualShock4WindowsManager::new(), + "DualShock 4" + ); + } else { + drive!( + inject::dualsense_windows::DualSenseWindowsManager::new(), + "DualSense" + ); } println!("dualsense-windows-test: done (devnode removed)"); Ok(()) diff --git a/crates/punktfunk-host/src/punktfunk1.rs b/crates/punktfunk-host/src/punktfunk1.rs index a8c1990..8e18382 100644 --- a/crates/punktfunk-host/src/punktfunk1.rs +++ b/crates/punktfunk-host/src/punktfunk1.rs @@ -1167,7 +1167,8 @@ fn mic_service_thread(rx: std::sync::mpsc::Receiver>) { /// The session's virtual-gamepad backend, resolved once per session (sessions run serially). /// /// - `Xbox360` — uinput X-Box-360 pads on Linux ([`GamepadManager`](crate::inject::gamepad::GamepadManager)), -/// ViGEm on Windows. Also the X-Box One/Series identity (`PUNKTFUNK_GAMEPAD=xboxone`): the same +/// the in-tree XUSB companion driver (classic XInput) on Windows. Also the X-Box One/Series identity +/// (`PUNKTFUNK_GAMEPAD=xboxone`): the same /// backend with the One/Series USB VID/PID so games show One/Series glyphs (XInput-identical /// otherwise). The Linux pad carries it as a [`PadIdentity`](crate::inject::gamepad::PadIdentity). /// - `DualSense` (`PUNKTFUNK_GAMEPAD=dualsense`) — virtual DualSense via UHID + `hid-playstation`, @@ -1187,6 +1188,8 @@ enum PadBackend { DualShock4(crate::inject::dualshock4::DualShock4Manager), #[cfg(target_os = "windows")] DualSenseWindows(crate::inject::dualsense_windows::DualSenseWindowsManager), + #[cfg(target_os = "windows")] + DualShock4Windows(crate::inject::dualshock4_windows::DualShock4WindowsManager), } impl PadBackend { @@ -1213,11 +1216,20 @@ impl PadBackend { _ => {} } #[cfg(target_os = "windows")] - if kind == GamepadPref::DualSense { - tracing::info!("gamepad backend: virtual DualSense (Windows UMDF shm channel)"); - return PadBackend::DualSenseWindows( - crate::inject::dualsense_windows::DualSenseWindowsManager::new(), - ); + match kind { + GamepadPref::DualSense => { + tracing::info!("gamepad backend: virtual DualSense (Windows UMDF shm channel)"); + return PadBackend::DualSenseWindows( + crate::inject::dualsense_windows::DualSenseWindowsManager::new(), + ); + } + GamepadPref::DualShock4 => { + tracing::info!("gamepad backend: virtual DualShock 4 (Windows UMDF shm channel)"); + return PadBackend::DualShock4Windows( + crate::inject::dualshock4_windows::DualShock4WindowsManager::new(), + ); + } + _ => {} } let _ = kind; PadBackend::Xbox360(crate::inject::gamepad::GamepadManager::new()) @@ -1232,6 +1244,8 @@ impl PadBackend { PadBackend::DualShock4(m) => m.handle(ev), #[cfg(target_os = "windows")] PadBackend::DualSenseWindows(m) => m.handle(ev), + #[cfg(target_os = "windows")] + PadBackend::DualShock4Windows(m) => m.handle(ev), } } @@ -1246,6 +1260,8 @@ impl PadBackend { PadBackend::DualShock4(m) => m.apply_rich(_rich), #[cfg(target_os = "windows")] PadBackend::DualSenseWindows(m) => m.apply_rich(_rich), + #[cfg(target_os = "windows")] + PadBackend::DualShock4Windows(m) => m.apply_rich(_rich), } } @@ -1269,6 +1285,8 @@ impl PadBackend { PadBackend::DualShock4(m) => m.pump(rumble, hidout), #[cfg(target_os = "windows")] PadBackend::DualSenseWindows(m) => m.pump(rumble, hidout), + #[cfg(target_os = "windows")] + PadBackend::DualShock4Windows(m) => m.pump(rumble, hidout), } } @@ -1286,6 +1304,8 @@ impl PadBackend { PadBackend::DualShock4(m) => m.heartbeat(std::time::Duration::from_millis(8)), #[cfg(target_os = "windows")] PadBackend::DualSenseWindows(m) => m.heartbeat(std::time::Duration::from_millis(8)), + #[cfg(target_os = "windows")] + PadBackend::DualShock4Windows(m) => m.heartbeat(std::time::Duration::from_millis(8)), } } } @@ -1570,10 +1590,11 @@ fn synthetic_stream( /// Pure selection of the session's virtual-gamepad backend: the client's explicit `pref` wins, /// then the host's `PUNKTFUNK_GAMEPAD` env var (under a client `Auto`), then X-Box 360. /// -/// `linux` is whether this is a Linux host (uinput + UHID). The rich UHID pads (DualSense, DualShock -/// 4) need it — off Linux any such wish degrades to X-Box 360 (never an error: a session without rich -/// pads still streams). X-Box One/Series is a distinct uinput *identity* on Linux, but XInput-identical -/// to the 360 pad on Windows (ViGEm has no One target), so it degrades to `Xbox360` there. +/// `linux`/`windows` flag the host platform. DualSense and DualShock 4 each have both a Linux (UHID +/// hid-playstation) and a Windows (UMDF minidriver) backend; on any other platform such a wish degrades +/// to X-Box 360 (never an error: a session without rich pads still streams). X-Box One/Series is a +/// distinct uinput *identity* on Linux, but XInput-identical to the 360 pad on Windows (the XUSB +/// companion presents a 360 identity), so it degrades to `Xbox360` there. fn pick_gamepad(pref: GamepadPref, env: Option<&str>, linux: bool, windows: bool) -> GamepadPref { let want = match pref { GamepadPref::Auto => env @@ -1582,9 +1603,9 @@ fn pick_gamepad(pref: GamepadPref, env: Option<&str>, linux: bool, windows: bool explicit => explicit, }; match want { - // DualSense: Linux UHID hid-playstation, or the Windows UMDF minidriver backend. + // DualSense / DualShock 4: Linux UHID hid-playstation, or the Windows UMDF minidriver backend. GamepadPref::DualSense if linux || windows => GamepadPref::DualSense, - GamepadPref::DualShock4 if linux => GamepadPref::DualShock4, + GamepadPref::DualShock4 if linux || windows => GamepadPref::DualShock4, // One/Series: a real, distinct uinput identity on Linux; folded into the 360 backend on // Windows (XInput can't tell them apart anyway). GamepadPref::XboxOne if linux => GamepadPref::XboxOne, @@ -3092,10 +3113,11 @@ mod tests { ); assert_eq!(pick_gamepad(DualSense, None, false, false), Xbox360); assert_eq!(pick_gamepad(Auto, Some("dualsense"), false, false), Xbox360); - // DualShock 4: Linux-only (UHID); degrades to X-Box 360 off it (including Windows). + // DualShock 4: honored on Linux (UHID) AND Windows (UMDF minidriver); degrades elsewhere. assert_eq!(pick_gamepad(DualShock4, None, true, false), DualShock4); assert_eq!(pick_gamepad(Auto, Some("ps4"), true, false), DualShock4); - assert_eq!(pick_gamepad(DualShock4, None, false, true), Xbox360); + assert_eq!(pick_gamepad(DualShock4, None, false, true), DualShock4); + assert_eq!(pick_gamepad(DualShock4, None, false, false), Xbox360); // X-Box One: a distinct uinput identity on Linux, folded into the 360 pad on Windows. assert_eq!(pick_gamepad(XboxOne, None, true, false), XboxOne); assert_eq!(pick_gamepad(Auto, Some("series"), true, false), XboxOne); diff --git a/docs/windows-dualsense-game-detection.md b/docs/windows-dualsense-game-detection.md index d42d4e6..f135879 100644 --- a/docs/windows-dualsense-game-detection.md +++ b/docs/windows-dualsense-game-detection.md @@ -19,17 +19,124 @@ one agent's memory). Run the experiments **on the Windows host** (`.173`, repo a the motors, host forwards `0xCA` — log: `rumble: forwarding to client (0xCA) low=16128 high=16128`). The break is the **client** (macOS) not rendering `0xCA` onto the physical pad. Separate task/agent. -## Root-cause hypothesis (the thing to confirm/fix) +## Root cause — CONFIRMED (2026-06-22, run live on the interactive desktop, console session 3) -The device is **software-enumerated**: `SWD\PUNKTFUNK\PF_PAD_0` → child `HID\VID_054C&PID_0CE6`. It is NOT -a real USB or Bluetooth device. SDL/HIDAPI enumerate any HID by VID/PID (incl. SWD) — so they see it. A -game's *native* DualSense path is pickier. Two likely causes: -1. **Windows.Gaming.Input (WGI) / GameInput exclude SWD (software) HID devices** that raw-HID - enumeration includes. Many modern titles use these. -2. **USB-vs-Bluetooth detection by device-path prefix.** Native DS5 code picks the report format (64-byte - USB report `0x01` vs 78-byte BT report `0x31`) from the connection type. If it keys off the device - path (`USB\…` vs `BTHENUM\…`) rather than the report length, our `SWD\…` path matches neither and it - mis-detects. (SDL keys off the *report length* = 64 → USB → works.) +The break is the device's **PnP identity / device-interface path**, not the HID descriptor or feature +reports. `hidclass` derives the HID child's path token and its `HID\VID_054C&PID_0CE6` hardware-ids from the +**parent bus device's hardware-id**. Our parent is the software (SWD) devnode `SWD\PUNKTFUNK\PF_PAD_0` whose +hardware-id is `pf_dualsense` (no VID/PID), so hidclass emits only the *VendorID+usage* fallback and **no +PID**. Measured on this box (one virtual pad live + one real 8BitDo present): + +HID-child hardware-ids (`DEVPKEY_Device_HardwareIds`, CompatibleIds empty): +`HID\pf_dualsense` · `HID\VID_054C&UP:0001_U:0005` · `HID_DEVICE_SYSTEM_GAME` · `HID_DEVICE_UP:0001_U:0005` +· `HID_DEVICE` — **note the absent `HID\VID_054C&PID_0CE6`.** `HIDD_ATTRIBUTES` itself is correct (VID 054C +/ PID 0CE6), which is why attribute-readers work. + +Device-interface paths (from `HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{4d1e55b2-…}`): + +| Device | HID interface path | +| --- | --- | +| **Ours (virtual)** | `\\?\HID#punktfunk#1&ca418da&0&0000#{…}` — **no `VID_/PID_` token** | +| Real DualShock 4 (USB, registry remnant) | `\\?\HID#VID_054C&PID_05C4&REV_0100#…` | +| Real DualSense (BT, registry remnant) | `\\?\HID#{00001124-…}_VID&0002054c_PID&0ce6#…` | + +**Cross-API enumeration (the decisive experiment — impossible over SSH, run live in the console session):** + +| API | Sees our virtual DS5? | Identity reported | Reads from | +| --- | --- | --- | --- | +| SDL3 / HIDAPI | ✅ | 054C:0CE6, type=PS5 | `HIDD_ATTRIBUTES` → Steam works | +| RawInput | ✅ | 054C:0CE6 | `HIDD_ATTRIBUTES` | +| WGI `RawGameController` | ✅ | 054C:0CE6 | `HIDD_ATTRIBUTES` | +| WGI `Gamepad` | ❌ empty | — | (empty for *all* pads on this box — no Xbox-profile pad; not DS-specific) | +| **MS GameInput** | ✅ enumerates it | **vid=0x0000 pid=0x0000** | **PnP path / hardware-ids** | +| Cyberpunk native PS5 | ❌ | — | needs the DS5 VID/PID identity | + +The GameInput result is the clincher: it **does** enumerate our pad — descriptor fingerprint matches exactly +(15 buttons, 6 axes, 1 hat, usage Game Pad 0x05) — but reports **vid/pid = 0**, while it reads the real +8BitDo's `vid=0x3434` correctly. So GameInput (and, by the same logic, a native PS5 path) takes VID/PID from +the **PnP device path / hardware-ids, NOT from `HIDD_ATTRIBUTES`**, and ours carry no `VID_054C&PID_0CE6`. +Everything that reads attributes directly (SDL / RawInput / WGI-raw) is fine; everything that keys off the +device *identity/path* (GameInput, native DualSense detection) sees a generic, unidentified gamepad → no +PS5 path. + +**⇒ The fix must put `VID_054C&PID_0CE6` into the device-interface path and the `HID\VID&PID` hardware-ids** +(give the device a real-USB-like PnP identity), not merely correct `HIDD_ATTRIBUTES`. See "Fix options". + +**Secondary driver gaps found (not the detection blocker, but fix while here):** +- `IOCTL_HID_GET_STRING` (id 4, ioctl `0x000b0013`) returns `STATUS_NOT_IMPLEMENTED` — a game polls it + repeatedly (seen live in `pfds-driver.log`). Implement manufacturer / product / serial strings + (`"DualSense Wireless Controller"`, a serial). Native PS5 code can read the serial to tell USB from BT. +- `DS_FEATURE_CALIBRATION` is **42** bytes but the report descriptor declares feature `0x05` as **41** + (`0x95 0x28` = 40 data + 1 id). Trim to 41 (motion-only; SDL accepts it regardless). + +## Fix — implemented & validated at the identity layer (2026-06-22) + +`create_swdevice` (`inject/dualsense_windows.rs`) now sets, via **`SW_DEVICE_CREATE_INFO` struct fields** +(NOT `pProperties` — empirically a `DEVPROPERTY` write of these PnP-owned identity keys is ignored; the +create-time struct fields are the supported lever, confirmed on `.173`): +- **`pszzCompatibleIds`** = `USB\VID_054C&PID_0CE6`, `USB\Class_03&SubClass_00&Prot_00`, `USB\Class_03` + (Windows appends `SWD\Generic`). HIDAPI/SDL/libScePad walk HID-child → `CM_Get_Parent` → this parent's + CompatibleIds and string-match `"USB"` → **`bus_type` now resolves to USB** (was UNKNOWN). +- **`pszzHardwareIds`** = `pf_dualsense` **first** (so the INF still binds our UMDF driver), then + `USB\VID_054C&PID_0CE6&REV_0100`, `USB\VID_054C&PID_0CE6`. hidclass then derives the real-DS5 child ids + **`HID\VID_054C&PID_0CE6[&REV_0100]`** (previously only `HID\VID_054C&UP:0001_U:0005`). +- **`pContainerId`** = a deterministic per-pad GUID `{50464453-0000-0000-0000-00000000000}` ("PFDS") + (avoids the null-sentinel-ContainerId `xinput1_4` slot-skip bug; groups the pad's devnodes). + +**Validated live** (real shipping path, `dualsense-windows-test --index 1` alongside the running service's +pad 0): INF still binds (`Service=MsHidUmdf`), parent CompatibleIds/HardwareIds + per-pad ContainerId set, +the HID child gains `HID\VID_054C&PID_0CE6`, and the HIDAPI parent-walk reports **bus_type=USB**. +SDL / RawInput / WGI `RawGameController` identity stays correct (054C:0CE6). + +**Remaining gap (NOT fixed by the above): GameInput VID/PID still reads 0.** GameInput parses VID/PID from +the HID child's **instance path** (`HID\punktfunk\1&…`), which carries no `VID_…&PID_…` token; neither +CompatibleIds nor HardwareIds change the instance path. Only a real USB-bus instance path +(`HID\VID_054C&PID_0CE6\…`) does — i.e. a **ViGEm-style KMDF USB-emulating bus driver** (the rank-3, last +resort). Pursue only if a target title uses GameInput AND the identity fix above doesn't satisfy it; prior +art (HIDMaestro) shows pure user-mode pads ARE accepted by WGI/GameInput, so other parity (descriptor / +strings / mapping) may matter more than a genuine USB bus. + +## Next steps + +> **Deployed to `.173` (2026-06-22):** the host identity fix is live in the `PunktfunkHost` service (release +> rebuilt + restarted) and the driver fixes are installed + signed (`oem74.inf`, `punktfunk-ds-test` cert). +> The box is ready for the decisive on-glass test. A rollback copy of the prior driver is at +> `C:\Users\Public\giprobe\driver-backup-oem74`. + +1. **Decisive on-glass test (only the user can run):** launch Cyberpunk 2077 with Steam Input OFF against a + virtual DS5 carrying the new identity; check the in-game glyphs/prompt switch to DualSense. Cleanest + single-pad test (frees the service's pad 0 so only the new-identity pad is present): + `sc stop PunktfunkHost` → `target\debug\punktfunk-host.exe dualsense-windows-test --index 0 --seconds 600` + (new identity + live cycling Cross/stick), launch the game; then deploy the release + restart with + `scripts\windows\deploy-host.ps1`. +2. **Driver-side correctness — DONE & installed (2026-06-22).** Rebuilt/resigned/reinstalled per the recipe + below; validated live (`hidstrings` probe + `pfds-driver.log`): + - `IOCTL_HID_GET_STRING` now implemented (was `STATUS_NOT_IMPLEMENTED`). **Discovery:** Windows polls + this device's string slots with low-word ids **`0x0E`/`0x0F`/`0x10`** (lang `0x0409`) cyclically — NOT + the `0/1/2` `HID_STRING_ID_*` constants. The handler maps them (+ `0/1/2` as fallbacks): + `0x0E`→manufacturer "Sony Interactive Entertainment", `0x0F`→product "DualSense Wireless Controller", + `0x10`→serial "35533AD6E774" (the `0x09` pairing-report MAC). Verified: `HidD_GetManufacturer/Product/ + SerialNumberString` now return those three distinct strings. + - `DS_FEATURE_CALIBRATION` trimmed 42 → 41 bytes (1 id + 40 data) to match the descriptor's feature + `0x05` (`0x95 0x28`). + - The repo source (`packaging/windows/dualsense-driver/src/lib.rs`) and the m0 build copy were diverged + by *formatting only*; they are now back in sync (the repo file was copied to m0 before building). +3. If a GameInput-only title needs the real VID/PID → the rank-3 KMDF USB-emulating bus driver. + +## On-box experiment tooling (built 2026-06-22, `C:\Users\Public\giprobe\`) +- `probe.cpp` (+`build.bat`) — GameInput enumeration/fingerprint via `LoadLibrary("GameInput.dll")` + + `GameInputCreate`/`RegisterDeviceCallback` (GDK header). Prints each device's vid/pid/usage/counts — + this is what proved GameInput reads our pad as vid=0. +- `swexp.cpp` (+`build-swexp.bat`) — standalone `SwDeviceCreate` identity experiment: variations for + `pszzCompatibleIds` (struct field) vs `DEVPKEY_Device_CompatibleIds` (pProperties — ignored), + `pszzHardwareIds` USB ids, `pContainerId`. Create at a spare instance id, hold, inspect. Built with the + VS18 MSVC toolchain via `vcvars64.bat`. +- WGI probe: Windows PowerShell **5.1** WinRT projection of `RawGameController`/`Gamepad` (pump the message + loop; subscribe `RawGameControllerAdded` to kick enumeration). +- Parent-walk bus check: from the HID child, `DEVPKEY_Device_Parent` → that node's + `DEVPKEY_Device_CompatibleIds`, match `^USB`/`^BTH` — mirrors HIDAPI's `hid_internal_detect_bus_type()`. +- NOTE: the agent shell's PowerShell tool chokes on inline `@'…'@` here-strings feeding `Add-Type` (throws + a spurious "Remove-Item on system path '/' is blocked"); write C#/scripts to a file and run them instead. ## How to reproduce / iterate (on `.173`) diff --git a/packaging/windows/dualsense-driver/pf_dualsense.inx b/packaging/windows/dualsense-driver/pf_dualsense.inx index 36615bc..10bb2a4 100644 --- a/packaging/windows/dualsense-driver/pf_dualsense.inx +++ b/packaging/windows/dualsense-driver/pf_dualsense.inx @@ -25,10 +25,12 @@ pf_dualsense.dll=1 %ManufacturerString%=pf, NT$ARCH$.10.0...22000 [pf.NT$ARCH$.10.0...22000] -; Two hardware ids: `root\pf_dualsense` for a root-enumerated devnode (devgen/devcon tests) and -; `pf_dualsense` for the host's SwDeviceCreate'd software device (the `root\` prefix is reserved for -; root enumeration, so SwDeviceCreate rejects it with E_INVALIDARG). -%DeviceDesc%=pfDualSense, root\pf_dualsense, pf_dualsense +; Hardware ids: `root\pf_dualsense` for a root-enumerated devnode (devgen/devcon tests); `pf_dualsense` +; for the host's SwDeviceCreate'd DualSense (the `root\` prefix is reserved for root enumeration, so +; SwDeviceCreate rejects it with E_INVALIDARG); `pf_dualshock4` for the host's virtual DualShock 4 — the +; same driver binds both and serves the DualSense or DS4 identity per the device_type byte the host +; stamps into shared memory. +%DeviceDesc%=pfDualSense, root\pf_dualsense, pf_dualsense, pf_dualshock4 [pfDualSense.NT] CopyFiles=UMDriverCopy @@ -60,6 +62,9 @@ UmdfKernelModeClientPolicy=AllowKernelModeClients UmdfFileObjectPolicy=AllowNullAndUnknownFileObjects UmdfMethodNeitherAction=Copy UmdfFsContextUsePolicy=CanUseFsContext2 +; Each pad gets its OWN WUDFHost so the driver's per-pad statics (incl. the shm index) don't collide +; across multiple simultaneous controllers (multi-pad). +UmdfHostProcessSharing=ProcessSharingDisabled [pf_dualsense_Install] UmdfLibraryVersion=$UMDFVERSION$ diff --git a/packaging/windows/dualsense-driver/src/lib.rs b/packaging/windows/dualsense-driver/src/lib.rs index 925401c..be0654b 100644 --- a/packaging/windows/dualsense-driver/src/lib.rs +++ b/packaging/windows/dualsense-driver/src/lib.rs @@ -11,7 +11,7 @@ #![allow(non_snake_case, non_upper_case_globals, clippy::missing_safety_doc)] use core::ffi::c_void; -use core::sync::atomic::{AtomicPtr, Ordering}; +use core::sync::atomic::{AtomicPtr, AtomicU32, Ordering}; use wdk_sys::{ NTSTATUS, PCUNICODE_STRING, PDRIVER_OBJECT, PWDFDEVICE_INIT, ULONG, WDF_DRIVER_CONFIG, @@ -41,6 +41,7 @@ const IOCTL_HID_GET_REPORT_DESCRIPTOR: u32 = hid_ctl(1); const IOCTL_HID_READ_REPORT: u32 = hid_ctl(2); const IOCTL_HID_WRITE_REPORT: u32 = hid_ctl(3); const IOCTL_HID_GET_DEVICE_ATTRIBUTES: u32 = hid_ctl(9); +const IOCTL_HID_GET_STRING: u32 = hid_ctl(4); const IOCTL_UMDF_HID_SET_FEATURE: u32 = hid_ctl(20); const IOCTL_UMDF_HID_GET_FEATURE: u32 = hid_ctl(21); const IOCTL_UMDF_HID_SET_OUTPUT_REPORT: u32 = hid_ctl(22); @@ -57,6 +58,8 @@ const WdfSynchronizationScopeInheritFromParent: i32 = 1; // WDF_SYNCHRONIZATION_ const DS_VID: u16 = 0x054C; const DS_PID: u16 = 0x0CE6; const DS_VER: u16 = 0x0100; +/// DualShock 4 v2 product id — served (same VID/version) when the host stamps device_type=1. +const DS4_PID: u16 = 0x09CC; // Sony DualSense USB HID report descriptor (273 bytes), verbatim from inputtino (== inject/dualsense.rs). // NOTE: inject/dualsense.rs comments this as "232 bytes" — that comment is wrong; it is 273. @@ -84,10 +87,10 @@ static DUALSENSE_RDESC: [u8; 273] = [ // Feature reports hid-playstation / Steam read during init (each array's first byte is the report id). #[rustfmt::skip] -static DS_FEATURE_CALIBRATION: [u8; 42] = [ // 0x05 motion calibration +static DS_FEATURE_CALIBRATION: [u8; 41] = [ // 0x05 motion calibration: 1 id + 40 data (descriptor declares feature 0x05 as 0x95 0x28 = 40) 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x27, 0xF0, 0xD8, 0x10, 0x27, 0xF0, 0xD8, 0x10, 0x27, 0xF0, 0xD8, 0xF4, 0x01, 0xF4, 0x01, 0x10, 0x27, 0xF0, 0xD8, 0x10, 0x27, 0xF0, 0xD8, 0x10, - 0x27, 0xF0, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x27, 0xF0, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, ]; #[rustfmt::skip] static DS_FEATURE_PAIRING: [u8; 20] = [ // 0x09 pairing info (MAC at 1..7) @@ -102,16 +105,85 @@ static DS_FEATURE_FIRMWARE: [u8; 64] = [ // 0x20 firmware info 0x14, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]; -// HID descriptor (9 bytes, packed): len, type=0x21, bcdHID=0x0100, country=0, numDesc=1, -// then {reportType=0x22, wReportLength=273 (0x0111)}. +// ---- DualShock 4 v2 assets (served when the host stamps device_type=1) ---- +// Sony DualShock 4 v2 USB HID report descriptor (507 bytes), verbatim from inject/dualshock4.rs. +#[rustfmt::skip] +static DS4_RDESC: [u8; 507] = [ + 0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x85, 0x01, 0x09, 0x30, 0x09, 0x31, + 0x09, 0x32, 0x09, 0x35, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, + 0x04, 0x81, 0x02, 0x09, 0x39, 0x15, 0x00, 0x25, 0x07, 0x35, 0x00, 0x46, + 0x3B, 0x01, 0x65, 0x14, 0x75, 0x04, 0x95, 0x01, 0x81, 0x42, 0x65, 0x00, + 0x05, 0x09, 0x19, 0x01, 0x29, 0x0E, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, + 0x95, 0x0E, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x20, 0x75, 0x06, 0x95, + 0x01, 0x15, 0x00, 0x25, 0x7F, 0x81, 0x02, 0x05, 0x01, 0x09, 0x33, 0x09, + 0x34, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x02, 0x81, 0x02, + 0x06, 0x00, 0xFF, 0x09, 0x21, 0x95, 0x36, 0x81, 0x02, 0x85, 0x05, 0x09, + 0x22, 0x95, 0x1F, 0x91, 0x02, 0x85, 0x04, 0x09, 0x23, 0x95, 0x24, 0xB1, + 0x02, 0x85, 0x02, 0x09, 0x24, 0x95, 0x24, 0xB1, 0x02, 0x85, 0x08, 0x09, + 0x25, 0x95, 0x03, 0xB1, 0x02, 0x85, 0x10, 0x09, 0x26, 0x95, 0x04, 0xB1, + 0x02, 0x85, 0x11, 0x09, 0x27, 0x95, 0x02, 0xB1, 0x02, 0x85, 0x12, 0x06, + 0x02, 0xFF, 0x09, 0x21, 0x95, 0x0F, 0xB1, 0x02, 0x85, 0x13, 0x09, 0x22, + 0x95, 0x16, 0xB1, 0x02, 0x85, 0x14, 0x06, 0x05, 0xFF, 0x09, 0x20, 0x95, + 0x10, 0xB1, 0x02, 0x85, 0x15, 0x09, 0x21, 0x95, 0x2C, 0xB1, 0x02, 0x06, + 0x80, 0xFF, 0x85, 0x80, 0x09, 0x20, 0x95, 0x06, 0xB1, 0x02, 0x85, 0x81, + 0x09, 0x21, 0x95, 0x06, 0xB1, 0x02, 0x85, 0x82, 0x09, 0x22, 0x95, 0x05, + 0xB1, 0x02, 0x85, 0x83, 0x09, 0x23, 0x95, 0x01, 0xB1, 0x02, 0x85, 0x84, + 0x09, 0x24, 0x95, 0x04, 0xB1, 0x02, 0x85, 0x85, 0x09, 0x25, 0x95, 0x06, + 0xB1, 0x02, 0x85, 0x86, 0x09, 0x26, 0x95, 0x06, 0xB1, 0x02, 0x85, 0x87, + 0x09, 0x27, 0x95, 0x23, 0xB1, 0x02, 0x85, 0x88, 0x09, 0x28, 0x95, 0x3F, + 0xB1, 0x02, 0x85, 0x89, 0x09, 0x29, 0x95, 0x02, 0xB1, 0x02, 0x85, 0x90, + 0x09, 0x30, 0x95, 0x05, 0xB1, 0x02, 0x85, 0x91, 0x09, 0x31, 0x95, 0x03, + 0xB1, 0x02, 0x85, 0x92, 0x09, 0x32, 0x95, 0x03, 0xB1, 0x02, 0x85, 0x93, + 0x09, 0x33, 0x95, 0x0C, 0xB1, 0x02, 0x85, 0x94, 0x09, 0x34, 0x95, 0x3F, + 0xB1, 0x02, 0x85, 0xA0, 0x09, 0x40, 0x95, 0x06, 0xB1, 0x02, 0x85, 0xA1, + 0x09, 0x41, 0x95, 0x01, 0xB1, 0x02, 0x85, 0xA2, 0x09, 0x42, 0x95, 0x01, + 0xB1, 0x02, 0x85, 0xA3, 0x09, 0x43, 0x95, 0x30, 0xB1, 0x02, 0x85, 0xA4, + 0x09, 0x44, 0x95, 0x0D, 0xB1, 0x02, 0x85, 0xF0, 0x09, 0x47, 0x95, 0x3F, + 0xB1, 0x02, 0x85, 0xF1, 0x09, 0x48, 0x95, 0x3F, 0xB1, 0x02, 0x85, 0xF2, + 0x09, 0x49, 0x95, 0x0F, 0xB1, 0x02, 0x85, 0xA7, 0x09, 0x4A, 0x95, 0x01, + 0xB1, 0x02, 0x85, 0xA8, 0x09, 0x4B, 0x95, 0x01, 0xB1, 0x02, 0x85, 0xA9, + 0x09, 0x4C, 0x95, 0x08, 0xB1, 0x02, 0x85, 0xAA, 0x09, 0x4E, 0x95, 0x01, + 0xB1, 0x02, 0x85, 0xAB, 0x09, 0x4F, 0x95, 0x39, 0xB1, 0x02, 0x85, 0xAC, + 0x09, 0x50, 0x95, 0x39, 0xB1, 0x02, 0x85, 0xAD, 0x09, 0x51, 0x95, 0x0B, + 0xB1, 0x02, 0x85, 0xAE, 0x09, 0x52, 0x95, 0x01, 0xB1, 0x02, 0x85, 0xAF, + 0x09, 0x53, 0x95, 0x02, 0xB1, 0x02, 0x85, 0xB0, 0x09, 0x54, 0x95, 0x3F, + 0xB1, 0x02, 0x85, 0xE0, 0x09, 0x57, 0x95, 0x02, 0xB1, 0x02, 0x85, 0xB3, + 0x09, 0x55, 0x95, 0x3F, 0xB1, 0x02, 0x85, 0xB4, 0x09, 0x55, 0x95, 0x3F, + 0xB1, 0x02, 0x85, 0xB5, 0x09, 0x56, 0x95, 0x3F, 0xB1, 0x02, 0x85, 0xD0, + 0x09, 0x58, 0x95, 0x3F, 0xB1, 0x02, 0x85, 0xD4, 0x09, 0x59, 0x95, 0x3F, + 0xB1, 0x02, 0xC0, +]; +// DS4 feature reports games read during init (each array's first byte is the report id). +#[rustfmt::skip] +static DS4_FEATURE_PAIRING: [u8; 16] = [ // 0x12 pairing info (MAC at bytes 1..7) + 0x12, 0x01, 0x00, 0xEF, 0xBE, 0xAD, 0xDE, 0x08, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +]; +#[rustfmt::skip] +static DS4_FEATURE_CALIBRATION: [u8; 37] = [ // 0x02 IMU calibration + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xF0, 0xFF, 0x10, 0x00, 0xF0, 0xFF, 0x10, + 0x00, 0xF0, 0xFF, 0x20, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0x20, 0x00, 0xE0, 0x00, + 0x20, 0x00, 0xE0, 0x00, 0x00, +]; +#[rustfmt::skip] +static DS4_FEATURE_FIRMWARE: [u8; 49] = [ // 0xa3 firmware/build info + 0xA3, 0x41, 0x75, 0x67, 0x20, 0x20, 0x33, 0x20, 0x32, 0x30, 0x31, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x37, 0x3A, 0x30, 0x31, 0x3A, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, +]; + +// HID descriptor (9 bytes, packed): len, type=0x21, bcdHID=0x0100, country=0, numDesc=1, then +// {reportType=0x22, wReportLength}. DualSense = 273 (0x0111); DualShock 4 = 507 (0x01FB). static HID_DESC: [u8; 9] = [0x09, 0x21, 0x00, 0x01, 0x00, 0x01, 0x22, 0x11, 0x01]; +static DS4_HID_DESC: [u8; 9] = [0x09, 0x21, 0x00, 0x01, 0x00, 0x01, 0x22, 0xFB, 0x01]; // HID_DEVICE_ATTRIBUTES (32 bytes): Size(u32)=32, VendorID, ProductID, VersionNumber, Reserved[11]. -fn hid_attrs() -> [u8; 32] { +// `ds4` selects the DualShock 4 product id (same VID/version). +fn hid_attrs(ds4: bool) -> [u8; 32] { let mut a = [0u8; 32]; a[0..4].copy_from_slice(&32u32.to_le_bytes()); a[4..6].copy_from_slice(&DS_VID.to_le_bytes()); - a[6..8].copy_from_slice(&DS_PID.to_le_bytes()); + a[6..8].copy_from_slice(&(if ds4 { DS4_PID } else { DS_PID }).to_le_bytes()); a[8..10].copy_from_slice(&DS_VER.to_le_bytes()); a } @@ -128,8 +200,24 @@ const NEUTRAL_REPORT: [u8; 64] = { r[8] = 0x08; // buttons[0]: low nibble = dpad hat (8 = neutral), high nibble = face buttons (0) r }; -fn neutral_report() -> [u8; 64] { - NEUTRAL_REPORT +// Neutral DualShock 4 input report 0x01: sticks centered (0x80); the dpad hat is in byte 5 (low +// nibble), so a neutral hat (8) lands there instead of byte 8. +const DS4_NEUTRAL_REPORT: [u8; 64] = { + let mut r = [0u8; 64]; + r[0] = 0x01; // report id + r[1] = 0x80; // LX + r[2] = 0x80; // LY + r[3] = 0x80; // RX + r[4] = 0x80; // RY + r[5] = 0x08; // buttons[0]: low nibble = dpad hat (8 = neutral), high nibble = face buttons (0) + r +}; +fn neutral_report(ds4: bool) -> [u8; 64] { + if ds4 { + DS4_NEUTRAL_REPORT + } else { + NEUTRAL_REPORT + } } static MANUAL_QUEUE: AtomicPtr = AtomicPtr::new(core::ptr::null_mut()); @@ -198,6 +286,59 @@ pub unsafe extern "system" fn driver_entry( } } +/// The pad index this device serves (which `pfds-shm-` section to map). The host stamps it into +/// the device Location (`pszDeviceLocation`); the driver reads it in EvtDeviceAdd. With +/// `UmdfHostProcessSharing=ProcessSharingDisabled` (the INF) each pad gets its own WUDFHost, so this +/// static is per-pad — the basis for multi-pad. +static SHM_INDEX: AtomicU32 = AtomicU32::new(0); +/// DEVICE_REGISTRY_PROPERTY: DevicePropertyLocationInformation (not re-exported at the wdk_sys root). +const DEVICE_PROPERTY_LOCATION_INFORMATION: i32 = 10; + +/// Read the pad index the host stamped into the device Location (a NUL-terminated UTF-16 decimal +/// string). Defaults to 0 (single-pad) if absent. +fn query_shm_index(device: WDFDEVICE) -> u32 { + let mut mem: WDFMEMORY = core::ptr::null_mut(); + // SAFETY: device valid; property = LocationInformation; pool ignored in UMDF; mem receives the handle. + let st = unsafe { + call_unsafe_wdf_function_binding!( + WdfDeviceAllocAndQueryProperty, + device, + DEVICE_PROPERTY_LOCATION_INFORMATION, + 0, + WDF_NO_OBJECT_ATTRIBUTES, + &mut mem + ) + }; + if !nt_success(st) || mem.is_null() { + return 0; + } + let mut len: usize = 0; + // SAFETY: mem valid. + let buf = unsafe { call_unsafe_wdf_function_binding!(WdfMemoryGetBuffer, mem, &mut len) } + as *const u16; + if buf.is_null() { + return 0; + } + let mut idx: u32 = 0; + let mut any = false; + for i in 0..(len / 2).min(8) { + // SAFETY: buf valid for len bytes; i < len/2. + let c = unsafe { *buf.add(i) }; + if c == 0 { + break; + } + if (0x30..=0x39).contains(&c) { + idx = idx.wrapping_mul(10).wrapping_add((c - 0x30) as u32); + any = true; + } + } + if any { + idx + } else { + 0 + } +} + extern "C" fn evt_device_add(_driver: WDFDRIVER, mut device_init: PWDFDEVICE_INIT) -> NTSTATUS { log("[pf-ds] EvtDeviceAdd"); @@ -220,6 +361,10 @@ extern "C" fn evt_device_add(_driver: WDFDRIVER, mut device_init: PWDFDEVICE_INI return st; } + let shm_idx = query_shm_index(device); + SHM_INDEX.store(shm_idx, Ordering::Relaxed); + dbglog!("[pf-ds] shm index = {shm_idx}"); + // Default parallel queue handling all IOCTLs. // SAFETY: zeroed config then fields set; Size matches the struct. let mut qcfg: WDF_IO_QUEUE_CONFIG = unsafe { core::mem::zeroed() }; @@ -317,9 +462,18 @@ extern "C" fn evt_io_device_control( dbglog!("[pf-ds] ioctl 0x{ioctl:08x} out={_output_len} in={_input_len}"); } let status: NTSTATUS = match ioctl { - IOCTL_HID_GET_DEVICE_DESCRIPTOR => copy_to_output(request, &HID_DESC), - IOCTL_HID_GET_DEVICE_ATTRIBUTES => copy_to_output(request, &hid_attrs()), - IOCTL_HID_GET_REPORT_DESCRIPTOR => copy_to_output(request, &DUALSENSE_RDESC), + IOCTL_HID_GET_DEVICE_DESCRIPTOR => { + copy_to_output(request, if device_type() == 1 { &DS4_HID_DESC } else { &HID_DESC }) + } + IOCTL_HID_GET_DEVICE_ATTRIBUTES => copy_to_output(request, &hid_attrs(device_type() == 1)), + IOCTL_HID_GET_REPORT_DESCRIPTOR => copy_to_output( + request, + if device_type() == 1 { + &DS4_RDESC[..] + } else { + &DUALSENSE_RDESC[..] + }, + ), IOCTL_HID_READ_REPORT => { let mq: WDFQUEUE = MANUAL_QUEUE.load(Ordering::SeqCst); // SAFETY: request valid; mq is the manual queue created in EvtDeviceAdd. @@ -341,7 +495,10 @@ extern "C" fn evt_io_device_control( STATUS_SUCCESS } IOCTL_UMDF_HID_GET_FEATURE => on_get_feature(request), - IOCTL_UMDF_HID_GET_INPUT_REPORT => copy_to_output(request, &neutral_report()), + IOCTL_UMDF_HID_GET_INPUT_REPORT => { + copy_to_output(request, &neutral_report(device_type() == 1)) + } + IOCTL_HID_GET_STRING => on_get_string(request), _ => STATUS_NOT_IMPLEMENTED, }; @@ -479,11 +636,15 @@ fn on_get_feature(request: WDFREQUEST) -> NTSTATUS { } // SAFETY: inbuf valid for >=1 byte. let report_id = unsafe { *inbuf }; - let blob: &[u8] = match report_id { - 0x05 => &DS_FEATURE_CALIBRATION, - 0x09 => &DS_FEATURE_PAIRING, - 0x20 => &DS_FEATURE_FIRMWARE, - other => { + // DualSense uses feature ids 0x05/0x09/0x20; DualShock 4 uses 0x02/0x12/0xa3. + let blob: &[u8] = match (device_type() == 1, report_id) { + (false, 0x05) => &DS_FEATURE_CALIBRATION, + (false, 0x09) => &DS_FEATURE_PAIRING, + (false, 0x20) => &DS_FEATURE_FIRMWARE, + (true, 0x02) => &DS4_FEATURE_CALIBRATION, + (true, 0x12) => &DS4_FEATURE_PAIRING, + (true, 0xA3) => &DS4_FEATURE_FIRMWARE, + (_, other) => { dbglog!("[pf-ds] GET_FEATURE unknown report id 0x{other:02x}"); return STATUS_INVALID_PARAMETER; } @@ -491,12 +652,70 @@ fn on_get_feature(request: WDFREQUEST) -> NTSTATUS { copy_to_output(request, blob) } +// IOCTL_HID_GET_STRING: the input is a ULONG whose low word is the string id and whose high word is +// the language id. Reply with the requested device string as a NUL-terminated UTF-16 buffer. Native +// PS5 / Steam code reads these (HidD_GetProductString / HidD_GetSerialNumberString — the serial is one +// way they tell USB from BT); the old default returned STATUS_NOT_IMPLEMENTED, leaving them blank. +// Observed live on this device, Windows polls ids 0x0E/0x0F/0x10 (lang 0x0409) cyclically — the +// manufacturer/product/serial slots — NOT the 0/1/2 HID_STRING_ID_* constants; we map both forms. +fn on_get_string(request: WDFREQUEST) -> NTSTATUS { + let mut inmem: WDFMEMORY = core::ptr::null_mut(); + // SAFETY: request valid. + let st = unsafe { + call_unsafe_wdf_function_binding!(WdfRequestRetrieveInputMemory, request, &mut inmem) + }; + if !nt_success(st) { + return st; + } + let mut inlen: usize = 0; + // SAFETY: inmem valid. + let inbuf = unsafe { call_unsafe_wdf_function_binding!(WdfMemoryGetBuffer, inmem, &mut inlen) } + as *const u8; + // SAFETY: inbuf is valid for inlen bytes; read the 4-byte id value when present. + let id_val: u32 = if !inbuf.is_null() && inlen >= 4 { + unsafe { core::ptr::read_unaligned(inbuf as *const u32) } + } else { + 0 + }; + let string_id = id_val & 0xFFFF; + let ds4 = device_type() == 1; + dbglog!("[pf-ds] GET_STRING id=0x{string_id:04x} (raw 0x{id_val:08x}) ds4={ds4}"); + let s: &str = match string_id { + 0 | 0x000e => { + if ds4 { + "Sony Computer Entertainment" + } else { + "Sony Interactive Entertainment" + } + } + 2 | 0x0010 => { + if ds4 { + "DEADBEEF0001" + } else { + "35533AD6E774" + } + } + _ => { + if ds4 { + "Wireless Controller" + } else { + "DualSense Wireless Controller" + } + } + }; + let mut wide: Vec = s.encode_utf16().collect(); + wide.push(0); // NUL terminator + // SAFETY: reinterpret the UTF-16 buffer as bytes for the byte-oriented copy_to_output. + let bytes = unsafe { core::slice::from_raw_parts(wide.as_ptr() as *const u8, wide.len() * 2) }; + copy_to_output(request, bytes) +} + // Open + map the host's shared-memory section (Global\pfds-shm-0) and run `f` against the mapped base // if it exists with a valid magic, then unmap. NOT cached: re-mapped per access so the driver always // sees the current section (UMDF groups all devices in one WUDFHost, and the host may recreate the // section across restarts — a cached view would go stale). ~125 maps/s from the timer = negligible. fn with_shm(f: F) { - let name: Vec = "Global\\pfds-shm-0" + let name: Vec = format!("Global\\pfds-shm-{}", SHM_INDEX.load(Ordering::Relaxed)) .encode_utf16() .chain(std::iter::once(0)) .collect(); @@ -516,7 +735,10 @@ fn with_shm(f: F) { let magic = unsafe { core::ptr::read_unaligned(view as *const u32) }; if magic == SHM_MAGIC { if !LOGGED_SHM.swap(true, Ordering::Relaxed) { - dbglog!("[pf-ds] control: shared memory mapped (Global\\pfds-shm-0)"); + dbglog!( + "[pf-ds] control: shared memory mapped (Global\\pfds-shm-{})", + SHM_INDEX.load(Ordering::Relaxed) + ); } f(view); } @@ -524,6 +746,19 @@ fn with_shm(f: F) { unsafe { UnmapViewOfFile(view as *const c_void) }; } +/// The host's device-type selector from shared memory (`device_type` byte @140): 0 = DualSense +/// (default), 1 = DualShock 4. Read fresh on each enumeration query — cheap, and the host stamps the +/// section before `SwDeviceCreate`, so it's set by the time hidclass asks for the descriptor / +/// attributes. Defaults to DualSense if the section isn't mapped yet (magic absent). +fn device_type() -> u8 { + let mut t = 0u8; + with_shm(|view| { + // SAFETY: view points at a mapped 256-byte section; the device-type byte is at offset 140. + t = unsafe { *view.add(140) }; + }); + t +} + extern "C" fn evt_timer(timer: WDFTIMER) { // Pull the latest host input report from shared memory (if the host has connected). with_shm(|view| { diff --git a/packaging/windows/gamepad-drivers/pf_dualsense.cat b/packaging/windows/gamepad-drivers/pf_dualsense.cat new file mode 100644 index 0000000000000000000000000000000000000000..cf3e613f7d803f84f38158e6759733179b320f48 GIT binary patch literal 2545 zcmd5;X;c$e6n<}Jf@Fc91!NNtQDpTE0Yn6a76C;hf)TNL6eKKyfUGV>$fTx11u9^R ziZ(0?A}*&C7ZlKHMN~8`7`4Z(bwOIOC@2;c`eIRor>#HRlQVP9+|2jAJNMr2dk-<} zE)BMg%um**1xFBahJ6Du?4Jk-X+F}@U@w*VK`}`YkOdG!DK*%(8jym_WDb-wR5K2p zL_7`7P>=^9rBnTwmoqP&o_*M?^k^4LTW_?MqYH9zbfldeosjE7q^IeNSa^(a#D*xdIGXE z<$*vD47@-J{v{EV4g`?Wb_8yK1_(Id3jpLj4CR8HOf`WIhyigxJcO`F1d(6~hybY| z42P3}7{tH2JK)#i@qd^_^oE6i6zz*|Frx7(WO+19&% z>TW4N*oWQazE0XfOY+nf;QbE@pvrXC{iOLCsjo~hhZEMGUWh25CUcbZy*>#n!GEbXpjJwf!MzorVV32$U%+4afrd_U53{( z#2NSv!@D6@H9S3pw@kt-CSWI61pb*x&X7FpLz=i2-ExwE1fer#T()awZC*~m0b#>N zL$fTEiicbha1o16dgS)RwKwLhQj$`%^hk8gWox4S=a zNlb~L{WQ7Tp*uEiTHyg6ByA7Qi<^}^)5C@}AtYbRf7@n<7Q<}M{IoNn z*P_C9RyWPh*k^qqj_$8jw&?E^PZV9eyTS0Nm2}PGxNfU^eH*S8ZZ9W7AJojC_ zSSn50x%^=qwrFxR>&zK2deH-;R5{|HSFC&wFM*yuLi)Y_(o?3*)@+?80v4 zr#GW>&v|N>OxvEXYf>PR)OgPcZ;3*YaF5ltuxA`a`n_hY<0Y*jt!oBRy3s*N%X6)u z;_edb6B%CDFRxedEuZlgJblT1VisIFo>g8)kl518eULZaOGwceK7@l5MG_;j&4Q{4ysX3^DORbLHWo!KO_`8i21T;!jWbFuHmyzdSFU@GR( z47`G;tsS2N5c>CF{d=XTof_n8)hv~OJeoiNE9bSC*d)zWJ5(T(H<~6Om)2H0To6zX zO?r!?XbZ~Rp(y8xx0|xnR~Bxxt|E)8E%-eoO)_#tPESvCo9C`qd+%%2Vi{4`>w@MS z%lz=u)%9)?UaA({8dsm+9d!7-m>LYM?Y#U&U6EnHNWOJrr}4f()34{o z`**JVsp|gWJAK;~d(P}DwiL{hHI3p5MiPqCZmUJt3OmEyN6o47Iw_Ui+?&hMzcYH$ zk@>OmnzDP&vDYJR*b0l?8$04xENGZ6LG@-GvzP9>hx6ZPG!ENs7D GTlpu0`0k+q literal 0 HcmV?d00001 diff --git a/packaging/windows/gamepad-drivers/pf_dualsense.dll b/packaging/windows/gamepad-drivers/pf_dualsense.dll new file mode 100644 index 0000000000000000000000000000000000000000..674bac01097e8d540425ddb57917fd0349100b26 GIT binary patch literal 361344 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

wj&k;*DdfYpc`|EBK;jL@1d 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 a6TNpIKX&cp+j|y$lQe9arQ)oRru{GP$3>O^ literal 0 HcmV?d00001 diff --git a/packaging/windows/gamepad-drivers/pf_dualsense.inf b/packaging/windows/gamepad-drivers/pf_dualsense.inf new file mode 100644 index 0000000..eb06379 --- /dev/null +++ b/packaging/windows/gamepad-drivers/pf_dualsense.inf @@ -0,0 +1,82 @@ +;/*++ +; punktfunk virtual DualSense — UMDF2 HID minidriver INF (M0 spike). +; Adapted from the WDK vhidmini2 UMDF2 sample (VhidminiUm.inx). +; Depends on MsHidUmdf.inf (build >= 22000). +; Install: devgen /add /hardwareid "root\pf_dualsense" (after pnputil /add-driver /install) +;--*/ +[Version] +Signature="$WINDOWS NT$" +Class=HIDClass +ClassGuid={745a17a0-74d3-11d0-b6fe-00a0c90f57da} +Provider=%ProviderString% +CatalogFile = pf_dualsense.cat +PnpLockdown=1 +DriverVer = 06/22/2026,16.23.43.887 + +[DestinationDirs] +DefaultDestDir = 13 + +[SourceDisksNames] +1=%Disk_Description%,,, + +[SourceDisksFiles] +pf_dualsense.dll=1 + +[Manufacturer] +%ManufacturerString%=pf, NTamd64.10.0...22000 + +[pf.NTamd64.10.0...22000] +; Hardware ids: `root\pf_dualsense` for a root-enumerated devnode (devgen/devcon tests); `pf_dualsense` +; for the host's SwDeviceCreate'd DualSense (the `root\` prefix is reserved for root enumeration, so +; SwDeviceCreate rejects it with E_INVALIDARG); `pf_dualshock4` for the host's virtual DualShock 4 — the +; same driver binds both and serves the DualSense or DS4 identity per the device_type byte the host +; stamps into shared memory. +%DeviceDesc%=pfDualSense, root\pf_dualsense, pf_dualsense, pf_dualshock4 + +[pfDualSense.NT] +CopyFiles=UMDriverCopy +Include=MsHidUmdf.inf +Needs=MsHidUmdf.NT +Include=WUDFRD.inf +Needs=WUDFRD_LowerFilter.NT + +[pfDualSense.NT.hw] +Include=MsHidUmdf.inf +Needs=MsHidUmdf.NT.hw +Include=WUDFRD.inf +Needs=WUDFRD_LowerFilter.NT.hw + +[pfDualSense.NT.Services] +Include=MsHidUmdf.inf +Needs=MsHidUmdf.NT.Services +Include=WUDFRD.inf +Needs=WUDFRD_LowerFilter.NT.Services + +[pfDualSense.NT.Filters] +Include=WUDFRD.inf +Needs=WUDFRD_LowerFilter.NT.Filters + +[pfDualSense.NT.Wdf] +UmdfService="pf_dualsense", pf_dualsense_Install +UmdfServiceOrder=pf_dualsense +UmdfKernelModeClientPolicy=AllowKernelModeClients +UmdfFileObjectPolicy=AllowNullAndUnknownFileObjects +UmdfMethodNeitherAction=Copy +UmdfFsContextUsePolicy=CanUseFsContext2 +; Each pad gets its OWN WUDFHost so the driver's per-pad statics (incl. the shm index) don't collide +; across multiple simultaneous controllers (multi-pad). +UmdfHostProcessSharing=ProcessSharingDisabled + +[pf_dualsense_Install] +UmdfLibraryVersion=2.31.0 +ServiceBinary="%13%\pf_dualsense.dll" + +[UMDriverCopy] +pf_dualsense.dll + +[Strings] +ProviderString ="punktfunk" +ManufacturerString ="punktfunk" +ClassName ="HID device" +Disk_Description ="punktfunk DualSense Installation Disk" +DeviceDesc ="punktfunk Virtual DualSense" diff --git a/packaging/windows/gamepad-drivers/pf_xusb.cat b/packaging/windows/gamepad-drivers/pf_xusb.cat new file mode 100644 index 0000000000000000000000000000000000000000..ec19e3b9d9d947e6fe0f25836bfe70806208feec GIT binary patch literal 2417 zcmd5-dsIzX7~lJxbJMMRD^zZwuAb9-pI$1dkRB3|q=-sSU9Y-|i0-*PWaN&TJd>+p zND(RHnPz!qs3dpDqld*b33*kbnscp&n`Op-Gqd(OXRZCM^E==E_V4@sK14B>$}x@8 zJkq+^a2O`0mjq;ZBF9AeNlM zV2}kNp;9}q<9eS(qgUR|bWe}^Ion6EEp3slr6p-i+S!nSNJ-{%T>4ks2T>3ZT!wYP z%K*u{gb$ob`x#9-cSI(h1=Cr*2Q4SL$1@X&OQhf)Quz$Va1x^cvX+TJ(g5jcvA|5= z3nl?Ry<#y!1p-JYSpo+@0tC$I2LR+S1Z9ehwd8>thz2|mK8WC~01;pjSPfQzI1ozX zqQNpcLSy|tVKGRM?r5sasW7OKk0k>{esOo-t_}(I5ULy{J)_zudM$gticA8Qv}`)TzgBh_eJ4C=*%Xu~xN#n-nFrL$Vk;s$3QL-w%~@U0d@ef_Oz>4- z=6+)DtkI<4(f{JGK|?s2iM$aIm>hIik zENXK;Z2AgU|3!<61tmyOge*Um%%VG059w$TQfUk}xauMh|4|Z%Zu5D-7FbJJ9@1BY zR89)O1NZ|^;0i1Ukt#!_L8F|8WJ1VX21O2{G-JVXdhx*m@FiYM;Vjw*P4KxLHWYf{shf`2lssIIyf)L!acjR(g)3;2# zxVGimvkV^%GyPj{O%L_1SQMRWb^3x<9WlP-_NuD=WdV7cw=SIsI%4{oAS8HUrh~lpX+>Z>|UsO3a>4;GckL)dzRIBd~|IV-W@kWg^hQh=kUZ>%c z?u~b|_hfV2{dQSfy?0*|B=lkKGq1~%Ke=!5a~nawg5y4x&@Hmu|4qg9vlzklud z{K1mt*NW6KswtZz*8)2wDNRwCzq%;pI_(juj>+;96uZs{t&T(y@UY?TkRFA)geOi6u~J34cXs*)x>_${?gS+9pRud7e-t+wwzeMUh!hSQc>;D%gj zFUS4HDnmFx5I8n08I6?g^$8YIkdvop0)sIO$I)16P>E0{RD0u?YG&U3f}Rf&#rW)< zW@RPb!Lm0^6HDJT1WL{ZJ{qh?H4OnU@^rLBc>1inu#L@Zi0?9?Qm2*2@EIHy=in@_ znhCy#g8lD8PTIJWy!wJyx2}Tuoo`HX%tZSWA~L6TpGtdrV#cOn^q=ydYBOcG#i*4v$F1phmEqqhAvVK&lX~F1+%?bB&fSrS& z|H(k1b5e3EfluU**4|Oxd?EOZ+yWTF4e==sS=Oc6(W@O*w7uxA@0tyjX~r$FYN38! zv72hUKg_wL@s28-LsIY#-E9r@6h`QuoAv8Tk(t`!wK9f`K^BQ2Kr81jF)?vcQD&&4 zF`tx-K}AwYX1HTe4Ox7~5u^^mbxFyz8k^OsDOoL8%zAWXbH$4G^sMRT7q8rUrOrQM zH6TkaEhB=S^P7A%gq}ezqLEFpnoCM+cdaj0(KfYBUgviCapmrgr0mY*W~258HEs6! zJMv01<6k@0vnE)`UF0@4uKPJk&~*ESu+59-Jhx8&r0&u7;UyJ&b+mwB|S3^@YV8 z*rqt9IMGfgZ?vt^eW&tYw$5H(c=!f)_Vt{iuoupwmN2$9@{V6{ z7e?-h$1)mPr;Q8!&;wkmg6(tHAO53lq~f^h%2W%__xz5gzRt_8J?F*UDd}A~65T8t R#{#>JDGSdV=xv{u@Fys;*J%I% literal 0 HcmV?d00001 diff --git a/packaging/windows/gamepad-drivers/pf_xusb.dll b/packaging/windows/gamepad-drivers/pf_xusb.dll new file mode 100644 index 0000000000000000000000000000000000000000..c94c3b41f0b9cb1f9abd28507b39ac79f0d715a6 GIT binary patch literal 343424 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 z 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 z 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 AasU7T literal 0 HcmV?d00001 diff --git a/packaging/windows/gamepad-drivers/pf_xusb.inf b/packaging/windows/gamepad-drivers/pf_xusb.inf new file mode 100644 index 0000000..fc10984 --- /dev/null +++ b/packaging/windows/gamepad-drivers/pf_xusb.inf @@ -0,0 +1,66 @@ +;/*++ +; punktfunk virtual Xbox 360 XUSB companion — a non-HID UMDF2 driver that registers the XUSB +; device-interface GUID {EC87F1E3-...} and answers the buffered XInput IOCTLs, so classic +; XInputGetState() reads the pad without a kernel bus driver (the HIDMaestro approach). System class, +; hosted by the in-box WUDFRd reflector. Created per-session by the host via SwDeviceCreate +; (hardware id `pf_xusb`); `root\pf_xusb` is the devgen/devcon test id. +;--*/ +[Version] +Signature = "$WINDOWS NT$" +Class = System +ClassGuid = {4D36E97D-E325-11CE-BFC1-08002BE10318} +Provider = %ProviderString% +CatalogFile = pf_xusb.cat +PnpLockdown = 1 +DriverVer = 06/22/2026,16.17.56.696 + +[DestinationDirs] +DefaultDestDir = 13 + +[SourceDisksNames] +1 = %DiskId1%,,,"" + +[SourceDisksFiles] +pf_xusb.dll = 1,, + +[Manufacturer] +%StdMfg%=Standard, NTamd64.10.0...22000 + +[Standard.NTamd64.10.0...22000] +%DeviceDesc%=pfXusb, root\pf_xusb, pf_xusb + +[pfXusb.NT] +CopyFiles=Drivers_Dir +Include=WUDFRD.inf +Needs=WUDFRD.NT + +[Drivers_Dir] +pf_xusb.dll + +[pfXusb.NT.HW] +Include=WUDFRD.inf +Needs=WUDFRD.NT.HW + +[pfXusb.NT.Services] +Include=WUDFRD.inf +Needs=WUDFRD.NT.Services + +[pfXusb.NT.Wdf] +UmdfService=pf_xusb, pfXusb_Install +UmdfServiceOrder=pf_xusb +UmdfKernelModeClientPolicy=AllowKernelModeClients +UmdfFileObjectPolicy=AllowNullAndUnknownFileObjects +UmdfMethodNeitherAction=Copy +UmdfFsContextUsePolicy=CanUseFsContext2 +UmdfHostProcessSharing=ProcessSharingDisabled + +[pfXusb_Install] +UmdfLibraryVersion=2.31.0 +ServiceBinary=%13%\pf_xusb.dll + +[Strings] +ProviderString = "punktfunk" +StdMfg = "(Standard system devices)" +DiskId1 = "punktfunk XUSB Installation Disk" +DeviceDesc = "punktfunk Virtual Xbox 360 (XUSB)" + diff --git a/packaging/windows/gamepad-drivers/punktfunk-driver.cer b/packaging/windows/gamepad-drivers/punktfunk-driver.cer new file mode 100644 index 0000000000000000000000000000000000000000..603933efef9d6210e474b0494a7e60d72edd6e30 GIT binary patch literal 780 zcmXqLV&*VtV*IdxnTe5!NkCS))1rQJUzhKOfW1AE@(l*OY@Awc9&O)w85y}*84P3$ zr3@t4m_u2Zc?1he^Ri3QfP`*Jv2ICfafyMPIIoeJftit^p^2%9kx7&|udyMRYia=E z642emsDx}CBP#=Q6C*zZ&~;o)O^l2T7cFfR6dtwr*&eBWcO$wrW>R&u2!F&_=D?0`LpA^2j-j&KU?+Rpj>KO z$ zYkd=tLmC*dz>sES;Imf?kmPxM?n)$M`mW4t&AaxvH^1QJyi)c}yQ$S{Yjz2%1dqgu zK<{(b!7CHOZ!$`>DQ?fXwD{BI6AaNGzGzR??O$4+*6aFxXWQ#7&M^(we9vAx`EQ=t zoPJC1;$HQOLNz&xYqZ3cWc+j6vu(z&Mg5&OBJE8LcWUuBy;}Yy<#nHNx<|Y@Yw(n! z|I5U-*BaN_ZAyFod4I}2dOgxbQ literal 0 HcmV?d00001 diff --git a/packaging/windows/install-gamepad-drivers.ps1 b/packaging/windows/install-gamepad-drivers.ps1 new file mode 100644 index 0000000..6815ba8 --- /dev/null +++ b/packaging/windows/install-gamepad-drivers.ps1 @@ -0,0 +1,50 @@ +<# +.SYNOPSIS + Install the bundled punktfunk virtual-gamepad UMDF drivers - pf_dualsense (DualSense + DualShock 4, + one type-aware HID driver) and pf_xusb (Xbox 360 XUSB companion for classic XInput). Runs ELEVATED + at setup time (invoked from the installer's [Run] section). Best-effort: warns and exits 0 on any + failure, so a driver hiccup never aborts the whole install (gamepad input degrades gracefully - a + session still streams without a pad). + +.DESCRIPTION + -Dir holds the staged payload: pf_dualsense.{inf,cat,dll}, pf_xusb.{inf,cat,dll}, and the signing + .cer. Steps: + 1. Trust the self-signed driver cert (machine Root + TrustedPublisher) so pnputil adds it silently. + 2. pnputil /add-driver each .inf - adds the package to the driver store. (No /install or device-node + creation: the host SwDeviceCreate's the per-session devnodes itself when a client forwards a pad, + so PnP binds the store driver on demand.) + + ASCII-only on purpose: this is run by the installer via Windows PowerShell 5.1, which mis-decodes a + BOM-less UTF-8 non-ASCII char (e.g. an em-dash) as a smart-quote and breaks parsing. + +.EXAMPLE + powershell -ExecutionPolicy Bypass -File install-gamepad-drivers.ps1 -Dir C:\path\to\gamepad +#> +[CmdletBinding()] +param([string]$Dir = $PSScriptRoot) +# Never abort the installer on a driver failure. +$ErrorActionPreference = 'Continue' +trap { Write-Warning "gamepad driver install error: $_"; exit 0 } + +# 1) Trust the self-signed driver cert (Root so the chain validates + TrustedPublisher so pnputil adds +# it without a prompt). +$cer = Get-ChildItem -Path $Dir -Filter *.cer -ErrorAction SilentlyContinue | Select-Object -First 1 +if ($cer) { + Write-Host "==> importing $($cer.Name) to Root + TrustedPublisher" + certutil.exe -addstore -f Root "$($cer.FullName)" | Out-Null + certutil.exe -addstore -f TrustedPublisher "$($cer.FullName)" | Out-Null +} +else { Write-Warning "no .cer in $Dir; drivers may not install silently (untrusted publisher)" } + +# 2) Add each driver package to the store (idempotent; re-adding the same .inf is harmless). +$infs = Get-ChildItem -Path $Dir -Filter *.inf -ErrorAction SilentlyContinue +if (-not $infs) { Write-Warning "no driver .inf in $Dir; skipping gamepad driver install."; exit 0 } +foreach ($inf in $infs) { + Write-Host "==> pnputil /add-driver $($inf.Name)" + & pnputil.exe /add-driver "$($inf.FullName)" + $rc = $LASTEXITCODE + if ($rc -eq 3010) { Write-Host " added; a reboot is recommended." } + elseif ($rc -ne 0) { Write-Warning "pnputil /add-driver $($inf.Name) returned $rc" } +} + +exit 0 diff --git a/packaging/windows/pack-host-installer.ps1 b/packaging/windows/pack-host-installer.ps1 index a304cee..25ad115 100644 --- a/packaging/windows/pack-host-installer.ps1 +++ b/packaging/windows/pack-host-installer.ps1 @@ -147,6 +147,23 @@ if (-not $NoDriver) { } else { Write-Host "-NoDriver: building installer WITHOUT the bundled SudoVDA driver" } +# --- stage the punktfunk virtual-gamepad UMDF drivers (DualSense/DS4 + Xbox 360 XUSB) ---------- +# Vendored, pre-signed under packaging/windows/gamepad-drivers/ (like SudoVDA). Rebuild + re-vendor +# from packaging/windows/{dualsense,xusb}-driver/ when the driver source changes (see their READMEs). +if (-not $NoDriver) { + $gpVendor = Join-Path $here 'gamepad-drivers' + if (Test-Path (Join-Path $gpVendor 'pf_dualsense.inf')) { + $gpStage = Join-Path $OutDir 'gamepad' + if (Test-Path $gpStage) { Remove-Item -Recurse -Force $gpStage } + New-Item -ItemType Directory -Force -Path $gpStage | Out-Null + Copy-Item (Join-Path $gpVendor '*') $gpStage -Force + Copy-Item (Join-Path $here 'install-gamepad-drivers.ps1') (Join-Path $gpStage 'install-gamepad-drivers.ps1') -Force + $defines += "/DGamepadStageDir=$gpStage" + Write-Host "==> staged vendored gamepad UMDF drivers from $gpVendor" + } + else { Write-Warning "no vendored gamepad drivers under $gpVendor — installer built WITHOUT them" } +} + # --- stage the FFmpeg shared DLLs (AMD/Intel AMF/QSV build) ------------------------------------ # A host built with --features amf-qsv link-imports avcodec/avutil/swscale/... so the shared DLLs # MUST sit next to the exe (it won't start otherwise). Bundle them from $FfmpegDir\bin — the same diff --git a/packaging/windows/punktfunk-host.iss b/packaging/windows/punktfunk-host.iss index cd7b4e0..aabf102 100644 --- a/packaging/windows/punktfunk-host.iss +++ b/packaging/windows/punktfunk-host.iss @@ -32,6 +32,10 @@ #ifdef StageDir #define WithDriver #endif +; GamepadStageDir (the vendored UMDF gamepad drivers + install-gamepad-drivers.ps1) is optional. +#ifdef GamepadStageDir + #define WithGamepad +#endif ; FfmpegBin (a dir of FFmpeg shared DLLs) is optional — present when the host is built with ; --features amf-qsv (the AMD/Intel AMF/QSV encode backend link-imports the FFmpeg libs). #ifdef FfmpegBin @@ -67,6 +71,9 @@ Name: "english"; MessagesFile: "compiler:Default.isl" #ifdef WithDriver Name: "installdriver"; Description: "Install the SudoVDA virtual display driver (required for native-resolution streaming)" #endif +#ifdef WithGamepad +Name: "installgamepad"; Description: "Install the virtual gamepad drivers (DualSense / DualShock 4 / Xbox 360 — no ViGEmBus needed)" +#endif Name: "startservice"; Description: "Start the punktfunk host service now (also starts on every boot)" [Files] @@ -83,6 +90,10 @@ Source: "{#FfmpegBin}\*.dll"; DestDir: "{app}"; Flags: ignoreversion ; The driver payload + nefconc.exe + install-sudovda.ps1, extracted to {tmp} and removed after install. Source: "{#StageDir}\*"; DestDir: "{tmp}\sudovda"; Flags: deleteafterinstall recursesubdirs createallsubdirs; Tasks: installdriver #endif +#ifdef WithGamepad +; The vendored UMDF gamepad drivers + install-gamepad-drivers.ps1, extracted to {tmp}, removed after. +Source: "{#GamepadStageDir}\*"; DestDir: "{tmp}\gamepad"; Flags: deleteafterinstall recursesubdirs createallsubdirs; Tasks: installgamepad +#endif [Run] #ifdef WithDriver @@ -91,6 +102,12 @@ Filename: "powershell.exe"; \ StatusMsg: "Installing the SudoVDA virtual display driver..."; \ Flags: runhidden waituntilterminated; Tasks: installdriver #endif +#ifdef WithGamepad +Filename: "powershell.exe"; \ + Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{tmp}\gamepad\install-gamepad-drivers.ps1"" -Dir ""{tmp}\gamepad"""; \ + StatusMsg: "Installing the virtual gamepad drivers..."; \ + Flags: runhidden waituntilterminated; Tasks: installgamepad +#endif ; Register (or re-point, on upgrade - idempotent) the SYSTEM service from its FINAL {app} location: ; service install records current_exe() as the SCM binPath, so it must run from {app}, not {tmp}. Filename: "{app}\punktfunk-host.exe"; Parameters: "service install"; WorkingDir: "{app}"; \ diff --git a/packaging/windows/xusb-driver/Cargo.toml b/packaging/windows/xusb-driver/Cargo.toml new file mode 100644 index 0000000..9ff4ee1 --- /dev/null +++ b/packaging/windows/xusb-driver/Cargo.toml @@ -0,0 +1,35 @@ +[package] +edition = "2024" +name = "pf-xusb" +version = "0.1.0" +publish = false +license = "MIT OR Apache-2.0" +description = "punktfunk virtual Xbox 360 XUSB companion (UMDF2 — classic XInput)" + +[package.metadata.wdk.driver-model] +driver-type = "UMDF" +target-umdf-version-minor = 31 +umdf-version-major = 2 + +[lib] +crate-type = ["cdylib"] + +[build-dependencies] +wdk-build.path = "../../crates/wdk-build" + +[dependencies] +wdk.path = "../../crates/wdk" +wdk-sys.path = "../../crates/wdk-sys" + +[features] +default = [] +nightly = ["wdk-sys/nightly", "wdk/nightly"] + +[profile.dev] +lto = true + +[profile.release] +lto = true + +# Standalone package (not part of the windows-drivers-rs root workspace). +[workspace] diff --git a/packaging/windows/xusb-driver/Makefile.toml b/packaging/windows/xusb-driver/Makefile.toml new file mode 100644 index 0000000..be118bb --- /dev/null +++ b/packaging/windows/xusb-driver/Makefile.toml @@ -0,0 +1,4 @@ +extend = [ + { path = "../../crates/wdk-build/rust-driver-makefile.toml" }, + { path = "../../crates/wdk-build/rust-driver-sample-makefile.toml" }, +] diff --git a/packaging/windows/xusb-driver/README.md b/packaging/windows/xusb-driver/README.md new file mode 100644 index 0000000..cda75b3 --- /dev/null +++ b/packaging/windows/xusb-driver/README.md @@ -0,0 +1,79 @@ +# pf-xusb — virtual Xbox 360 XUSB companion (UMDF2, classic XInput) + +A **pure-user-mode** UMDF2 driver that makes a virtual Xbox 360 controller visible to classic +**`XInputGetState`** with **no kernel bus driver** (no ViGEmBus) — the HIDMaestro approach. It is the +Windows counterpart to ViGEm's X360 target, owned in-tree. + +## Why this is not the HID driver + +XInput does **not** use HID. `xinput1_4.dll` enumerates the **XUSB device-interface GUID** +`{EC87F1E3-C13B-4100-B5F7-8B84D54260CB}` (`SetupDiEnumDeviceInterfaces`), opens the Nth present +instance (= player slot 0–3) with `CreateFile`, and polls it with buffered IOCTLs. So this driver: + +- is **not** a HID minidriver (no `MsHidUmdf`) — it's a plain UMDF2 function driver under `WUDFRd`, + **System** setup class; +- registers the XUSB interface with `WdfDeviceCreateDeviceInterface(device, &XUSB_GUID, NULL)`; +- answers the XUSB IOCTLs (all `METHOD_BUFFERED`, delivered to user mode by the reflector) from + controller state the host publishes into a shared section `Global\pfxusb-shm-0`; a game's rumble + (`SET_STATE`) is published back for the host to forward to the client. + +The WAIT_* IOCTLs return `STATUS_INVALID_DEVICE_REQUEST`, which makes `xinput1_4` fall back to +synchronous `GET_STATE` polling — so no manual queue / timer is needed for classic XInput. (WGI/ +GameInput admission additionally needs a `xinputhid` `UpperFilters` registry tripwire + the async +`WAIT_FOR_INPUT` pump — not implemented; classic XInput does not need it.) + +## Verified wire formats (source: HIDMaestro `driver/companion.c`, nefarius/XInputHooker `XUSB.h`, ViGEm) + +| IOCTL | Code | Reply | +| --- | --- | --- | +| `GET_INFORMATION` | `0x80006000` | 12 B: `[0]`=ver `0x0103`, `[2]`=count `0x01`, `[8]`=VID `045E`, `[10]`=PID `028E` — marks the slot **connected** | +| `GET_CAPABILITIES` | `0x8000E004` | 24 B (or 36 B V2 if `outLen>=36`): Type `0x03`/SubType `0x01`, motor max `0xFFFF` (advertise rumble) | +| `GET_STATE` | `0x8000E00C` | **29 B**: `[0]`ver `[2]`count `[5]`u32 packet# `[0x0B]`u16 wButtons `[0x0D]`LT `[0x0E]`RT `[0x0F..0x16]`4×i16 sticks | +| `SET_STATE` | `0x8000A010` | input 5 B `{00, led, large, small, subcmd}`: `subcmd 0x02`=rumble (large `[2]`, small `[3]`), `0x01`=player-LED | +| `GET_LED_STATE` | `0x8000E008` | `{0,0,0x06}` | +| `GET_BATTERY_INFORMATION` | `0x8000E018` | `{0,0x01,0x03,0}` | +| `WAIT_GUIDE_BUTTON` / `WAIT_FOR_INPUT` | `0x8000E014` / `0x8000E3AC` | `STATUS_INVALID_DEVICE_REQUEST` → GET_STATE fallback | + +`wButtons` is the `XINPUT_GAMEPAD_*` bitmap (DPAD_UP `0x0001` … A `0x1000` B `0x2000` X `0x4000` +Y `0x8000`). `dwPacketNumber` (GET_STATE `[5]`) must increment whenever the payload changes. + +## Shared-memory layout `Global\pfxusb-shm-0` (64 B) — host writes state, driver writes rumble + +`magic u32 @0` (`"PFXU"` `0x55584650`) · `packet u32 @4` (host bumps → dwPacketNumber) · `wButtons u16 +@8` · `LT @10` · `RT @11` · `LX/LY/RX/RY i16 @12/@14/@16/@18` · `rumble_seq u32 @24` (driver bumps) · +`large @28` · `small @29`. + +## Validated live on `.173` (2026-06-22) + +`XInputGetState(0)` returns **CONNECTED** with the pushed buttons/sticks and an incrementing +`dwPacketNumber`; `XInputSetState(0xC000, 0x4000)` reaches the driver as `00 00 c0 40 02` → host sees +`large=192 small=64`. Test tools: `C:\Users\Public\giprobe\xusbtest.exe` (creates the `pf_xusb` +devnode + cycling state via shm) and `xinputtest.exe` (`XInputGetState`/`SetState` harness). + +## Build / sign / install (same recipe as the DualSense driver) + +Built from `C:\Users\Public\m0\windows-drivers-rs\examples\pf-xusb` (the `../../crates` paths resolve +there); these repo files are the canonical copies — keep them in sync. + +1. `cargo make` (env `LIBCLANG_PATH`, `Version_Number=10.0.26100.0`) → `target\debug\pf_xusb_package\`. +2. Clear the FORCE_INTEGRITY PE bit (bit `0x80` at `e_lfanew+0x5e` of `pf_xusb.dll`). +3. `signtool sign /fd SHA256 /sha1 6A52984E54376C45A1C236B1A2C8A746C5AB6131 pf_xusb.dll`. +4. `Inf2Cat /driver: /os:10_X64` → re-sign `pf_xusb.cat` with the same thumbprint. +5. `pnputil /add-driver pf_xusb.inf` (no `/install`; the host SwDeviceCreate's `pf_xusb` per session). + +## Host integration (done) + +`crates/punktfunk-host/src/inject/gamepad_windows.rs` is the Windows `GamepadManager` (used by +`PadBackend::Xbox360`): it SwDeviceCreate's the `pf_xusb` companion, maps `pfxusb-shm-`, writes +the XInput state from the client's gamepad frame (already XInput-convention) and forwards rumble. There +is **no ViGEmBus dependency** anymore. The driver is vendored + pnputil-installed by the Inno Setup +installer (`packaging/windows/gamepad-drivers/` + `install-gamepad-drivers.ps1`). + +## Multi-pad + +The host stamps each pad's index into the device Location (`pszDeviceLocation`); the driver reads it +via `WdfDeviceAllocAndQueryProperty(DevicePropertyLocationInformation)` in EvtDeviceAdd and maps its own +`pfxusb-shm-`. `UmdfHostProcessSharing=ProcessSharingDisabled` (the INF) gives each pad its own +WUDFHost, so the per-pad `SHM_INDEX` static doesn't collide. Validated live: two pads → two distinct +XInput slots. (XInput assigns the player slot 0-3 by interface-enumeration order, independent of this +index — which only routes shared memory.) diff --git a/packaging/windows/xusb-driver/build.rs b/packaging/windows/xusb-driver/build.rs new file mode 100644 index 0000000..bf0e777 --- /dev/null +++ b/packaging/windows/xusb-driver/build.rs @@ -0,0 +1,5 @@ +//! Build script for the `pf-xusb` UMDF driver — provides Cargo the WDK linker flags. + +fn main() -> Result<(), wdk_build::ConfigError> { + wdk_build::configure_wdk_binary_build() +} diff --git a/packaging/windows/xusb-driver/pf_xusb.inx b/packaging/windows/xusb-driver/pf_xusb.inx new file mode 100644 index 0000000..12febc8 --- /dev/null +++ b/packaging/windows/xusb-driver/pf_xusb.inx @@ -0,0 +1,64 @@ +;/*++ +; punktfunk virtual Xbox 360 XUSB companion — a non-HID UMDF2 driver that registers the XUSB +; device-interface GUID {EC87F1E3-...} and answers the buffered XInput IOCTLs, so classic +; XInputGetState() reads the pad without a kernel bus driver (the HIDMaestro approach). System class, +; hosted by the in-box WUDFRd reflector. Created per-session by the host via SwDeviceCreate +; (hardware id `pf_xusb`); `root\pf_xusb` is the devgen/devcon test id. +;--*/ +[Version] +Signature = "$WINDOWS NT$" +Class = System +ClassGuid = {4D36E97D-E325-11CE-BFC1-08002BE10318} +Provider = %ProviderString% +CatalogFile = pf_xusb.cat +PnpLockdown = 1 + +[DestinationDirs] +DefaultDestDir = 13 + +[SourceDisksNames] +1 = %DiskId1%,,,"" + +[SourceDisksFiles] +pf_xusb.dll = 1,, + +[Manufacturer] +%StdMfg%=Standard, NT$ARCH$.10.0...22000 + +[Standard.NT$ARCH$.10.0...22000] +%DeviceDesc%=pfXusb, root\pf_xusb, pf_xusb + +[pfXusb.NT] +CopyFiles=Drivers_Dir +Include=WUDFRD.inf +Needs=WUDFRD.NT + +[Drivers_Dir] +pf_xusb.dll + +[pfXusb.NT.HW] +Include=WUDFRD.inf +Needs=WUDFRD.NT.HW + +[pfXusb.NT.Services] +Include=WUDFRD.inf +Needs=WUDFRD.NT.Services + +[pfXusb.NT.Wdf] +UmdfService=pf_xusb, pfXusb_Install +UmdfServiceOrder=pf_xusb +UmdfKernelModeClientPolicy=AllowKernelModeClients +UmdfFileObjectPolicy=AllowNullAndUnknownFileObjects +UmdfMethodNeitherAction=Copy +UmdfFsContextUsePolicy=CanUseFsContext2 +UmdfHostProcessSharing=ProcessSharingDisabled + +[pfXusb_Install] +UmdfLibraryVersion=$UMDFVERSION$ +ServiceBinary=%13%\pf_xusb.dll + +[Strings] +ProviderString = "punktfunk" +StdMfg = "(Standard system devices)" +DiskId1 = "punktfunk XUSB Installation Disk" +DeviceDesc = "punktfunk Virtual Xbox 360 (XUSB)" diff --git a/packaging/windows/xusb-driver/src/lib.rs b/packaging/windows/xusb-driver/src/lib.rs new file mode 100644 index 0000000..4c5416f --- /dev/null +++ b/packaging/windows/xusb-driver/src/lib.rs @@ -0,0 +1,462 @@ +// punktfunk virtual Xbox 360 XUSB companion — UMDF2 driver presenting the XUSB device interface so +// classic XInput (XInputGetState) reads the pad with no kernel bus driver (the HIDMaestro approach). +// +// xinput1_4.dll enumerates GUID_DEVINTERFACE_XUSB, opens the Nth instance (= player slot), and polls +// it with buffered IOCTLs. We register the interface and answer those IOCTLs from controller state the +// host publishes into a shared-memory section (`Global\pfxusb-shm-0`); a game's rumble (SET_STATE) is +// published back for the host to forward. Byte formats are the source-verified xusb22 wire layout +// (HIDMaestro driver/companion.c + nefarius/XInputHooker XUSB.h + ViGEm XUSB_REPORT). +// +// We answer the WAIT_* IOCTLs with STATUS_INVALID_DEVICE_REQUEST, which makes xinput1_4 fall back to +// synchronous GET_STATE polling — so no manual queue / timer is needed for classic XInput. + +#![allow(non_snake_case, non_upper_case_globals, clippy::missing_safety_doc)] + +use core::ffi::c_void; +use core::sync::atomic::{AtomicU32, Ordering}; +use wdk_sys::{ + call_unsafe_wdf_function_binding, windows::OutputDebugStringA, GUID, NTSTATUS, PCUNICODE_STRING, + PDRIVER_OBJECT, PWDFDEVICE_INIT, ULONG, WDFDEVICE, WDFDRIVER, WDFMEMORY, WDFQUEUE, WDFREQUEST, + WDF_DRIVER_CONFIG, WDF_IO_QUEUE_CONFIG, WDF_NO_HANDLE, WDF_NO_OBJECT_ATTRIBUTES, +}; + +// DEVICE_REGISTRY_PROPERTY: DevicePropertyLocationInformation (the const isn't re-exported at the +// wdk_sys root; the value is stable WDM). +const DEVICE_PROPERTY_LOCATION_INFORMATION: i32 = 10; + +/// The pad index this device serves (which `pfxusb-shm-` section to map). The host stamps it +/// into the device Location (`pszDeviceLocation`); the driver reads it in EvtDeviceAdd. With +/// `UmdfHostProcessSharing=ProcessSharingDisabled` (the INF) each pad gets its own WUDFHost, so this +/// static is per-pad — the basis for multi-pad. +static SHM_INDEX: AtomicU32 = AtomicU32::new(0); + +// ---- NTSTATUS ---- +const STATUS_SUCCESS: NTSTATUS = 0; +const STATUS_INVALID_DEVICE_REQUEST: NTSTATUS = 0xC000_0010u32 as NTSTATUS; +const STATUS_INVALID_BUFFER_SIZE: NTSTATUS = 0xC000_0206u32 as NTSTATUS; + +#[inline] +fn nt_success(s: NTSTATUS) -> bool { + s >= 0 +} + +// GUID_DEVINTERFACE_XUSB {EC87F1E3-C13B-4100-B5F7-8B84D54260CB} — what xinput1_4 enumerates + opens. +const GUID_DEVINTERFACE_XUSB: GUID = GUID { + Data1: 0xEC87_F1E3, + Data2: 0xC13B, + Data3: 0x4100, + Data4: [0xB5, 0xF7, 0x8B, 0x84, 0xD5, 0x42, 0x60, 0xCB], +}; + +// ---- XUSB IOCTLs (METHOD_BUFFERED) ---- +const IOCTL_XUSB_GET_INFORMATION: u32 = 0x8000_6000; +const IOCTL_XUSB_GET_CAPABILITIES: u32 = 0x8000_E004; +const IOCTL_XUSB_GET_LED_STATE: u32 = 0x8000_E008; +const IOCTL_XUSB_GET_STATE: u32 = 0x8000_E00C; +const IOCTL_XUSB_SET_STATE: u32 = 0x8000_A010; +const IOCTL_XUSB_WAIT_GUIDE_BUTTON: u32 = 0x8000_E014; +const IOCTL_XUSB_GET_BATTERY_INFORMATION: u32 = 0x8000_E018; +const IOCTL_XUSB_POWER_DOWN: u32 = 0x8000_A01C; +const IOCTL_XUSB_GET_XINPUT_MANAGEMENT_DRIVER: u32 = 0x8000_6380; +const IOCTL_XUSB_WAIT_FOR_INPUT: u32 = 0x8000_E3AC; +const IOCTL_XUSB_GET_INFORMATION_EX: u32 = 0x8000_E3FC; + +// Xbox 360 wired identity (what GET_INFORMATION reports). 0x0103 unblocks SET_STATE (vibration). +const XUSB_VID: u16 = 0x045E; +const XUSB_PID: u16 = 0x028E; +const XUSB_VERSION: u16 = 0x0103; + +// ---- WDF enum values ---- +const WdfIoQueueDispatchParallel: i32 = 2; +const WdfUseDefault: i32 = 2; // WDF_TRI_STATE + +// ---- shared-memory layout (host ↔ driver), must match the host's xbox_xusb_windows backend ---- +// magic u32 @0 ("PFXU"); packet u32 @4 (host bumps on state change → dwPacketNumber); the XUSB_REPORT +// payload @8: wButtons u16 @8, bLeftTrigger @10, bRightTrigger @11, sThumbLX i16 @12, LY @14, RX @16, +// RY @18; rumble_seq u32 @24 (driver bumps on SET_STATE); rumble large @28, small @29. +const FILE_MAP_RW: u32 = 0x0002 | 0x0004; +const SHM_MAGIC: u32 = 0x5558_4650; // "PFXU" little-endian +const SHM_SIZE: usize = 64; + +unsafe extern "system" { + fn OpenFileMappingW(access: u32, inherit: i32, name: *const u16) -> *mut c_void; + fn MapViewOfFile(h: *mut c_void, access: u32, hi: u32, lo: u32, len: usize) -> *mut c_void; + fn UnmapViewOfFile(addr: *const c_void) -> i32; + fn CloseHandle(h: *mut c_void) -> i32; +} + +fn log(s: &str) { + if let Ok(c) = std::ffi::CString::new(s) { + // SAFETY: c is a valid null-terminated string for the duration of the call. + unsafe { OutputDebugStringA(c.as_ptr().cast()) }; + } + use std::io::Write; + if let Ok(mut f) = std::fs::OpenOptions::new() + .create(true) + .append(true) + .open("C:\\Users\\Public\\pfxusb-driver.log") + { + let _ = writeln!(f, "{s}"); + } +} +macro_rules! dbglog { ($($a:tt)*) => { log(&format!($($a)*)) } } + +#[unsafe(export_name = "DriverEntry")] +pub unsafe extern "system" fn driver_entry( + driver: PDRIVER_OBJECT, + registry_path: PCUNICODE_STRING, +) -> NTSTATUS { + log("[pf-xusb] DriverEntry"); + // SAFETY: zeroed config then Size + callback set. + let mut config: WDF_DRIVER_CONFIG = unsafe { core::mem::zeroed() }; + config.Size = core::mem::size_of::() as ULONG; + config.EvtDriverDeviceAdd = Some(evt_device_add); + // SAFETY: all pointers valid; provided by the loader. + unsafe { + call_unsafe_wdf_function_binding!( + WdfDriverCreate, + driver, + registry_path, + WDF_NO_OBJECT_ATTRIBUTES, + &mut config, + WDF_NO_HANDLE.cast::() + ) + } +} + +/// Read the pad index the host stamped into the device Location (`pszDeviceLocation`), a NUL-terminated +/// UTF-16 decimal string. Defaults to 0 (single-pad) if absent. +fn query_shm_index(device: WDFDEVICE) -> u32 { + let mut mem: WDFMEMORY = core::ptr::null_mut(); + // SAFETY: device valid; property = LocationInformation; pool ignored in UMDF; mem receives the handle. + let st = unsafe { + call_unsafe_wdf_function_binding!( + WdfDeviceAllocAndQueryProperty, + device, + DEVICE_PROPERTY_LOCATION_INFORMATION, + 0, + WDF_NO_OBJECT_ATTRIBUTES, + &mut mem + ) + }; + if !nt_success(st) || mem.is_null() { + return 0; + } + let mut len: usize = 0; + // SAFETY: mem valid. + let buf = unsafe { call_unsafe_wdf_function_binding!(WdfMemoryGetBuffer, mem, &mut len) } + as *const u16; + if buf.is_null() { + return 0; + } + let mut idx: u32 = 0; + let mut any = false; + for i in 0..(len / 2).min(8) { + // SAFETY: buf valid for len bytes; i < len/2. + let c = unsafe { *buf.add(i) }; + if c == 0 { + break; + } + if (0x30..=0x39).contains(&c) { + idx = idx.wrapping_mul(10).wrapping_add((c - 0x30) as u32); + any = true; + } + } + if any { + idx + } else { + 0 + } +} + +extern "C" fn evt_device_add(_driver: WDFDRIVER, mut device_init: PWDFDEVICE_INIT) -> NTSTATUS { + log("[pf-xusb] EvtDeviceAdd"); + + let mut device: WDFDEVICE = core::ptr::null_mut(); + // SAFETY: device_init valid; attributes null; device receives the handle. + let st = unsafe { + call_unsafe_wdf_function_binding!( + WdfDeviceCreate, + &mut device_init, + WDF_NO_OBJECT_ATTRIBUTES, + &mut device + ) + }; + if !nt_success(st) { + dbglog!("[pf-xusb] WdfDeviceCreate failed 0x{:08x}", st as u32); + return st; + } + + let idx = query_shm_index(device); + SHM_INDEX.store(idx, Ordering::Relaxed); + dbglog!("[pf-xusb] shm index = {idx}"); + + // Register the XUSB device interface (no reference string) — what xinput1_4 enumerates + opens. + // SAFETY: device valid; GUID static; null reference string. + let st = unsafe { + call_unsafe_wdf_function_binding!( + WdfDeviceCreateDeviceInterface, + device, + &GUID_DEVINTERFACE_XUSB, + core::ptr::null() + ) + }; + if !nt_success(st) { + dbglog!( + "[pf-xusb] WdfDeviceCreateDeviceInterface failed 0x{:08x}", + st as u32 + ); + return st; + } + + // Default parallel queue: all the XUSB IOCTLs land here. + // SAFETY: zeroed config then fields set; Size matches the struct. + let mut qcfg: WDF_IO_QUEUE_CONFIG = unsafe { core::mem::zeroed() }; + qcfg.Size = core::mem::size_of::() as ULONG; + qcfg.DispatchType = WdfIoQueueDispatchParallel; + qcfg.PowerManaged = WdfUseDefault; + qcfg.DefaultQueue = 1; + qcfg.EvtIoDeviceControl = Some(evt_io_device_control); + qcfg.Settings.Parallel.NumberOfPresentedRequests = u32::MAX; + let mut queue: WDFQUEUE = core::ptr::null_mut(); + // SAFETY: device + config valid; attributes null; queue receives the handle. + let st = unsafe { + call_unsafe_wdf_function_binding!( + WdfIoQueueCreate, + device, + &mut qcfg, + WDF_NO_OBJECT_ATTRIBUTES, + &mut queue + ) + }; + if !nt_success(st) { + dbglog!("[pf-xusb] WdfIoQueueCreate failed 0x{:08x}", st as u32); + return st; + } + + log("[pf-xusb] device ready (XUSB interface registered)"); + STATUS_SUCCESS +} + +// Open + map the host's shared section and run `f` against the mapped base if magic is valid, then +// unmap. Re-mapped per access (the host may recreate the section across restarts). +fn with_shm(f: F) { + let name: Vec = format!("Global\\pfxusb-shm-{}", SHM_INDEX.load(Ordering::Relaxed)) + .encode_utf16() + .chain(std::iter::once(0)) + .collect(); + // SAFETY: name is a valid NUL-terminated UTF-16 string. + let h = unsafe { OpenFileMappingW(FILE_MAP_RW, 0, name.as_ptr()) }; + if h.is_null() { + return; + } + // SAFETY: h is a valid mapping handle; map the whole section; the view keeps it alive. + let view = unsafe { MapViewOfFile(h, FILE_MAP_RW, 0, 0, SHM_SIZE) } as *mut u8; + unsafe { CloseHandle(h) }; + if view.is_null() { + return; + } + // SAFETY: view points at >= 4 mapped bytes. + let magic = unsafe { core::ptr::read_unaligned(view as *const u32) }; + if magic == SHM_MAGIC { + f(view); + } + // SAFETY: view came from MapViewOfFile. + unsafe { UnmapViewOfFile(view as *const c_void) }; +} + +/// The current controller state from shared memory (zeros / neutral if the host hasn't connected). +/// Returns `(dwPacketNumber, wButtons, lt, rt, lx, ly, rx, ry)`. +fn read_state() -> (u32, u16, u8, u8, i16, i16, i16, i16) { + let mut out = (0u32, 0u16, 0u8, 0u8, 0i16, 0i16, 0i16, 0i16); + with_shm(|v| { + // SAFETY: v points at a mapped SHM_SIZE section with valid magic. + unsafe { + out.0 = core::ptr::read_unaligned(v.add(4) as *const u32); + out.1 = core::ptr::read_unaligned(v.add(8) as *const u16); + out.2 = *v.add(10); + out.3 = *v.add(11); + out.4 = core::ptr::read_unaligned(v.add(12) as *const i16); + out.5 = core::ptr::read_unaligned(v.add(14) as *const i16); + out.6 = core::ptr::read_unaligned(v.add(16) as *const i16); + out.7 = core::ptr::read_unaligned(v.add(18) as *const i16); + } + }); + out +} + +/// Publish a game's rumble (from SET_STATE) into shared memory for the host to forward. +fn publish_rumble(large: u8, small: u8) { + with_shm(|v| { + // SAFETY: v points at a mapped SHM_SIZE section; rumble_seq @24, large @28, small @29. + unsafe { + *v.add(28) = large; + *v.add(29) = small; + let seqp = v.add(24) as *mut u32; + let seq = core::ptr::read_unaligned(seqp).wrapping_add(1); + core::ptr::write_unaligned(seqp, seq); + } + }); +} + +// Build the 29-byte GET_STATE buffer (the layout xinput1_4 parses). +fn build_get_state() -> [u8; 29] { + let (packet, buttons, lt, rt, lx, ly, rx, ry) = read_state(); + let mut s = [0u8; 29]; + s[0..2].copy_from_slice(&XUSB_VERSION.to_le_bytes()); + s[2] = 0x01; // device count + s[5..9].copy_from_slice(&packet.to_le_bytes()); + s[0x0B..0x0D].copy_from_slice(&buttons.to_le_bytes()); + s[0x0D] = lt; + s[0x0E] = rt; + s[0x0F..0x11].copy_from_slice(&lx.to_le_bytes()); + s[0x11..0x13].copy_from_slice(&ly.to_le_bytes()); + s[0x13..0x15].copy_from_slice(&rx.to_le_bytes()); + s[0x15..0x17].copy_from_slice(&ry.to_le_bytes()); + s +} + +// GET_INFORMATION: 12 bytes — version, device count, VID/PID. Marks the slot connected. +fn build_information() -> [u8; 12] { + let mut info = [0u8; 12]; + info[0..2].copy_from_slice(&XUSB_VERSION.to_le_bytes()); + info[2] = 0x01; // one device/port + info[8..10].copy_from_slice(&XUSB_VID.to_le_bytes()); + info[10..12].copy_from_slice(&XUSB_PID.to_le_bytes()); + info +} + +// GET_CAPABILITIES V1 (24 bytes): Type=0x03 SubType=0x01 (gamepad), button/stick masks, motor max +// = 0xFFFF (advertise rumble). The V2 (36-byte) form prepends a 16-byte header when WGI asks for 36. +#[rustfmt::skip] +const CAPS_V1: [u8; 24] = [ + 0x03, 0x01, 0x00, 0x01, 0xFF, 0xF7, 0xFF, 0xFF, + 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +]; + +fn build_caps_v2() -> [u8; 36] { + let mut c = [0u8; 36]; + c[0..6].copy_from_slice(&[0x03, 0x01, 0x01, 0x01, 0x0C, 0x00]); + c[6..8].copy_from_slice(&XUSB_VID.to_le_bytes()); + c[8..10].copy_from_slice(&XUSB_PID.to_le_bytes()); + c[10..16].copy_from_slice(&[0x10, 0x01, 0x00, 0xFA, 0x34, 0x22]); + c[16..36].copy_from_slice(&CAPS_V1[4..24]); // the XINPUT_CAPABILITIES struct body + c +} + +extern "C" fn evt_io_device_control( + _queue: WDFQUEUE, + request: WDFREQUEST, + output_len: usize, + input_len: usize, + ioctl: ULONG, +) { + let status: NTSTATUS = match ioctl { + IOCTL_XUSB_GET_INFORMATION => copy_to_output(request, &build_information()), + IOCTL_XUSB_GET_INFORMATION_EX => { + let mut ex = [0u8; 64]; + ex[0..2].copy_from_slice(&XUSB_VERSION.to_le_bytes()); + ex[2] = 0x01; + ex[3] = 0x01; + ex[8..10].copy_from_slice(&XUSB_VID.to_le_bytes()); + ex[10..12].copy_from_slice(&XUSB_PID.to_le_bytes()); + let n = output_len.min(64); + copy_to_output(request, &ex[..n]) + } + IOCTL_XUSB_GET_CAPABILITIES => { + if output_len >= 36 { + copy_to_output(request, &build_caps_v2()) + } else { + copy_to_output(request, &CAPS_V1) + } + } + IOCTL_XUSB_GET_STATE => copy_to_output(request, &build_get_state()), + IOCTL_XUSB_GET_LED_STATE => copy_to_output(request, &[0x00, 0x00, 0x06]), + IOCTL_XUSB_GET_BATTERY_INFORMATION => { + copy_to_output(request, &[0x00, 0x01, 0x03, 0x00]) + } + IOCTL_XUSB_SET_STATE => on_set_state(request), + IOCTL_XUSB_POWER_DOWN | IOCTL_XUSB_GET_XINPUT_MANAGEMENT_DRIVER => STATUS_SUCCESS, + // Decline the async waits → xinput1_4 falls back to synchronous GET_STATE polling. + IOCTL_XUSB_WAIT_GUIDE_BUTTON | IOCTL_XUSB_WAIT_FOR_INPUT => STATUS_INVALID_DEVICE_REQUEST, + other => { + dbglog!("[pf-xusb] unhandled IOCTL 0x{other:08x} in={input_len} out={output_len}"); + STATUS_INVALID_DEVICE_REQUEST + } + }; + // SAFETY: request valid and not forwarded. + unsafe { call_unsafe_wdf_function_binding!(WdfRequestComplete, request, status) }; +} + +// SET_STATE: the rumble packet. Classic xusb22 layout is small; the motor bytes sit near the end. +// We publish a best-effort (large = byte 3, small = byte 4 for the 5-byte form) and log the raw bytes +// so the exact offsets can be confirmed against a real pad. +fn on_set_state(request: WDFREQUEST) -> NTSTATUS { + let mut inmem: WDFMEMORY = core::ptr::null_mut(); + // SAFETY: request valid. + let st = unsafe { + call_unsafe_wdf_function_binding!(WdfRequestRetrieveInputMemory, request, &mut inmem) + }; + if nt_success(st) { + let mut len: usize = 0; + // SAFETY: inmem valid. + let p = unsafe { call_unsafe_wdf_function_binding!(WdfMemoryGetBuffer, inmem, &mut len) } + as *const u8; + if !p.is_null() && len >= 2 { + let n = len.min(8); + // SAFETY: p valid for len bytes; read at most n. + let bytes = unsafe { core::slice::from_raw_parts(p, n) }; + let mut hex = String::new(); + for b in bytes { + hex.push_str(&format!("{b:02x} ")); + } + dbglog!("[pf-xusb] SET_STATE len={len} data: {hex}"); + // Observed 5-byte form {00, led, largeMotor, smallMotor, subcmd}: subcmd 0x02 = rumble + // (large/low-freq at [2], small/high-freq at [3]); 0x01 = player-LED set (ignored). + // 4-byte = raw XINPUT_VIBRATION → the two motor hi bytes. + if len >= 5 && bytes[4] == 0x02 { + publish_rumble(bytes[2], bytes[3]); + } else if len == 4 { + publish_rumble(bytes[1], bytes[3]); + } + } + } + STATUS_SUCCESS +} + +// Copy `src` into the request's (buffered) output buffer and set the completed byte count. +fn copy_to_output(request: WDFREQUEST, src: &[u8]) -> NTSTATUS { + let mut mem: WDFMEMORY = core::ptr::null_mut(); + // SAFETY: request valid; mem receives the memory handle. + let st = unsafe { + call_unsafe_wdf_function_binding!(WdfRequestRetrieveOutputMemory, request, &mut mem) + }; + if !nt_success(st) { + return st; + } + let mut outlen: usize = 0; + // SAFETY: mem valid; outlen receives the buffer size. + let _ = unsafe { call_unsafe_wdf_function_binding!(WdfMemoryGetBuffer, mem, &mut outlen) }; + if outlen < src.len() { + return STATUS_INVALID_BUFFER_SIZE; + } + // SAFETY: mem valid; src is a valid buffer of src.len() bytes. + let st = unsafe { + call_unsafe_wdf_function_binding!( + WdfMemoryCopyFromBuffer, + mem, + 0usize, + src.as_ptr() as *mut c_void, + src.len() + ) + }; + if !nt_success(st) { + return st; + } + // SAFETY: request valid. + unsafe { + call_unsafe_wdf_function_binding!(WdfRequestSetInformation, request, src.len() as u64) + }; + STATUS_SUCCESS +}