// // __FrameHandler3::FrameUnwindToState from 0x180126b10 to 0x180126c9a (394 bytes) // // 3 xrefs: // > __FrameHandler3::FrameUnwindToEmptyState @ 0x1801253e3 // > __InternalCxxFrameHandler<__FrameHandler3> @ 0x180126613 // > @ 0x180202948 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // void __fastcall __FrameHandler3::FrameUnwindToState( unsigned __int64 *a1, struct _xDISPATCHER_CONTEXT *a2, const struct _s_FuncInfo *a3, __ehstate_t a4) { __int64 ImageBase; // r13 __ehstate_t CurrentState; // edi __int64 v10; // rcx __int64 v11; // rax __int64 v12; // rcx __int64 v13; // r14 __int64 v14; // rax __int64 dispUnwindMap; // rcx __int64 v16; // rax __int64 v17; // rax __int64 v18; // rcx __int64 v19; // rbx __int64 v20; // rax __int64 v21; // rcx __int64 v22; // rax __int64 v23; // rcx __int64 v24; // rax __int64 v25; // rcx __int64 v26; // rbx __int64 v27; // rax __int64 v28; // rcx __int64 v29; // rax ImageBase = GetImageBase((__int64)a1); CurrentState = __FrameHandler3::GetCurrentState(a1, a2, a3); v11 = _vcrt_getptd(v10); ++*(_DWORD *)(v11 + 48); while ( CurrentState != -1 && CurrentState > a4 ) { if ( CurrentState <= -1 || CurrentState >= a3->maxState ) abort(); v13 = CurrentState; v14 = GetImageBase(v12); dispUnwindMap = a3->dispUnwindMap; CurrentState = *(_DWORD *)(dispUnwindMap + v14 + 8LL * CurrentState); v16 = GetImageBase(dispUnwindMap); v12 = a3->dispUnwindMap; if ( *(_DWORD *)(v12 + v16 + 8 * v13 + 4) ) { v17 = GetImageBase(v12); v18 = a3->dispUnwindMap; v19 = *(int *)(v18 + v17 + 8 * v13 + 4); v20 = v19 + GetImageBase(v18); } else { v20 = 0; } if ( v20 ) { __FrameHandler3::SetState(a1, a3, CurrentState); v22 = GetImageBase(v21); v23 = a3->dispUnwindMap; if ( *(_DWORD *)(v23 + v22 + 8 * v13 + 4) ) { v24 = GetImageBase(v23); v25 = a3->dispUnwindMap; v26 = *(int *)(v25 + v24 + 8 * v13 + 4); v27 = v26 + GetImageBase(v25); } else { v27 = 0; } CallSettingFrame(v27, a1, 259); SetImageBase(ImageBase); } } if ( *(int *)(_vcrt_getptd(v12) + 48) > 0 ) { v29 = _vcrt_getptd(v28); --*(_DWORD *)(v29 + 48); } if ( CurrentState != -1 && CurrentState > a4 ) abort(); __FrameHandler3::SetState(a1, a3, CurrentState); }