Skip to content

Releases: itsnateai/eqswitch

v3.10.0 — GPL-2.0-or-later + Native v7/v8 login path

18 Apr 12:45

Choose a tag to compare

Changed

  • License changed from GPL-3.0 to GPL-2.0-or-later — ecosystem alignment with MacroQuest and the broader EverQuest tool community. Prior releases (v3.9.3 and earlier) remain GPL-3.0 forever. Tag v3.9.3-last-gplv3 marks the relicense boundary.
  • README License section — formal attributions for Stonemite (approach studied only) and MacroQuest (facts referenced, no source compiled in).
  • README fan-made disclaimer strengthened — EQSwitch is free, educational, independent, and not sold.
  • CONTRIBUTING.md — contributor license grant updated to GPL-2.0-or-later.

Native login reliability (v7)

  • GiveTime detour replaces SetTimer-based polling — login state machine now rides the game's own game-loop tick (50–130 Hz).
  • LoginController* fast-path skips the full scan when the pointer is already resolved.
  • Charselect robustness — detects eqmain.dll unload at character select and resumes the background poll instead of bailing.

Native widget discovery (v8, internal foundation)

  • MQ2-style eqmain.dll detection with widget-ownership tracking
  • Corrected SetWindowText vtable slot + exact-vtable class gate
  • HeapScanForWidget — locates login widgets by SIDL name on the heap
  • Live CXWnd discovery: tree walk, heap cross-reference, label search

No user-visible behaviour change from the relicense itself.

Full Changelog: v3.9.3...v3.10.0

v3.9.3-last-gplv3

16 Apr 01:15

Choose a tag to compare

v3.9.3

13 Apr 10:24

Choose a tag to compare

Security

  • Auto-updater now verifies the SHA256 hash of each downloaded update before installing it, so only the exact release asset published on GitHub will be swapped in.
  • Shared memory segments used to talk to the injected DLL are now locked down with tight permissions — only the EQSwitch process and the game process it injected into can open them.
  • The injected DLL now validates its host executable before touching memory, so it only runs inside the expected eqgame.exe.

Full Changelog: v3.9.2...v3.9.3

v3.9.2

13 Apr 07:54

Choose a tag to compare

A big catch-up release rolling up everything since v3.6.0 — the in-process login rewrite, character select overhaul for Dalaya ROF2, per-account auto-enter-world, and a pile of polish from code-review agent sweeps.

Added

  • In-process login via the injected DLL. Replaces the old PostMessage / focus-faking approach with direct calls through an MQ2 bridge — logins now work reliably in the background with no window activation flicker.
  • Per-account and per-team Auto Enter World. You can toggle auto-enter-world on a specific character or team instead of flipping one global switch.
  • Slot-based character select (slots 1–10). Enter World is now driven by slot number rather than name matching, which was flaky on servers where GetItemText returns empty strings.
  • Heap scan for character names on Dalaya ROF2. Fallback used when the classic charSelectPlayerArray export is missing — scans the heap for title-case name candidates.
  • Parallel team login. Logs multiple accounts in at once instead of serially, with brief activation windows to let each one take focus just long enough.
  • Card-based sub-form layout + ScrollGuardComboBox. UI polish — dropdowns no longer change value when you accidentally scroll the page.

Fixed

  • Charselect reliability on Dalaya ROF2. All pinstC* exports need a double-dereference, not single; CXWndManager is resolved via pinstCXWndManager + pinstCCharacterSelect; gameState==1 gate removed (Dalaya uses 0 at character select).
  • Residual input after entering the game — keystrokes could leak through into the game window right after login; now cleanly cut off.
  • Team / account uniqueness. Same EverQuest username can't be added to the same team twice. Character name is the unique key for team and slot references (not account, which can host multiple toons).
  • Auto-enter-world state snapshot. Config values are now snapshotted before the background thread runs, so flipping a setting mid-login can't race.
  • Config migration and validation. Global AutoEnterWorld now migrates to per-account on upgrade. Validate() mutations are flushed to disk on load instead of staying in memory.
  • Native DLL hardeningvolatile on cross-thread state to prevent data races; state variables fully reset in Shutdown; duplicate WndMgr offsets deduplicated; heap scan false positives tightened (alpha-only, 5+ matches); vtable guard relaxed to warn-only so it stops blocking character select.
  • Log spam and diagnostics. Shared-memory barriers added around enter-world; chatty logs trimmed; slot-probe diagnostics added.
  • Tray menu naming. Untangled the overlapping LaunchAll / LaunchTwo / LoginAll action labels.
  • TIMERPROC shutdown guard + one-shot migration flag from the red-team review.

