// // sub_180001540 from 0x180001540 to 0x180001906 (966 bytes) // // 2 xrefs: // > sub_180007A70 @ 0x180007ab3 // > @ 0x1801f60cc // // 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_180001540(__int64 a1) { int v1; // r12d unsigned int v3; // r13d int v4; // eax unsigned __int64 v5; // rdi __int64 v6; // rsi int v7; // eax int v8; // r14d __int64 v9; // rax void *v10; // rsp int v11; // edi __int64 v12; // rbx int v13; // edx unsigned int v14; // eax int v15; // eax int i; // ecx int v17; // ebx __int64 v18; // rax unsigned int v19; // r8d int v20; // eax int v21; // edx int v22; // r11d __int64 v23; // rax void *v24; // rsp _BYTE *v25; // rbx int v26; // eax char v27; // al __int64 v28; // rbx int v29; // eax int v30; // ebx int v31; // edi unsigned int v32; // ecx int j; // eax int v34; // r8d int k; // r9d int v36; // eax int v37; // ecx __int64 v38; // rdx int v39; // ecx __int64 v40; // rdx __int64 v41; // rax unsigned int m; // ebx int v43; // eax char v44; // di _BYTE v46[8]; // [rsp+20h] [rbp+0h] BYREF int v47; // [rsp+28h] [rbp+8h] v1 = 0; v3 = 0; if ( (unsigned int)sub_180001340(a1, 24) != 5653314 ) return 0xFFFFFFFFLL; v47 = sub_180001340(a1, 16); v4 = sub_180001340(a1, 24); v5 = v4; if ( v4 == -1 ) return 0xFFFFFFFFLL; v6 = v4; v7 = sub_180001340(a1, 1); if ( v7 ) { if ( v7 != 1 ) return 0xFFFFFFFFLL; v8 = sub_180001340(a1, 5) + 1; v9 = v5 + 15; if ( v5 + 15 < v5 ) v9 = 0xFFFFFFFFFFFFFF0LL; v10 = alloca(v9 & 0xFFFFFFFFFFFFFFF0uLL); v11 = 0; if ( v6 > 0 ) { v12 = 0; do { v13 = 0; v14 = v6 - v11; if ( (_DWORD)v6 != v11 ) { do { ++v13; v14 >>= 1; } while ( v14 ); } v15 = sub_180001340(a1, v13); if ( v15 == -1 ) return 0xFFFFFFFFLL; for ( i = 0; i < v15; ++v11 ) { if ( v12 >= v6 ) break; v46[v12] = v8; ++i; ++v12; } LOBYTE(v8) = v8 + 1; } while ( v12 < v6 ); } v3 = v6; LODWORD(v5) = v6; } else { v23 = v5 + 15; if ( v5 + 15 <= v5 ) v23 = 0xFFFFFFFFFFFFFF0LL; v24 = alloca(v23 & 0xFFFFFFFFFFFFFFF0uLL); if ( (unsigned int)sub_180001340(a1, 1) ) { if ( (int)v5 > 0 ) { v25 = v46; do { if ( (unsigned int)sub_180001340(a1, 1) ) { v26 = sub_180001340(a1, 5); if ( v26 == -1 ) return 0xFFFFFFFFLL; ++v3; v27 = v26 + 1; } else { v27 = 0; } *v25++ = v27; } while ( v25 - v46 < (__int64)v5 ); } } else { v3 = v5; if ( (int)v5 > 0 ) { v28 = 0; do { v29 = sub_180001340(a1, 5); if ( v29 == -1 ) return 0xFFFFFFFFLL; v46[v28] = v29 + 1; } while ( ++v28 < (__int64)v5 ); } } } v17 = sub_180001340(a1, 4); if ( v17 <= 0 ) { v22 = 0; } else { v18 = (__int64)(*(_DWORD *)(a1 + 16) + 32) >> 3; v19 = ((*(_BYTE *)(a1 + 16) + 32) & 7) + 32; *(_DWORD *)(a1 + 16) = (((*(_BYTE *)(a1 + 16) + 32) & 7) + 32) & 7; *(_QWORD *)a1 += v18 + ((unsigned __int64)v19 >> 3); v20 = sub_180001340(a1, 4); v21 = *(_DWORD *)(a1 + 16) + 1; v22 = v20 + 1; *(_DWORD *)(a1 + 16) = (*(_BYTE *)(a1 + 16) + 1) & 7; *(_QWORD *)a1 += (__int64)v21 >> 3; } if ( v17 ) { v30 = v17 - 1; if ( v30 ) { if ( v30 != 1 ) goto LABEL_55; v31 = v47 * v5; } else { v32 = v5; for ( j = 0; v32; v32 >>= 1 ) ++j; v34 = (int)v5 >> ((v47 - 1) * (j - 1) / v47); for ( k = v34 + 1; ; ++k ) { while ( 1 ) { v36 = 1; v37 = 1; if ( v47 > 0 ) { v38 = (unsigned int)v47; do { v36 *= v34; v37 *= k; --v38; } while ( v38 ); } if ( v36 <= (int)v5 ) break; --k; --v34; } if ( v37 > (int)v5 ) break; ++v34; } v31 = v34; } if ( v31 > 0 ) { v39 = *(_DWORD *)(a1 + 16); v40 = (unsigned int)v31; do { v41 = (__int64)(v39 + v22) >> 3; v39 = ((_BYTE)v39 + (_BYTE)v22) & 7; *(_QWORD *)a1 += v41; --v40; } while ( v40 ); *(_DWORD *)(a1 + 16) = v39; } } LABEL_55: for ( m = (((((4 * v3 + 19) & 0xFFFFFFF0) + 2 * v3 + 15) & 0xFFFFFFF0) + v3 + 16) & 0xFFFFFFF0; v3; v3 >>= 1 ) ++v1; v43 = 5 * v1 / 4; if ( v43 >= 5 ) { v44 = 5 * v1 / 4; if ( v43 > 8 ) v44 = 8; } else { v44 = 5; } if ( !(unsigned int)sub_180001310((_QWORD *)a1) ) return m + (2 << v44); return 0xFFFFFFFFLL; }