// // sub_5AD18 from 0x5ad18 to 0x5af2c (532 bytes) // // 1 xrefs: // > sub_59FEC @ 0x5a0a4 // // 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_5AD18(__int64 a1, __int64 a2, char a3) { __int64 v6; // x10 __int64 v7; // x9 unsigned int v13; // w11 __int64 v14; // x11 __int64 v15; // x9 __int64 v16; // x8 unsigned int *v17; // x22 int v18; // w9 unsigned int v19; // w8 __int64 result; // x0 unsigned int *v21; // x8 unsigned int v22; // w9 unsigned int v23; // w8 __int64 v24; // x8 unsigned int *v25; // x8 unsigned int v26; // w9 __int64 v27; // [xsp+8h] [xbp-28h] BYREF if ( (a3 & 1) != 0 ) { v6 = *(_QWORD *)(a1 + 472); *(_QWORD *)(a1 + 496) = 0; *(_DWORD *)(a1 + 24) = 1; *(_QWORD *)(a1 + 16) = 0; *(_QWORD *)(a1 + 40) = 0; v7 = *(_QWORD *)(a1 + 8); if ( (*(_BYTE *)(v6 + 62) & 1) == 0 ) *(_DWORD *)(a1 + 548) = *(_DWORD *)(v7 + 70460); __asm { FMOV V0.2S, #1.0 } v13 = *(_DWORD *)(a1 + 72) & 0xFEEDFFD8; *(_DWORD *)(a1 + 552) = 0; *(_DWORD *)(a1 + 192) = 0; *(_DWORD *)(a1 + 544) = 1065353216; *(_DWORD *)(a1 + 52) = 1065353216; *(_DWORD *)(a1 + 164) = 1065353216; *(_QWORD *)(a1 + 120) = _D0; *(_DWORD *)(a1 + 72) = v13; v14 = *(_QWORD *)(a2 + 120); *(_DWORD *)(a1 + 152) = 0; *(_QWORD *)(a1 + 156) = v14; *(_QWORD *)(a1 + 168) = *(_QWORD *)(a2 + 128); LODWORD(v14) = *(_DWORD *)(a2 + 136); *(_DWORD *)(a1 + 184) = 0; *(_DWORD *)(a1 + 188) = 1065353216; *(_DWORD *)(a1 + 176) = v14; *(_DWORD *)(a1 + 180) = 0; *(_QWORD *)(a1 + 224) = *(_QWORD *)(a2 + 144); LODWORD(v14) = *(_DWORD *)(a2 + 152); *(_QWORD *)(a1 + 240) = _D0; *(_DWORD *)(a1 + 256) = 0; *(_DWORD *)(a1 + 248) = 0; *(_DWORD *)(a1 + 232) = v14; *(_DWORD *)(a1 + 252) = *(_DWORD *)(v7 + 69712); *(_QWORD *)(a1 + 88) = 1065353216; if ( v7 ) { v15 = 0; while ( v15 != 4 ) sub_5C6F0(); } *(_QWORD *)(a1 + 296) = 0; *(_QWORD *)(a1 + 304) = 0; *(_BYTE *)(a1 + 312) = 0; } v16 = *(_QWORD *)(a1 + 472); if ( !v16 ) return 30; *(_QWORD *)(v16 + 40) = a2; *(_QWORD *)(v16 + 48) = 0; v17 = (unsigned int *)(a2 + 88); *(_DWORD *)(v16 + 56) = *(_DWORD *)(a2 + 44); *(_QWORD *)(v16 + 88) = *(_QWORD *)(a2 + 76); *(_DWORD *)(v16 + 84) = *(_DWORD *)(a2 + 84); v18 = *(_DWORD *)(a2 + 68); *(_QWORD *)(v16 + 24) = a1; *(_DWORD *)(v16 + 96) = v18; do v19 = __ldaxr(v17); while ( __stlxr(v19 & 0xFFFFF7FF, v17) ); result = sub_5C500(*(_QWORD *)(a1 + 96)); if ( !(_DWORD)result ) { if ( (a3 & 1) == 0 ) goto LABEL_21; if ( (*(_BYTE *)(*(_QWORD *)(a1 + 472) + 62LL) & 1) != 0 ) { v21 = (unsigned int *)(*(_QWORD *)(a1 + 96) + 100LL); do v22 = __ldaxr(v21); while ( __stlxr(v22 | 0x100, v21) ); } result = sub_5C638(); if ( !(_DWORD)result ) { result = sub_AFE50(*(_QWORD *)(a1 + 112)); if ( !(_DWORD)result ) { result = sub_5C50C(*(_QWORD *)(a1 + 32), 4294967293LL, &v27); if ( !(_DWORD)result ) { result = sub_5C538(v27, *(_QWORD *)(a1 + 96)); if ( !(_DWORD)result ) { LABEL_21: result = (*(__int64 (__fastcall **)(_QWORD))(**(_QWORD **)(a1 + 472) + 40LL))(*(_QWORD *)(a1 + 472)); if ( !(_DWORD)result ) { do v23 = __ldaxr(v17); while ( __stlxr(v23 | 4, v17) ); v24 = *(_QWORD *)(a2 + 184); if ( v24 ) { v25 = (unsigned int *)(v24 + 88); result = 0; do v26 = __ldaxr(v25); while ( __stlxr(v26 | 4, v25) ); } else { return 0; } } } } } } } return result; }