// // sub_180006640 from 0x180006640 to 0x180006a3e (1022 bytes) // // 2 xrefs: // > sub_180007790 @ 0x1800078bf // > @ 0x1801f6330 // // 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_180006640(__int64 a1, _QWORD *a2) { __int64 v2; // r12 unsigned int v4; // edi int v5; // ebx __int64 v6; // rsi unsigned int v7; // eax int v8; // ebp int v9; // edi int v10; // r13d int v11; // ebp __int64 v12; // r14 int v13; // edi __int64 v14; // rbx int v15; // eax int v16; // eax int v17; // ecx int v18; // r13d __int64 v19; // r9 char *v20; // r8 __int64 v21; // rcx __int64 v22; // rax bool v23; // cc int v24; // edi int v25; // r12d __int64 v26; // rbx __int64 v27; // rbp __int64 v28; // rdi int v29; // r14d unsigned __int16 v30; // ax int v32; // eax int v33; // edx int i; // ebp unsigned __int16 *v35; // rdx char v36; // bl int v37; // r8d __int64 v38; // r14 char v39; // di int v40; // ecx int v41; // r9d unsigned int j; // r10d unsigned int v43; // eax int v44; // [rsp+50h] [rbp+8h] v2 = *(_QWORD *)(a1 + 32); v4 = 0; v5 = -1; v6 = sub_180018290(1, 64); v7 = sub_180001340((__int64)a2, 5); *(_DWORD *)(v6 + 48) = v7; v8 = 0; *(_QWORD *)(v6 + 8) = sub_1800182F0(v7); if ( *(int *)(v6 + 48) <= 0 ) { *(_QWORD *)v6 = sub_1800182F0(0); } else { do { v9 = v5; *(_BYTE *)(v8 + *(_QWORD *)(v6 + 8)) = sub_180001340((__int64)a2, 4); v5 = *(char *)(v8 + *(_QWORD *)(v6 + 8)); if ( v9 >= v5 ) v5 = v9; ++v8; } while ( v8 < *(_DWORD *)(v6 + 48) ); v10 = v5 + 1; *(_QWORD *)v6 = sub_1800182F0((unsigned int)(11 * (v5 + 1))); v11 = 0; if ( v5 + 1 > 0 ) { while ( 1 ) { v12 = 11LL * v11; *(_BYTE *)(v12 + *(_QWORD *)v6) = sub_180001340((__int64)a2, 3) + 1; *(_BYTE *)(v12 + *(_QWORD *)v6 + 1) = sub_180001340((__int64)a2, 2); if ( (int)sub_180001310(a2) < 0 ) return 0; if ( *(_BYTE *)(*(_QWORD *)v6 + v12 + 1) ) *(_BYTE *)(v12 + *(_QWORD *)v6 + 2) = sub_180001340((__int64)a2, 8); else *(_BYTE *)(*(_QWORD *)v6 + v12 + 2) = 0; if ( *(unsigned __int8 *)(*(_QWORD *)v6 + v12 + 2) >= *(int *)(v2 + 24) ) return 0; v13 = 0; if ( 1 << *(_BYTE *)(*(_QWORD *)v6 + v12 + 1) > 0 ) { v14 = 11LL * v11; do { *(_BYTE *)(*(_QWORD *)v6 + v14 + 3) = sub_180001340((__int64)a2, 8) - 1; v15 = *(unsigned __int8 *)(*(_QWORD *)v6 + v14 + 3); if ( v15 >= *(_DWORD *)(v2 + 24) && (_BYTE)v15 != 0xFF ) return 0; ++v13; ++v14; } while ( v13 < 1 << *(_BYTE *)(v12 + *(_QWORD *)v6 + 1) ); } if ( ++v11 >= v10 ) { v4 = 0; goto LABEL_20; } } } v4 = 0; } LABEL_20: *(_DWORD *)(v6 + 56) = sub_180001340((__int64)a2, 2) + 1; v16 = sub_180001340((__int64)a2, 4); v17 = *(_DWORD *)(v6 + 48); v18 = v16; if ( v17 > 0 ) { v19 = (unsigned int)v17; v20 = *(char **)(v6 + 8); do { v21 = *v20++; v4 += *(char *)(11 * v21 + *(_QWORD *)v6); --v19; } while ( v19 ); } *(_QWORD *)(v6 + 16) = sub_1800182F0(2 * (v4 + 2)); *(_QWORD *)(v6 + 24) = sub_1800182F0(v4 + 2); *(_QWORD *)(v6 + 40) = sub_1800182F0(v4); v22 = sub_1800182F0(v4); v23 = *(_DWORD *)(v6 + 48) <= 0; v24 = 0; *(_QWORD *)(v6 + 32) = v22; v25 = 0; if ( !v23 ) { v26 = 0; while ( 1 ) { v24 += *(char *)(11LL * *(char *)(v25 + *(_QWORD *)(v6 + 8)) + *(_QWORD *)v6); v27 = v24; v44 = v24; if ( v26 < v24 ) break; LABEL_30: if ( ++v25 >= *(_DWORD *)(v6 + 48) ) goto LABEL_31; } v28 = 2 * v26 + 4; v29 = __ROL4__(1, v18); while ( 1 ) { v30 = sub_180001340((__int64)a2, v18); *(_WORD *)(v28 + *(_QWORD *)(v6 + 16)) = v30; if ( v30 >= v29 ) return 0; ++v26; v28 += 2; if ( v26 >= v27 ) { v24 = v44; goto LABEL_30; } } } LABEL_31: if ( (unsigned int)sub_180001310(a2) ) return 0; **(_WORD **)(v6 + 16) = 0; *(_WORD *)(*(_QWORD *)(v6 + 16) + 2LL) = 1 << v18; LOWORD(v32) = v24 + 2; *(_DWORD *)(v6 + 52) = v24 + 2; v33 = 0; if ( v24 + 2 > 0 ) { do { *(_BYTE *)(v33 + *(_QWORD *)(v6 + 24)) = v33; ++v33; v32 = *(_DWORD *)(v6 + 52); } while ( v33 < v32 ); } sub_180006ED0(*(_QWORD *)(v6 + 24), *(_QWORD *)(v6 + 16), (unsigned __int16)v32); for ( i = 0; i < *(_DWORD *)(v6 + 52) - 2; *(_BYTE *)(v38 + *(_QWORD *)(v6 + 32)) = v39 ) { v35 = *(unsigned __int16 **)(v6 + 16); v36 = 0; v37 = 0; v38 = i; v39 = 1; v40 = 0; v41 = v35[1]; for ( j = v35[i + 2]; v40 < i + 2; ++v35 ) { v43 = *v35; if ( (int)v43 > v37 && v43 < j ) { v36 = v40; v37 = *v35; } if ( (int)v43 < v41 && v43 > j ) { v39 = v40; v41 = *v35; } ++v40; } ++i; *(_BYTE *)(v38 + *(_QWORD *)(v6 + 40)) = v36; } return v6; }