Windows: Xbox Series Share button is unavailable through Steam's VHF/XInput path
@LizardByte-bot is already working on this.
Since Aug 26, 2026.
Assessment
This issue has not been assessed yet.
Description
Environment
- Host OS: Windows
- Backend: libvirtualhid UMDF/VHF driver
- Virtual profile: Xbox Series (
VID_045E&PID_0B12, release0x0509) - Affected consumer: Steam controller input
Observed behavior
The public Xbox Series profile retains VID_045E&PID_0B12. At device creation,
the Windows transport applies the captured 0x0509 release and
VID_045E&PID_0B12&IG_00 XInputHID match ID observed from physical Xbox Series
USB and Xbox Wireless Adapter connections.
The VHF child preserves the native 17-byte GIP-shaped input report, including
Share/Misc as button bit 12, and the native eight-byte four-motor output
payload. Raw HID/browser testers can see the virtual HID device, but Steam's
controller tester does not expose the Share button.
Physical Xbox Series controllers connected through USB, Bluetooth, or the Xbox
Wireless Adapter enter Steam's Xbox HIDAPI path and map Share as misc1:b11.
The Windows VHF-created controller instead follows the XInput path. XInput
exposes the standard Xbox button set but has no Share/Misc button.
SDL's Xbox HIDAPI driver also rejects the Windows \\?\HID# fake endpoints
used for XGIP controllers. Changing only the VHF HID descriptor therefore
cannot make Steam select the same path used by a physical Xbox Series
controller.
This is a Windows host transport/consumer-path limitation, not a Moonlight
client forwarding limitation.
Proposed direction
- Add a separate Windows Xbox transport that is not a VHF HID child and can be
accepted by Steam's Xbox HIDAPI/GIP path. - Model it on captured physical Xbox Series USB, Bluetooth, and Xbox Wireless
Adapter device trees, including parent transport identity, interface class,
compatible IDs, initialization behavior, and output routing. - Retain the current VHF Xbox Series path as the user-mode compatibility path
until the alternative transport is implemented and validated.
Acceptance criteria
- Steam maps the virtual Share button as
misc1:b11. - Steam's controller tester detects Share.
- Standard buttons, sticks, analog triggers, D-pad, Guide, basic rumble, and
trigger rumble continue to work. - Validation includes Steam controller logs and the Steam controller tester,
not only descriptor or raw-HID inspection.
Non-goals
- Do not add a custom kernel-mode driver to the normal C++ library.
- Do not continue descriptor-only VHF remaps as a solution for Steam Share
support. - Do not expose this Windows-specific transport limitation through the public,
platform-neutral C++ API.
The investigation originated in
PR #54.
- Dominant language
- C++
- Stars
- 57
- Forks
- 15
- Avg merge
- 11h 15m
- Merged PRs (30d)
- 33
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from LizardByte/libvirtualhid
-
Difficulty 3/5 1-2 days Newbie friendliness 68/100
LizardByte/libvirtualhid#150 · 1 comment ·
-
Difficulty 3/5 1-2 days Newbie friendliness 78/100
LizardByte/libvirtualhid#134 · 1 comment ·
-
LizardByte/libvirtualhid#84 · 1 assignee ·
-
LizardByte/libvirtualhid#83 · 1 assignee ·
-
LizardByte/libvirtualhid#82 · 1 assignee ·
All issues in LizardByte/libvirtualhid
Similar issues
-
enhancement
Difficulty 1/5 Under an hour Newbie friendliness 88/100
QuantStack/git2cpp#187 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
mlcommons/mobile_app_open#1182 ·
-
Needs-Triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
microsoft/winget-cli#6547 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 90/100
AXERA-TECH/ax-llm#77 ·