// // sub_5417C from 0x5417c to 0x544cc (848 bytes) // // 1 xrefs: // > @ 0x10c348 // // 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_5417C(__int64 a1) { __int64 v1; // x8 __int64 v3; // x20 __int64 v4; // x24 unsigned int v6; // w8 unsigned int *v7; // x8 unsigned int v8; // w9 unsigned int v9; // w21 unsigned int *v10; // x23 unsigned int v11; // w8 __int64 v12; // x0 unsigned int v13; // w0 unsigned int v14; // w8 __int64 v16; // x0 char v17; // w8 unsigned int v18; // w8 unsigned int v19; // w9 unsigned int v20; // w22 __int64 v21; // x0 unsigned int v22; // w8 unsigned int v23; // w8 unsigned int v24; // w9 bool v25; // cf unsigned int v26; // w8 __int64 v27; // x0 unsigned int v28; // w8 unsigned int v29; // w9 unsigned int v30; // w8 int v31; // w21 __int64 v32; // x0 unsigned int v33; // w8 int v34; // w9 unsigned int v35; // w10 int v36; // w11 int v37; // w22 unsigned int v38; // w13 unsigned int v39; // w10 int v40; // w11 unsigned int v41; // w9 char v42; // w8 int v43; // w8 __int64 v44; // x0 __int64 v45; // x0 __int64 v46; // x8 unsigned int v47; // w8 _BYTE v48[4]; // [xsp+4h] [xbp-4Ch] BYREF __int64 v49; // [xsp+8h] [xbp-48h] BYREF int v50; // [xsp+10h] [xbp-40h] char v51; // [xsp+14h] [xbp-3Ch] __int64 v52; // [xsp+18h] [xbp-38h] BYREF v1 = *(_QWORD *)(a1 + 8); v51 = 0; v50 = 8; v49 = v1; v52 = 0; sub_520A0((__int64)&v49); v3 = *(_QWORD *)(a1 + 40); if ( !v3 ) goto LABEL_17; v4 = *(_QWORD *)(v3 + 384); if ( atomic_load((unsigned int *)(v3 + 272)) ) { v6 = atomic_load((unsigned int *)(v3 + 272)); if ( v6 == 7 ) { v7 = (unsigned int *)(v3 + 88); do v8 = __ldaxr(v7); while ( __stlxr(v8 | 0x400, v7) ); } v9 = 46; goto LABEL_18; } v10 = (unsigned int *)(v3 + 88); do v11 = __ldaxr(v10); while ( __stlxr(v11 & 0xFFFFFBFF, v10) ); if ( (*(_BYTE *)(a1 + 60) & 0x80) != 0 ) { LABEL_17: v9 = 0; goto LABEL_18; } v12 = *(_QWORD *)(a1 + 192); if ( v12 ) { v13 = (*(__int64 (__fastcall **)(__int64, _BYTE *, _QWORD))(*(_QWORD *)v12 + 184LL))(v12, v48, 0); if ( v13 ) { v9 = v13; goto LABEL_18; } if ( !v48[0] ) ((void (*)(void))sub_54D20)(); } if ( *(_BYTE *)(a1 + 136) ) { do v14 = __ldaxr(v10); while ( __stlxr(v14 | 8, v10) ); goto LABEL_17; } v16 = *(_QWORD *)(a1 + 192); if ( !v16 || (v9 = (*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v16 + 72LL))(v16)) == 0 && (v9 = (*(__int64 (__fastcall **)(_QWORD, __int64 *))(**(_QWORD **)(a1 + 192) + 136LL))( *(_QWORD *)(a1 + 192), &v52)) == 0 ) { while ( 1 ) { v27 = ((__int64 (*)(void))sub_54D10)(); v28 = *(_DWORD *)(a1 + 156); v29 = *(_DWORD *)(a1 + 160); if ( v28 <= v29 ) { if ( !v28 || (v25 = v29 >= v28, v30 = v29 - v28, v30 == 0 || !v25) || v30 < *(_DWORD *)(v3 + 396) ) { LABEL_43: v31 = HIDWORD(v52) - *(_DWORD *)(a1 + 148); if ( v31 < 0 ) v31 += *(_DWORD *)(v4 + 80); v32 = sub_54D18(v27); v34 = *(_DWORD *)(a1 + 88); v33 = *(_DWORD *)(a1 + 92); v35 = *(_DWORD *)(v3 + 68); if ( v35 < v33 + v34 ) { v33 = v35 - v34; *(_DWORD *)(a1 + 92) = v35 - v34; } v36 = *(_DWORD *)(a1 + 56); v37 = v31 & ~(v31 >> 31); if ( (v36 & 2) != 0 && *(_DWORD *)(a1 + 84) ) v35 = v33 + v34; v38 = v35 - 1; v39 = *(_DWORD *)(a1 + 76) + v37; *(_DWORD *)(a1 + 76) = v39; if ( v39 > v38 ) { if ( (v36 & 2) != 0 && (v40 = *(_DWORD *)(a1 + 84)) != 0 ) { v41 = (v39 - v34) / v33; if ( v40 >= 1 ) { if ( v41 >= v40 ) v41 = *(_DWORD *)(a1 + 84); *(_DWORD *)(a1 + 84) = v40 - v41; } *(_DWORD *)(a1 + 76) = v39 - v41 * v33; } else if ( *(_DWORD *)(v3 + 68) == -1 ) { *(_QWORD *)(a1 + 72) = 0; } else { v42 = atomic_load(v10); if ( (v42 & 8) != 0 ) { v43 = *(_DWORD *)(v3 + 68); v44 = *(_QWORD *)(a1 + 192); *(_DWORD *)(a1 + 72) = 0; *(_DWORD *)(a1 + 76) = v43; if ( v44 ) v44 = sub_54CA8(); v32 = sub_54D20(v44); } } } sub_54D10(v32); v9 = 0; *(_DWORD *)(a1 + 156) += v37; *(_QWORD *)(a1 + 144) = v52; goto LABEL_18; } } else if ( v28 - v29 < *(_DWORD *)(v3 + 396) ) { goto LABEL_43; } v27 = sub_54D18(v27); if ( (*(_BYTE *)(a1 + 60) & 0x80) != 0 ) goto LABEL_43; v17 = atomic_load(v10); if ( v17 < 0 ) goto LABEL_43; v18 = *(_DWORD *)(a1 + 152); v19 = *(_DWORD *)(v4 + 68); if ( v19 >= v18 ) v20 = v18 + *(_DWORD *)(v3 + 396) <= v19 ? *(_DWORD *)(v3 + 396) : v19 - v18; else v20 = 0; ((void (*)(void))sub_54D10)(); v21 = sub_66A00(v3, *(unsigned int *)(a1 + 152), v20, 0); v9 = v21; sub_54D18(v21); if ( (v9 & 0xFFFFFFEF) != 0 ) break; do v22 = __ldaxr(v10); while ( __stlxr(v22 | 0x10, v10) ); v23 = *(_DWORD *)(a1 + 152) + v20; *(_DWORD *)(a1 + 152) = v23; v24 = *(_DWORD *)(v4 + 68); v25 = v23 >= v24; v26 = v23 - v24; if ( v25 ) *(_DWORD *)(a1 + 152) = v26; *(_DWORD *)(a1 + 160) += v20; } v45 = *(_QWORD *)(a1 + 192); if ( v45 ) v45 = sub_54CA8(); atomic_store(2u, (unsigned int *)(v3 + 272)); v46 = *(_QWORD *)(v3 + 264); if ( v46 ) *(_DWORD *)(v46 + 292) = v9; sub_54D20(v45); do v47 = __ldaxr(v10); while ( __stlxr(v47 | 8, v10) ); } LABEL_18: sub_51F94((__int64)&v49); return v9; }