{"type": "func", "start": 6443653404, "end": 6443653506, "name": "__FrameHandler3::StateFromIp", "pseudocode": "// \n// __FrameHandler3::StateFromIp from 0x18012591c to 0x180125982 (102 bytes)\n// \n// 4 xrefs:\n// > __FrameHandler3::GetCurrentState @ 0x180125895\n// > __FrameHandler3::StateFromControlPc @ 0x180125917\n// > __InternalCxxFrameHandler<__FrameHandler3> @ 0x1801265f0\n// > <???> @ 0x1802028a0\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall __FrameHandler3::StateFromIp(\n        const struct _s_FuncInfo *a1,\n        struct _xDISPATCHER_CONTEXT *a2,\n        unsigned __int64 a3)\n{\n  __int64 dispIPtoStateMap; // r11\n  __int64 ImageBase; // r10\n  unsigned int nIPMapEntries; // r8d\n  __int64 v7; // r9\n\n  if ( !a1 || (dispIPtoStateMap = a1->dispIPtoStateMap, ImageBase = a2->ImageBase, !(dispIPtoStateMap + ImageBase)) )\n    abort();\n  nIPMapEntries = a1->nIPMapEntries;\n  v7 = 0;\n  if ( !nIPMapEntries )\n    return 0xFFFFFFFFLL;\n  do\n  {\n    if ( a3 < ImageBase + *(int *)(dispIPtoStateMap + 8 * v7 + ImageBase) )\n      break;\n    v7 = (unsigned int)(v7 + 1);\n  }\n  while ( (unsigned int)v7 < nIPMapEntries );\n  if ( (_DWORD)v7 )\n    return *(unsigned int *)(dispIPtoStateMap + 8LL * (unsigned int)(v7 - 1) + ImageBase + 4);\n  else\n    return 0xFFFFFFFFLL;\n}", "assembly": "; \n; __FrameHandler3::StateFromIp from 0x18012591c to 0x180125982 (102 bytes)\n; \n; 4 xrefs:\n; > __FrameHandler3::GetCurrentState @ 0x180125895\n; > __FrameHandler3::StateFromControlPc @ 0x180125917\n; > __InternalCxxFrameHandler<__FrameHandler3> @ 0x1801265f0\n; > <???> @ 0x1802028a0\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\npush    rbx                                                            ; +0x0, 0x18012591c\nsub     rsp, 20h                                                       ; +0x2, 0x18012591e\nmov     rbx, r8                                                        ; +0x6, 0x180125922\ntest    rcx, rcx                                                       ; +0x9, 0x180125925\njz      short loc_18012597C                                            ; +0xc, 0x180125928\nmovsxd  r11, dword ptr [rcx+18h]                                       ; +0xe, 0x18012592a\nmov     r10, [rdx+8]                                                   ; +0x12, 0x18012592e\nlea     rax, [r11+r10]                                                 ; +0x16, 0x180125932\ntest    rax, rax                                                       ; +0x1a, 0x180125936\njz      short loc_18012597C                                            ; +0x1d, 0x180125939\nmov     r8d, [rcx+14h]                                                 ; +0x1f, 0x18012593b\nxor     r9d, r9d                                                       ; +0x23, 0x18012593f\ntest    r8d, r8d                                                       ; +0x26, 0x180125942\njz      short loc_180125977                                            ; +0x29, 0x180125945\nlea     rcx, [r11+r9*8]                                                ; +0x2b, 0x180125947\nmovsxd  rdx, dword ptr [rcx+r10]                                       ; +0x2f, 0x18012594b\nadd     rdx, r10                                                       ; +0x33, 0x18012594f\ncmp     rbx, rdx                                                       ; +0x36, 0x180125952\njb      short loc_18012595F                                            ; +0x39, 0x180125955\ninc     r9d                                                            ; +0x3b, 0x180125957\ncmp     r9d, r8d                                                       ; +0x3e, 0x18012595a\njb      short loc_180125947                                            ; +0x41, 0x18012595d\ntest    r9d, r9d                                                       ; +0x43, 0x18012595f\njz      short loc_180125977                                            ; +0x46, 0x180125962\nlea     ecx, [r9-1]                                                    ; +0x48, 0x180125964\nlea     rax, [r11+rcx*8]                                               ; +0x4c, 0x180125968\nmov     eax, [rax+r10+4]                                               ; +0x50, 0x18012596c\nadd     rsp, 20h                                                       ; +0x55, 0x180125971\npop     rbx                                                            ; +0x59, 0x180125975\nretn                                                                   ; +0x5a, 0x180125976\nor      eax, 0FFFFFFFFh                                                ; +0x5b, 0x180125977\njmp     short loc_180125971                                            ; +0x5e, 0x18012597a\ncall    abort                                                          ; +0x60, 0x18012597c\ndb 0CCh                                                                ; +0x65, 0x180125981", "xrefs": ["__FrameHandler3::GetCurrentState @ 0x180125895", "__FrameHandler3::StateFromControlPc @ 0x180125917", "__InternalCxxFrameHandler<__FrameHandler3> @ 0x1801265f0", "<???> @ 0x1802028a0"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}