From a8ebe21b0d09dcc4e0a0db6ab8715d22c73ec1c3 Mon Sep 17 00:00:00 2001 From: MarcelineVQ Date: Fri, 27 Feb 2026 16:47:42 -0800 Subject: [PATCH] Add hook 5 (loadModelFromFileAsync), combatlog stub, framecrash vtable hooks, marker assets Hook 5 intercepts loadModelFromFileAsync (0x71d4e0) to synchronously load M2 model data for fake in-memory file contexts. processLoadedModelData returns 1 and entities are created, but file context cleanup is currently skipped (leaks 0x60 bytes per load) due to a crash in the cleanup path, and there's a later EIP=0 crash during the game main loop that needs investigation. Also adds: combatlog module stub, framecrash anchor vtable hooks (GetRelativeTo and GetWidth/GetHeight crash guards), embedded Raid_UI_FX model assets with skins and textures, WU_XYZ debug model. --- build.zig | 20 +- src/combatlog/combatlog.zig | 14 + src/framecrash/RESEARCH.md | 461 ++++++++++++++++++ src/framecrash/framecrash.zig | 201 +++++++- src/interact/interact.zig | 2 + src/main.zig | 417 +++++++++++++++- src/markers/RESEARCH.md | 183 +++++++ src/markers/assets/Spells/GRAD2C2.BLP | Bin 0 -> 12132 bytes src/markers/assets/Spells/GRAD2D.BLP | Bin 0 -> 12132 bytes .../NEXUS_FIREBEAM_FAINT_SQUARE_ORA.BLP | Bin 0 -> 3916 bytes .../assets/Spells/RaidTarget_Diamond.blp | Bin 0 -> 6660 bytes .../assets/Spells/RaidTarget_Square.blp | Bin 0 -> 6660 bytes src/markers/assets/Spells/RaidTarget_Star.blp | Bin 0 -> 6660 bytes .../assets/Spells/RaidTarget_Triangle.blp | Bin 0 -> 6660 bytes src/markers/assets/Spells/RaidTarget_X.blp | Bin 0 -> 6660 bytes src/markers/assets/Spells/Raid_UI_FX_Cyan.m2 | Bin 0 -> 32586 bytes .../assets/Spells/Raid_UI_FX_Cyan00.skin | Bin 0 -> 9552 bytes src/markers/assets/Spells/Raid_UI_FX_Green.m2 | Bin 0 -> 32602 bytes .../assets/Spells/Raid_UI_FX_Green00.skin | Bin 0 -> 9552 bytes .../assets/Spells/Raid_UI_FX_Purple.m2 | Bin 0 -> 32490 bytes .../assets/Spells/Raid_UI_FX_Purple00.skin | Bin 0 -> 9552 bytes src/markers/assets/Spells/Raid_UI_FX_Red.m2 | Bin 0 -> 32466 bytes .../assets/Spells/Raid_UI_FX_Red00.skin | Bin 0 -> 9552 bytes .../assets/Spells/Raid_UI_FX_Yellow.m2 | Bin 0 -> 32598 bytes .../assets/Spells/Raid_UI_FX_Yellow00.skin | Bin 0 -> 9552 bytes .../assets/Spells/T_VFX_FLARE05_32ALPHA.BLP | Bin 0 -> 2564 bytes src/markers/assets/Spells/WU_XYZ.m2 | Bin 0 -> 8128 bytes src/markers/assets/Spells/xyz.blp | Bin 0 -> 44876 bytes .../Doodads/Zulaman/Doors/T_VFX_BORDER6.BLP | Bin 0 -> 88580 bytes .../Doodads/Zulaman/Doors/T_VFX_FIRE03_A.BLP | Bin 0 -> 88580 bytes src/markers/markers.zig | 14 +- src/markers/offsets.zig | 55 +++ src/outline/api.zig | 2 + src/screenshot/screenshot.zig | 2 + 34 files changed, 1351 insertions(+), 20 deletions(-) create mode 100644 src/combatlog/combatlog.zig create mode 100644 src/framecrash/RESEARCH.md create mode 100644 src/markers/RESEARCH.md create mode 100644 src/markers/assets/Spells/GRAD2C2.BLP create mode 100644 src/markers/assets/Spells/GRAD2D.BLP create mode 100644 src/markers/assets/Spells/NEXUS_FIREBEAM_FAINT_SQUARE_ORA.BLP create mode 100644 src/markers/assets/Spells/RaidTarget_Diamond.blp create mode 100644 src/markers/assets/Spells/RaidTarget_Square.blp create mode 100644 src/markers/assets/Spells/RaidTarget_Star.blp create mode 100644 src/markers/assets/Spells/RaidTarget_Triangle.blp create mode 100644 src/markers/assets/Spells/RaidTarget_X.blp create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Cyan.m2 create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Cyan00.skin create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Green.m2 create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Green00.skin create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Purple.m2 create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Purple00.skin create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Red.m2 create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Red00.skin create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Yellow.m2 create mode 100644 src/markers/assets/Spells/Raid_UI_FX_Yellow00.skin create mode 100644 src/markers/assets/Spells/T_VFX_FLARE05_32ALPHA.BLP create mode 100644 src/markers/assets/Spells/WU_XYZ.m2 create mode 100644 src/markers/assets/Spells/xyz.blp create mode 100644 src/markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_BORDER6.BLP create mode 100644 src/markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_FIRE03_A.BLP diff --git a/build.zig b/build.zig index fcde2f5..b539b36 100644 --- a/build.zig +++ b/build.zig @@ -13,6 +13,8 @@ pub fn build(b: *std.Build) void { const enable_interact = b.option(bool, "interact", "Enable interact module") orelse true; const enable_outline = b.option(bool, "outline", "Enable outline module") orelse true; const enable_markers = b.option(bool, "markers", "Enable markers module") orelse true; + const enable_framecrash = b.option(bool, "framecrash", "Enable framecrash fix") orelse true; + const enable_combatlog = b.option(bool, "combatlog", "Enable combat log freshness") orelse true; // Create build options module const build_options = b.addOptions(); @@ -20,6 +22,8 @@ pub fn build(b: *std.Build) void { build_options.addOption(bool, "enable_interact", enable_interact); build_options.addOption(bool, "enable_outline", enable_outline); build_options.addOption(bool, "enable_markers", enable_markers); + build_options.addOption(bool, "enable_framecrash", enable_framecrash); + build_options.addOption(bool, "enable_combatlog", enable_combatlog); const build_options_module = build_options.createModule(); const hook_mod = b.dependency("hook", .{ @@ -47,18 +51,22 @@ pub fn build(b: *std.Build) void { const build_all_step = b.step("all-variants", "Build all DLL variants"); // Helper to create a single-module build - inline for (&[_]struct { name: []const u8, screenshot: bool, interact: bool, outline: bool, markers: bool }{ - .{ .name = "full", .screenshot = true, .interact = true, .outline = true, .markers = true }, - .{ .name = "screenshot", .screenshot = true, .interact = false, .outline = false, .markers = false }, - .{ .name = "interact", .screenshot = false, .interact = true, .outline = false, .markers = false }, - .{ .name = "outline", .screenshot = false, .interact = false, .outline = true, .markers = false }, - .{ .name = "markers", .screenshot = false, .interact = false, .outline = false, .markers = true }, + inline for (&[_]struct { name: []const u8, screenshot: bool, interact: bool, outline: bool, markers: bool, framecrash: bool, combatlog: bool }{ + .{ .name = "full", .screenshot = true, .interact = true, .outline = true, .markers = true, .framecrash = true, .combatlog = true }, + .{ .name = "screenshot", .screenshot = true, .interact = false, .outline = false, .markers = false, .framecrash = true, .combatlog = true }, + .{ .name = "interact", .screenshot = false, .interact = true, .outline = false, .markers = false, .framecrash = true, .combatlog = true }, + .{ .name = "outline", .screenshot = false, .interact = false, .outline = true, .markers = false, .framecrash = true, .combatlog = true }, + .{ .name = "markers", .screenshot = false, .interact = false, .outline = false, .markers = true, .framecrash = true, .combatlog = true }, + .{ .name = "framecrash", .screenshot = false, .interact = false, .outline = false, .markers = false, .framecrash = true, .combatlog = false }, + .{ .name = "combatlog", .screenshot = false, .interact = false, .outline = false, .markers = false, .framecrash = false, .combatlog = true }, }) |variant| { const opts = b.addOptions(); opts.addOption(bool, "enable_screenshot", variant.screenshot); opts.addOption(bool, "enable_interact", variant.interact); opts.addOption(bool, "enable_outline", variant.outline); opts.addOption(bool, "enable_markers", variant.markers); + opts.addOption(bool, "enable_framecrash", variant.framecrash); + opts.addOption(bool, "enable_combatlog", variant.combatlog); const variant_lib = b.addLibrary(.{ .name = variant.name, diff --git a/src/combatlog/combatlog.zig b/src/combatlog/combatlog.zig new file mode 100644 index 0000000..69ef18b --- /dev/null +++ b/src/combatlog/combatlog.zig @@ -0,0 +1,14 @@ +//! Combat log freshness module. +//! +//! Appends a timestamp to the combat log filename so each client session +//! gets a fresh log file (e.g. WoWCombatLog_20260227_123456.txt). +//! +//! TODO: Find and hook the combat log open/create function. + +const con = @import("../console.zig"); + +pub fn installHooks() void { + con.print("[combatlog] Module loaded (stub)\n"); +} + +pub fn removeHooks() void {} diff --git a/src/framecrash/RESEARCH.md b/src/framecrash/RESEARCH.md new file mode 100644 index 0000000..9357e78 --- /dev/null +++ b/src/framecrash/RESEARCH.md @@ -0,0 +1,461 @@ +# Framecrash Research + +## The Crash + +``` +ERROR #132 (0x85100084) Fatal Exception +Exception: 0xC0000005 (ACCESS_VIOLATION) at 0023:007A2452 +The instruction at "0x007A2452" referenced memory at "0x16C0FFE8". +The memory could not be "read". +``` + +Crash log: `/media/bigfaststore/games/twmoa_1172/Errors/2026-02-25 19.38.01 Crash.txt` + +### Registers at Crash +``` +EAX=321A2188 EBX=16C0FFE4 ECX=00000000 EDX=25B94A35 +ESI=03319888 EDI=303A4588 EBP=00F2FADC ESP=00F2FACC +``` + +### Crash Instruction +``` +0x007A2452: 8B 43 04 MOV EAX, [EBX+4] ; EBX=0x16C0FFE4 → reads 0x16C0FFE8 (decommitted page) +``` + +--- + +## Call Chain + +``` +processGraphicsFrame (0x764330) + → renderAllFrameLayers (0x765650) + → processFrameUpdates + → DispatchHeartbeatEvent (0x76b2c0) — fires OnUpdate + → ExecuteLuaCallback (0x704f10) + → luaD_pcall (0x6f6960) + → luaCallFunction (0x6f6050) + → luaGetPoint (0x7a2340) ← CRASH +``` + +An addon's **OnUpdate** handler calls `frame:GetPoint()` on a frame whose anchor +references a **destroyed frame** via a dangling pointer. + +Stack string evidence: `"DBG:MinimapButtonFrame"` visible in stack dump. + +--- + +## Function: `luaGetPoint` (0x007A2340) + +This is the Lua API `frame:GetPoint(index)`. It returns anchor point info: +`point, relativeTo, relativePoint, xOfs, yOfs`. + +### Relevant Disassembly + +```asm +; === Anchor iteration loop === +; Frame anchor array starts at frame+0x28, 9 slots (one per POINT enum) +0x007a23f5: LEA EAX,[EDI + 0x28] ; anchor array start +0x007a23f8: MOV EDI,[EAX] ; EDI = anchor_points[i] +0x007a23fa: TEST EDI,EDI ; skip NULL slots +0x007a23fc: JZ 0x007a2404 +0x007a23fe: CMP ECX,[EBP-4] ; compare current_index with requested_index +0x007a2401: JGE 0x007a2416 ; found the requested anchor +0x007a2403: INC ECX +0x007a2404: INC EBX ; (EBX = enum counter here, NOT the crash EBX) +0x007a2405: ADD EAX,0x4 +0x007a2408: CMP EBX,0x9 ; 9 anchor point types max +0x007a240b: JL 0x007a23f8 + +; === Found anchor — get relativeTo frame === +0x007a2416: MOV EDX,[EDI] ; anchor vtable +0x007a2418: MOV ECX,EDI ; this = anchor +0x007a241a: CALL [EDX + 0xc] ; vtable[3]() → GetRelativeTo → returns raw ptr +0x007a241d: TEST EAX,EAX +0x007a241f: JZ 0x007a24d7 ; NULL → safe "no relativeTo" path + +; Second call to same vfunc — gets value for real this time +0x007a2425: MOV EAX,[EDI] +0x007a2429: CALL [EAX + 0xc] ; vtable[3]() again +0x007a242c: TEST EAX,EAX +0x007a242e: JZ 0x007a2438 ; if NULL → relativeTo = NULL +0x007a2430: ADD EAX,-0x24 ; adjust from inner offset to frame base +0x007a2433: MOV [EBP-4],EAX ; store relativeTo frame ptr + +; Push anchor point name string onto Lua stack +0x007a243f: MOV ECX,EBX ; EBX = enum value +0x007a2441: CALL PositionEnumToString ; (0x006f1890) +0x007a244a: CALL lua_pushstring ; (0x006f3890) + +; === CRASH SITE === +0x007a244f: MOV EBX,[EBP-4] ; EBX = relativeTo frame ptr (DANGLING!) +0x007a2452: MOV EAX,[EBX+4] ; ← ACCESS VIOLATION: reads lua ref from freed frame +0x007a2455: TEST EAX,EAX +0x007a2457: JNZ 0x007a2462 ; if lua ref exists, skip registration +0x007a2459: PUSH 0x0 +0x007a245b: MOV ECX,EBX +0x007a245d: CALL RegisterFrameScriptReference ; (0x00701bd0) +0x007a2462: MOV ECX,[EBX+8] ; lua reference index +... +``` + +### Safe "no relativeTo" path (0x007a24d7) +When `GetRelativeTo()` returns NULL, execution jumps here and pushes just +the point name + x/y offsets, skipping the relativeTo frame entirely. + +--- + +## Anchor Object Structure (0x14 = 20 bytes) + +Discovered from `SetAnimationOrder` (0x00767c70) — the internal C++ `SetPoint`: + +``` +Offset Size Field ++0x00 4 vtable pointer = PTR_GetAnimationOrder_0081c44c ++0x04 4 x offset (float) ++0x08 4 y offset (float) ++0x0C 4 relativeTo frame pointer (RAW — no refcount, no validation!) ++0x10 4 relative point enum (uint) +``` + +**Vtable address**: `0x0081c44c` (in .rdata) +**vtable[3]** (at vtable+0xC = `0x0081c458`): GetRelativeTo — simply returns `this+0x0C` + +### Anchor Creation (in SetAnimationOrder) +```c +// Allocate 0x14 bytes +anchor = M2_AllocateModelBuffer(0x14, ...); +anchor->xOfs = param_4; // +0x04 +anchor->yOfs = param_5; // +0x08 +anchor->relativeTo = param_2; // +0x0C ← RAW POINTER, no ref held +anchor->relativePoint = param_3; // +0x10 +anchor->vtable = &PTR_0081c44c; // +0x00 + +// Store in frame's anchor array +frame_anchors[pointEnum] = anchor; // frame + enum*4 + 0x28 +``` + +### Anchor Destruction +When a frame is destroyed (`DestroyFrame` 0x773240 / `DestroyFrameScriptObject` 0x4c34a0): +- The frame's own anchors are cleaned up +- But **no notification is sent to OTHER frames whose anchors reference this frame** +- Result: dangling pointer at `anchor+0x0C` + +--- + +## Root Cause + +**The anchor stores a raw pointer to the relativeTo frame with no weak reference or +invalidation mechanism.** When the relativeTo frame is destroyed: + +1. Frame memory is freed (and potentially decommitted by the OS) +2. The anchor's `relativeTo` pointer at +0x0C is NOT cleared +3. Next time `GetPoint()` is called, `GetRelativeTo()` returns the stale pointer +4. The code dereferences it → ACCESS_VIOLATION + +--- + +## Relevant WoW Functions & Globals + +### Frame Validation +| Address | Name | Purpose | +|---------|------|---------| +| 0x787910 | `ValidateFrameTypePointer` | Compares value against `g_ParentFrameTypeID`, `g_FrameTypeID` | +| 0x789480 | `ValidatePointerType` | Same pattern, different type set | +| 0x403f50 | `ValidateObjectPointer` | Calls `IsBadReadPtr` via `[0x007ff2b8]` | +| 0x4c38a0 | `FrameScript_ValidateMemory` | Global memory validation | + +### Type ID Globals (runtime values, .bss — not readable from Ghidra) +| Address | Name | +|---------|------| +| 0x00cf0c10 | `g_ParentFrameTypeID` | +| 0x00cf0c3c | `g_FrameTypeID` | +| 0x00cf4f2c | Frame type ID (specific subclass) | +| 0x00cf4f48 | Frame type ID (specific subclass) | + +### Frame Lifecycle +| Address | Name | +|---------|------| +| 0x773240 | `DestroyFrame` — clears fields +0/+4, unlinks | +| 0x4c34a0 | `DestroyFrameScriptObject` — clears lua ref, unlinks from list, frees | +| 0x4c3510 | `FrameScript_InsertIntoList` | +| 0x4c3c10 | `FrameScript_UnlinkFromList` | +| 0x701bd0 | `RegisterFrameScriptReference` — creates Lua table + metatable for frame | + +### Anchor Functions +| Address | Name | +|---------|------| +| 0x767c70 | `SetAnimationOrder` — internal SetPoint (creates anchor object) | +| 0x768010 | `IsAnimationPlaying` — recursive anchor dependency check | +| 0x7a2340 | `luaGetPoint` — Lua API, CRASH SITE | +| 0x7a2540 | `luaSetPoint` — Lua API | +| 0x7a2940 | `luaClearAllPoints` — Lua API | + +### Windows API +| IAT Address | API | +|-------------|-----| +| 0x007ff2b8 | `IsBadReadPtr` (used by `ValidateObjectPointer`) | + +--- + +## Fix Strategies + +### Option A: Inline Hook at Crash Site (minimal, symptom fix) +Patch 6 bytes at `0x007a244f` (MOV EBX,[EBP-4] + MOV EAX,[EBX+4]): +``` +Original: 8B 5D FC 8B 43 04 → JMP trampoline + NOP +``` +Trampoline: +1. `MOV EBX,[EBP-4]` (original) +2. `TEST EBX,EBX` / `JZ no_relative` (→ 0x007a24d7) +3. Validate EBX via `IsBadReadPtr([0x007ff2b8])` or VirtualQuery +4. If invalid → JMP 0x007a24d7 (safe path) +5. If valid → `MOV EAX,[EBX+4]` + JMP 0x007a2455 + +**Pro**: Minimal patch, only affects GetPoint +**Con**: Only fixes this one crash site; other code using GetRelativeTo is still vulnerable + +### Option B: Hook Anchor vtable[3] (GetRelativeTo) +Replace function pointer at `0x0081c458` with our own GetRelativeTo: +1. Read `this+0x0C` (relativeTo pointer) +2. If NULL → return NULL +3. Call `IsBadReadPtr(ptr, 0x10)` via `[0x007ff2b8]` +4. If bad → clear `this+0x0C` to NULL, return NULL +5. If good → return original value + +**Pro**: Protects ALL callers of GetRelativeTo, self-healing (clears stale ptr) +**Con**: Modifies vtable in .rdata (need VirtualProtect), slight overhead on every anchor access + +### Option C: Hook Frame Destruction (root cause fix) +Hook `DestroyFrameScriptObject` (0x4c34a0) to scan all frames' anchors and +clear any that reference the frame being destroyed. + +**Pro**: Fixes the root cause, no runtime overhead on GetPoint +**Con**: Complex, needs to iterate all frames, frame list structure must be understood + +### Recommended: Option B ← IMPLEMENTED +The vtable hook is the best balance of robustness and simplicity. It: +- Uses WoW's own `IsBadReadPtr` import (no new API dependencies) +- Self-heals by NULLing the stale pointer on first detection +- Protects all code paths, not just GetPoint +- The vtable is a single pointer write (after VirtualProtect) + +Implementation: `src/framecrash/framecrash.zig` + +--- + +## Second Crash: `luaGetWidth` NULL Layout Pointer (0x007A2FB8) + +**NOT related to the anchor/GetRelativeTo fix above.** This is a separate bug. + +Crash log: `/media/bigfaststore/games/twmoa_1172/Errors/2026-02-27 12.37.03 Crash.txt` + +### Crash Details +``` +Exception: 0xC0000005 (ACCESS_VIOLATION) at 0023:007A2FB8 +The instruction at "0x007A2FB8" referenced memory at "0x0000003C". +The memory could not be "read". +``` + +### Registers +``` +EAX=3F4F5C29 EBX=0081C3D0 ECX=00000000 EDX=0081C44C +ESI=16D046A8 EDI=17077C2C EBP=00F2F7EC ESP=00F2F7D8 +``` + +### Crash Instruction +``` +0x007A2FB8: F6 41 3C 02 TEST byte ptr [ECX+0x3C], 0x02 ; ECX=0 → reads 0x0000003C +``` + +ECX is NULL — the frame/layout object pointer is missing. + +**Note**: EDX=0x0081C44C (the anchor vtable) is just a leftover register value, +NOT caused by our vtable hook. EDX is not used at the crash site. + +### Call Chain +``` +GetAnimationSmoothing (0x768d20) + → calculate_negative... (0x7673d0) — pushes 0x0081C3D0, calls SetFrameHitTestMode + → SetFrameHitTestMode (0x7671a0) — iterates anchors, calls vtable[1] (+0x04) + → luaGetWidth (0x7a2f90) ← CRASH: ECX=NULL +``` + +This crashes during **frame layout calculation at startup** — the frame layout +system is computing dimensions, and a frame's layout dependency (parent or +anchor target) is NULL. + +### Key Disassembly (crash site in luaGetWidth) +```asm +; luaGetWidth prologue — sets up local vars +0x007a2faa: MOV [EBP-8], 0x0 +0x007a2fb1: MOV [EBP-4], 0x0 +0x007a2fb8: TEST byte ptr [ECX+0x3C], 0x02 ← CRASH (ECX=NULL) +0x007a2fbc: JZ 0x007a2fc5 ; skip if flag not set +0x007a2fbe: PUSH 0x0 +0x007a2fc0: CALL 0x00768060 +``` + +### Caller (0x007673E7) +```asm +0x007673e7: PUSH 0x81c3d0 ; NOT the anchor vtable (0x81c44c) +0x007673ec: MOV ECX, ESI ; frame object +0x007673ee: MOV [ESI+0x28], EAX ; store layout result +0x007673f1: CALL SetFrameHitTestMode (0x7671a0) +``` + +### Full Disassembly (luaGetWidth entry → crash) +```asm +0x007a2f90: PUSH EBP +0x007a2f91: MOV EBP, ESP +0x007a2f93: SUB ESP, 0x10 +0x007a2f96: PUSH ESI +0x007a2f97: MOV ESI, ECX ; save original this (anchor) to ESI +0x007a2f99: MOV ECX, [ESI+0xC] ; ECX = anchor->relativeTo (NULL!) +0x007a2f9c: MOV [EBP-0x10], 0x0 +0x007a2fa3: MOV [EBP-0xC], 0x0 +0x007a2faa: MOV [EBP-0x8], 0x0 +0x007a2fb1: MOV [EBP-0x4], 0x0 +0x007a2fb8: TEST byte ptr [ECX+0x3C], 0x02 ← CRASH (ECX=NULL from ESI+0xC) +``` + +### SetFrameHitTestMode Call Site +```asm +0x007671b4: MOV EAX, [EBX+ESI*4] ; load index from array at 0x81c3d0 +0x007671b7: MOV ECX, [EDI+EAX*4+0x4] ; load anchor from frame[index] +0x007671bb: TEST ECX, ECX ; NULL check on ANCHOR (not relativeTo) +0x007671bd: JZ skip +0x007671bf: MOV EAX, [EDI+0x58] ; load frame->field_0x58 +0x007671c2: MOV EDX, [ECX] ; EDX = anchor vtable (0x81c44c) +0x007671c4: PUSH EAX ; push param +0x007671c5: CALL [EDX+0x4] ; call vtable[1] = luaGetWidth +0x007671c8: FLD ST0 ; duplicate float return +0x007671ca: FCOMP [0x00cf550c] ; compare with sentinel +``` + +### Root Cause (CONFIRMED) + +`SetFrameHitTestMode` checks that the anchor object is non-NULL, but +`luaGetWidth` / `luaGetHeight` read `anchor+0x0C` (the relativeTo pointer) +and dereference it at `+0x3C` **without** a NULL check. The anchor exists, +but its `relativeTo` field is NULL (no target frame set). + +**`0x0081C3D0` is NOT a vtable** — it's a static array of 3 anchor-point indices: +`[0, 3, 6]`, used by the width layout pass. `SetFrameHitTestMode` iterates these +indices to look up anchors from the frame's anchor array. + +### Anchor Vtable (0x0081C44C) — Full Layout +``` +[0] +0x00 = 0x00767d80 → GetAnimationOrder (destructor) +[1] +0x04 = 0x007a2f90 → luaGetWidth ← CRASH FUNCTION +[2] +0x08 = 0x007a3070 → luaGetHeight ← SAME VULNERABILITY +[3] +0x0C = 0x00767d70 → GetRelativeTo (already hooked) +``` + +### Fix Attempt: vtable[1]/[2] hook returning 0.0 — REVERTED + +Hooked vtable[1] (GetWidth) and vtable[2] (GetHeight) with wrappers that +returned 0.0 when relativeTo was NULL/dangling. **This broke UI layout** because: +1. 0.0 is not the sentinel value that `SetFrameHitTestMode` expects + (it compares via `FCOMP [0x00cf550c]` — a runtime .bss value) +2. The functions have side effects (IsAnimationDone, GetAnimationTarget calls) + that update layout state — skipping them entirely is wrong + +### Relationship Between Crash 1 and Crash 2 + +The GetRelativeTo hook (crash 1 fix) self-heals by NULLing anchor+0x0C when +it detects a dangling pointer. But GetWidth/GetHeight read anchor+0x0C +**directly** (not through vtable[3]), so they see the now-NULL value and crash. +The two crashes are likely the same underlying issue — the GetRelativeTo hook +is masking the dangling pointer but exposing it as a NULL pointer to other code. + +--- + +## Root Cause Analysis: Frame Destruction Missing Anchor Cleanup + +### Dependency Tracking System + +WoW's frame system tracks anchor dependencies via `PauseAnimationGroup` / +`ResumeAnimationGroup`: + +**PauseAnimationGroup(relativeTo_frame, owner_frame, bitmask)** — 0x767ee0 +- Called by `SetAnimationOrder` (SetPoint) when creating an anchor +- Maintains a linked list on `relativeTo_frame+0x30/0x34` +- Each node is 0x10 bytes: `[link0, next_ptr(+4), owner_frame(+8), bitmask(+C)]` +- Bitmask = `1 << anchor_point_enum` — tracks which anchor slots reference this frame +- If owner already in list, ORs in the new bitmask bits + +**ResumeAnimationGroup(relativeTo_frame, owner_frame, bitmask)** — 0x767fa0 +- Called when replacing/removing an anchor +- Walks list at `relativeTo_frame+0x34`, finds matching owner +- Clears bitmask bits: `node+0xC &= ~bitmask` +- If bitmask reaches 0, unlinks and frees the node + +### Proper Anchor Cleanup (exists but not called on destruction) + +**cleanup_array_of_objects** (0x767620) — cleans up a frame's OWN anchors: +```c +for i in 0..9: + anchor = *(frame + i*4 + 4) // anchor slot + if anchor != NULL: + relativeTo = anchor->vtable[3]() // GetRelativeTo + if relativeTo != NULL: + ResumeAnimationGroup(relativeTo, frame, 1 << i) // unregister dependency + anchor->vtable[0](1) // destructor + *(frame + i*4 + 4) = 0 +``` + +Called from: `SetAnimationOrigin` (0x768e20), `StartAnimationGroup` (0x767db0), +`GetAnimationEndDelay` (0x768430) — **never during frame destruction**. + +### Frame Destruction Chain + +``` +destroy_object (0x7676f0) — thiscall(frame, free_flag) + -> cleanup_linked_list_structures (0x767720) — thiscall(frame) + -> sets vtable to CLayoutFrame base (0x81c400) + -> SetAnimationOrigin(frame) -> cleanup_array_of_objects(frame) + ^ cleans up THIS frame's own anchors (forward direction) + ^ MISSING: cleanup of OTHER frames' anchors pointing to this frame + -> unlinks from various lists + -> if (free_flag & 1): FreeMemory(frame) +``` + +Also called from: `CleanupRegion` (0x76c560), `cleanupGraphicsResources` (0x764390) + +### The Bug + +When frame B is destroyed: +1. `cleanup_array_of_objects(B)` cleans up B's own anchors (calls + ResumeAnimationGroup on each of B's relativeTo frames) ✓ +2. **MISSING**: Nobody walks B's dependency list at B+0x30/0x34 to clean up + other frames' anchors that reference B ✗ +3. Frame A's anchor still has `anchor+0xC = B` (now freed/stale) +4. Any code that reads the anchor's relativeTo → crash + +### Proposed Root Cause Fix + +Hook `cleanup_linked_list_structures` (0x767720). Before calling the original: +1. Walk the dependency list at `dying_frame+0x34` +2. For each entry `(owner_frame, bitmask)`: + - For each bit `i` in bitmask: + - `anchor = *(owner_frame + i*4 + 4)` + - If anchor != NULL and `*(anchor+0xC) == dying_frame`: + - Call `anchor->vtable[0](1)` to destroy the anchor + - `*(owner_frame + i*4 + 4) = 0` to clear the slot + - Free the dependency list node +3. Clear `dying_frame+0x30/0x34` +4. Call original `cleanup_linked_list_structures` + +This uses the game's own anchor destructor and cleans up the dependency list. +The existing GetRelativeTo vtable hook can be kept as defense-in-depth. + +### cleanup_linked_list_structures Prologue (for detour) +```asm +0x767720: 53 PUSH EBX ; 1 byte +0x767721: 56 PUSH ESI ; 1 byte +0x767722: 8B F1 MOV ESI, ECX ; 2 bytes +0x767724: 57 PUSH EDI ; 1 byte +0x767725: C7 06 00 C4 81 00 MOV [ESI], 0x81c400 ; 6 bytes (vtable set) +0x76772b: E8 F0 16 00 00 CALL SetAnimationOrigin ; 5 bytes +``` +First 5 bytes (53 56 8B F1 57) can be replaced with JMP rel32 for a detour. diff --git a/src/framecrash/framecrash.zig b/src/framecrash/framecrash.zig index dfa389b..4f00783 100644 --- a/src/framecrash/framecrash.zig +++ b/src/framecrash/framecrash.zig @@ -1,5 +1,202 @@ //! Framecrash fix module. //! -//! Reference crash log: /media/bigfaststore/games/twmoa_1172/Errors/2026-02-25 19.38.01 Crash.txt +//! Fixes ACCESS_VIOLATION crashes caused by UI frame anchor objects holding raw +//! pointers to their "relativeTo" frame (anchor+0x0C). When the relativeTo frame +//! is destroyed, the pointer is never cleared, causing crashes in any code that +//! dereferences it (luaGetPoint, luaGetWidth, luaGetHeight, etc). +//! +//! Root cause fix: detour hook on cleanup_linked_list_structures (0x767720), +//! the common frame destruction path. Before the original runs, we walk the +//! dying frame's PauseAnimationGroup dependency list (frame+0x34) to find all +//! other frames whose anchors reference the dying frame. For each, we destroy +//! the anchor and NULL the slot, preventing any stale/NULL pointer dereferences. +//! +//! Defense-in-depth: vtable[3] (GetRelativeTo) hook validates returned pointers +//! with IsBadReadPtr, catching any cases the root cause fix misses. +//! +//! See RESEARCH.md for full reverse engineering notes. -//We are finally going to solve: The instruction at "0x007A2452" referenced memory at "0x16C0FFE8". +const std = @import("std"); +const hook = @import("hook"); +const con = @import("../console.zig"); + +const WINAPI = std.builtin.CallingConvention.winapi; +const THISCALL = std.builtin.CallingConvention{ .x86_thiscall = .{} }; + +extern "kernel32" fn IsBadReadPtr(lp: ?*const anyopaque, ucb: usize) callconv(WINAPI) i32; + +// ============================================================================= +// Anchor vtable layout (20-byte object allocated in SetPoint / SetAnimationOrder) +// +// +0x00 vtable ptr → 0x0081c44c (.rdata) +// +0x04 x offset (float) +// +0x08 y offset (float) +// +0x0C relativeTo (raw frame pointer — the dangerous one) +// +0x10 relPoint (uint, anchor point enum on the relativeTo frame) +// +// vtable at 0x0081c44c: +// [0] +0x00 GetAnimationOrder (0x767d80) — destructor/cleanup +// [1] +0x04 luaGetWidth (0x7a2f90) — reads [this+0xC]+0x3C +// [2] +0x08 luaGetHeight (0x7a3070) — reads [this+0xC]+0x3C +// [3] +0x0C GetRelativeTo (0x767d70) — returns *(this+0x0C) +// ============================================================================= + +const ANCHOR_VTABLE_ADDR: usize = 0x0081c44c; +const GET_RELATIVE_TO_SLOT: usize = ANCHOR_VTABLE_ADDR + 0x0C; // vtable[3] + +// ============================================================================= +// Root cause fix: hook frame destruction to clean up reverse anchor references +// +// cleanup_linked_list_structures (0x767720) is the common frame cleanup path, +// called from destroy_object, CleanupRegion, and cleanupGraphicsResources. +// It cleans up the dying frame's OWN anchors (forward direction) but NOT other +// frames' anchors that reference the dying frame (reverse direction). +// +// PauseAnimationGroup maintains a linked list on the relativeTo frame: +// frame+0x34 → first node +// Each node (0x10 bytes): [link0, next(+4), owner_frame(+8), bitmask(+C)] +// bitmask = OR of (1 << anchor_point_enum) for each referencing anchor slot +// +// Anchor slots in a frame: frame + point_enum*4 + 4 (9 slots, enum 0..8) +// +// Prologue at 0x767720 (5 bytes, no rel32): +// 53 56 8B F1 57 = PUSH EBX; PUSH ESI; MOV ESI,ECX; PUSH EDI +// ============================================================================= + +const CLEANUP_TARGET: usize = 0x767720; +const CLEANUP_PROLOGUE_SIZE: usize = 5; + +/// FreeMemory — __stdcall(ptr, source_string, flags) +const FreeMemory = @as(*const fn (u32, u32, u32) callconv(WINAPI) void, @ptrFromInt(0x646430)); +const CLAYOUT_FRAME_STR: u32 = 0x878540; // "...CLayoutFrame..." + +var cleanup_hook: hook.Hook = .{}; + +/// Detour for cleanup_linked_list_structures. Runs before the original to +/// walk the dying frame's dependency list and destroy referencing anchors. +fn cleanupDetour(frame: u32) callconv(THISCALL) void { + cleanupReverseDependencies(frame); + + // Call original cleanup_linked_list_structures via trampoline + const orig = cleanup_hook.getTrampoline(*const fn (u32) callconv(THISCALL) void); + orig(frame); +} + +/// Walk the PauseAnimationGroup dependency list on the dying frame and destroy +/// all anchors from other frames that reference it. +fn cleanupReverseDependencies(dying_frame: u32) void { + // Read first node from dying_frame+0x34 + var node: u32 = readAligned(dying_frame + 0x34); + + // Validate: odd pointer or zero means empty list + if (node == 0 or (node & 1) != 0) return; + + var cleaned: u32 = 0; + + while (node != 0 and (node & 1) == 0) { + // Save next pointer before we potentially free this node + const next: u32 = readAligned(node + 0x04); + const owner_frame: u32 = readAligned(node + 0x08); + const bitmask: u32 = readAligned(node + 0x0C); + + if (owner_frame != 0) { + // For each bit set in bitmask, destroy the corresponding anchor + var bit: u5 = 0; + while (bit < 9) : (bit += 1) { + if ((bitmask & (@as(u32, 1) << bit)) == 0) continue; + + const anchor_slot_addr = owner_frame + @as(u32, bit) * 4 + 4; + const anchor: u32 = readAligned(anchor_slot_addr); + if (anchor == 0) continue; + + // Verify this anchor actually references the dying frame + const relativeTo: u32 = readAligned(anchor + 0x0C); + if (relativeTo != dying_frame) continue; + + // Call anchor destructor: vtable[0](1) — thiscall with flag=1 (free) + const vtable: u32 = readAligned(anchor); + const dtor_addr: u32 = readAligned(vtable); + const dtor: *const fn (u32, u32) callconv(THISCALL) void = @ptrFromInt(dtor_addr); + dtor(anchor, 1); + + // NULL the anchor slot in the owner frame + const slot: *align(1) u32 = @ptrFromInt(anchor_slot_addr); + slot.* = 0; + + cleaned += 1; + } + } + + // Free the dependency list node + FreeMemory(node, CLAYOUT_FRAME_STR, 0xfffffffe); + + node = next; + } + + if (cleaned > 0) { + con.fmt("[framecrash] Cleaned {d} stale anchor(s) referencing dying frame 0x{x:0>8}\n", .{ cleaned, dying_frame }); + } + + // Clear the list head so the original cleanup doesn't see stale nodes + const head: *align(1) u32 = @ptrFromInt(dying_frame + 0x30); + head.* = 0; + const tail: *align(1) u32 = @ptrFromInt(dying_frame + 0x34); + tail.* = 0; +} + +fn readAligned(addr: u32) u32 { + return @as(*align(1) const u32, @ptrFromInt(addr)).*; +} + +// ============================================================================= +// Defense-in-depth: GetRelativeTo vtable hook +// ============================================================================= + +var orig_get_relative_to: usize = 0; + +/// Replacement for the anchor's GetRelativeTo virtual function. +/// Validates the stored relativeTo pointer before returning it. +/// If the pointer is stale (freed/decommitted memory), NULLs it out +/// and returns 0 so the caller takes the safe "no relativeTo" code path. +fn getRelativeToHook(this: u32) callconv(THISCALL) u32 { + // Call the original GetRelativeTo to get the stored pointer + const orig: *const fn (u32) callconv(THISCALL) u32 = @ptrFromInt(orig_get_relative_to); + const result = orig(this); + + if (result == 0) return 0; + + // Validate: the returned pointer is an inner offset into the frame object. + // The caller (luaGetPoint) subtracts 0x24 to get the frame base, then reads + // at +0x00 (vtable), +0x04 (lua ref), +0x08 (lua ref index). + // Check that the frame base region is readable. + if (IsBadReadPtr(@ptrFromInt(result -% 0x24), 0x10) != 0) { + con.fmt("[framecrash] Stale relativeTo ptr 0x{x:0>8} in anchor 0x{x:0>8} — nulled\n", .{ result, this }); + + // Self-heal: clear the dangling pointer in the anchor object + const field: *align(1) u32 = @ptrFromInt(this + 0x0C); + field.* = 0; + return 0; + } + + return result; +} + +// ============================================================================= +// Module API +// ============================================================================= + +pub fn installHooks() void { + // Root cause fix: detour cleanup_linked_list_structures to clean up + // reverse anchor references before the frame is destroyed. + // Prologue: 53 56 8B F1 57 (5 bytes, no rel32 fixups needed) + // if (!cleanup_hook.install(CLEANUP_TARGET, CLEANUP_PROLOGUE_SIZE, @intFromPtr(&cleanupDetour), &.{})) { + // con.print("[framecrash] ERROR: Failed to install frame cleanup detour\n"); + // } else { + // con.print("[framecrash] Frame cleanup detour installed\n"); + // } +} + +pub fn removeHooks() void { + cleanup_hook.remove(); + con.print("[framecrash] Frame cleanup detour removed\n"); +} diff --git a/src/interact/interact.zig b/src/interact/interact.zig index f3c7be8..10b4b4f 100644 --- a/src/interact/interact.zig +++ b/src/interact/interact.zig @@ -1,4 +1,5 @@ const hook = @import("hook"); +const con = @import("../console.zig"); const WINAPI = @import("std").builtin.CallingConvention.winapi; extern "kernel32" fn GetTickCount() callconv(WINAPI) u32; @@ -400,6 +401,7 @@ fn callOriginalSceneEnd(device: u32) void { // ============================================================================= pub fn installHooks() void { + con.print("[interact] Module loaded\n"); // SceneEnd — per-frame loot queue processing // Uses thunk: __fastcall(ECX=device, EDX) → cdecl(device, edx) if (scene_end_hook.prepare(Offsets.ADDR_SceneEnd, 9, &.{})) { diff --git a/src/main.zig b/src/main.zig index 4c0d898..b4bda47 100644 --- a/src/main.zig +++ b/src/main.zig @@ -8,6 +8,8 @@ const build_opts = struct { const interact = @import("build_options").enable_interact; const outline = @import("build_options").enable_outline; const markers = @import("build_options").enable_markers; + const framecrash = @import("build_options").enable_framecrash; + const combatlog = @import("build_options").enable_combatlog; }; // Conditional module imports @@ -15,6 +17,8 @@ const screenshot = if (build_opts.screenshot) @import("screenshot/screenshot.zig const interact = if (build_opts.interact) @import("interact/interact.zig") else struct {}; const outline = if (build_opts.outline) @import("outline/api.zig") else struct {}; const markers = if (build_opts.markers) @import("markers/markers.zig") else struct {}; +const framecrash = if (build_opts.framecrash) @import("framecrash/framecrash.zig") else struct {}; +const combatlog = if (build_opts.combatlog) @import("combatlog/combatlog.zig") else struct {}; const WINAPI = std.builtin.CallingConvention.winapi; const fc: std.builtin.CallingConvention = .{ .x86_fastcall = .{} }; @@ -300,9 +304,47 @@ const markers_files = if (build_opts.markers) [_]FileEntry{ .{ .name = "Bindings.xml", .data = @embedFile("markers/addon/Bindings.xml") }, } else [_]FileEntry{}; -const markers_assets = if (build_opts.markers) [_]FileEntry{ - .{ .name = "xyz.m2", .data = @embedFile("markers/assets/World/ArtTest/Boxtest/xyz.m2") }, - .{ .name = "xyz.blp", .data = @embedFile("markers/assets/World/ArtTest/Boxtest/xyz.blp") }, +// Marker model + skin + textures served under Spells\ prefix +const markers_spells_assets = if (build_opts.markers) [_]FileEntry{ + // Models (5 colors) + .{ .name = "Raid_UI_FX_Yellow.m2", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Yellow.m2") }, + .{ .name = "Raid_UI_FX_Cyan.m2", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Cyan.m2") }, + .{ .name = "Raid_UI_FX_Green.m2", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Green.m2") }, + .{ .name = "Raid_UI_FX_Purple.m2", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Purple.m2") }, + .{ .name = "Raid_UI_FX_Red.m2", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Red.m2") }, + // Skin files + .{ .name = "Raid_UI_FX_Yellow00.skin", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Yellow00.skin") }, + .{ .name = "Raid_UI_FX_Cyan00.skin", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Cyan00.skin") }, + .{ .name = "Raid_UI_FX_Green00.skin", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Green00.skin") }, + .{ .name = "Raid_UI_FX_Purple00.skin", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Purple00.skin") }, + .{ .name = "Raid_UI_FX_Red00.skin", .data = @embedFile("markers/assets/Spells/Raid_UI_FX_Red00.skin") }, + // Per-model raid target icon textures + .{ .name = "RaidTarget_Star.blp", .data = @embedFile("markers/assets/Spells/RaidTarget_Star.blp") }, + .{ .name = "RaidTarget_Square.blp", .data = @embedFile("markers/assets/Spells/RaidTarget_Square.blp") }, + .{ .name = "RaidTarget_Triangle.blp", .data = @embedFile("markers/assets/Spells/RaidTarget_Triangle.blp") }, + .{ .name = "RaidTarget_Diamond.blp", .data = @embedFile("markers/assets/Spells/RaidTarget_Diamond.blp") }, + .{ .name = "RaidTarget_X.blp", .data = @embedFile("markers/assets/Spells/RaidTarget_X.blp") }, + // Shared effect textures + .{ .name = "T_VFX_FLARE05_32ALPHA.BLP", .data = @embedFile("markers/assets/Spells/T_VFX_FLARE05_32ALPHA.BLP") }, + .{ .name = "GRAD2D.BLP", .data = @embedFile("markers/assets/Spells/GRAD2D.BLP") }, + .{ .name = "GRAD2C2.BLP", .data = @embedFile("markers/assets/Spells/GRAD2C2.BLP") }, + .{ .name = "NEXUS_FIREBEAM_FAINT_SQUARE_ORA.BLP", .data = @embedFile("markers/assets/Spells/NEXUS_FIREBEAM_FAINT_SQUARE_ORA.BLP") }, +} else [_]FileEntry{}; + +// Shared effect textures served under World\Expansion01\Doodads\Zulaman\Doors\ prefix +const markers_world_assets = if (build_opts.markers) [_]FileEntry{ + .{ .name = "T_VFX_FIRE03_A.BLP", .data = @embedFile("markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_FIRE03_A.BLP") }, + .{ .name = "T_VFX_BORDER6.BLP", .data = @embedFile("markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_BORDER6.BLP") }, +} else [_]FileEntry{}; + +// XYZ debug model (renamed to avoid collision with game's built-in xyz.m2) +const markers_xyz_model = if (build_opts.markers) [_]FileEntry{ + .{ .name = "WU_XYZ.m2", .data = @embedFile("markers/assets/Spells/WU_XYZ.m2") }, +} else [_]FileEntry{}; + +// XYZ texture served under World\ArtTest\Boxtest\ (matches M2 internal reference) +const markers_xyz_texture = if (build_opts.markers) [_]FileEntry{ + .{ .name = "xyz.blp", .data = @embedFile("markers/assets/Spells/xyz.blp") }, } else [_]FileEntry{}; // All addon prefixes to check @@ -312,7 +354,10 @@ const addon_prefixes = [_]AddonPrefix{ .{ .prefix = "Interface\\AddOns\\Interact\\", .files = &interact_files }, .{ .prefix = "Interface\\AddOns\\Outline\\", .files = &outline_files }, .{ .prefix = "Interface\\AddOns\\Markers\\", .files = &markers_files }, - .{ .prefix = "World\\ArtTest\\Boxtest\\", .files = &markers_assets }, + .{ .prefix = "Spells\\", .files = &markers_spells_assets }, + .{ .prefix = "Spells\\", .files = &markers_xyz_model }, + .{ .prefix = "World\\Expansion01\\Doodads\\Zulaman\\Doors\\", .files = &markers_world_assets }, + .{ .prefix = "World\\ArtTest\\Boxtest\\", .files = &markers_xyz_texture }, }; fn findEmbeddedFile(path: [*:0]const u8) ?*const FileEntry { @@ -389,6 +434,355 @@ fn loadFileDetour( return orig(unk, path, buf_out, size_out, extra_alloc, flags, async_ptr); } +// ============================================================================= +// In-memory file serving hooks (Storm file I/O layer) +// ============================================================================= +// +// M2 model loading bypasses our LoadFileWithTextureResourceFallback hook. +// These hooks intercept at the lower Storm file I/O level (openFileWithOptions +// and friends) to create fake file contexts for embedded files and serve data +// from memory. +// +// Fake context detection: type==0, handle(+0x04)==NULL, embedded_ptr(+0x30)!=0 + +var open_file_hook: hook.Hook = .{}; +var get_file_size_hook: hook.Hook = .{}; +var read_file_hook: hook.Hook = .{}; +var cleanup_file_handle_hook: hook.Hook = .{}; +var process_async_hook: hook.Hook = .{}; +var model_load_hook: hook.Hook = .{}; + +// Windows API imports for async handling +extern "kernel32" fn EnterCriticalSection(lpCriticalSection: *anyopaque) callconv(WINAPI) void; +extern "kernel32" fn LeaveCriticalSection(lpCriticalSection: *anyopaque) callconv(WINAPI) void; +extern "kernel32" fn SetEvent(hEvent: *anyopaque) callconv(WINAPI) i32; + +/// Check if a file context is one of our fakes +fn isFakeFileContext(ctx_addr: u32) bool { + if (ctx_addr < 0x10000) return false; + return hook.readMem(u32, ctx_addr) == 0 and // type == 0 (disk) + hook.readMem(u32, ctx_addr + 0x04) == 0 and // handle == NULL + hook.readMem(u32, ctx_addr + 0x30) != 0; // embedded ptr set +} + +/// Call initializeFileContext (0x647290) — __thiscall(ECX=ctx, type) +fn callInitFileContext(ctx: [*]u8, file_type: u32) void { + asm volatile ( + \\push %[ftype] + \\call *%[func] + : + : [_] "{ecx}" (@intFromPtr(ctx)), + [ftype] "r" (file_type), + [func] "r" (@as(u32, 0x647290)), + : .{ .eax = true, .edx = true, .memory = true, .cc = true } + ); +} + +/// Call cleanupFileContext (0x6472d0) — __thiscall(ECX=ctx) +fn callCleanupFileContext(ctx: [*]u8) void { + asm volatile ( + \\call *%[func] + : + : [_] "{ecx}" (@intFromPtr(ctx)), + [func] "r" (@as(u32, 0x6472d0)), + : .{ .eax = true, .edx = true, .memory = true, .cc = true } + ); +} + +/// Free a buffer via FreeMemory/SMemFree (0x646430) — __stdcall(ptr, src, flags) +fn freeGameBuffer(ptr: [*]u8) void { + asm volatile ( + \\push $0xffffffff + \\push %[src] + \\push %[ptr] + \\call *%[func] + : + : [ptr] "r" (@intFromPtr(ptr)), + [src] "r" (@intFromPtr(@as([*:0]const u8, "weirdutils"))), + [func] "r" (@as(u32, 0x646430)), + : .{ .eax = true, .ecx = true, .edx = true, .memory = true, .cc = true } + ); +} + +// --- Hook 1: openFileWithOptions (0x6477c0) --- + +fn openFileDetour( + archive_ptr: u32, + path: [*:0]const u8, + flags: u32, + handle_out: *u32, +) callconv(sc) u32 { + if (findEmbeddedFile(path)) |entry| { + // Allocate and zero-fill 0x60-byte file context + const ctx = allocateGameBuffer(0x60) orelse { + handle_out.* = 0; + return 0; + }; + @memset(ctx[0..0x60], 0); + + // Initialize critical section and set type=0 + callInitFileContext(ctx, 0); + + // Store embedded data pointer and size in unused fields + @as(*align(1) u32, @ptrFromInt(@intFromPtr(ctx) + 0x30)).* = @intCast(@intFromPtr(entry.data.ptr)); + @as(*align(1) u32, @ptrFromInt(@intFromPtr(ctx) + 0x34)).* = @intCast(entry.data.len); + + // Duplicate path string at +0x0C for game's use + const path_span = std.mem.span(path); + const path_len: u32 = @intCast(path_span.len + 1); + if (allocateGameBuffer(path_len)) |path_buf| { + @memcpy(path_buf[0..path_span.len], path_span); + path_buf[path_span.len] = 0; + @as(*align(1) u32, @ptrFromInt(@intFromPtr(ctx) + 0x0C)).* = @intFromPtr(path_buf); + } + + handle_out.* = @intFromPtr(ctx); + con.fmt("[file] fake ctx: {s} ({d} bytes)\n", .{ path_span, entry.data.len }); + return 2; // success (non-zero type code) + } + + const orig = open_file_hook.getTrampoline( + *const fn (u32, [*:0]const u8, u32, *u32) callconv(sc) u32, + ); + return orig(archive_ptr, path, flags, handle_out); +} + +// --- Hook 2: GetFileSizeFromHandle (0x6487f0) --- + +fn getFileSizeDetour( + file_ctx: u32, + high_size_out: ?*u32, +) callconv(sc) u32 { + if (isFakeFileContext(file_ctx)) { + if (high_size_out) |h| h.* = 0; + return hook.readMem(u32, file_ctx + 0x34); + } + + const orig = get_file_size_hook.getTrampoline( + *const fn (u32, ?*u32) callconv(sc) u32, + ); + return orig(file_ctx, high_size_out); +} + +// --- Hook 3: ReadFileFromMultipleSources (0x648460) --- + +fn readFileDetour( + ctx: u32, + buffer: [*]u8, + size: u32, + bytes_read_out: ?*u32, + async_ptr: u32, + param6: u32, +) callconv(sc) u32 { + if (isFakeFileContext(ctx)) { + const data_ptr = hook.readMem(u32, ctx + 0x30); + const data_size = hook.readMem(u32, ctx + 0x34); + const read_size = @min(size, data_size); + + const src: [*]const u8 = @ptrFromInt(data_ptr); + @memcpy(buffer[0..read_size], src[0..read_size]); + + if (bytes_read_out) |out| out.* = read_size; + + // If async, signal the completion event immediately + if (async_ptr != 0) { + const event_handle = hook.readMem(u32, async_ptr + 4); + if (event_handle != 0) { + _ = SetEvent(@ptrFromInt(event_handle)); + } + } + + return 1; // success + } + + const orig = read_file_hook.getTrampoline( + *const fn (u32, [*]u8, u32, ?*u32, u32, u32) callconv(sc) u32, + ); + return orig(ctx, buffer, size, bytes_read_out, async_ptr, param6); +} + +// --- Hook 4: processAsyncFileOperation (0x647350) --- + +fn processAsyncDetour(param1: u32, _edx: u32) callconv(.c) void { + _ = _edx; + const ctx_addr = hook.readMem(u32, param1 + 0x08); + + if (isFakeFileContext(ctx_addr)) { + // Enter critical section (same as original prologue) + EnterCriticalSection(@ptrFromInt(ctx_addr + 0x24)); + + // Read request fields + const dest = hook.readMem(u32, param1 + 0x0C); + const req_size = hook.readMem(u32, param1 + 0x10); + const data_ptr = hook.readMem(u32, ctx_addr + 0x30); + const data_size = hook.readMem(u32, ctx_addr + 0x34); + const read_size = @min(req_size, data_size); + + // Copy embedded data to destination buffer + const src: [*]const u8 = @ptrFromInt(data_ptr); + const dst: [*]u8 = @ptrFromInt(dest); + @memcpy(dst[0..read_size], src[0..read_size]); + + // Replicate cleanup epilogue from original function: + // 1. Decrement refcount at *(ctx + 0x5c) + const rc_addr = ctx_addr + 0x5c; + const cur_rc = hook.readMem(i32, rc_addr); + @as(*align(1) i32, @ptrFromInt(rc_addr)).* = cur_rc - 1; + + // 2. Leave critical section + LeaveCriticalSection(@ptrFromInt(ctx_addr + 0x24)); + + // 3. Signal completion event: *(*(param1 + 0x14) + 4) + const seek_struct = hook.readMem(u32, param1 + 0x14); + if (seek_struct != 0) { + const event_handle = hook.readMem(u32, seek_struct + 4); + if (event_handle != 0) { + _ = SetEvent(@ptrFromInt(event_handle)); + } + } + + // 4. If close-after-read flag at *(ctx + 0x58) is set, clean up + const close_flag = hook.readMem(u32, ctx_addr + 0x58); + if (close_flag != 0) { + cleanupFileHandleDetour(ctx_addr); + } + + return; + } + + // Not our fake — call original via trampoline (__fastcall ECX=param1) + hook.fastcall(void, process_async_hook.trampoline, param1, 0); +} + +// --- Hook 6: CleanupFileHandleResources (0x648730) --- + +fn cleanupFileHandleDetour(file_ctx: u32) callconv(sc) void { + if (isFakeFileContext(file_ctx)) { + const ctx: [*]u8 = @ptrFromInt(file_ctx); + + // cleanupFileContext frees +0x0C, +0x10, +0x18, +0x1C and destroys critical section. + // Do NOT manually free +0x0C here — that would be a double-free. + callCleanupFileContext(ctx); + + // Free the 0x60-byte context block + freeGameBuffer(ctx); + return; + } + + const orig = cleanup_file_handle_hook.getTrampoline( + *const fn (u32) callconv(sc) void, + ); + orig(file_ctx); +} + +// --- Hook 5: loadModelFromFileAsync (0x71d4e0) --- + +fn loadModelAsyncDetour(model: u32, _edx: u32, file_handle: u32, should_use_callback: u32) callconv(.c) u32 { + _ = _edx; + + // Debug: log every call to confirm the hook is firing + con.fmt("[file] loadModelAsync: model=0x{x} fh=0x{x} cb={d}\n", .{ model, file_handle, should_use_callback }); + con.fmt("[file] fh type={d} handle=0x{x} embed=0x{x} isFake={}\n", .{ + hook.readMem(u32, file_handle), + hook.readMem(u32, file_handle + 0x04), + hook.readMem(u32, file_handle + 0x30), + isFakeFileContext(file_handle), + }); + + // file_handle IS the file context address directly (Ghidra shows pointer* but + // the assembly pushes it directly to GetFileSizeFromHandle — no dereference) + if (isFakeFileContext(file_handle)) { + const data_ptr = hook.readMem(u32, file_handle + 0x30); + const data_size = hook.readMem(u32, file_handle + 0x34); + con.fmt("[file] embed_ptr=0x{x} embed_size={d}\n", .{ data_ptr, data_size }); + + // Toggle callback flag (bit 1 of model+8) based on shouldUseCallback + const flags = hook.readMem(u32, model + 0x08); + if (should_use_callback != 0) { + @as(*align(1) u32, @ptrFromInt(model + 0x08)).* = flags | 2; + } else { + @as(*align(1) u32, @ptrFromInt(model + 0x08)).* = flags & ~@as(u32, 2); + } + + // Store size in model first (original does this before allocation) + @as(*align(1) u32, @ptrFromInt(model + 0x134)).* = data_size; + + // Allocate buffer via setCullMode (0x71f9a0) — same as original path + // setCullMode is __fastcall(ECX=size), returns buffer pointer + const buffer_addr = hook.fastcall(u32, 0x71f9a0, data_size, 0); + if (buffer_addr == 0) { + con.print("[file] setCullMode alloc failed\n"); + return 0; + } + con.fmt("[file] buffer=0x{x}\n", .{buffer_addr}); + + // Store buffer in model object + @as(*align(1) u32, @ptrFromInt(model + 0x130)).* = buffer_addr; + + // Copy embedded data into the allocated buffer + const buffer: [*]u8 = @ptrFromInt(buffer_addr); + const src: [*]const u8 = @ptrFromInt(data_ptr); + @memcpy(buffer[0..data_size], src[0..data_size]); + con.print("[file] memcpy done\n"); + + // No async task — set task pointer to NULL + @as(*align(1) u32, @ptrFromInt(model + 0x0c)).* = 0; + con.print("[file] task=0 set\n"); + + // Skip cleanup for now (leaks 0x60 bytes) — investigate separately + // cleanupFileHandleDetour(file_handle); + con.print("[file] skipping cleanup (leak ok)\n"); + + // Call processLoadedModelData directly — __fastcall(ECX=model) + con.fmt("[file] calling processLoadedModelData(0x{x})...\n", .{model}); + const result = hook.fastcall(u32, 0x71d640, model, 0); + con.fmt("[file] processLoadedModelData returned 0x{x}\n", .{result}); + + con.fmt("[file] loadModelAsync: sync loaded {d} bytes\n", .{data_size}); + return 1; + } + + // Not our fake — call original trampoline (__thiscall: ECX=model, stack: fileHandle, shouldUseCallback) + return asm volatile ( + \\push %[cb] + \\push %[fh] + \\call *%[func] + : [ret] "={eax}" (-> u32), + : [_] "{ecx}" (model), + [fh] "r" (file_handle), + [cb] "r" (should_use_callback), + [func] "r" (model_load_hook.trampoline), + : .{ .edx = true, .memory = true, .cc = true } + ); +} + +// --- Install/remove in-memory file hooks --- + +fn installFileHooks() void { + _ = open_file_hook.install(0x6477c0, 9, @intFromPtr(&openFileDetour), &.{}); + _ = get_file_size_hook.install(0x6487f0, 6, @intFromPtr(&getFileSizeDetour), &.{}); + _ = read_file_hook.install(0x648460, 6, @intFromPtr(&readFileDetour), &.{}); + _ = cleanup_file_handle_hook.install(0x648730, 7, @intFromPtr(&cleanupFileHandleDetour), &.{}); + + // loadModelFromFileAsync is __thiscall(ECX=model, fileHandle, shouldUseCallback) — needs thunk bridge + if (model_load_hook.prepare(0x71d4e0, 6, &.{})) { + const thunk = model_load_hook.mem.? + 32; + _ = hook.buildFastcallToCdeclThunk(thunk, @intFromPtr(&loadModelAsyncDetour), 2); + model_load_hook.activate(@intFromPtr(thunk)); + } + + con.print("[file] in-memory file hooks installed\n"); +} + +fn removeFileHooks() void { + model_load_hook.remove(); + process_async_hook.remove(); + cleanup_file_handle_hook.remove(); + read_file_hook.remove(); + get_file_size_hook.remove(); + open_file_hook.remove(); +} + // ============================================================================= // Hook: LoadScriptFunctions (0x490250) // ============================================================================= @@ -555,9 +949,17 @@ fn install() void { con.init(); con.print("[weirdutils] Installing hooks\n"); _ = protection_hook.install(0x42a320, 6, @intFromPtr(&luaProtectionDetour), &.{}); + installFileHooks(); _ = file_hook.install(0x648620, 6, @intFromPtr(&loadFileDetour), &.{}); _ = lsf_hook.install(0x490250, 6, @intFromPtr(&loadScriptFunctionsDetour), &.{1}); + if (build_opts.framecrash) { + framecrash.installHooks(); + } + if (build_opts.combatlog) { + combatlog.installHooks(); + } + if (load_addons_hook.prepare(0x51F600, 7, &.{})) { const thunk = load_addons_hook.mem.? + 32; _ = hook.buildFastcallToCdeclThunk(thunk, @intFromPtr(&loadAddonsDetour), 0); @@ -589,10 +991,17 @@ fn uninstall() void { if (build_opts.interact) { interact.removeHooks(); } + if (build_opts.framecrash) { + framecrash.removeHooks(); + } + if (build_opts.combatlog) { + combatlog.removeHooks(); + } load_addons_hook.remove(); lsf_hook.remove(); file_hook.remove(); + removeFileHooks(); protection_hook.remove(); con.deinit(); } diff --git a/src/markers/RESEARCH.md b/src/markers/RESEARCH.md new file mode 100644 index 0000000..8c94fc6 --- /dev/null +++ b/src/markers/RESEARCH.md @@ -0,0 +1,183 @@ +# M2 Model Loading Research + +## Root Cause (Confirmed) +M2 model loading uses `openFileWithOptions` (0x6477c0) directly — it **never** goes through our hooked `LoadFileWithTextureResourceFallback` (0x648620). That's why embedded M2 files aren't served. + +## M2 Loading Call Chain +``` +createModelAttachment (0x707350) + → loadResourceByPath (0x706a50) + → openFileWithOptions (0x6477c0) ← file not found, returns NULL + → loadModelFromFileAsync (0x71d4e0) ← never reached + → falls back to ErrorCube.mdx +``` + +## File Context Structure (0x60 bytes, allocated by openFileWithOptions) +- **+0x00**: type (0=disk, 1=validated disk, 2/3=storage, 4=archive) +- **+0x04**: file handle pointer (disk types) +- **+0x0C**: path string +- **+0x14**: pre-read size (type 1) +- **+0x24**: critical section +- **+0x3C**: stream handle (types 2/3) +- **+0x40**: archive handle (type 4) + +## Calling Conventions (verified from disasm) +| Function | Convention | Params | RET | +|---|---|---|---| +| `openFileWithOptions` (0x6477c0) | `__stdcall` | 4 | `RET 0x10` | +| `GetFileSizeFromHandle` (0x6487f0) | `__stdcall` | 2 | `RET 0x08` | +| `ReadFileFromMultipleSources` (0x648460) | `__stdcall` | 5 | `RET 0x14` | +| `CleanupFileHandleResources` (0x648730) | `__stdcall` | 1 | `RET 0x04` | +| `loadModelFromFileAsync` (0x71d4e0) | `__thiscall` | ECX=this, 2 stack | `RET 0x08` | + +## GetFileSizeFromHandle (0x6487f0) — dispatches on context type +- Type 0: `fstatFileHandle(ctx[1]+0x10)` — needs real file handle +- Type 1: returns `ctx[5]` (value at +0x14) — **simplest, just returns a stored value** +- Types 2/3: `GetAudioStreamPosition(ctx[0xf])` +- Type 4: `getFileSize(ctx[0x10])` + +## ReadFileFromMultipleSources (0x648460) — dispatches on context type +- Type 0: `fileReadWithLock(buffer, 1, size, ctx[1])` — needs real file handle +- Other types: use respective handle fields + +## initializeFileContext (0x647290) — __thiscall, ECX=ctx, 1 stack param (type) +```c +TraverseListNodes((LPCRITICAL_SECTION)(this + 0x24)); // init critical section +*(uint *)this = param_1; // +0x00: type +*(uint *)(this + 0x04) = 0; // file handle +*(uint *)(this + 0x08) = 0; +*(uint *)(this + 0x0C) = 0; // path +*(uint *)(this + 0x18) = 0; +*(uint *)(this + 0x3C) = 0; +*(uint *)(this + 0x40) = 0; +*(uint *)(this + 0x54) = 0; +*(uint *)(this + 0x58) = 0; +*(uint *)(this + 0x10) = 0; +*(uint *)(this + 0x5C) = 0; +*(uint *)(this + 0x1C) = 0; +``` + +## CleanupFileHandleResources (0x648730) — __stdcall, 1 param, RET 0x04 +```c +if (ctx + 0x04 != NULL) closeFileStreamSafely(ctx + 0x04); // disk file handle +if (ctx + 0x3C != 0) Stream_CompareBuffers(ctx + 0x3C); // stream +if (ctx + 0x40 != NULL) closeArchiveFile(ctx + 0x40); // archive +// then frees path at +0x0C, buffer at +0x18, context at +0x1C +// calls cleanupFileContext (0x6472d0) on the 0x60-byte struct +// frees the struct itself +``` + +## Async Task Structure (from loadModelFromFileAsync) +``` ++0x00: file handle context ++0x04: destination buffer ptr ++0x08: data size ++0x0C: model object (callback context) ++0x10: onModelLoadComplete callback ++0x14: error callback (0x71d610) ++0x18: 0 ++0x1C: byte 0 ++0x1D: byte 1 ++0x28: byte 0 +``` +Queued via `AsyncTask_QueueForExecution` (0x443ae0). Executor reads from file handle into buffer, then calls completion callback. + +## loadResourceByPath (0x706a50) — __thiscall, ECX=resourceMgr +After `openFileWithOptions` succeeds: +1. Allocates 0x164-byte model object via `M2_AllocateModelBuffer` +2. `initializeModelObject(modelObj, resourceMgr)` +3. `loadModelFromFileAsync(modelObj, fileHandle, loadFlags)` +4. On success: copies normalized path into modelObj+0x20, sets up hash links +5. On failure: `CleanupFileHandleResources`, free model object, return NULL + +## LoadFileWithTextureResourceFallback (0x648620) — our hooked function +Calls `openFileWithOptions(param_1, path, async_flag, &handle_out)`, then: +1. `GetFileSizeFromHandle(handle, NULL)` → size +2. `M2_AllocateModelBuffer(size + extra_alloc)` → buffer +3. `ReadFileFromMultipleSources(handle, buffer, size, &bytesRead, asyncFlag)` → data +4. Returns buffer + size to caller +**Only called by UI/config/addon loaders**, never by M2 model loading. + +## The Core Problem +Every file context type needs a **real file handle or archive handle** for the read path. There's no "memory buffer" type. A fake context that works through the normal read pipeline requires either: +- A real handle pointing to our data, or +- Hooking the read functions to detect our fakes and return embedded data + +## Hook Options + +### Option 1: Triple hook (openFileWithOptions + GetFileSizeFromHandle + ReadFileFromMultipleSources) +- Create fake type-0 context with NULL handle, store data ptr/size in unused fields (+0x30/+0x34) +- GetFileSizeFromHandle hook: detect fake (type 0, +0x04==NULL, +0x30!=0), return +0x34 +- ReadFileFromMultipleSources hook: detect fake, memcpy from +0x30 +- **Risk**: async executor might call fileReadWithLock directly, bypassing ReadFileFromMultipleSources + +### Option 2: Hook loadModelFromFileAsync +- After openFileWithOptions succeeds with fake context, fill buffer synchronously +- Call onModelLoadComplete directly, skip async task +- **Need**: onModelLoadComplete address, setCullMode (allocator) address +- **Risk**: completion callback may expect async-specific state + +### Option 3: Hook openFileWithOptions only +- Make it produce a context that works through existing read pipeline +- **Hardest** — requires understanding all read paths for the chosen type + +## Implementation: In-Memory File Serving (chosen: Option 1 extended) + +### Implemented Hooks +5 hooks at the Storm file I/O layer, plus the existing `loadFileDetour` at 0x648620: + +| Hook | Target | Convention | Prologue | Purpose | +|---|---|---|---|---| +| `openFileDetour` | 0x6477c0 | `__stdcall(4)` | 9 bytes | Create fake file context for embedded files | +| `getFileSizeDetour` | 0x6487f0 | `__stdcall(2)` | 6 bytes | Return embedded data size | +| `readFileDetour` | 0x648460 | `__stdcall(5)` | 6 bytes | memcpy embedded data (sync+async) | +| `processAsyncDetour` | 0x647350 | `__fastcall(ECX)` | 7 bytes | Serve data in async executor path | +| `cleanupFileHandleDetour` | 0x648730 | `__stdcall(1)` | 7 bytes | Free fake context + path | + +### Fake File Context Layout +Allocated via `allocateGameBuffer(0x60)`, zero-filled, then: +- `initializeFileContext(ctx, 0)` — sets type=0, inits critsec at +0x24 +- `+0x0C`: duplicated path string (game-allocated) +- `+0x30`: embedded data pointer (custom field, points into DLL .rdata) +- `+0x34`: embedded data size (custom field) +- **Detection**: `type==0 && handle(+0x04)==NULL && *(ctx+0x30)!=0` +- Return value from openFileWithOptions: 2 (non-zero = success) + +### processAsyncFileOperation (0x647350) — verified via Ghidra +- `__fastcall(ECX=request)`, plain `RET` (c3) +- Request: `+0x08`=file_ctx, `+0x0C`=dest_buf, `+0x10`=read_size, `+0x14`=seek/event struct +- Event handle at `*(*(request+0x14)+4)` — signaled via `SetEvent` +- Cleanup epilogue: decrement `*(ctx+0x5c)`, `LeaveCriticalSection(ctx+0x24)`, signal event, conditional `CleanupFileHandleResources` +- Close-after-read flag at `*(ctx+0x58)` + +### CleanupFileHandleResources (0x648730) — verified decompile +```c +void CleanupFileHandleResources(int ctx) { + if (ctx == 0) return; + if (*(ctx+0x04)) closeFileStreamSafely(*(ctx+0x04)); + if (*(ctx+0x3C)) Stream_CompareBuffers(*(ctx+0x3C)); + if (*(ctx+0x40)) closeArchiveFile(*(ctx+0x40)); + if (*(ctx+0x08)) { /* check+free sub-buffer */ FreeMemory(*(ctx+0x08)); } + cleanupFileContext(ctx); // destroy critsec + FreeMemory(ctx); // free 0x60 struct + // NOTE: does NOT free path at +0x0C — we must free it ourselves +} +``` +FreeMemory (SMemFree) at **0x646430** — `__stdcall(ptr, src_str, flags)`. + +### Crash: Hook Install Order Matters +**Symptom**: Crash on game load in `loadFileDetour` calling `file_hook.getTrampoline()`. +The trampoline memory (VirtualAlloc'd) contained zeros instead of the saved prologue. + +**Analysis**: +- Crash at `0x075D5E88` (trampoline memory) — bytes: `00 00 00 00` +- Return address `0x04AA1542` in weirdutils.dll = `CALL *%eax` in `loadFileDetour` +- `getTrampoline` (compiled at DLL+0x3250) reads `file_hook.trampoline` field from `.data` section at `0x1015c0d8`, checks non-NULL, calls through it + +**Root cause**: `LoadFileWithTextureResourceFallback` (0x648620) internally calls `openFileWithOptions` (0x6477c0). If `file_hook` is installed FIRST (copying the 0x648620 prologue to its trampoline), and THEN we patch 0x6477c0, the trampoline's execution context is disrupted. The `file_hook` trampoline runs the original 0x648620 prologue which eventually calls 0x6477c0 — but if 0x6477c0 was patched after the trampoline was built, there may be page-level or VirtualProtect interactions that corrupt the trampoline's allocated memory. + +**Fix**: Install Storm I/O hooks (`installFileHooks`) BEFORE `file_hook` at 0x648620. Remove in reverse order. + +### Open Questions +- Does M2 async loading go through `ReadFileFromMultipleSources` or bypass it via direct `fileReadWithLock`? The `processAsyncDetour` hook catches the latter path. If M2 still shows ErrorCube, may need hook 5 (`loadModelFromFileAsync` at 0x71d4e0). +- `openFileWithOptions` return value: returns type code (0=fail, 1-4=success per type). We return 2 for fakes. Callers primarily check handle_out != NULL. diff --git a/src/markers/assets/Spells/GRAD2C2.BLP b/src/markers/assets/Spells/GRAD2C2.BLP new file mode 100644 index 0000000000000000000000000000000000000000..8570f5d9eba39a33eefa4292c4559e8598067ed6 GIT binary patch literal 12132 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�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 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/NEXUS_FIREBEAM_FAINT_SQUARE_ORA.BLP b/src/markers/assets/Spells/NEXUS_FIREBEAM_FAINT_SQUARE_ORA.BLP new file mode 100644 index 0000000000000000000000000000000000000000..066f6fd2f2f42fb958b53c5dbdddd57bf00f033b GIT binary patch literal 3916 zcmeHJL1-J<8Ge~0V0)TIhX#BcXA#I2!G^WwEpr)`lgc zX)-gCAz;iNjH^T1%gEgnX^d)e5R`&evI&$PdK7!i;N8L?6WYtL!|Y1a{~y`iQks&& z9wT^sdT-u)-~a#b|G)Qs`ty4~yhI3L2)QHzV*B+KXy1eOeL{Y4osb_v`!Te;(BA4d z0kdF38-Rm`-HQf)-~HZ2;9UgXMc|DQKs}=Hdt2l{Twr=lOc4?cI|8C=#UmVdo35Ln zOKilFTV>AY-~WI2AFp$p3I5(?kcY-cQ;7W`5M;QCpmoS-95}jR4$@6^c ziydZ7(@phGsh*Rqfm6>(l49x&v_n=$K3Q@yO61wSjLpf4p2TAmMQF!_8AS&2IJV;; zmP!vw32(DGi}npWoi5tl;rZ)Q-pRCEJXgx9T7S9WFKigg3(lxKQzQwG;x%b9!~^)@5AqK-bRGG1FaY*XndWGOd{Gpg*NFz_Ldel!_jXT&`~rtB6?%*9S(Z6? zAr;#Y_=Ec0s;-CL)%{;o1(qK^-G5n?jg!ky_rI*J|K*eGSGM0Psfx0CvviU#`ThXo z0PgBD666CcO!&jl*QUjkvZ9ArFL77cM&8jkqZsk_Z9(wvXuUKl5AKBPTgQ3kFsA9`JFLUYuw>`A#cpJnZ5 z+@?BkJg%s5kQN^yUv!=akbe&n{#%`z1NF^ZZUs=+nV;NVSRil?#2zS8u{TfLm{tnj zyaQN=y2E~9*_-G7^orgrNz%dD@Z-WVRGx3jGdXWQ3+s<7q`+=}VTffXLmH7v3O1(= zVv7DNk3%1MEz}2y!;Kr1V*c^zg&OJ#-+KLV5Ax8DEQ<92e0@Ae;tu;*-vr`8etr*9jBk#)nZ*?EPx1I-m zw1bI*#2znx1nanosct|;7@u;xG3GIG4-qFIKBf)+IFSn9VgI?Wzj88MYU*f65k13F zao=!csmKR(Z@g!49_V5XAB;P&@H@~_{QdwIAlA;2 z%+->4UaThL|BLrRcX9n}vsS}>Nfak_;l-~KyIr@L>_c2P(aV32+r|3t3egVt+>f`h z`@7@?+BWi2I%Mn&o=022bNxIXCFd|`d}fcoQ{^20b$>y25;#7%FW~+Qc=ovBWGGxb zoTPD2&Z@SP5mTz+dAJ|k*B-8~Q8}rd$Nr^J&%7SM?9}e`oyiuYcgSx9WM* z2*Y}=H?M$Dp&iPq3HJfK7p&+X-aT$&A)QVaUi97+K?M&<{%c3-vPA-EfyIkqIhC-gsQmr6RsV7WgaM zQgPT~FW=en=0V1Ftb1j3^|81Ey2W>bm%q`tDbU56hLZ{Z_*vhEad}lq?7H^+Z{xcC z@L{48Q)n;PhxvV{3VZ=S$-qm1s>%ujeHQFLE)ud~P|9o(@?`yt9)sT9eRTIxCF5{0 G{Qe0e|G4=8 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/RaidTarget_Diamond.blp b/src/markers/assets/Spells/RaidTarget_Diamond.blp new file mode 100644 index 0000000000000000000000000000000000000000..a5271fb11bdc5b76faf08e85473bb605c92f8fb4 GIT binary patch literal 6660 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 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/RaidTarget_Star.blp b/src/markers/assets/Spells/RaidTarget_Star.blp new file mode 100644 index 0000000000000000000000000000000000000000..2c02d3db88cf89a3d6fcadd80c45e14c4b886eef GIT binary patch literal 6660 zcmeHL4^Wfm8Gp$iAwURjQrAN&Ee8C@;dK|f-I|5!2}IjF??wn`Ba2~*L{V!;|7j ztTjKO5ejGt99DoLbQv38-H_yd_h8KvTe@IG0RaDkOnRiLJ4-NN755%r*Q1AB)MPgQ zb*AO{w&{UDxi@Ulo{(d($Q@qUzZSrsUgS6o4nOhO+!zjf;PYW`ad9yS0`ah!mNA6K z7k}IGep7x+YuWr>{}Vmz#(FX|lyy6^V{igsGu^Vx_FQ`u=*AzRG@qSC#!{{R^5$j0J~tN z(`YQp<@DRY2%Qxsa|4I3!%9Xf6-RKm6H1xlVnZK?%a|3;69z->B(I1kZHXin_yxl& z7m0-1S$=UnjsAM6(tJ~YO}GDhF9q~7BR_x=g^wur8Ro~6bFhj+N^8!KZ)@Mg^o4c^ zr@C?WUm(6$(|VWs*40`Lhr3&w7Kf#+;cz2eZtFXr9Mu099k7ef-_d_F)wP{4i9)&c zyI{a2Hye$T_D+uixr`wHKCwf!Y{V+>!AE0QUsSpM$%(rI_Bno!_Iau*pr3`)kEh)C zv73-#(1Xfx%}5}pYk_j#0z2}n%25+e9u})q5X2p@`oHi9iybM!`CasKQ%{XGiQC^v z%NbDwKRACKgo6fcUp+V9K-DhQsm0KqMJG=B zPU~X}z*wiw=_Aj$klTdBl}URdqw#s z`mfZLW+bHMdLSP7?#oTh?^!?EGaT@@YdEh>qq#V5?$y#4dK=mNOtu4GQkkCA=o z4ZOcLfR4GCo2wZo%Kinb%H(!9J!~?WOQ)kBf1T~e)-UVu_p6SbUZSj#;P+fJ_Lqus zP33#Ovn)HXK)uT_bf@1tM)TUPr6vaZg=19coSb)13%@tArv&*Fgzn^9CbDF_F|M^_ z9N(|?G)pI~ed;#y!$%{2erla)JbPOn+b>W-hc*p2o`b`X6QwP{^V_U87~i?caT1#`N|=lDbU8SJU>5?r+lo3E-%6a@P(MdvcI6Z)I5 zUE$3-Q~hj@pC7S_?%_NOb7XH#u;#}W&=yOM5!>;Ltaj0)&84%+t zD=|qh=ili3^2vX&@u*U*t&03&45gXrmrjcD%zj3=Wd*VAH@O-TIo^svF^ pknnkD&RGjjZQasaMOWC!!e2kj(O=?Du#rpn`;uQKli_3&<3HpY0~-JU literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/RaidTarget_Triangle.blp b/src/markers/assets/Spells/RaidTarget_Triangle.blp new file mode 100644 index 0000000000000000000000000000000000000000..2e28121637b177cc1dbacadbf29062f7a5c86081 GIT binary patch literal 6660 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 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/Raid_UI_FX_Cyan00.skin b/src/markers/assets/Spells/Raid_UI_FX_Cyan00.skin new file mode 100644 index 0000000000000000000000000000000000000000..7b32bb8eb4a5dbd30e25be2c71595bebe18da295 GIT binary patch literal 9552 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 Q9RJBmfAD_zT=0zl0vkiNM*si- literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/Raid_UI_FX_Green.m2 b/src/markers/assets/Spells/Raid_UI_FX_Green.m2 new file mode 100644 index 0000000000000000000000000000000000000000..410b34e7d3140fd9a066143bf2e6f4c9cfbcf7c9 GIT binary patch literal 32602 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 a7!IJxJD~AFx^bHik;Noo{sN_0Mg{=dmlPTR literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/Raid_UI_FX_Green00.skin b/src/markers/assets/Spells/Raid_UI_FX_Green00.skin new file mode 100644 index 0000000000000000000000000000000000000000..7b32bb8eb4a5dbd30e25be2c71595bebe18da295 GIT binary patch literal 9552 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 Q9RJBmfAD_zT=0zl0vkiNM*si- literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/Raid_UI_FX_Purple.m2 b/src/markers/assets/Spells/Raid_UI_FX_Purple.m2 new file mode 100644 index 0000000000000000000000000000000000000000..929c3151912432d329c2d92780a1e569745e481d GIT binary patch literal 32490 zcmce<30w}}`~QCz>MkL&RAddQkZdjYTvt&fcMGX^C`CnRrINKGS|kbCijb|6ozgvL zk}WFxQr1v}RQ7E3pW7YM_q;#f-}m=>eE;)!TwP~op64~!IkR-nnR8}rEDQ|K$%V+ z?|Dqnah{Bm@c!2%<%{_Fj=V4Dy>wn>{;##N{ObICD}GT=-d}sCeMV}c?youCn@jEM z>`CTFbGMlP$@RaVl9pGWk7wfa*`98W+nCXlhxs9-5o!-WyUMX z|2zZ#Z}t8?Uz+zPc2lcBrmLr{T++i`R-%8;^Pgk?Px)l!8on&`cez>$uKhpM)4y-4 z`pYVET)~`JzOgX>b!@c!U#i2(EFd3*dl;=TvO1LRFGazP|CMr8TwYGPCa)CPthW4F zE`B48N7=vE#V|W8zrW7UZi7wh|I?>_tbz zFKlxBUyO=iRrad?r5|+Fo3pMdhGSbw7;D%5f9cy;C$UUBy}$H-@ke-m9M3n^S9FYJ zQ{3J#&pfmPy6msra?xw>J7ylK{J)eV2&dO*} z(|8U(3B$rRpG2i|Q*uWJZ2L>!@M$`8!hN2oss5?#FnsjNh}qm1C9f84`%8alS}gNj zCxU6Jf6>bt9glTG%Eo=Kp5*3`1yRljQ4;p@my&b&CwCVB8?_aLsl@YsB7bQcQ)&HZ< z@$8{XhJPKO5-)4c<5)MYS5~-Wc(db&;bK|k{DFU+FY`ZHa|6D1<(#|DmQ*%7e&%c| zmAuJ{|Lc5Fk62FXq8D&^{QkYz?0m5ZDUkdKjQ>kNpmiMK_b)f{J->gO9sjP6B;?41 zR@~AO{CPe~fBP1CF5{F3K4H4H-!GXel7sMqWPm>Y_*)Eo@8l9p&52+H(H%sggSDCDrRVWx>-ALrTSYMHm(Rk;{N;@5@vY3@ zfXPhS;0%n)Uqy|_Gcz1-x0!^3j~#M1Kk5K8TGfb-)*ir~+H0x$X2a*>O+!cYE?mJx zuWk>s&gwIgU2AdiSU;-1(}^YMr8yb}ho7BRSN#XBXKWN*_J~Jc(Q2xGsk0CMGsqIH zZbdRGtRw8`EMWHNd1IxL9aW$C7>b9_4MRcb&eK;?*MR)Ex2E|Ay-+eKimLy7^i1># z9*O!7S29+g;~?wiUeWFLL(r*cFjc?%wGfO<>W_jYa5^F95G*wD&V9Rn5DI-)Q1!D1 zPQ%azx~Tem6(dwV1U660ByBqDV^mo!l|No;gD(F17@wvH%V%Z*8yzKiJlF$`3qDZ! z+318fCjfTqsR(&Cad1qMom-;42Hza2qwEiG27_lvwx} zmk*Vv^2aqi(fa99bZXlQ!n3}brcIm3>TMo?a=L@5{Ev;JaBZ8x*x}B2_%1mJ503O@ zzaMeO2UBd@vaY6QYko8Q~M$R^#%D)pBVC1lo zxTae=RL#zWxfhPJBTi1mOsln2UisZ%oR>HrC*3;$`V(S7Fy zzp1o0rl$@>yWvGJGcN-MuobL>(PUh`C!NZVs_luPcL6)UFNCyxF>qn#Rkp)`Xbjzv zLFKn@(ZC}9`t#^;ArxrY!F1Ie_Unn==(#16$}2l|KymC;+~ZdWW>w1YBWD-;Y!ruf z>km@-l*y`CQ#TiV^a~+8cn!0~BaSV+dJma3SybL(pBkQ0Uxq_pT?T<&Z_|D&JCl^u z9=KF^p2~l|)*kzq48Zob)lk+s13pe}P5e(g;T-u3R6aXP701Sm#M0K)(7iqy&I}Te zp08G+(|0=G?SV2f(UzEc=?!FGwt?=7uUO%NT{!yFMXG)$rqVEvG_(Wo-lRv0@gvSLCxsJxfAL^K_Js#}7_9cD4>_GX$^;AB{=Q8Xu zpMW6`)KUGt0%%>;ByCpZV(ozjDnD=46>#0{fs=F9QD?a^u&H}bxpI<8sUn#vcwON0wu2BE%K7p*l9K>MOe5BtU_2F{Hx`z&Fb?Y{| z3ffZj+t;6f`hJUX``!U4$TP@In-@yj9q5EV7!4}_tk4PCS`EfE{QvoL0sCRzSYPra zUySch)A{@{?og2r7&y`t1NQr!3tBhk7sL+u}@6kiR@vZb38|sHcWLRsE>?Q?0r{Rjxi(dx}wXaUXa; zSxy=(tkGk3e=0wqZ%=qV+Z=C<7UQCeYP^+8p9uyq)f*Er5Hvk&T^U7#x- z*V+f_J=T(L7sukwF2kw(BJIb_(($9v(B2h4v|I^cF)`##*)lBHK<5RaC`as9Csx%MNd`sO25pzOUrer@B5Wqajdn`8+Y8+#H@#?yIgu@LgJm*S%; z7Yw)^%*}S8%4^1VVjMsB z!^2Dca8S@*C~(4o5a}dCfZL!30{0Z#K@XyRB?GFl} zvl)TUBE&DgXciN|cq*(UOvyFucACz6sVOp3wk^lrCB7(lFOal1I7lLov_{EiJF5P< zp$8>ht#z0nx8Bf?MKVOV}-1w3xKi}bBni2L8t z`3sf;2Au7%bZi(}8IA@^|75ZxY%}ign?TjiIwfF&3*AxDFO0wb*E0u8lZdCvaoqTt z&R1pW9;vDJ!_-z`C}8F?9WB-on=MyywfDq-(`RRQSc;M5e4CDTXG!p?vt;Gmo#a^y zTPnX^GmuFxEPzq`Z|=LDyWj<@Q-tHoFyGOP%IAyP!kn^P=q>M$TjzGc2emATeO$zr zhST-;dWJIjyDDJTn=lMfRzUq@M~HuIHaq7AU4P3`0Yo~Lfx;6%G;veF(NnXDe9dd- z>JPfUeracBIkZ6QqA=9`{u0(}WfHAN4UC(eIW_+1+)Iq@XL)?d`Qgz$uOR*WQQ|rH z0GwY$KYk`Q9LNb@(Gdq_grWDdi|{pSFVWS@0>>h{{-piOn8T$Vv3R>5*2Wb;R_b9= zd{drlqiaZwC#65au9Qviu=6zJigd73>kLvie-ml3kIuXNBZg`*fxM5dI4!RWE)Cv8 z9Od?~U-}HC>QDPJ9HyLk4r#Ys@y9U*eD-(;Nq(*bHK}wy_f;3T7ovdC$N2w|cCW$O zdMkO`?-*2Q(XY>L2VXPlZe7qP(G^2RT!MxfY2=lofJ<4dO^ru&cK{rny9t&k+u-tE z1JJ8@J24DRBpd7K{1%09_;9os++T{ZcPDi$9=U~>bXdp62KS}v=d73wMZxc3bb%Pp z2o-VYuJuIsks5@*qx0FmHcT~+Y2JUc4v)_`GvQO0e3)@{q@ZipIm|UTO#XWTKpiU5Z7`cMP-1|)B^N(GJ z8~*n}bWQ_()HHDM4{uT$qss=}s-yDNdv8GYfd=TgTLV=Tg=lrdm0UeH1ZG_MLgmxc zFF{Z5w%BsH22T3;20HJXNK`ss1lxkIRDRs83!sp#g)iJSF!2H322nDThw+41wZcp}P$g@cc z9#VPx8{eP+zXO*f#H&+<_{zzWxJpc6Mc^YU-(k}?czUxn?hY2>gYDIjt!F~6w=aUg zxsR#5B>5vGNHlQOBq3_9DuN!aw&X+J3-YjE9+eL=mdC^qIWTZb4NSVEi#0<=lUpABsC-?aGMee!hYwCQ@Sfj}M8SxZZ9O5$*375!+t;XKh}CD1bgY5I!$MqrU!S}> zW(j*bo~80{v)bdRdL>+OqZ(#d)qwNiUSxBd>#(lvIVx}HtcFK4HPAYt8d3)r!PTEVPNVY2^UQJ4 z?n98J5(AK{iJ}1yS+Cj8O@|BJseFXGB^D@Og5b;1@GwgWOKx0X6SjIloA1-9{KD6W z_C~Kk#NU_KS-gedC5PE6K^aukcu@It6JvZ4(H>iliG~sSS7FTK61L>}O>%B#Un-xU zI28@Ar-7A^EzIbqkI$m>Szpn3k}{<~m5*xi4{m628cJT+fV^r~3^UAR&p5@1LTm?6 z`8an69LC&+nI1Nf+CmvMA8cg1C;EcjC_O44Z!``!tf+$zkHoO7`Yrgj4r7mgF9+Qb z1F3w{dkZACsu(#%43gVdA-ZxOt9IuKQJM0P`uuBF2R|I+a~#f@C_}$MebnZk??16H zC!F~cD*y5AOuV+`7EC&+1m``wV)%j(R#&Z56fmHI%1fWeRaaNT(;-UW>8y;|m&dUg zF$i*wqpP4hlhG^E;@~(qb3Zy@cC!Ra8D-V2AeWJ7c|$5G=y3LBca% zR($Ug=~nDUSXo;-`rPnwUarB5MQX*Cm_(-q}n zJF=H&b!5ut`crv7;aps^T7cPtSVrfdG6tT$DoM!;hjFG0sQi^m51e1Eg10_LGjZnc zA@7Wj1U^*5LFF(i?>XEBElRrLhw3P%Nas3;K4^+s)xL*w@v7A4xoy7(Vz;5)P+;Jl zGx5fC(EH4u_K>WE>ARjXwEOG6Cqgi9x+)5aHW+t&{T>wNSxbIciWpJ3fw zwLrlgTa(vvt#N%Kkz8;bNc5e@Q+eT(a1?f~072RT6LH&a*x^%acIBgUn^5k`vdA*tzqjFx^XA@ zHclGfDl7!8f|r1M*ENjw4F-4Fd9f9{?70)MdMu4k;li?O-kD?%?+1-k|EoUtWl+J9HR<`yx{V zaUeR6zs3$vPvxT5no;#%=*_}Zp&g?#B7yPw9DqO4Pq6xRr#Y`}LPDz_m9m8x?qe@8 zBWp~p^dpen`JB}nDdDv9jHvo2Rc4|fh0CpibDc z5`Dj>0xR!^qsmSJ>GyIcH#)bN%9}iL!p(cPFtK74IIt@KkH3D!qRT4oj@52u>MREoCretTvH5LAX`ByHc;`hb+gSS=I$nxcmg@b1)ozx@iz~o!y+qIKwsmKTgeLslgx5h&L@^CENG=wP6O5?O9Orr8_{Y)`n)ko&?Ke5pJi$8Am=|}q9 zi{?IAI8pgRbHHI~0P8x%!kMaRIMciH1TsyyA!vnC%q@J=ev6;Fbtoz>!oKp5Y=^M^gFum-Nw~S7+wj(M)i64o6)z zYw~^19?o~=N-96-3;#ds{1+xJAQPsg`D5J+AZi-1oJ-g$Dt~U1E{gY>fWx3nsNXaV zFGz+GM|D?j?7}E2-yx|7e*fYDnpGK)vf2hWuG1lr^?kXa^P{P}%2Z9f61W@Su zmx&YqJc*eqq?gWO1}ExsYm|gQ&JqKY0Ogj zm}tJ=C4arT>sAXP)vmbwm?!DhaR#R_lu-G!{BPhBF&=hk)k5c|Vswa}OvZoJ<=*LY zRDQ&vkC6T&9%kOJffKh)k#Sy2a%#?TJ$Bup@?US(gCMRjchxc_3_2QyY56ha>Wl-N zO7dMQzbO4Xq>h=$%yw16j(h#E^}t9{d3z04x3PrEr+B@CGJM3?h?MZy7FR4Ew3O7Z z^W-YlmQwj~Dit6ZKO79YD&fR6Vm#Vn9vK)qkh>mpkIH}k{t%MORzt_HLVOo)if=Y< zBN>A(aP{?Xsr=JjcOl$hjO0bECLVDOLq|apIkPjJdtLXA%CFjX7p~1QU@p(rMEePT zczR9(xz}+mclX_UDsMCVI@EexW3sF?vDU&B``nHtPutDn&R2b)^4qsxg5&Z7A+f(E z#v6$-8ds9`p9XV>pMRwC>MbvTNskB!R?x&j`lgt2b010Zy~tG`RG_w}wT;UJLFR;9 zt4(@XEeyk!u!|fk%it<>6{-9hk_qASY#F@}JzVqM7w7CxCPfYj+=G2|e(q5InWolN zrk$f6>ess9^$wfJ`8Bh->)Jx9{s)77P%xwqyc?>Ah0n&L(b9F~<9tJ|U?-iI3poJZ zO7q}O2R)o~*967wkCXV!0&bd%tUrA7{;m%)R)WCg^63M+MW}mx86I1lMfUVK$T^nM z`8TUVpe%kW6SrK1m-qRi=JWl8OTKjP3 zH|hLitK|^+ydO+56QOYJc&t2~LhigB#u?eu+mjU?RzvpVIWV$^2=^`LpJChPk+9d7 zxMJnr)Oc#PjpRq3#$_uXw!xWh%g`g|G)bD4#hr_y^C8>%fhxO*sgAcn1qWZe+~)+z zx}M0LZrO*bUs2f;bXq-UuKU{Ho-r;sB>oUt6XVAniJK1ZL&R}Xh*-mAQ*=m7ku4EeSR$hkf zKVKlxDTlbBBMhkg>g+70Ry&ok-8PMHSM$Mz)6bAp)eW5PF*Z_{`@XBOnAJtsHngn%T6rCGsA9@MGp>hyUXdkv(r9N*}@CV z;eGxXcEAU9cNCLEyN%q|=|I(A*M6HQ)LS1mtn$b1DN}K+QURH?az3~A5uM-t%AQe; zaDxS2{>Ua+V{2graok_bX>}e?)%O+8$rbF_Xu4@mICh)96z9!*OnkZ?<Gc^LRX zvbpmWMta|wJIM!2AC!{F_#{qQRZP{_5G$}c695*C3&$x|Q_*bfEi$}C2-grt=Y4eF z4Cb1?7vK?t}KhOK+*;rhKT$i0aNxYgBBKkx6F z^IwL|$9GdgP|#|xi6D-gJ`nebHRk_ci}y{X@~)Zl@krMMDAgqK2+ZN!Yth7_35T$oVcysQO(!g7EvuktmR#ZnAxE6!_NNV2{qIC&R_o zRQ<;*ywR%O7^C~gGLH(P;AHGEcF)IUBuakZ&-Rn%@w7-@fU|P?qF~e*lS=LYyd9a( z4)RGLdne1j&UDJtgpN znGXB+JYf~n75U$vH>mthi3?ukjB(W%CFuS-3bbdwW3Bc8XS}zN$~zBo=KH%^;h5=4 zuzxq-KXAPqS(6&fh4(m5<$V2?RZZPJ1RkW-Dxu67z?>fBqh8UZ2-m zO~GM7+88;_2KM($ho=*3*%Q50xr!~a`}gMj!%Gt}Vg7I&v(N@y+C)QEjDUR78p}mH zb))LvDHfxCxCJU~umSDL@lf?rNQ^a>ae8VRRDMb5c-*jZ5*B3HK*9+{(6eq&nAok{ zm8+eoyz5g@O^1GS(;@wi0%_N=7w2j(YaeLN z&v7urkve)fqb405OyKKuL_6Zp&Y3%uC2Ox}&YzrSg2gvX@Z9%w=ou)6ew(@w>y=TQ zT$>ft_)pFoi3N@}sI8m+6O7NbGe8ionIkN2MLzegAZLck?%$io&t;mR!?mtBgMXelb4@yo z8Q7MvaRWHDL|J=6bN=;`VK}1G06Z%!hHgR8uyRdj(h%j&dDZTq#?ya>0lv>LLha7Q zka|K4XWw)uJI}1$93M`GmQ8tC~|3~mtm8f#{1uNJ$$+wk*!z z*y>YMUQ0y>t#LY9TGv4BfEeaM%aO$7%LT5T%}FZ%y}Cd8uL{Dw|I~mW@0_vuqK@Rw z@)n%_sZuJx*1IQW?&yx~Hwm%)dOC#P>qaz}nQ&p9WbGBr%iEbBXWaRulDO`X<&ugH-eXhx({(XpHP)AOzC2N0Z9)H-!7P!Q{F9sggMNfWw zO-_^^neRWI3l_`TLz?r6MGbI_9fG}2>7x1%{+aiSp~Pi)1m9my);`mmzxTQU@|^*1 zu)3Ih(FR6XiO7$m$=rqXR@D22b_ZIZMwl%wKc~yThd>GD@3$Z+2H9LqX-g`>mEZ%*8zCrtSLJ8h=Gk@N{$Au11 zF>W@Gfgu}55n)yg=fL)&#sggoq0QXEXn2?B?QOyTqcus_+rurX>Ph84R^5Znw*a3$ z6l2To%5c!pfmk2N-;oQOUZ~;nJFeJ!X$GuaZBCYzdU6Vb>HLJ% zhd?2u4;u2%{YpGyp!oGT;`V9{H)xuyy{NfmD4MGZ9C><;M%S#WB$;9%Qsf z8MptnK9%2Vcn3O+^}+X_T~Ux(Z&DLsMk<{~aM`J{_Lk=HJ3H-wU2@&g@R=XF@5liC zr&dI7qA&O4s;vE|IbT}54eTZi!ly6&u=A=Im^*3$IoU6f6E=vb@yza#0k0MsVPdTx zZZ5Tj^j(vQQ`$k!a1fmz()}#hZ?wQspZ!pq8%XE%t&hSk{Xk3?^6#8V>SdbvPd}3Sx{|4h zl=W|KUfx-E55Wc-0zGes;Y>A6{3z%_qMSQJr*c{U_U8QLh_jHrtQZ0c_!078zn_u>_3}kHUeqfYq!>jjo>=l@7N&OQGjgKiv6I zh;7wJl0HXw60>Kr_P6Hx7VXzUT4^OjJPpGUA8PnxV=%dxmq5Hm$;KBn=j-EkLVkxg zaQ(I)e!5-*;!q@$ZYgr!9q9U@F7c4Rzcm`Z48y8>#c-sT5wST{PvQe*@9Su;uYGP8 z94l79hzEX{nOzK;*6oOP$IH;Jqip<9bAFM}3m9a00#r}9V$ly>bWZO=(9{TwM-QVO z4-S`}z~;+WATQSy`@Pk`B;}rD$i=p-$2?ho{^t6gl|>+V{Rjf`T`{6uh_~nHkh|N% z$m*T4@deHKuZ0}EDtiMxFS%m&p&C#tG$6I--;iV1WbM_>`J*#9IJZI`uU~aVpQK_~ z`d*QQ@%{CZ5CRK&hG9d%vSpT9Z3y8Hz!YX1WAPKa^FO(7a}>_vJ=T*(muomWbG4E4wB zAV4C<&^0v>5;TBpy!C*T4wj8aXs$oR_A%@}Da2l9`F59}VtA4)Aa_5#2A3PM@r=!R z;ldV}=yVtkZ8OC-92ANZ8N^ZN!#tSs(v%kn=#z4M5?IBY%np*?+w0aYh zXNBZPyzF^XbH4Ue1Bjn>z`&EHSUsT_qT=4MBP+i{*bo)!{!R8&#_c+AJ zd$KNn&mhExnH|WnPa5Pak&Q2C&Ofi~fJQMbQFXU2*75zNnTwj_;oH-sPc{Ab{K=8Z zxa~(LJaa&ozZEYA+sDt?f+__Z*XsxMeqm{j8lKKf20OmLy-kiTUfS`2Re81pwuOD8 z@}V!f;f(2LK@g*X`!o4_s>AZ6+tG{6n}=Vh{K}r%XuY};4zJZf`BWi#sJ13w`q#1` zs-yBVu5`z;D=pDINdr&!tAW%2H4-UECkb0WQTbJ|ol#)l3EQV=pkJF}=wx`C4fbk> z8y`QR@^`JZur4+kcJTe}2kz&`B)_X*XWcps6^v|ree?RCFrqK+-$cNEi4dc=X<*x9 zpV;%ct-vVx5mi6OX&}a#J_W%FAwG>4;)R?RByL6~8~ybGl{XtS2>V}@!^1H`T-34# zT575gopxKu1LylxzS9|P{QgE2rzh~^5nl6SHzF^v+I%0Ahbgl68#IsKu&5t8pH6~D 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 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/Raid_UI_FX_Red00.skin b/src/markers/assets/Spells/Raid_UI_FX_Red00.skin new file mode 100644 index 0000000000000000000000000000000000000000..30bff57fbb58658d0b78e056cde3089a4b87b1a4 GIT binary patch literal 9552 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 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/Raid_UI_FX_Yellow00.skin b/src/markers/assets/Spells/Raid_UI_FX_Yellow00.skin new file mode 100644 index 0000000000000000000000000000000000000000..7b32bb8eb4a5dbd30e25be2c71595bebe18da295 GIT binary patch literal 9552 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 Q9RJBmfAD_zT=0zl0vkiNM*si- literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/T_VFX_FLARE05_32ALPHA.BLP b/src/markers/assets/Spells/T_VFX_FLARE05_32ALPHA.BLP new file mode 100644 index 0000000000000000000000000000000000000000..68b1784902a55c60ec4221214e4a5f447570a685 GIT binary patch literal 2564 zcmeH{@lRV-6vuB%8LvE731wK=y0u%iA@CrZg9->8Btsj85$d&MHhpf@WFZcLO8N?p zHtbhTfow1=1Ok~$z)l9X3u&4~=P&(9bUvn5lSUw7HKMr3whmU$eV|z|asC0^X++}NDx9&Dovt+nb-vx7zHLr=xeY=usdM?d%%7KL65{%ptgc#mT_G7ViSZKqF>{d|DgBb_}vz}%KEsI(Nn@iDDVH?>8XQpxeW(;0YU zQmU3G?GJSH8IhB5Pqyr#`GI}+HJP@G!fe;FL_SsVje00kjAyZN+x1C)i>Cf8@%%g= z$Vzc_ItrH*3#uv#i@wKLW!hz!A zVl~z3G#mcNB>99HhG{t9ayblwg2ad8F#ej^bJq)hQXIWpU>E%P^wf)Mw?L1-9lq+o zYzOy>=GSKvV_u=aex(%TICXmbP}!(gIG)#?L0C#%{NdZ2eV-9MoAq5Tg$ka|FKIeY z7~}(LxuI2Q*yAMnAQ!GXu=2YCnCJrsuDI(#<6U5`gT*Hf zHhP7znM$G$ayCu+Xi;Kfrjo=1=Hw`LsI2Lrm_Nr^ZK){I`-bTQotQt*<7`=BtGRVB zMCt`{LJ7SDdiO)5o^(-IsM9Lzo1MNSi7%bpz*sZ)+;kvmBn*{O|80+{pz*JZQpLM_w!+Er1{##$`f`$3Mb^q3>Q&rd-;m;jHnQikU0ng>H< ze|}iNYFb&}c4Jsa>PhtX)1I1Oa76be#DBSq#p$TtSoY4Uj>O}D zx9dHQccGtqzK1JC>I3qaLdyF7$gs%L8v>T2o|<{*=DH`r;#8zbKC|Wjkp1_4-maG> z-tVD(BtG2l;#`TTZ{7J?x=yPB-k_zqLFQB6g|Lc!@Ww^z$LOD z+K>0Wfau7cRU5nO60}`N|c- z@Lo8Ot2Y!G(Ge#7(2kbPMt2{umf~y{TyZRTcJ9@;q6PNu3|v+9&;Ok~Inj`W@prw6 I{{)P`04Q3}sQ>@~ literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/WU_XYZ.m2 b/src/markers/assets/Spells/WU_XYZ.m2 new file mode 100644 index 0000000000000000000000000000000000000000..8e0d3f3a84c682c1a5b034925e08515288585d9d GIT binary patch literal 8128 zcmeHMO=ule6h3JZ8%=9oli233Nwn3bCZ?}VwP~BYm!@eeNFfWsO~FzvB198vlvD~G zx^XKAu3ThiL6GN0DA<=S1Q#MyaN)ALsmnkqxQpkz=iGN^?z{KB1d7e#4dk7fJKsI` zJ7>Ocn3-IhJC>&=q81{W=a}Abc$t3?OZ@XI$9sCb&J!?xxs~Wmj!PVoW4)7qbi?@v zgM!Nq*-;m9exAoo9*&s5q{oTIFEy@eEOA_%y}Q=Fr=^Tc-w!^T?wz<(e0=h^;+31F zBF3KPwsQUR;PS1z-SEauxBs=<4eo7h1cx^<*jxjHjz7)q|60FR51wTGSjX0s-rwpP z_2$Ovv1?;C9oXBpnHurF}k{e?mwf-^v>5aed;{F-H7tcTZ zu0R(Dr({0S0^{HPv#SumC*XaK@yS0oDr-!w^pzucPMH)tKR#T%mBOE5d@Vk}Z;p@j zFvR~V^Z#M|uc>Ukf)DWr{&ocK^N-gn`9u7}e9-Y^&F7En^&wxcQWYP;`~1;Q;J=OF zL;S<_N`9YzoDZ~26yhJgzJd?&uZ8#d$Lp2+K7Z)By8q69KL4=(9p2|3_Lsx^{KNgs z;?w$v-m0&c)QbN5e8T;4c%M($k6FCWr`qoh@AnhWa!ahw>(jRi&W{eia`biqb=VE~ z_t=jCd}1-_Xz>^e8kL;S1jb$Fk@&7b9y=A7P_?-h8SkKsf7tDpZ}PM^Q!ldad`eg0uRpk8d4 zm!2Ede`4T_jq%Uc>+;9=$M8OUnD3TvSGgDD?LEI&;yg#Z z&YSOAybmnxlj8>*&D(ab#9@wa@o8XZcpupN9C2Lg6U_a7iR&C+S8Q%Tu&W$_P4)|B zRlk?r~dYN9KLo`B%=~Wt~F?x;0=?LZNC>^5-I?l}Apc6DnC+QTOrYV}H z0u^b7&d@BKr8zoB=jj4-xlmz+k+XUZsG{OA^R(tbwiB8cD@^EGSoMgm4<@6^3G5Cj zPcS~9+)>4l)`QCWwMJCCPwPepy0jPQN{99bood&fp?f>EkLYN#_SO{D_}OF!px6cD z19;)*-#;stmlq1(eDz}?ry1nChjB_Kr|752s0peP-OL!ZL3N^+Nux%nQgo6xYK3Y= zA0tN1P_^h{*r*+<7d`YCH^3F5gPd^-TqD=N&A17!5`V#A`2Gwl z&0E&9&CHL}w9Y^8EM8l9|I(Rj%Wq%(WckwU;>t22|JQc>%EFQXyZ_kW=_NlT&*d{5 SLtFZPxuNqMxxn^+70 literal 0 HcmV?d00001 diff --git a/src/markers/assets/Spells/xyz.blp b/src/markers/assets/Spells/xyz.blp new file mode 100644 index 0000000000000000000000000000000000000000..3b74bad70d649b96e96f99f35ee4b584a83be204 GIT binary patch literal 44876 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 LKlsk3quBlriJp-P literal 0 HcmV?d00001 diff --git a/src/markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_BORDER6.BLP b/src/markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_BORDER6.BLP new file mode 100644 index 0000000000000000000000000000000000000000..7e3856baf929cff98c41bec6d6272f9fec0c014b GIT binary patch literal 88580 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 literal 0 HcmV?d00001 diff --git a/src/markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_FIRE03_A.BLP b/src/markers/assets/World/Expansion01/Doodads/Zulaman/Doors/T_VFX_FIRE03_A.BLP new file mode 100644 index 0000000000000000000000000000000000000000..12c7e924578ef29e87895ef8ba7c4107dbcea65b GIT binary patch literal 88580 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%0AaIkeh|dx)COiQ#M6+!5h)VISO3uBfc*En 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 N{EJ#=ys8xb{twPfMS}nU literal 0 HcmV?d00001 diff --git a/src/markers/markers.zig b/src/markers/markers.zig index bfc5af5..ffb7992 100644 --- a/src/markers/markers.zig +++ b/src/markers/markers.zig @@ -67,8 +67,7 @@ fn createEntityInstance(path: [*:0]const u8, pos: *[3]f32, facing: f32, flags: u [_] "{edx}" (@intFromPtr(pos)), [a] "r" (&stack_args), [func] "r" (o.FN_CREATE_ENTITY_INSTANCE), - : .{ .memory = true, .cc = true } - ); + : .{ .memory = true, .cc = true }); return if (result != 0) @ptrFromInt(result) else null; } @@ -81,8 +80,7 @@ fn cleanupEntity(obj: *anyopaque) void { : : [_] "{ecx}" (@intFromPtr(obj)), [func] "r" (o.FN_CLEANUP_ENTITY), - : .{ .eax = true, .edx = true, .memory = true, .cc = true } - ); + : .{ .eax = true, .edx = true, .memory = true, .cc = true }); } // ============================================================================= @@ -91,7 +89,7 @@ fn cleanupEntity(obj: *anyopaque) void { var test_marker: ?*anyopaque = null; -const MODEL_PATH: [*:0]const u8 = "Spells\\ErrorCube.mdx"; +const MODEL_PATH: [*:0]const u8 = "Spells\\WU_XYZ.m2"; /// Create a test marker at player position using the native entity creation API. pub fn createTestMarker() ?*anyopaque { @@ -110,7 +108,7 @@ pub fn createTestMarker() ?*anyopaque { con.fmt("[markers] player pos = {d:.1}, {d:.1}, {d:.1}\n", .{ pos.x, pos.y, pos.z }); if (pos.x == 0 and pos.y == 0 and pos.z == 0) return null; - var position = [3]f32{ pos.x, pos.y, pos.z + 2.0 }; + var position = [3]f32{ pos.x + 10.0, pos.y + 10.0, pos.z + 2.0 }; con.print("[markers] calling CreateEntityInstance_WithAttachment...\n"); const obj = createEntityInstance(MODEL_PATH, &position, 0.0, 0, 1) orelse { @@ -161,8 +159,7 @@ fn luaPushNumber(L: u32, n: f64) void { [lo] "r" (raw[0]), [hi] "r" (raw[1]), [func] "r" (@as(u32, 0x6F3810)), - : .{ .eax = true, .edx = true, .memory = true, .cc = true } - ); + : .{ .eax = true, .edx = true, .memory = true, .cc = true }); } // ============================================================================= @@ -215,6 +212,7 @@ pub fn luaGetPlayerPosition(L: u32) callconv(.c) u32 { // ============================================================================= pub fn installHooks() void { + con.print("[markers] Module loaded\n"); // Nothing to hook - markers are created via Lua commands } diff --git a/src/markers/offsets.zig b/src/markers/offsets.zig index 7cbbcc3..8e6170e 100644 --- a/src/markers/offsets.zig +++ b/src/markers/offsets.zig @@ -78,3 +78,58 @@ pub const FN_CM2_CREATE_FOR_MODEL_OBJECT: usize = 0x00695100; /// ECX = world object, EDX = 4x4 transform matrix (float[16]) /// Stack: bounds (float[6] min/max), halfExtents (float[3]), forceUpdate (int) pub const FN_UPDATE_OBJECT_TRANSFORM: usize = 0x006717d0; + +// ============================================================================= +// File I/O (Storm) — for in-memory file serving +// ============================================================================= + +/// openFileWithOptions — __stdcall(4), RET 0x10, prologue=9 +/// (archive_ptr, path, flags, handle_out) → type_code (0=fail, 1-4=success) +pub const FN_OPEN_FILE_WITH_OPTIONS: usize = 0x006477c0; + +/// GetFileSizeFromHandle — __stdcall(2), RET 0x08, prologue=6 +/// (file_context, high_size_out) → size +pub const FN_GET_FILE_SIZE: usize = 0x006487f0; + +/// ReadFileFromMultipleSources — __stdcall(6), RET 0x18, prologue=6 +/// (context, buffer, size, bytes_read_out, async_ptr, param6) → bool +/// async_ptr==NULL: synchronous read. Non-NULL: queues async operation. +pub const FN_READ_FILE: usize = 0x00648460; + +/// CleanupFileHandleResources — __stdcall(1), RET 0x04, prologue=7 +/// (file_context) → 1 +pub const FN_CLEANUP_FILE_HANDLE: usize = 0x00648730; + +/// processAsyncFileOperation — __fastcall(ECX=request), plain RET, prologue=7 +/// Request structure: +0x08=file_ctx, +0x0C=dest_buf, +0x10=read_size, +/// +0x14=seek/event_struct (*(+0x14)+4 = event handle) +pub const FN_PROCESS_ASYNC_FILE_OP: usize = 0x00647350; + +/// initializeFileContext — __thiscall(ECX=ctx, type) +/// Sets context type, initializes critical section at +0x24, zeroes fields. +pub const FN_INIT_FILE_CONTEXT: usize = 0x00647290; + +/// cleanupFileContext — __thiscall(ECX=ctx) +/// Destroys critical section, cleanup companion to initializeFileContext. +pub const FN_CLEANUP_FILE_CONTEXT: usize = 0x006472d0; + +/// FreeMemory (SMemFree) — __stdcall(3): (ptr, src_str, flags) +pub const FN_FREE_MEMORY: usize = 0x00646430; + +// ============================================================================= +// M2 model loading (async pipeline) +// ============================================================================= + +/// loadModelFromFileAsync — __thiscall(ECX=model_obj), 2 stack params, RET 0x08 +/// (fileHandle: **ctx, shouldUseCallback: int) → 1 +/// Prologue: 55 8b ec 8b 55 0c 56 8b f1 — safe sizes: [6, 7, 9] +/// Allocates async task to read file and call onModelLoadComplete when done. +/// The async executor at 0x71d610 calls fileReadWithLock directly, bypassing +/// our ReadFileFromMultipleSources hook — hence this hook fills the buffer +/// synchronously for fake file contexts. +pub const FN_LOAD_MODEL_ASYNC: usize = 0x0071d4e0; + +/// processLoadedModelData — __fastcall(ECX=model), no stack params, plain RET +/// Parses model header from buffer at model+0x130 (ptr) / model+0x134 (size), +/// initializes model resources, sets bit 0 of model+8 when done. +pub const FN_PROCESS_LOADED_MODEL_DATA: usize = 0x0071d640; diff --git a/src/outline/api.zig b/src/outline/api.zig index 7bb9e2d..fcdf15e 100644 --- a/src/outline/api.zig +++ b/src/outline/api.zig @@ -4,6 +4,7 @@ //! and a Lua C callback for `/wu outline` commands. const hook = @import("hook"); +const con = @import("../console.zig"); const tracker = @import("tracker.zig"); const model_hook = @import("model_hook.zig"); const d3d9_hook = @import("d3d9_hook.zig"); @@ -13,6 +14,7 @@ const d3d9_hook = @import("d3d9_hook.zig"); /// dummy D3D9 device during engine init corrupts the d3d9 proxy's state and /// causes model rendering to stutter at ~10fps. pub fn init() bool { + con.print("[outline] Module loaded\n"); if (!model_hook.installHooks()) return false; return true; } diff --git a/src/screenshot/screenshot.zig b/src/screenshot/screenshot.zig index 131a38c..8d15f7b 100644 --- a/src/screenshot/screenshot.zig +++ b/src/screenshot/screenshot.zig @@ -1,5 +1,6 @@ const std = @import("std"); const hook = @import("hook"); +const con = @import("../console.zig"); const png = @import("png.zig"); const WINAPI = std.builtin.CallingConvention.winapi; @@ -340,6 +341,7 @@ pub fn screenshotCommand(L: *anyopaque) callconv(.c) u32 { // ============================================================================= pub fn installHook() void { + con.print("[screenshot] Module loaded\n"); // CTgaFile::Write at 0x5a4810 // __thiscall(self, filename) — prologue: 55 8B EC 83 EC 08 = 6 bytes, no fixups // Thunk: fastcall(ECX=self, EDX, stack: filename) → cdecl(self, edx, filename)