// // sub_56824 from 0x56824 to 0x56b28 (772 bytes) // // 2 xrefs: // > sub_59214 @ 0x59228 // > @ 0x10c738 // // 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_56824(__int64 a1, __int64 a2) { __int64 v2; // x8 __int64 v4; // x21 unsigned int *v6; // x24 char v7; // w8 unsigned int v8; // w23 __int64 j; // x20 int v10; // w8 __int64 v11; // x0 int v12; // w20 int i; // w22 __int64 v14; // x8 unsigned int v15; // w8 _QWORD *v16; // x22 __int64 v17; // t1 _QWORD *v18; // x9 _QWORD *v19; // x9 __int64 v20; // x10 int v21; // w8 __int64 v22; // x21 __int64 v23; // x8 int v24; // w10 __int64 v25; // x9 __int64 v26; // x11 __int64 v28; // [xsp+8h] [xbp-58h] BYREF int v29; // [xsp+10h] [xbp-50h] char v30; // [xsp+14h] [xbp-4Ch] __int128 v31; // [xsp+18h] [xbp-48h] BYREF int v32; // [xsp+2Ch] [xbp-34h] v2 = *(_QWORD *)(a1 + 96); if ( !v2 ) return 9; if ( v2 == *(_QWORD *)(a1 + 104) ) return 0; v4 = *(_QWORD *)(a1 + 112); if ( !a2 ) { v11 = sub_579A8(); if ( (_DWORD)v11 ) return (unsigned int)v11; v12 = 0; for ( i = 0; i < SDWORD2(v31); ++i ) { v11 = sub_57924(); if ( (_DWORD)v11 ) return (unsigned int)v11; if ( v28 == v4 ) ++v12; else v11 = (*(__int64 (__fastcall **)(__int64))(*(_QWORD *)a1 + 280LL))(a1); } LABEL_52: LODWORD(v11) = ((__int64 (__fastcall *)(__int64))loc_57870)(v11); return (unsigned int)v11; } v31 = 0u; v6 = (unsigned int *)(a2 + 100); v7 = atomic_load((unsigned int *)(a2 + 100)); if ( (v7 & 0x20) != 0 ) return 10; v8 = sub_579A8(); if ( !v8 ) { for ( j = 0; ; ++j ) { v10 = v32; if ( (int)j >= v32 ) break; v28 = 0; LODWORD(v11) = sub_57924(); if ( (_DWORD)v11 ) return (unsigned int)v11; if ( v28 == a2 ) { v10 = v32; break; } } if ( (int)j < v10 ) { if ( (_DWORD)j ) { if ( (_DWORD)j - v10 == -1 ) (*(void (__fastcall **)(__int64, _QWORD, __int128 *))(*(_QWORD *)a1 + 288LL))( a1, (unsigned int)(v10 - 2), &v31); } else { sub_5793C(a1, 1, (char *)&v31 + 8); } v14 = *(_QWORD *)(a1 + 8); v30 = 0; v28 = v14; v29 = 1; sub_520A0((__int64)&v28); do v15 = __ldaxr(v6); while ( __stlxr(v15 & 0xFFFFFFBF, v6) ); *(_QWORD *)(a2 + 512) = 0; v8 = sub_C7D1C(a2, 0, 0); if ( v8 || (v8 = sub_CBBD4(a2, a2, 0)) != 0 || *((_QWORD *)&v31 + 1) && (v8 = sub_579A0(v4, *((_QWORD *)&v31 + 1) + 8LL)) != 0 ) { sub_51F94((__int64)&v28); } else { v11 = sub_51F94((__int64)&v28); v17 = *(_QWORD *)(a2 + 144); v16 = (_QWORD *)(a2 + 144); v18 = (_QWORD *)v16[1]; *v18 = v17; *(_QWORD *)(*v16 + 8LL) = v18; v19 = (_QWORD *)(a1 + 272); *v16 = v16; v16[1] = v16; while ( 1 ) { v19 = (_QWORD *)*v19; if ( v19 == (_QWORD *)(a1 + 272) ) break; v20 = v19[2]; if ( (int)j < (int)v20 >> 16 ) v19[2] = v20 & 0xFFFFFFFF0000FFFFLL | ((unsigned __int64)((unsigned int)(v20 - 0x10000) >> 16) << 16); } v21 = *(_DWORD *)(a1 + 24); if ( v21 < 3 ) { v22 = 0; } else { v11 = ((__int64 (__fastcall *)(__int64, _QWORD, __int64))loc_57858)( *(_QWORD *)(a1 + 8) + 67656LL, (unsigned int)(8 * v21 - 8), 184320); if ( !v11 ) return 38; v22 = v11; v23 = 0; v24 = 0; v25 = *(int *)(a1 + 24) - 1LL; while ( v23 < v25 ) { if ( !j ) ++v24; --j; v26 = *(_QWORD *)(*(_QWORD *)(a1 + 16) + 8LL * v24++); *(_QWORD *)(v11 + 8 * v23++) = v26; } } if ( *(_QWORD *)(a1 + 16) ) v11 = ((__int64 (__fastcall *)(__int64))loc_577E4)(v11); *(_QWORD *)(a1 + 16) = v22; if ( v31 == 0 || (v11 = sub_5794C(v11), (v8 = v11) == 0) ) { --*(_DWORD *)(a1 + 24); goto LABEL_52; } } return v8; } return 9; } return v8; }