// // sub_56490 from 0x56490 to 0x56824 (916 bytes) // // 2 xrefs: // > sub_591BC @ 0x591d8 // > @ 0x10c730 // // 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 // __int64 __fastcall sub_56490(__int64 a1, int a2, __int64 a3) { int v4; // w23 __int64 v6; // x21 __int64 v7; // x24 unsigned int v8; // w22 unsigned int *v10; // x8 unsigned int v11; // w9 __int64 v12; // x8 int v13; // w8 int *v14; // x21 int *v15; // x9 __int64 v16; // x10 __int64 v17; // x0 __int64 v18; // x11 __int64 v19; // x21 __int64 v20; // x9 int v21; // w10 __int64 v22; // x8 __int64 v23; // x13 __int64 *v24; // x13 int v25; // w9 int v26; // w9 __int64 v27; // x1 __int64 v28; // x2 __int64 v29; // x8 int v30; // w9 int *v31; // x10 int v32; // w11 __int64 v33; // x9 __int64 v34; // [xsp+0h] [xbp-50h] BYREF int v35; // [xsp+8h] [xbp-48h] char v36; // [xsp+Ch] [xbp-44h] __int64 v37; // [xsp+10h] [xbp-40h] BYREF int v38; // [xsp+1Ch] [xbp-34h] BYREF v38 = a2; if ( !a3 ) return 31; v4 = a2; if ( !(*(unsigned int (__fastcall **)(__int64, __int64, _QWORD))(*(_QWORD *)a1 + 312LL))(a1, a3, 0) ) { v8 = (*(__int64 (__fastcall **)(__int64, __int64))(*(_QWORD *)a1 + 280LL))(a1, a3); if ( v8 ) return v8; } v37 = *(_QWORD *)(a1 + 96); if ( !v37 ) return 9; v7 = *(_QWORD *)(a1 + 104); v6 = *(_QWORD *)(a1 + 112); if ( v4 == -3 ) { v4 = *(_DWORD *)(a1 + 24); v38 = v4; goto LABEL_12; } if ( v4 == -2 ) { v8 = sub_5796C(a1, *(_QWORD *)(a1 + 112), &v38); if ( v8 ) return v8; v4 = v38; if ( v38 < 0 ) return 31; goto LABEL_13; } if ( v4 != -1 ) { LABEL_12: if ( v4 < 0 ) return 31; goto LABEL_13; } v4 = 0; v38 = 0; LABEL_13: if ( v4 > *(_DWORD *)(a1 + 24) ) return 31; *(_QWORD *)(a3 + 512) = a1; v8 = sub_CBC5C(a3); if ( !v8 ) { *(_OWORD *)(a3 + 8) = *(_OWORD *)(v7 + 8); v10 = (unsigned int *)(a3 + 100); do v11 = __ldaxr(v10); while ( __stlxr(v11 | 0x40, v10) ); v8 = sub_C7D1C(a3, 1, 1); if ( !v8 ) { v12 = *(_QWORD *)(a1 + 8); v36 = 0; v35 = 1; v34 = v12; sub_520A0((__int64)&v34); v8 = sub_CB2C0(v37, a3, 0xFFFFFFFFLL, (unsigned int)v38, 1, 0); if ( v8 || !v38 && (v8 = sub_579A0(v6, a3 + 8)) != 0 ) { sub_57964(); } else { sub_57964(); v13 = v38; v14 = (int *)(a1 + 272); v15 = (int *)(a1 + 272); while ( 1 ) { v15 = *(int **)v15; if ( v15 == v14 ) break; v16 = *((_QWORD *)v15 + 2); if ( v13 <= (int)v16 >> 16 ) *((_QWORD *)v15 + 2) = v16 & 0xFFFFFFFF0000FFFFLL | ((unsigned __int64)((unsigned int)(v16 + 0x10000) >> 16) << 16); } if ( (unsigned int)sub_C7AC4(a3, 0xFFFFFFFFLL, &v34) ) goto LABEL_31; v29 = a3 + 144; if ( *(_QWORD *)(a3 + 144) != a3 + 144 ) return 28; if ( *(_QWORD *)(a3 + 152) != v29 ) return 28; if ( (int)v34 > 32766 ) return 28; v30 = v38; if ( v38 > 32766 ) return 28; v31 = (int *)(a1 + 272); *(_QWORD *)(a3 + 160) = (unsigned int)(v38 << 16) | (unsigned __int64)(unsigned __int16)v34; do { v31 = *(int **)v31; if ( v31 == v14 ) { v31 = (int *)(a1 + 272); goto LABEL_66; } v32 = v31[4] >> 16; } while ( v32 < v30 ); if ( v32 == v30 ) return 28; LABEL_66: v33 = *((_QWORD *)v31 + 1); *(_QWORD *)(a3 + 144) = v31; *(_QWORD *)(a3 + 152) = v33; *((_QWORD *)v31 + 1) = v29; **(_QWORD **)(a3 + 152) = v29; v8 = (*(__int64 (__fastcall **)(__int64))(*(_QWORD *)a1 + 520LL))(a1); if ( !v8 ) { LABEL_31: v17 = ((__int64 (__fastcall *)(__int64, _QWORD, __int64))loc_57858)( *(_QWORD *)(a1 + 8) + 67656LL, (unsigned int)(8 * *(_DWORD *)(a1 + 24) + 8), 184320); if ( v17 ) { v18 = *(int *)(a1 + 24); v19 = v17; v20 = 0; v21 = 0; *(_DWORD *)(a1 + 24) = v18 + 1; v22 = (unsigned int)v38; while ( v20 <= v18 ) { if ( v22 == v20 ) { *(_QWORD *)(v17 + 8 * v22) = a3; } else { v23 = *(_QWORD *)(a1 + 16); if ( v23 ) v24 = (__int64 *)(v23 + 8LL * v21); else v24 = &v37; ++v21; *(_QWORD *)(v17 + 8 * v20) = *v24; } ++v20; } if ( *(_QWORD *)(a1 + 16) ) { ((void (*)(void))loc_577E4)(); LODWORD(v22) = v38; } v25 = *(_DWORD *)(a1 + 24); *(_QWORD *)(a1 + 16) = v19; v26 = v25 - 1; if ( (_DWORD)v22 && (_DWORD)v22 != v26 ) return 0; v27 = (_DWORD)v22 ? 0LL : a3; v28 = (_DWORD)v22 == v26 ? a3 : 0LL; v8 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(*(_QWORD *)a1 + 488LL))(a1, v27, v28); if ( !v8 ) return 0; } else { return 38; } } } } } return v8; }