References¶
Authoritative sources for every load-bearing claim in this wiki. Each entry covers a specific topic plus the wiki pages that cite it.
A note on linking: this page deliberately avoids deep learn.microsoft.com URLs that may have moved during one of Microsoft's documentation reshuffles. For Microsoft-published material, the topic, header, or symbol name is cited verbatim: search Microsoft Learn for the exact symbol and the page is one click away. GitHub repos and stable spec roots are linked directly.
If a wiki page makes a claim that isn't backed by something here, it falls into one of three buckets: (a) author-empirical, validated by the regression battery in test/regression/regression_battery.ps1; (b) directly traceable to HIDMaestro's own source under github.com/hifihedgehog/HIDMaestro; (c) Ghidra decomp from this project's investigations, archived under docs/investigations/.
HID specification¶
The USB-IF specifications are the canonical source for every byte-layout, descriptor-item, and usage-code claim. Documents are at usb.org/document-library; search by the exact title.
-
USB HID 1.11 specification. Defines report descriptors, input/output/feature reports, the Item Format encoding (used by
HidDescriptorBuilder.AddRaw), andHidD_GetPreparsedDatasemantics. Backs every byte-level descriptor claim in HID Descriptor Builder and Profile System. -
USB HID Usage Tables (HUT) 1.5. Defines the Generic Desktop Page (Usage Page 0x01), where:
- 0x30 X, 0x31 Y, 0x32 Z, 0x33 Rx, 0x34 Ry, 0x35 Rz, 0x39 Hat Switch
- 0x40 Vx, 0x41 Vy: the velocity usages used in Cross-API Coverage for the separate-trigger trick.
-
0x04 Joystick, 0x05 Game Pad: the application TLCs used by
HidDescriptorBuilder.Joystick()/Gamepad(). -
HID Physical Interface Device (PID) 1.0. Defines Report IDs 0x11 Create New Effect, 0x12 Block Load, 0x13 PID Pool, 0x14 PID State, 0x1A Effect Operation, 0x1B Block Free, 0x1C Device Control, 0x1D Device Gain, plus the Physical Interface Device usage page (0x0F) and every effect-type code referenced by
HidDescriptorBuilder.AddPidFfbBlock's emitted bytes. Backs Force Feedback section by section.
Microsoft Windows driver framework¶
For symbols below, search learn.microsoft.com by exact name unless a verified URL is given.
-
User-Mode Driver Framework (UMDF) 2: the framework HIDMaestro.dll runs under. Topic: "Getting started with UMDF version 2." Defines
EvtIoDeviceControl,WDFDEVICElifetime, queue dispatch policies, and the WUDFRd reflector model. Backs UMDF2 Driver Internals and Architecture Overview. -
UmdfHostProcessSharingdirective: topic: "Specifying WDF Directives in INF Files." DocumentsProcessSharingEnabled(default) vsProcessSharingDisabled(HIDMaestro's choice). Backs the per-instance WUDFHost claim in Architecture Overview and Multi-Controller. -
mshidumdf.sys: the Windows-shipped HID minidriver proxy that hosts UMDF2 HID drivers. The reference sample is Microsoft'svhidmini2(in the public Windows-driver-samples repo on GitHub). -
SwDeviceCreate(cfgmgr32 / swdevice.h): topic: "SwDeviceCreate function." ThepContainerIdparameter is the linchpin of the slot-1-skip fix in SwDevice and PnP. TheSWDeviceLifetimeParentPresentlifetime flag and the only-documented-teardown-path are described in the same topic. -
SetupDiCreateDeviceInfoW: topic: "SetupDiCreateDeviceInfoW function." The older device-creation API used by HIDMaestro for plain HID profiles. Does NOT expose ContainerID assignment (the gap that forced the SwDevice migration). -
DEVPKEY_Device_ContainerId: topic by exact name. Defines the GUID that groups multiple devnodes as one logical device, including the null sentinel{00000000-0000-0000-FFFF-FFFFFFFFFFFF}that triggers the slot-1-skip path documented in SwDevice and PnP. -
pnputil: topic: "PnPUtil command syntax." The/add-driver,/install,/delete-driver,/remove-devicesemantics referenced in Driver Install and Signing and Lifecycle and Teardown. -
CM_NOTIFY_ACTIONenumeration: topic by exact name. DefinesCM_NOTIFY_ACTION_DEVICEINSTANCEREMOVED, used as the kernel-side guarantee in SwDevice and PnP's SwD-first removal ordering. -
HID class architecture (HidClass.sys): topic: "HID Architecture." Backs the kernel-side stack diagram in UMDF2 Driver Internals.
-
RAWMOUSEstructure: topic by exact name. It carries five buttons, flags an absolute pointer withMOUSE_MOVE_ABSOLUTE, and definesMOUSE_MOVE_NOCOALESCEbecause Windows merges consecutive moves. Backs the second button collection and the note on merged moves in Keyboards and Mice. -
xinputhid.inf [GIP_Hid]: the inbox INF that bindsxinputhid.sysas a HID upper filter for Xbox Series / One / Elite v2 BT controllers. Lives atC:\Windows\INF\xinputhid.infon every Win10/11 install. The[GIP_Hid]Match section is the documented mechanism for Profile System's xinputhid Xbox group.
XInput / Xbox controller protocol¶
-
XInput. Topic: "XInput Game Controller APIs" on Microsoft Learn. The 4-slot cap,
XInputGetState,XInputSetState,XINPUT_STATEpacket layout. Backs Cross-API Coverage's XInput section. -
XInputGetStateEx: ordinal 100 export ofxinput1_3.dll/xinput1_4.dll. ReturnsXINPUT_GAMEPAD_GUIDE(0x0400) inwButtons. Not in Microsoft's public XInput documentation; widely documented in community projects (search "XInputGetStateEx ordinal 100"). Backs the Guide button claims throughout the wiki. -
GUID_DEVINTERFACE_XUSB={EC87F1E3-C13B-4100-B5F7-8B84D54260CB}. Defined inXinput.h. The interface classxinput1_4.dllwalks for discovery. -
XUSB / GIP wire format: not officially documented by Microsoft. HIDMaestro's understanding comes from Ghidra decomp of
xinput1_4.dllandxusb22.sysplus empirical probing ofxinputhid.sys, archived indocs/investigations/. The IOCTL codes (0x80006000IOCTL_XUSB_GET_INFORMATION,0x8000E004IOCTL_XUSB_GET_CAPABILITIES, etc.) match the empirical probe results in XUSB Companion.
Microsoft GameInput and Windows.Gaming.Input¶
-
Microsoft GameInput (the modern API): product page at gaming.microsoft.com (search "GameInput") and developer docs on Microsoft Learn. The product name HIDMaestro user-facing copy uses (per the Glossary entry).
-
Windows.Gaming.Input (the older WinRT surface): the WinRT API exposed by
Windows.Gaming.Input.dll. Documented on Microsoft Learn under theWindows.Gaming.Inputnamespace. -
GameInput device mapping registry: the
HKLM\SYSTEM\CurrentControlSet\Control\GameInput\Devices\hive. Not Microsoft-documented; HIDMaestro's understanding is reverse-engineered. Investigation:docs/investigations/wgi-silent-sink-2026-04/. -
ProviderManagerWorker::OnPnpDeviceAddedclassifier pass-list: reverse-engineered via Ghidra decomp ofWindows.Gaming.Input.dllon Win11 26200. Source: same investigation. Backs the dispatch claims in Cross-API Coverage and the System-class choice in XUSB Companion. -
IsDeviceOrAncestorFilteredBywcsncmpagainst"xinputhid": same Ghidra source. Backs the UpperFilter tripwire in XUSB Companion.
DirectInput / DInput8 / pid.dll¶
-
DirectInput. Topic: "DirectInput" under "Previous Versions" on Microsoft Learn. The 8-axis enumeration (X, Y, Z, Rx, Ry, Rz, Slider0, Slider1), POVs, button caps. Backs the DirectInput claims in Cross-API Coverage.
-
pid.dllPID FFB enumerator: the DirectInput-shipped DLL that walks HID PID descriptors and exposes effects to DI consumers. Closed-source Microsoft component. The Gamepad-TLC AV inPID_EffectOperation+0x52is documented in HIDMaestro issue #16; reproducible against the canonical four-feature vJoy descriptor on Windows 10/11. -
Ownership claims and deploy locking (v2.0.0): CreateNamedPipeW documents
FILE_FLAG_FIRST_PIPE_INSTANCE, the claim every program, transport index and identity takes, and that a pipe instance is deleted when the last handle closes. WaitNamedPipeW documents the liveness probe that opens no handle. Object Namespaces documents the private namespace the machine-wide locks live in,HIDMaestro.Admin\Deployand the rest: "The caller must be within the specified boundary for the create operation to succeed", and the boundary holds the Administrators SID. No Microsoft page documents the pipe prefixProtectedPrefix\Administrators\the claims live under. James Forshaw's "Named Pipe Secure Prefixes" (2017) describes it, and the SDK's source names the smss.exe and npfs.sys builds read for it. Back Programs Side by Side. -
Marking a gone devnode for reinstall (v2.0.0): Determining Whether a Device is Plugged In gives
CM_Get_DevNode_StatusreturningCR_NO_SUCH_DEVINSTas the test for an unplugged device's devnode, andCONFIGFLAG_REINSTALLas the mark that reinstalls it at its next arrival. Back the WinUSB restore in Wii U GameCube Adapter. -
Installing on one device (v2.0.0): DiInstallDevice installs the best match the driver store holds on the named device and no other. SetupAPI functions that simplify driver installation documents that
UpdateDriverForPlugAndPlayDevicesinstalls the package on all present devices with a matching hardware or compatible ID, which is why a create no longer uses it. Back Driver Install and Signing. -
PnP notifications without a managed delegate (v2.0.0): CM_Unregister_Notification waits for pending callbacks to finish, which is why the
GCHandlethe dispatcher reads is freed after it returns. -
Build layouts (v2.0.0): Install the WDK using NuGet lists the Windows SDK as a requirement of the NuGet WDK. Microsoft's windows-drivers-rs reads
WDKContentRootandVersion_Numberin an EWDK prompt (crates/wdk-build/src/utils.rs) and pointsWDKContentRootat the target architecture's package in CI (.github/actions/install-wdk/action.yaml). Back the settings in Build and Release. -
Inf2Cat's manifest and search order (v2.0.0): Internal Manifest vs External Manifest and Dynamic-link library search order back dropping
inf2cat.exe.manifestandMicrosoft.Kits.Logger.dll. -
vJoy reference descriptor: github.com/njz3/vJoy maintains the descriptor headers (
hidReportDesc.h,hidReportDescSingle.h,hidReportDescFfb.h). The four-feature descriptor that triggers thepid.dllAV.
Library source code¶
-
HIDAPI: github.com/libusb/hidapi. The Windows backend at
windows/hid.cis where the bus type detection (USB / Bluetooth / SPI), theBTHENUMandBTHLEDEVICEcompatible ID checks (back the Bluetooth identity in Cross-API Coverage), and the&IG_skip logic live. The preparsed-data reconstruction algorithmHMDeviceExtractorports lives inwindows/hidapi_descriptor_reconstruct.c(originally contributed by the Chromium WebHID team). -
SDL3: github.com/libsdl-org/SDL. The XInput / RawInput / HIDAPI fallback hierarchy is in
src/joystick/windows/. TheSDL_HINT_JOYSTICK_XINPUThint is documented at wiki.libsdl.org (search the hint name). -
SDL community gamepad mapping database: github.com/mdqinc/SDL_GameControllerDB. The community-maintained
gamecontrollerdb.txt. Spoofed-VID/PID profiles in Custom Profiles inherit mappings from here. -
Linux HID drivers:
drivers/hid/hid-playstation.c(DualSense and DualShock 4: report layouts, calibration parsing, the Bluetooth feature CRC) anddrivers/hid/hid-sony.c(DualShock 3: report offsets, battery codes, motion scale) in the kernel's HID tree. -
RPCS3: github.com/RPCS3/rpcs3.
rpcs3/Input/ds3_pad_handler.cppand.hare the DualShock 3 read sequence and output report thedualshock-3-fullpersona answers.ds4_pad_handler.cppanddualsense_pad_handler.cppcheck the Bluetooth calibration CRC. -
PCSX2: github.com/PCSX2/pcsx2.
pcsx2/Input/SDLInputSource.cppsets SDL's sixaxis hint on Windows and binds pressure axes for a pad SDL reports as a PS3 controller with 16 axes and 11 buttons. -
DS4Windows: github.com/schmaldeo/DS4Windows, the maintained fork.
DS4Windows/DS4Library/DS4Sixaxis.csparses the DualShock 4 calibration per transport without absolute values. -
switch2_controller_research: github.com/ndeadly/switch2_controller_research. The Switch 2 controllers' command protocol (
commands.md), reports (hid_reports.md), descriptors and flash layout, andcaptures/usb/rumble-procon-gccon.pcapng, the link-layer capture of a console driving a Pro Controller 2 thatswitch2-pro-controller-compositereproduces. -
SDL's Switch 2 driver:
src/joystick/hidapi/SDL_hidapi_switch2.cin SDL3. The start sequence, report0x05parsing, the sensor constants and the rumble encoding the Switch 2 Pro persona answers. -
Switch 2 device emulations: VIIPER's
device/ns2proover USB/IP, switch2-controllers-windows10-gyro'ssrc/usbip_server.py, and XinHeLianSheng-Pro2-Bridge'susb_switch2_vendor.c. The last two serve the Microsoft OS 1.0 descriptors the persona serves. switch2-controllers'controller.pygives the rumble frame's bit layout. -
libusb: github.com/libusb/libusb.
libusb/os/windows_winusb.creads a device'sDeviceInterfaceGUIDsorDeviceInterfaceGUIDto reach an interface on WinUSB. -
usbip-win2 host controller install (v2.0.1): github.com/vadimgrn/usbip-win2 at tag
v.0.9.8.1.userspace/devnode/main.cpplines 232-295 are the two callsdevnode.exe installmakes, which the SDK makes itself.userspace/innosetup/setup.issline 176 adds the root-hub filter with pnputil, anddrivers/ude_filter/usbip2_filter.inflines 32-43 make it an extension INF onUSB\ROOT_HUB30, which is why its install restarts every USB 3 root hub.drivers/ude/device.cpplines 405-411 anddrivers/ude/filter_request.cppare why SET_CONFIGURATION and SET_INTERFACE need the filter. Back the install in Driver Install and Signing. -
Programs that run usbip-win2's installer (v2.0.1): Handheld Companion's
HandheldCompanion.isslines 568-577 andutils/Utils.isslines 75-113, and VIIPER'sscripts/install.ps1lines 120-132. Back what happens when they find HIDMaestro's install. -
Wii U GameCube adapter hosts (v2.0.0): Dolphin (
Source/Core/InputCommon/GCAdapter.cpp), Slippi's Dolphin fork (the same file, andLibusbUtils.cpp), SDL (src/joystick/hidapi/SDL_hidapi_gamecube.c, andsrc/hidapi/SDL_hidapi.c, which opens 057E:0337 only through libusb), eden (src/input_common/drivers/gc_adapter.cpp), RMG (Source/RMG-Input-GCA/main.cpp), gcfeeder and Nintendont (kernel/HID.c,PADReadGC.c). They back the command protocol, the report0x21layout and the status bits in Wii U GameCube Adapter. github.com/dolphin-emu/dolphin, github.com/libsdl-org/SDL. -
Wii U GameCube adapter devices (v2.0.0): 57
lsusbandusb-devicesdumps of 057E:0337 from linux-hardware.org back the descriptors. The firmwares of loopj (usb-gamecube-controller-adapter) and pico-rectangle copy the strings, pico-rectangle and HOJA-LIB-ESP32 the report descriptor, and HOJA-LIB-RP2040 holds notes from a real adapter on its status values. joypad-os emulates the adapter with a different, 70-byte descriptor. A command survey of a real adapter (GBAtemp thread 388169, 2015) gives what0x11to0x17do, François-Xavier Carton's Linux driver series (hid-gamecube-adapter v3, 2020) gives the report layout and the 37-byte read, and Arte's guide to overclocking the adapter gives the 1.19971 ms controller read and the 833 and 1000 reports a second. -
libusb Windows backend (v2.0.0):
libusb/os/windows_winusb.cturns onALLOW_PARTIAL_READSfor every endpoint, readsDeviceInterfaceGUIDsto open a WinUSB device, and skips a device whose install state is not 0, which is whyBindWinUsbleaves no reinstall flag on the bound devnode. The USB device emulation behind the persona is Write a UDE client driver, and the endpoint polling periods are the tables under USB_ENDPOINT_DESCRIPTOR. -
Linux HID core and hid-tools:
drivers/hid/hid-core.cin the kernel's HID tree and the report descriptor parser in hid-tools. The SDK's descriptor parser assigns usage pages, Delimiter alternative sets and the empty value of a key array (hid_array_value_is_valid) as they do. -
Keyboard and mouse descriptors: each of the 103 keyboard and mouse profiles copies one interface's report descriptor from a public dump: usbhid-dump output posted in project issues, libinput recordings, or the Linux kernel's HID selftests (
tools/testing/selftests/hid/). -
Chromium gamepad implementation: source.chromium.org/chromium/chromium/src/+/main:device/gamepad/. The platform-specific backends are under
device/gamepad/{windows,linux,mac}/. The&IG_skip in the Raw Input backend is inraw_input_data_fetcher_win.cc.
Reference virtual-controller projects¶
-
DsHidMini: github.com/nefarius/DsHidMini. The architectural ancestor of HIDMaestro: UMDF2 + xinputhid for DualShock 3 emulation. Provides the proven UMDF2-as-HID-minidriver pattern. Its SXS mode is the model for
dualshock-3-full: the report descriptor (driver/HID/03_SXS_Col1_Joystick.h, BSD 3-Clause), the joystick and feature report conversions (DsHid.c,HID.FeatureReport.c), and the output command handling (HID.Reports.c). -
ViGEmBus: github.com/nefarius/ViGEmBus. The retired-but-still-used kernel-mode virtual controller bus driver. Referenced as "what HIDMaestro replaces." Its
Bus_FileCloseinsys/Driver.cppunplugs a client's devices when the client's process exits, the precedent for the owner pipe in Keyboards and Mice. -
vJoy: the active-maintenance fork at github.com/njz3/vJoy is the canonical source for
hidReportDescFfb.h(the four-feature descriptor that trapspid.dll). -
VHF (Microsoft Virtual HID Framework): kernel-only; the alternative HIDMaestro deliberately avoids. Topic: "Virtual HID Framework (VHF)" on Microsoft Learn.
.NET / SDK / signing toolchain¶
For .NET API symbols below, search learn.microsoft.com/en-us/dotnet/api/ by exact name.
-
.NET self-signed certificate generation:
System.Security.Cryptography.X509Certificates.CertificateRequest. The API HIDMaestro uses in Driver Install and Signing to mint the per-machine self-signed cert. -
Driver signing: the trust path that lets a self-signed cert in
Cert:\LocalMachine\TrustedPublisherinstall a UMDF2 driver without WHQL submission. Search Microsoft Learn for "Driver Signing" / "Driver signing requirements" for the current authoritative description. -
Inf2Cat.exe: topic by exact name on Microsoft Learn. Embedded in the SDK alongside the WDK-required dependencies. -
signtool.exe: topic by exact name on Microsoft Learn.
Internal HIDMaestro investigations¶
These archive Ghidra decomp output, ProcMon traces, registry dumps, and empirical probe results that back claims throughout the wiki.
-
docs/investigations/issue3-dual-xinputhid-saturation-2026-04/: the multi-controller WUDFHost CPU saturation investigation. Backs theUmdfHostProcessSharing = ProcessSharingDisabledclaim in Architecture Overview and Multi-Controller. -
docs/design/coexistence.md: the 2.0.0 design note for programs side by side, with every mechanism, measurement and source behind Programs Side by Side, Wii U GameCube Adapter, the build settings and the NativeAOT work. -
docs/design/data-driven-devices.md: the design note for devices as profile data, behind the report field parameters and the values on the wire. -
docs/MIGRATION.md: the repository's copy of Moving from 1.x. -
docs/UNINSTALL.md: the repository's source for Removing HIDMaestro. -
docs/investigations/wgi-silent-sink-2026-04/: the WGI dispatch /IsDeviceOrAncestorFilteredBy/ classifier pass-list /IOCTL_XUSB_WAIT_FOR_INPUT29-byte format reverse engineering. Backs all of XUSB Companion and Cross-API Coverage's WGI sections. -
HIDMaestro README: primary source for the catalog count, performance numbers, and validation results referenced in Multi-Controller and Lifecycle and Teardown.
-
HIDMaestro issue #16: the four-feature pid.dll AV report. Backs Force Feedback's "only one Feature report" rule.
-
HIDMaestro issue #19: the Xbox 360 d-pad XInput regression. Backs the v1.3.3 fix in XUSB Companion.
-
test/regression/regression_battery.ps1: the 101-scenario battery that empirically validates lifecycle latency, multi-controller behavior, force-kill recovery, PID FFB round-trip, the composite personas, the battery reply a pad gives XInput and the device identity of every family. Backs every "verified" / "tested" claim in Lifecycle and Teardown and Testing and Verification.
Web standards¶
-
W3C Gamepad API: w3.org/TR/gamepad/. The W3C standard implemented by Chromium (Edge / Chrome / Brave / Opera), Firefox, Safari, and others. The
mapping = "standard"STANDARD_GAMEPAD bucket referenced in Cross-API Coverage is at w3.org/TR/gamepad/#remapping. -
WebHID API: wicg.github.io/webhid/. The browser API that motivated the Chromium WebHID team's Windows preparsed-data reconstruction algorithm now ported into HIDMaestro's
HMDeviceExtractor.
How to verify a specific claim¶
- Code-traceable (function names, line numbers, byte layouts) → check the file path + line in github.com/hifihedgehog/HIDMaestro.
- Spec-traceable (HID descriptor items, PID Report IDs, usage codes) → cross-reference the appropriate USB-IF spec at usb.org/document-library.
- Microsoft-API-traceable → search learn.microsoft.com by the exact symbol or topic name; that's the contract.
pnputilcommand output is the runtime behavior. - Library-behavior-traceable → the GitHub source links above are authoritative; behavior changes by version are tracked in their release notes.
- Reverse-engineered → the
docs/investigations/directory has the Ghidra output, ProcMon traces, and registry dumps that back the claim. - Author-empirical → reproduce via
regression_battery.ps1or theverify.pycross-API harness on Windows 11 26100/26200 with the latest HIDMaestro release.
If a claim is contested and none of the above apply, file an issue: github.com/hifihedgehog/HIDMaestro/issues.
See also¶
- Glossary: one-line definitions for every term.
- Architecture Overview: the assembled architecture every other page refers back to.
- HIDMaestro README: the primary author-curated summary.