Changed

  • Winget compatibility + security hardening for the distribution pipeline.
  • Comprehensive value audits: ASLR handling, WndMgr offset, DLL signatures, and the address verification report.

Full Changelog: v3.6.0...v3.9.2

v3.6.0-pre-inprocess-login

16 Apr 01:16

Choose a tag to compare

v3.6.0

10 Apr 07:32

Choose a tag to compare

Full Changelog: v3.4.2...v3.6.0

v3.4.2

08 Apr 23:12

Choose a tag to compare

Full Changelog: v3.4.0...v3.4.2

v3.4.0 — Update Checker, UI Polish & Tab Reorganization

05 Apr 06:27

Choose a tag to compare

What's New

  • Manual Update Checker — Settings > Paths > Update button. Checks GitHub for new versions, downloads with progress bar, self-replaces the exe. Zero telemetry.
  • PiP Improvements — Flush thumbnails (no gap), fixed border tint bleed, proper border rendering
  • Tab Reorganization — Monitor Selection moved to Video tab, Window Title moved to Hotkeys tab
  • EQ Client Settings — Now opens as a non-modal window
  • UI Polish — Fixed input box overhang across all tabs, consistent card padding, opacity increments by 5
  • Privacy First — Zero telemetry, no network calls, DPAPI-encrypted passwords
  • CI Fix — Release workflow now auto-builds and publishes all assets

Files

File Size Notes
EQSwitch.exe ~179 MB Self-contained, click and go
eqswitch-hook.dll ~132 KB Ships alongside exe
dinput8.dll ~132 KB Ships alongside exe

v3.3.1 — Config Baseline & Defaults Overhaul

04 Apr 21:31

Choose a tag to compare

Config Baseline & Defaults Overhaul

32-agent audit campaign: ~30 bugs fixed across 11 files.

Highlights

  • AppConfig defaults baselined to match EQ's fresh eqclient.ini — nuclear reset now gives a sane known state
  • INI section targeting corrected — ChatSpam, Keymaps, Particles were writing to wrong sections; 11 phantom [Defaults] writes removed
  • LoadFromIni reads [Options] — EQ's runtime-authoritative section is now properly read
  • ConfiguredKeys sentinel tracking — numeric fields at sentinel values are properly excluded from enforcement
  • GDI font leak coverage — DisposeControlFonts added to all remaining forms

Full changelog

See CHANGELOG.md for the complete list of ~30 fixes.

v3.3.0 — Video Settings consolidated into Settings tab

04 Apr 14:36

Choose a tag to compare

What's New

Video Settings is now a tab inside the main Settings dialog instead of a separate window.

Changes

  • Video tab — 7th tab in Settings with Resolution, Monitor Selection, and eqclient.ini action cards
  • Own Save button — "Save to eqclient.ini" with clear labeling that it writes to the INI, not EQSwitch config
  • Hook DLL sync — Changing monitors/offsets in the Video tab now updates injected hook configs immediately
  • Error handling — Save button disabled with warning when eqclient.ini can't be read; MessageBox when save fails
  • Cross-tab sync — Layout tab monitor dropdowns stay in sync after Video tab saves
  • Bug fix — XOffset/YOffset now clamped on load to prevent crashes from extreme INI values

Assets

  • EQSwitch.exe — Single-file portable exe (~171MB, self-contained .NET 8)
  • eqswitch-hook.dll — Must be placed alongside EQSwitch.exe