Skip to content

Repository files navigation

ZakoVirtualGamepad

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.

Current milestone

This repository contains an x64 developer preview:

  • fixed Sony VID 054C / PID 0CE6 DualSense 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.exe smoke-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.

Build

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=x64

For a cataloged development package:

.\scripts\package-driver.ps1 -SignMode Test

Test 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 -TrustDevelopmentCertificate

Remove 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.

Diagnose

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 60

smoke 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.

Integration rule

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.

Attribution

The VHF lifecycle and DualSense behavior are based in part on the MIT-licensed WinUHid project. See THIRD_PARTY_NOTICES.md.

About

UMDF 2 and VHF virtual DualSense driver for Sunshine

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages