// // sub_180003160 from 0x180003160 to 0x18000331d (445 bytes) // // 2 xrefs: // > sub_180003320 @ 0x1800034fb // > @ 0x1800491bc // // 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 // char *__fastcall sub_180003160(__int64 *a1, __int64 a2, __int64 a3) { __int64 v5; // r12 __int64 v6; // r15 unsigned __int64 v7; // r15 unsigned __int64 v8; // rcx unsigned __int64 v9; // rdx unsigned __int64 v10; // r14 unsigned __int64 v11; // rsi void *v12; // rax _OWORD *v13; // rbx char *v14; // r14 __int64 v15; // rdx __int64 v16; // rcx _OWORD *v17; // r8 void *v18; // rcx __int64 v20; // rcx char *v21; // [rsp+70h] [rbp+8h] unsigned __int64 v22; // [rsp+78h] [rbp+10h] __int64 v23; // [rsp+80h] [rbp+18h] v23 = a3; v5 = a2 - *a1; v6 = (a1[1] - *a1) >> 5; if ( v6 == 0x7FFFFFFFFFFFFFFLL ) sub_180003530(); v7 = v6 + 1; v8 = (a1[2] - *a1) >> 5; v9 = v8 >> 1; if ( v8 > 0x7FFFFFFFFFFFFFFLL - (v8 >> 1) ) goto LABEL_25; v10 = v7; if ( v9 + v8 >= v7 ) v10 = v9 + v8; if ( v10 > 0x7FFFFFFFFFFFFFFLL ) goto LABEL_25; v11 = 32 * v10; v22 = v10; if ( 32 * v10 < 0x1000 ) { if ( v11 ) { v13 = operator new(32 * v10); a3 = v23; } else { v13 = nullptr; } v22 = v10; goto LABEL_14; } if ( v11 + 39 < v11 ) LABEL_25: Concurrency::cancel_current_task(); v12 = operator new(v11 + 39); if ( !v12 ) goto LABEL_24; v13 = (_OWORD *)(((unsigned __int64)v12 + 39) & 0xFFFFFFFFFFFFFFE0uLL); *((_QWORD *)v13 - 1) = v12; a3 = v23; LABEL_14: v14 = (char *)v13 + (v5 & 0xFFFFFFFFFFFFFFE0uLL); try { sub_180003F50(v14, a3); v21 = (char *)v13 + (v5 & 0xFFFFFFFFFFFFFFE0uLL); v15 = a1[1]; v16 = *a1; v17 = v13; if ( a2 != v15 ) { sub_1800030E0(v16, a2, v13); v21 = (char *)v13; v17 = v14 + 32; v15 = a1[1]; v16 = a2; } sub_1800030E0(v16, v15, v17); } catch ( ... ) { sub_1800036B0(v21, v14 + 32); sub_1800035E0(v20, v13, v22); throw; } if ( *a1 ) { sub_1800036B0(*a1, a1[1]); v18 = (void *)*a1; if ( ((a1[2] - *a1) & 0xFFFFFFFFFFFFFFE0uLL) < 0x1000 ) { LABEL_22: j_j_free(v18); goto LABEL_23; } if ( (unsigned __int64)v18 - *((_QWORD *)v18 - 1) - 8 <= 0x1F ) { v18 = *((void **)v18 - 1); goto LABEL_22; } LABEL_24: invalid_parameter_noinfo_noreturn(); } LABEL_23: *a1 = (__int64)v13; a1[1] = (__int64)&v13[2 * v7]; a1[2] = (__int64)&v13[v11 / 0x10]; return (char *)v13 + (v5 & 0xFFFFFFFFFFFFFFE0uLL); }