ZakoVirtualGamepad is an AlkaidLab UMDF 2 + Virtual HID Framework (VHF) driver that exposes a native wired Sony DualSense-compatible controller to Windows. It is intended to add DualSense support to Sunshine without replacing its mature, signed ViGEm backend for Xbox 360 and DualShock 4 compatibility.
This repository contains an x64 developer preview:
- fixed Sony
VID 054C / PID 0CE6DualSense profile; - sticks, triggers, buttons, D-pad, motion, two touches, and battery input;
- rumble, lightbar, player LEDs, mute LED, and adaptive-trigger output;
- versioned, size-checked private IOCTL ABI;
- one virtual controller per client handle, destroyed automatically on close;
- asynchronous output reads with a latest-value cache;
- a native client API and
ZakoVirtualGamepadCli.exesmoke-test tool; - Windows 10 2004+ and Windows 11 INF paths, with UMDF 2.15 as the floor.
It is not yet a production release. Hardware/game compatibility, suspend and resume, verifier runs, upgrade/rollback, and formal driver signing still need validation on clean Windows test machines.
Requirements: Visual Studio 2022 C++ build tools, Windows SDK/WDK, NuGet, and PowerShell 5.1 or newer.
nuget install .\packages.config -OutputDirectory .\packages -NonInteractive
msbuild .\ZakoVirtualGamepad.sln -m -p:Configuration=Release -p:Platform=x64For a cataloged development package:
.\scripts\package-driver.ps1 -SignMode TestTest output is a deliberately self-signed development distribution. The user
must explicitly trust its packaged public certificate; it must never be
presented as a normally trusted, WHQL, attestation, or production release. The
scripts do not enable Windows test mode or modify Secure Boot. See
docs/DRIVER_SIGNING.md.
The default packaging mode is unsigned and CI publishes only an explicitly
named signing input. Local testing uses an explicitly marked self-signed
package, following the ZakoVirtualMouse development workflow. A public x64
release must use the manually approved SignPath path and must never contain the
development .cer; tag pushes alone cannot publish a driver. Installation is
never part of build or packaging.
On an isolated elevated test machine, install a test package with:
.\scripts\install-driver.ps1 -TrustDevelopmentCertificateRemove the generated root device while retaining the Driver Store package for
rollback with scripts\uninstall-driver.ps1. Removing a Driver Store package
requires both -RemoveDriverPackage and its explicit oemNN.inf name.
Development certificate trust is retained by default for safe rollback. Remove
the exact certificate supplied with the package by also passing
-RemoveDevelopmentCertificate when it is no longer needed.
After installing a development package in a test environment, run an elevated terminal:
.\x64\Release\ZakoVirtualGamepadCli.exe info
.\x64\Release\ZakoVirtualGamepadCli.exe smoke
.\x64\Release\ZakoVirtualGamepadCli.exe hold 60smoke creates one controller and submits neutral state for one second. hold
keeps it alive at 250 Hz and prints feedback for interactive Steam/game testing.
Both remove the controller when the process exits and deliberately do not
automate driver installation. Follow docs/VALIDATION_PLAN.md
for reproducible acceptance runs.
Sunshine should select this backend only for DualSense (native) and should
fall back to ViGEm DS4 when the driver is absent, incompatible, or fails its
handshake. Do not silently map an explicit native-DS5 selection to Xbox 360.
See docs/ARCHITECTURE.md and docs/PROTOCOL.md.
The VHF lifecycle and DualSense behavior are based in part on the MIT-licensed WinUHid project. See THIRD_PARTY_NOTICES.md.