Releases: itsnateai/eqswitch
Releases · itsnateai/eqswitch
v3.10.0 — GPL-2.0-or-later + Native v7/v8 login path
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-gplv3marks 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.dllunload at character select and resumes the background poll instead of bailing.
Native widget discovery (v8, internal foundation)
- MQ2-style
eqmain.dlldetection with widget-ownership tracking - Corrected
SetWindowTextvtable slot + exact-vtable class gate HeapScanForWidget— locates login widgets by SIDL name on the heap- Live
CXWnddiscovery: 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
Full Changelog: v3.9.3...v3.9.3-last-gplv3
v3.9.3
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
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
GetItemTextreturns empty strings. - Heap scan for character names on Dalaya ROF2. Fallback used when the classic
charSelectPlayerArrayexport 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;CXWndManageris resolved viapinstCXWndManager+pinstCCharacterSelect;gameState==1gate 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
AutoEnterWorldnow migrates to per-account on upgrade.Validate()mutations are flushed to disk on load instead of staying in memory. - Native DLL hardening —
volatileon cross-thread state to prevent data races; state variables fully reset inShutdown; duplicateWndMgroffsets 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/LoginAllaction 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,
WndMgroffset, DLL signatures, and the address verification report.
Full Changelog: v3.6.0...v3.9.2
v3.6.0-pre-inprocess-login
Full Changelog: v3.6.0...v3.6.0-pre-inprocess-login
v3.6.0
Full Changelog: v3.4.2...v3.6.0
v3.4.2
Full Changelog: v3.4.0...v3.4.2
v3.4.0 — Update Checker, UI Polish & Tab Reorganization
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
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
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