feat(gamepad): SwDeviceCreate per-session devnode (best-effort) + windows self-test

DualSenseWindowsManager now SwDeviceCreate's the pf_dualsense devnode per session
(SwDeviceClose on drop), matching the Linux UHID pad's lifecycle. It's best-effort:
SwDeviceCreate currently hits an unresolved E_INVALIDARG when a completion callback is
passed (an underscore in the enumerator name was a second cause, fixed by using
"punktfunk"), so on failure the host keeps the section + data plane and falls back to
an out-of-band devnode (installer/devgen) — see docs/windows-dualsense-scoping.md.

Add a `dualsense-windows-test` host CLI that drives the manager (create devnode + push
a frame + hold), used to validate the path. Live on the RTX box: the manager creates
the section + pushes report 0x01 and a devnode serves it to a HID read (b1=0xC0,
b8=0x28) — the host-side data plane works end to end.

cargo check + clippy -D warnings clean on x86_64-pc-windows-msvc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-21 21:34:00 +00:00
parent 01dc0b616c
commit fde438a1ed
4 changed files with 185 additions and 11 deletions
+3
View File
@@ -120,6 +120,9 @@ windows = { version = "0.62", features = [
# shared-memory section (inject/dualsense_windows.rs) so the UMDF host can open it.
"Win32_Security_Authorization",
"Win32_Devices_DeviceAndDriverInstallation",
# SwDeviceCreate/SwDeviceClose — the per-session virtual-DualSense devnode
# (inject/dualsense_windows.rs).
"Win32_Devices_Enumeration_Pnp",
"Win32_Devices_Display",
"Win32_Storage_FileSystem",
"Win32_System_IO",