// // sub_180001E90 from 0x180001e90 to 0x1800024c0 (1584 bytes) // // 2 xrefs: // > sub_180001A10 @ 0x180001e4e // > @ 0x1801f60e4 // // 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_180001E90(_BYTE *a1, int a2, __int64 a3, __int64 a4) { __int64 v5; // r9 _BYTE *v7; // r13 unsigned __int64 v8; // rdx unsigned __int64 v9; // rdx void *v10; // rsp void *v11; // rsp int v12; // eax int v13; // edx int v14; // r8d unsigned __int64 v15; // rcx __int64 v16; // rax void *v17; // rsp unsigned int v19; // edi int v20; // r10d __int64 v21; // r9 unsigned int *v22; // r8 unsigned int v23; // ecx unsigned int v24; // edx unsigned int v25; // ecx unsigned int v26; // edx int v27; // ecx unsigned __int64 v28; // rax __int64 v29; // rdx void *v30; // rsp void *v31; // rsp int v32; // edx int *p_Base; // rsi __int64 v34; // rax signed int v35; // ecx signed int v36; // r8d __int64 v37; // rax __int64 v38; // rcx __int64 v39; // rdx __int64 v40; // rax int v41; // r11d _BYTE *v42; // r12 __int64 *v43; // r13 __int64 v44; // rsi int v45; // eax int v46; // r8d __int16 v47; // r9 int v48; // ecx __int64 v49; // r10 int v50; // eax __int16 v51; // dx __int64 v52; // rcx __int64 v53; // rax int v54; // edx __int64 *v55; // r8 __int64 v56; // rcx __int64 v57; // rax int v58; // edx char v59; // r8 __int64 v60; // rcx unsigned int v61; // ecx int v62; // eax int v63; // eax int v64; // r15d void *v65; // rax int v66; // ecx int v67; // r11d int v68; // r10d int v69; // r14d int v70; // r8d unsigned int v71; // ecx unsigned int v72; // ecx unsigned int v73; // ecx unsigned int v74; // eax int v75; // r11d __int64 v76; // r9 unsigned int v77; // ecx unsigned int v78; // edx unsigned int v79; // ecx _WORD *v80; // rsi signed int v81; // r8d signed int v82; // ecx _DWORD *v83; // rdx __int16 v84; // ax int v85; // r8d __int64 v86; // rdx __int64 Base; // [rsp+20h] [rbp+0h] BYREF int *v88; // [rsp+28h] [rbp+8h] _BYTE *v89; // [rsp+30h] [rbp+10h] Base = a3; v5 = *(__int16 *)(a4 + 98); v89 = a1; v7 = a1; if ( (__int16)v5 > 0 ) { v8 = 4 * v5 + 15; if ( v8 <= 4 * v5 ) v8 = 0xFFFFFFFFFFFFFF0LL; v9 = v8 & 0xFFFFFFFFFFFFFFF0uLL; v10 = alloca(v9); v11 = alloca(v9); v12 = sub_180002550(&Base, a1, (unsigned int)*(__int16 *)(a4 + 96)); LOWORD(v13) = *(_WORD *)(a4 + 98); v14 = v12; v15 = 8LL * (__int16)v13; v16 = v15 + 15; if ( v15 + 15 < v15 ) v16 = 0xFFFFFFFFFFFFFF0LL; v17 = alloca(v16 & 0xFFFFFFFFFFFFFFF0uLL); if ( v14 < 0 ) return 0xFFFFFFFFLL; v19 = 0; v20 = 0; if ( (__int16)v13 > 0 ) { do { v21 = v20++; v22 = (unsigned int *)&Base + v21; v23 = __ROL4__(*v22, 16); v24 = (v23 << 8) ^ ((v23 << 8) ^ (v23 >> 8)) & 0xFF00FF; v25 = (16 * v24) ^ ((16 * v24) ^ (v24 >> 4)) & 0xF0F0F0F; v26 = (4 * v25) ^ ((4 * v25) ^ (v25 >> 2)) & 0x33333333; *v22 = (2 * v26) ^ ((2 * v26) ^ (v26 >> 1)) & 0x55555555; *(&Base + v21) = (__int64)v22; v13 = *(__int16 *)(a4 + 98); } while ( v20 < v13 ); } qsort(&Base, (__int16)v13, 8u, CompareFunction); LOWORD(v27) = *(_WORD *)(a4 + 98); v28 = 4LL * (__int16)v27; v29 = v28 + 15; if ( v28 + 15 < v28 ) v29 = 0xFFFFFFFFFFFFFF0LL; v30 = alloca(v29 & 0xFFFFFFFFFFFFFFF0uLL); v31 = alloca(v29 & 0xFFFFFFFFFFFFFFF0uLL); v32 = 0; p_Base = (int *)&Base; v88 = (int *)&Base; if ( (__int16)v27 > 0 ) { do { *((_DWORD *)&Base + (int)((*(&Base + v32) - (__int64)&Base) >> 2)) = v32; ++v32; v27 = *(__int16 *)(a4 + 98); } while ( v32 < v27 ); } v34 = sub_180018340(16, (unsigned int)(4 * (__int16)v27 + 4)); LOWORD(v35) = *(_WORD *)(a4 + 98); v36 = 0; *(_QWORD *)(a4 + 64) = v34; if ( (__int16)v35 > 0 ) { do { v37 = v36++; *(_DWORD *)(*(_QWORD *)(a4 + 64) + 4LL * *((int *)&Base + v37)) = *((_DWORD *)&Base + v37); v35 = *(__int16 *)(a4 + 98); } while ( v36 < v35 ); } if ( v36 < (int)(((__int16)v35 + 4) & 0xFFFFFFFC) ) { do { v38 = v36++; *(_DWORD *)(*(_QWORD *)(a4 + 64) + 4 * v38) = -1; v35 = *(__int16 *)(a4 + 98); } while ( v36 < (int)((v35 + 4) & 0xFFFFFFFC) ); } v39 = (unsigned int)(2 * (__int16)v35); if ( *(_BYTE *)(a4 + 101) ) { v40 = sub_180018340(16, v39); v41 = 0; *(_QWORD *)(a4 + 72) = v40; if ( *(__int16 *)(a4 + 96) > 0 ) { v42 = v7; v43 = &Base; v44 = Base; do { if ( *v42 ) { v45 = *(char *)(a4 + 100); v46 = 1; v47 = 0; if ( v45 > 0 ) { v48 = 0; v49 = (unsigned int)v45; do { v50 = v41 / v46; v46 *= a2; v51 = *(_WORD *)(v44 + 2LL * (v50 % a2)) << v48; v48 += *(char *)(a4 + 102); v47 |= v51; --v49; } while ( v49 ); } v52 = *(int *)v43; v43 = (__int64 *)((char *)v43 + 4); *(_WORD *)(*(_QWORD *)(a4 + 72) + 2 * v52) = v47; } ++v41; ++v42; } while ( v41 < *(__int16 *)(a4 + 96) ); p_Base = v88; v7 = v89; } } else { v53 = sub_180018340(16, v39); v54 = 0; *(_QWORD *)(a4 + 80) = v53; if ( *(__int16 *)(a4 + 96) > 0 ) { v55 = &Base; do { if ( (char)v7[v54] > 0 ) { v56 = *(int *)v55; v55 = (__int64 *)((char *)v55 + 4); *(_WORD *)(*(_QWORD *)(a4 + 80) + 2 * v56) = v54; } ++v54; } while ( v54 < *(__int16 *)(a4 + 96) ); } } v57 = sub_180018340(16, (unsigned int)(*(__int16 *)(a4 + 98) + 1)); v58 = 0; for ( *(_QWORD *)(a4 + 56) = v57; v58 < *(__int16 *)(a4 + 96); ++v58 ) { v59 = v7[v58]; if ( v59 > 0 ) { v60 = *p_Base++; *(_BYTE *)(v60 + *(_QWORD *)(a4 + 56)) = v59; } } v61 = *(__int16 *)(a4 + 98); v62 = 0; if ( *(_WORD *)(a4 + 98) ) { do { ++v62; v61 >>= 1; } while ( v61 ); } v63 = 5 * v62 / 4; if ( v63 >= 5 ) { if ( v63 > 8 ) LOBYTE(v63) = 8; } else { LOBYTE(v63) = 5; } v64 = 1 << v63; *(_DWORD *)(a4 + 108) = (char)v63; *(_DWORD *)(a4 + 112) = (1 << v63) - 1; v65 = (void *)sub_180018340(16, (unsigned int)(2 * (1 << v63))); *(_QWORD *)(a4 + 48) = v65; memset(v65, 0, 2LL * v64); LOWORD(v66) = *(_WORD *)(a4 + 98); v67 = 0; if ( (__int16)v66 > 0 ) { do { v68 = *(_DWORD *)(a4 + 108); v69 = *(char *)(v67 + *(_QWORD *)(a4 + 56)); if ( v69 <= v68 ) { v70 = 0; v71 = __ROL4__(*(_DWORD *)(*(_QWORD *)(a4 + 64) + 4LL * v67), 16); v72 = (v71 << 8) ^ ((v71 << 8) ^ (v71 >> 8)) & 0xFF00FF; v73 = (16 * v72) ^ ((16 * v72) ^ (v72 >> 4)) & 0xF0F0F0F; if ( 1 << (v68 - v69) > 0 ) { do { v74 = v70++ << *(_BYTE *)(v67 + *(_QWORD *)(a4 + 56)); *(_WORD *)(*(_QWORD *)(a4 + 48) + 2 * ((2 * ((4 * v73) ^ ((4 * v73) ^ (v73 >> 2)) & 0x33333333)) ^ ((2 * ((4 * v73) ^ ((4 * v73) ^ (v73 >> 2)) & 0x33333333)) ^ (((4 * v73) ^ ((4 * v73) ^ (v73 >> 2)) & 0x33333333) >> 1)) & 0x55555555 | (unsigned __int64)v74)) = v67 + 1; } while ( v70 < 1 << (*(_BYTE *)(a4 + 108) - *(_BYTE *)(v67 + *(_QWORD *)(a4 + 56))) ); } } v66 = *(__int16 *)(a4 + 98); ++v67; } while ( v67 < v66 ); } v75 = 0; if ( v64 > 0 ) { v76 = 0; do { v77 = __ROL4__(v75 << (32 - *(_BYTE *)(a4 + 108)), 16); v78 = (16 * ((v77 << 8) ^ ((v77 << 8) ^ (v77 >> 8)) & 0xFF00FF)) ^ ((16 * ((v77 << 8) ^ ((v77 << 8) ^ (v77 >> 8)) & 0xFF00FF)) ^ (((v77 << 8) ^ ((v77 << 8) ^ (v77 >> 8)) & 0xFF00FF) >> 4)) & 0xF0F0F0F; v79 = (4 * v78) ^ ((4 * v78) ^ (v78 >> 2)) & 0x33333333; v80 = (_WORD *)(*(_QWORD *)(a4 + 48) + 2 * ((2 * v79) ^ (unsigned __int64)(((2 * v79) ^ (v79 >> 1)) & 0x55555555))); if ( !*v80 ) { v81 = *(__int16 *)(a4 + 98); v82 = v19 + 1; if ( (int)(v19 + 1) < v81 ) { v83 = (_DWORD *)(*(_QWORD *)(a4 + 64) + 4LL + 4 * v76); do { if ( *v83 > (unsigned int)(v75 << (32 - *(_BYTE *)(a4 + 108))) ) break; ++v19; ++v82; ++v76; ++v83; } while ( v82 < v81 ); } v84 = v19; if ( v19 > 0x7FFF ) v84 = 0x7FFF; *v80 = v84 | 0x8000; } ++v75; } while ( v75 < v64 ); LOWORD(v66) = *(_WORD *)(a4 + 98); } v85 = (__int16)v66; if ( (__int16)v66 > 0 ) { v86 = (__int16)v66; do { --v86; --v85; *(_BYTE *)(*(_QWORD *)(a4 + 56) + v86 + 1) = *(_BYTE *)(*(_QWORD *)(a4 + 56) + v86); } while ( v85 > 0 ); } } return 0; }