// // sub_1800189D0 from 0x1800189d0 to 0x180018c07 (567 bytes) // // 5 xrefs: // > sub_180017930 @ 0x18001794d // > @ 0x18002f370 // > @ 0x18002f380 // > @ 0x18002f398 // > @ 0x18004ab54 // // 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 // void __fastcall sub_1800189D0(__int64 a1, _BYTE *a2, const void *a3, size_t a4) { _BYTE *v4; // r15 _BYTE *v6; // r13 __int64 v8; // rcx size_t v11; // rsi signed __int64 v12; // r12 unsigned __int64 v13; // rcx unsigned __int64 v14; // rdx size_t v15; // rcx void *v16; // rax char *v17; // rdi size_t v18; // r8 const void *v19; // rdx char *v20; // rcx _BYTE *v21; // rcx signed __int64 v22; // rsi char *v23; // rdi size_t v25; // [rsp+88h] [rbp+20h] if ( a4 ) { v4 = *(_BYTE **)(a1 + 8); v6 = *(_BYTE **)a1; v8 = *(_QWORD *)(a1 + 16); if ( a4 > v8 - (__int64)v4 ) { v11 = 0x7FFFFFFFFFFFFFFFLL; v12 = v4 - v6; if ( a4 > 0x7FFFFFFFFFFFFFFFLL - (v4 - v6) ) sub_180003530(); v13 = v8 - (_QWORD)v6; v25 = v12 + a4; v14 = v13 >> 1; if ( v13 <= 0x7FFFFFFFFFFFFFFFLL - (v13 >> 1) ) { v11 = v12 + a4; if ( v14 + v13 >= v12 + a4 ) v11 = v14 + v13; if ( v11 < 0x1000 ) { if ( v11 ) v17 = (char *)operator new(v11); else v17 = nullptr; goto LABEL_16; } v15 = v11 + 39; if ( v11 + 39 < v11 ) Concurrency::cancel_current_task(); } else { v15 = 0x8000000000000026uLL; } v16 = operator new(v15); if ( !v16 ) goto LABEL_26; v17 = (char *)(((unsigned __int64)v16 + 39) & 0xFFFFFFFFFFFFFFE0uLL); *((_QWORD *)v17 - 1) = v16; LABEL_16: memmove(&v17[a2 - v6], a3, a4); if ( a4 == 1 && a2 == v4 ) { v18 = v4 - v6; v19 = v6; v20 = v17; } else { memmove(v17, v6, a2 - v6); v20 = &v17[a2 - v6 + a4]; v18 = v4 - a2; v19 = a2; } memmove(v20, v19, v18); v21 = *(_BYTE **)a1; if ( !*(_QWORD *)a1 ) goto LABEL_25; if ( *(_QWORD *)(a1 + 16) - (_QWORD)v21 < 0x1000u ) { LABEL_24: j_j_free(v21); LABEL_25: *(_QWORD *)a1 = v17; *(_QWORD *)(a1 + 8) = &v17[v25]; *(_QWORD *)(a1 + 16) = &v17[v11]; return; } if ( (unsigned __int64)&v21[-*((_QWORD *)v21 - 1) - 8] <= 0x1F ) { v21 = *((_BYTE **)v21 - 1); goto LABEL_24; } LABEL_26: invalid_parameter_noinfo_noreturn(); } v22 = v4 - a2; if ( a4 >= v4 - a2 ) { v23 = &a2[a4]; memmove(&a2[a4], a2, v4 - a2); *(_QWORD *)(a1 + 8) = &v23[v22]; } else { memmove(v4, &v4[-a4], a4); *(_QWORD *)(a1 + 8) = &v4[a4]; memmove(&v4[-(v22 - a4)], a2, v22 - a4); } memmove(a2, a3, a4); } }