DuoController is a driver for Windows that emulates Xbox Elite, DualShock 4, DualSense and DualSense Edge controllers.
It is a spiritual successor to ViGEmBus, the now-abandoned KMDF-based kernel driver, reimagined using Microsoft's Xbox GIP Synthetic and User-Mode Driver Framework (UMDF) APIs.
Microsoft is actively steering the Windows driver ecosystem away from kernel-mode and toward user-mode drivers.
The reasoning is clear:
| Concern | Kernel Driver (KMDF) | User Driver (UMDF) |
|---|---|---|
| System Stability | A crash takes down the entire OS | A crash takes down only the driver process |
| Attestation Signing | Required (EV certificate, expensive) | Not required |
| Development Complexity | High - kernel debugging, WinDbg, VM setup | Low - standard user-mode tooling |
| Security Surface | Ring 0 - full system access | Ring 3 - sandboxed, limited privileges |
| Distribution | Signing portal, HLK testing | Standard DLL deployment |
Kernel drivers on modern Windows must be submitted to the Windows Hardware Dev Center, pass through attestation signing, and have to be pre-signed by an Extended Validation (EV) code signing certificate.
This process costs hundreds of dollars, requires a registered legal entity that fulfills Microsoft's requirements, and takes weeks of turnaround.
UMDF drivers require no such signing.
A standard code signing certificate (or even self-signing for development or small-scale publishing) is sufficient.
This makes DuoController dramatically more accessible to:
- Independent developers
- Small teams
- Full DualShock 4, DualSense & DualSense Edge Controller Emulation
- Full Xbox Elite Controller Emulation
- Session Isolation - Isolates gamepads to the current session ID for multi-session and RDP environments
- Minimal Footprint - A single DLL/INF pair, no kernel components
flowchart TB
App["<b>Your Service</b><br/><span style='white-space:nowrap;color:inherit;font-size:small'>Running as SYSTEM</span><br/><br/>DuoController_Initialize()<br/><span style='white-space:nowrap;color:inherit'>DuoController_CreateController(Xbox|DualShock4|DualSense|DualSenseEdge)</span><br/>DuoController_SendReport()<br/>DuoController_RemoveController()<br/>DuoController_Uninitialize()"]
Xbox["<b>Xbox Path</b><br/><br/>xboxgipsynthetic.dll<br/>(System API)"]
DS4["<b>DualShock 4 Path</b><br/><br/>Shared Memory<br/>(UMDF Driver)"]
DS["<b>DualSense / Edge Path</b><br/><br/>Shared Memory<br/>(UMDF Driver)"]
Input["<b>Windows Game Input API</b><br/><span style='white-space:nowrap;color:inherit'>(GameInput / XInput / DirectInput / RawInput)</span>"]
App --> Xbox
App --> DS4
App --> DS
Xbox --> Input
DS4 --> Input
DS --> Input
style App fill:#1a1a2e,stroke:#e94560,stroke-width:2px,color:#fff
style Xbox fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#fff
style DS4 fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#fff
style DS fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#fff
style Input fill:#1a1a2e,stroke:#e94560,stroke-width:2px,color:#fff
// Initialize the library
HRESULT DuoController_Initialize();
// Create a virtual controller
HRESULT DuoController_CreateController(
DUO_CONTROLLER_TYPE controllerType, // Xbox, DualShock4, DualSense, or DualSenseEdge
DuoController_VibrationReportCallback_t vibrationCallback,
void* vibrationCallbackContext,
void** controller
);
// Send an input report:
// Xbox -> DUO_CONTROLLER_INPUT_REPORT_XBOX
// DualShock4 -> DUO_CONTROLLER_INPUT_REPORT_DS4
// DualSense -> DUO_CONTROLLER_INPUT_REPORT_DUALSENSE
// Edge -> DUO_CONTROLLER_INPUT_REPORT_DUALSENSE
HRESULT DuoController_SendReport(
void* controller,
void* inputReport
);
// Remove a virtual controller
HRESULT DuoController_RemoveController(void* controller);
// Uninitialize the library
HRESULT DuoController_Uninitialize();- Windows 10 or later (x64)
- Visual Studio 2026
- Windows Driver Kit (WDK, Nu-Get preferred)
# Open DuoController.sln in Visual Studio and build for Release x64| Project | Description |
|---|---|
DuoController |
The UMDF driver DLL and library — implements the HID minidriver, shared memory server, and the client API |
DuoControllerSample |
A minimal C sample showing library usage for Xbox, DualSense Edge, DualSense, and DualShock 4 controller types |
Apache 2.0 © 2026 Black-Seraph
