Skip to content

History / HIDMaestro Deep Dive

Revisions

  • Wiki: bump HIDMaestro version refs from 1.3.12 to 1.3.13 The shipping HIDMaestro.Core.dll at Resources\HIDMaestro\ has FileVersion 1.3.13.0 (confirmed via Get-Item VersionInfo). Two wiki pages still cited the prior 1.3.12 tag: - HIDMaestro-Deep-Dive.md:18 'PadForge ships with HM 1.3.12...' - Driver-Installation-Internals.md:86 'PadForge currently ships HIDMaestro 1.3.12.' Both updated to 1.3.13.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • HIDMaestro-Deep-Dive: align See-also Driver Management blurb Tail-end follow-up to commit 6013b44. The cross-reference said 'install / uninstall / status flow for HIDMaestro, HidHide, MIDI Services' which implied HIDMaestro has an uninstall path. It does not (Driver-Management.md HIDMaestro Uninstall subsection at line 88-90: 'There is no in-app Uninstall button for HIDMaestro'). Reworded to keep the link useful without re-asserting the wrong verb on the wrong driver.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • HIDMaestro-Deep-Dive: filter logic exists in three other places (matched the bullet count)

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HM filter surfaces: Step 1 has no HM filter; the four real surfaces are SDL3 fork, OpenXInput fork, XboxImpulseHidWriter, HidHideController

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Strip em-dash pseudo-colons and pseudo-period semicolons across wiki prose

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: OpenXInput fork filters by HIDMAESTRO substring, not product string The OpenXInput section said 'the fork's XInputGetState / XInputGetCapabilities filter out controllers whose product string matches HM's virtual-controller signature'. That's wrong — the fork doesn't read product strings. OpenXinput.cpp IsHidMaestroInterface (src/OpenXinput.cpp:18) does: 1. Fast path: substring-match the literal 'HIDMAESTRO' against the interface symlink (no CM API calls). 2. PnP walk: CM_Locate_DevNodeW then walk up to 4 ancestors, looking for 'HIDMAESTRO' in each one's hardware-ID list. Depth 4 covers the case where the HID child spoofs the real gamepad's hardware IDs (HM Xbox-family profiles) and the marker only appears on a depth-1+ ancestor. Rewrote the prose to describe what the classifier actually does.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Wiki: more accurate SDL3 fork descriptions in page intros + HM filter file list SDL3-Integration.md page intro framed the fork as Switch-2-Pro-only ('the custom SDL3 fork for Switch 2 Pro Controller support'). Updated to '6 commits across four features: HIDMaestro filter, Switch 2 Pro Controller, 16-XInput, XInput Share'. HIDMaestro-Deep-Dive.md filter-cascade bullet claimed the HIDMaestro filter substring list lives in 'joystick/windows/SDL_xinputjoystick.c'. That's wrong: the XInput backend is pristine upstream, XInput-side filtering happens through the OpenXInput fork. The actual SDL3-side patch touches three files: src/hidapi/windows/hid.c (classifier + 256-entry path cache), and one SDL_HidmaestroIsAnsiHidPathHm call site each in src/joystick/windows/SDL_dinputjoystick.c and SDL_rawinputjoystick.c. Updated the bullet to match.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: 'Auto-elevation' bullet was inverted The 'What's gone from the v2 vJoy story' list had: Auto-elevation for vJoy SetupAPI calls - still required, but for HM it's so the user-mode driver can register its INF... But v3 dropped auto-elevation: PadForge's manifest declares requireAdministrator, so the whole process starts elevated and HM's InstallDriver() runs inside that already-elevated session. No v2-style mid-session Verb=runas relaunch happens. Rewrote the bullet so the 'gone' classification matches the other six items in the same list.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: refresh stale CompactSlots(rebuildHmVcs=true) name Bubble-up cascade invariant said CompactSlots(rebuildHmVcs=true) destroys + recreates the surviving Xbox HM virtuals. The actual method is InputService.CompactSlotsForGaps() (parameterless), which drives compaction by calling ApplyProfile. Updated to match.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: rewrite FFB section to match current decoder shape The FFB-through-PID-descriptors section cited four class names that do not exist in the v3.x codebase: - FfbDeviceState (no such class) - FfbEffectState (actual nested name: EffectState) - FfbConditionAxis (actual nested name: ConditionAxis) - ApplyMotorOutput (v2 method name; the code's only mention is a historical 'Mirrors the v2 ApplyMotorOutput' comment) Also said callbacks register via 'HMController.FeedbackReceived'. The actual event is HMController.OutputReceived (FFB is one kind of output packet alongside rumble). Rewrote the whole section to match HMaestroFfbDecoder's current internals (EffectState, ConditionAxis as private nested types), explain the OutputReceived hook, and trace the path forward into Step 2 ApplyForceFeedback + the per-pad-family writers.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: restore valid HMProfile properties dropped in last pass Previous edit cut .AxisCount, .ButtonCount, and .HasHat from the HMProfile comment block when removing the stale .HasFeedback / .HasMotion / .HasTouchpad lines (which never existed). Those three do exist on HMProfile, plus there's .VendorId/.ProductId, .StickBits/.TriggerBits/.InputReportSize, and the ExtendedReport / ExtendedOutputReport specs that carry the DS4/DualSense extras. Restored them so the example shows the full readable surface.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: fix SDK usage example (every line had a name issue) The illustrative SDK usage block had 5 separate naming issues vs the actual HIDMaestro.Core API: - 'context.Initialize()' does not exist; the real init pair is LoadDefaultProfiles() + InstallDriver(). - 'controller.IsConnected' lives on PadForge's wrapper class (HMaestroVirtualController), not on HMController itself. - 'controller.XInputSlot' does not exist as an HM SDK property. - 'controller.SubmitGamepadState(...)' is PadForge wrapper naming; HM's own method is SubmitState(in HMGamepadState). - 'controller.SubmitRawReport(byte[])' actually takes ReadOnlySpan<byte>, not byte[]. - 'controller.FeedbackReceived' is the wrapper name; HM emits OutputReceived and OutputDecoded events. - 'controller.Destroy()' does not exist; HMController : IDisposable uses Dispose(). Rewrote the block to use the live HMContext / HMProfile / HMController API surface so the example is copy-pasteable against the actual SDK.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: two em-dash pseudo-colons -> periods HmInactivityDestroyTimeoutSeconds description em-dash before 'a slot with no mappings at all...' and the bubble-up invariant em-dash before 'slot 3 does NOT shift down...' were both pseudo-colons attaching contrastive elaborations. Periods read cleaner.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HIDMaestro-Deep-Dive: prose semicolons -> periods Five 'X; Y' constructions in the dropped-vJoy-features bullets, plus the back-compat XmlEnum paragraph, were using semicolons as pseudo-periods to gloss the prior clause. Periods read cleaner and match the project style rule.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Pass 91: HIDMaestro-Deep-Dive — drop first-person voice (we/our → PadForge / imperative)

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Pass 9: HIDMaestro bundled version is 1.3.12, not 1.2.0/1.2.1 (FileVersion read from HIDMaestro.Core.dll)

    @hifihedgehog hifihedgehog committed May 20, 2026
  • Wiki Pass 3: dev-deep-dive accuracy corrections ViewModels: HMaestro SDK assembly is HIDMaestro.Core (not Microsoft.HIDMaestro.SDK); user-mode driver still needs first-run installation, not just an embedded assembly. SDL3-Integration: drop the _filteredVigemInstanceIds field documentation. That field is gone from current InputService.cs. HM virtuals are filtered upstream by the SDL3 fork's patched SDL_GetJoysticks (walks container ID to the HM root enumerator and drops matches before returning the list), so the engine no longer needs the rumble-killing-close guard. Architecture-Overview / Driver-Installation-Internals / Build-and-Publish / HIDMaestro-Deep-Dive: OpenXInput corrections. xinput1_4.dll is bundled inside the single-file EXE via Content + IncludeNativeLibrariesForSelfExtract, not "copied adjacent to PadForge.exe". devobj.dll is deliberately NOT shipped (a bundled stub would hijack setupapi.dll's own DevObj* imports and crash HID class enumeration per PadForge #69). System devobj.dll resolves from System32 unaided. Also: refresh pad-playstation-configbar.jpg to match the canonical PS slot screenshot (DualSense (PS5, Bluetooth) profile, dualsense-bt).

    @hifihedgehog hifihedgehog committed May 20, 2026
  • Wiki: Pass 2 — dev-deep-dive accuracy + Home page voice match Architecture-Overview: AssemblyInfo.cs → SharedVersion.cs; expanded Data/ file list to include MappingSet/MappingSource/MappingRow/ ShiftActivator/MappingSetMigrator/DeviceTuning. Input-Pipeline: drop preserveExtendedNodes parameter; rebuild field table to match current InputService. Virtual-Controllers: VendorId==0xBEEF check replaced with DescriptorHasPidFfbBlock(descriptorHex) gate in three locations. HIDMaestro-Deep-Dive: Microsoft.HIDMaestro.SDK → HIDMaestro.Core (bundled at Resources/HIDMaestro/HIDMaestro.Core.dll); fix context.CreateController(profile) call shape. Services-Layer: drop preserveExtendedNodes from Stop(); remove the "step 9" preserve-nodes branch. Engine-Library: add TOUCHPAD = 0x0800 button flag row. SDL3-Integration: SDL3 fork now filters HM virtuals at SDL_GetJoysticks, so the engine no longer maintains _filteredVigemInstanceIds. Updated Mermaid flowchart and renumbered the connect-side step list. Home: "New in 3.2" rewritten from bullet lists to story paragraphs to match the website voice. Added Gyro / Impulse Triggers / Shift Layers to the navigation tables.

    @hifihedgehog hifihedgehog committed May 20, 2026
  • HM bump: 1.2.0 -> 1.2.1; add PXN to gamepad-vendor list

    @hifihedgehog hifihedgehog committed Apr 28, 2026
  • VC type wiki: drop 'on-disk name' framing; XmlEnum is back-compat exception, not parallel name

    @hifihedgehog hifihedgehog committed Apr 28, 2026
  • Inactivity timeout: clarify slot config is preserved (VC torn down only)

    @hifihedgehog hifihedgehog committed Apr 28, 2026
  • Wiki refresh: VC reorder model (visual-position kernel-slot anchor) Reorder behavior just changed: same-profile reorders are pointer-only (no kernel teardown, no game disconnection); different-profile reorders destroy and recreate only the specific positions whose profile changed; matching positions in the same reorder still pointer-swap. Wiki refreshed to reflect this. User-facing: - Controller-Slots: rewrote "What rebuilds on reorder" with the visual-position-as-kernel-anchor model, three-bullet behavior breakdown (same-profile pointer swap, different-profile selective rebuild, disabled/awaiting invisible to kernel), and the data- identity vs kernel-slot-anchor rule. - Dashboard: tightened drag-reorder paragraph to one sentence on the pointer-swap behavior with link to Controller-Slots. Dev-facing: - Services-Layer: rewrote the Slot Reordering subsection with the five-rule spec (data identity / kernel-slot anchor / repoint-not- rebuild / same-profile zero-flicker / different-profile destroy+ recreate), per-pad vs per-VC state split, RebuildKernelOrderAfterReorder as a thin delegator, and a new RerouteVirtualControllersForReorder subsection covering the three-step implementation. Dropped v2 prose about "lowest changed position". - Input-Pipeline: cross-reference the intra-group reroute path (pointer move + same-profile reuse) vs cross-group / type-change destroy+recreate. - HIDMaestro-Deep-Dive: distinguish bubble-up cascade (deletion / inactivity-timeout) from intra-group reroute (no cascade). - Architecture-Overview: one short paragraph in Slot System covering the model + cross-reference to Services-Layer. - Virtual-Controllers: two inline corrections naming RerouteVirtualControllersForReorder (intra-group) alongside SwapSlotData (cross-group). Page-level rewrite still pending per the existing editor's note.

    @hifihedgehog hifihedgehog committed Apr 28, 2026
  • Deep v3 resync: vJoy purge, Microsoft→Xbox terminology, current features Sweep residual v2 vJoy / ViGEmBus content out of user-facing pages and replace stale dev-page class names with the v3 unified HIDMaestro pipeline. Restore correct family-name terminology (Xbox / PlayStation / Extended, not Microsoft / Sony — those enum identifiers exist purely for v2 PadForge.xml back-compat per the in-source enum comment). User-facing pages (Home, Dashboard, Controller-Slots, Devices, Settings, Driver-Management, Troubleshooting, Force-Feedback, Web-Controller, 3D-and-2D-Visualization, 2D-Overlay-System, Installation, Stick-Deadzones, Trigger-Deadzones, Input-Precision): - vJoy slot type, "vJoy driver limit", and vJoy install steps removed - Troubleshooting: "vJoy Phantom Controllers" section deleted (v2 N²-bug, doesn't exist in HIDMaestro), other vJoy sections rewritten for HM - Force-Feedback: HID PID 1.0 framing for Extended; new Sony Report 0x01 rumble passthrough section - 3D-and-2D-Visualization: PlayStation touchpad preview (live finger spheres) and click-to-map TouchpadClick documented - 2D-Overlay-System: touchpad highlight visual spec (sampled colors) - Web-Controller: DS4 layout button-11 collapse for TouchpadClick Dev pages (Architecture-Overview, Engine-Library, Build-and-Publish, HIDMaestro-Deep-Dive, Input-Pipeline, SDL3-Integration, Services-Layer, Settings-and-Serialization, Driver-Installation-Internals, ViewModels, XAML-Views, Virtual-Controllers, Button-and-Axis-Mappings): - Stale Xbox360VirtualController / DS4VirtualController / ExtendedVirtualController / VJoyRawState references replaced with the v3 unified HMaestroVirtualController + ExtendedRawState - Step 5 prose updated to HMContext.SubmitState / SubmitRawReport with Sony Report 0x01 passthrough - HIDMaestro-Deep-Dive: HM 1.1.x → 1.2.0 - Services-Layer: false claim that Extended slots reset to "Microsoft (Xbox 360) gamepad preset" replaced with the actual behavior (ProfileId = GetDefaultProfileId(type), Custom "PadForge Game Controller" for Extended) - Three broken [[vJoy Deep Dive]] links retargeted to [[HIDMaestro Deep Dive]] - Virtual-Controllers gets a top-of-page editor's note flagging it for a full hand-rewrite (the deep sections still describe deleted v2 classes) Microsoft references kept where they are real: NuGet package Microsoft.Windows.Devices.Midi2, registry paths under SOFTWARE\Microsoft\, ".NET runtime download from Microsoft", literal VirtualControllerType.Microsoft enum-value citations, MaxXbox360Slots constant name (preserved from v2), [XmlEnum("Sony")] attribute string, OpenXInput Microsoft-trademark disclaimer.

    @hifihedgehog hifihedgehog committed Apr 27, 2026
  • v3 wiki refresh: drop vJoy-Deep-Dive, add HIDMaestro-Deep-Dive, refresh images, rewrite Home - Home.md: rewrite for v3 — Microsoft / PlayStation / Extended / MIDI / KB+M categories, HIDMaestro replaces ViGEmBus + vJoy, OpenXInput shim filters PadForge's own slots from its own XInput view, HM-lifecycle thread-pool model + bubble-up cascade. Adds 'Powered by HIDMaestro' badge with light/dark-mode logo swap via <picture>. - HIDMaestro-Deep-Dive.md: new analogous page replacing vJoy-Deep-Dive (deleted). Documents the HM SDK surface PadForge talks to (HMContext / HMProfile / HMController), the OpenXInput filter, and the three Step 5 invariants (lifecycle off polling thread, inactivity destroy timeout, bubble-up cascade). Explicitly enumerates the v2 vJoy bugs that no longer apply. - Image refresh from 2560x1600 build, including PlayStation / Extended / MIDI / KBM slot type variants. Drops pad-vjoy-* screenshots (replaced by pad-extended-configbar + pad-playstation-configbar). - Adds the HIDMaestro logo (light + dark variants) and convert-screenshots.ps1 helper that renames + JPGs into PadForge/screenshots and padforge.org/assets.

    @hifihedgehog hifihedgehog committed Apr 26, 2026