// // cocos2d::extension::AssetsManager::uncompress from 0x180001ec0 to 0x1800023ca (1290 bytes) // // 3 xrefs: // > sub_180001B60 @ 0x180001be7 // > @ 0x18002fdf8 // > @ 0x180049114 // // 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 // // Hidden C++ exception states: #wind=2 __int64 __fastcall cocos2d::extension::AssetsManager::uncompress(cocos2d::extension::AssetsManager *this) { char *v1; // r12 size_t v2; // rsi char *v3; // r15 size_t v4; // r14 unsigned __int64 v5; // rbx char *v6; // rdi size_t v7; // rax void *v8; // rax const char *v9; // rdx void **v10; // rcx cocos2d *v11; // rax struct cocos2d::unz_global_info_s *v12; // r8 cocos2d *v13; // r14 void *v14; // rdx unsigned __int8 v15; // bl void *v16; // rcx size_t v17; // r13 size_t v18; // rbx size_t v19; // r15 unsigned __int64 v20; // rdi char *v21; // rsi size_t v22; // rax void *v23; // rax void *v24; // rdx __int64 v25; // rax const CHAR *v26; // rcx void *v27; // rdx const char *v28; // rcx void *v29; // rdx FILE *v30; // rbx unsigned int v31; // r9d int CurrentFile; // eax void *v33; // rdx CHAR *v34; // rcx CHAR *v35; // rcx void *v37; // [rsp+28h] [rbp-D8h] char *v38; // [rsp+38h] [rbp-C8h] unsigned int v39; // [rsp+40h] [rbp-C0h] int v40; // [rsp+40h] [rbp-C0h] unsigned int v41; // [rsp+48h] [rbp-B8h] BYREF char *v42; // [rsp+50h] [rbp-B0h] LPCSTR lpPathName[2]; // [rsp+58h] [rbp-A8h] BYREF size_t v44; // [rsp+68h] [rbp-98h] unsigned __int64 v45; // [rsp+70h] [rbp-90h] void *Block[2]; // [rsp+78h] [rbp-88h] BYREF __int128 v47; // [rsp+88h] [rbp-78h] _BYTE v48[80]; // [rsp+A0h] [rbp-60h] BYREF _BYTE Src[512]; // [rsp+F0h] [rbp-10h] BYREF _BYTE Buffer[8192]; // [rsp+2F0h] [rbp+1F0h] BYREF v1 = (char *)this + 8; v42 = (char *)this + 8; v2 = *((_QWORD *)this + 3); if ( 0x7FFFFFFFFFFFFFFFLL - v2 < 0x20 ) sub_180003D90(); v3 = (char *)this + 8; if ( *((_QWORD *)this + 4) > 0xFu ) v3 = *(char **)v1; *(_OWORD *)Block = 0; v47 = 0; v4 = v2 + 32; v5 = 15; v6 = (char *)Block; if ( v2 + 32 > 0xF ) { v5 = v4 | 0xF; if ( (v4 | 0xF) <= 0x7FFFFFFFFFFFFFFFLL ) { if ( v5 < 0x16 ) v5 = 22; if ( v5 + 1 < 0x1000 ) { if ( v5 == -1 ) v6 = nullptr; else v6 = (char *)operator new(v5 + 1); LABEL_17: Block[0] = v6; goto LABEL_18; } v7 = v5 + 40; if ( v5 + 40 < v5 + 1 ) Concurrency::cancel_current_task(); } else { v5 = 0x7FFFFFFFFFFFFFFFLL; v7 = 0x8000000000000027uLL; } v8 = operator new(v7); if ( !v8 ) goto LABEL_27; v6 = (char *)(((unsigned __int64)v8 + 39) & 0xFFFFFFFFFFFFFFE0uLL); *((_QWORD *)v6 - 1) = v8; goto LABEL_17; } LABEL_18: *(_QWORD *)&v47 = v2 + 32; *((_QWORD *)&v47 + 1) = v5; memcpy(v6, v3, v2); qmemcpy(&v6[v2], "cocos2dx-update-temp-package.zip", 32); v6[v4] = 0; v10 = Block; if ( *((_QWORD *)&v47 + 1) > 0xFu ) v10 = (void **)Block[0]; v11 = (cocos2d *)cocos2d::unzOpen((cocos2d *)v10, v9); v13 = v11; if ( !v11 ) goto LABEL_23; if ( cocos2d::unzGetGlobalInfo(v11, &v41, v12) ) { LABEL_22: cocos2d::unzClose(v13, v14); LABEL_23: v15 = 0; goto LABEL_24; } v39 = 0; if ( v41 ) { while ( 1 ) { LODWORD(v38) = 0; LODWORD(v37) = 0; if ( cocos2d::unzGetCurrentFileInfo( v13, v48, (struct cocos2d::unz_file_info_s *)Src, (char *)0x200, 0, v37, 0, v38, v39) ) { goto LABEL_22; } v17 = *((_QWORD *)v1 + 2); v18 = -1; do ++v18; while ( Src[v18] ); if ( 0x7FFFFFFFFFFFFFFFLL - v17 < v18 ) sub_180003D90(); if ( *((_QWORD *)v42 + 3) > 0xFu ) v1 = *(char **)v42; *(_OWORD *)lpPathName = 0; v44 = 0; v45 = 0; v19 = v18 + v17; v20 = 15; v21 = (char *)lpPathName; if ( v18 + v17 > 0xF ) break; LABEL_48: v44 = v18 + v17; v45 = v20; memcpy(v21, v1, v17); memcpy(&v21[v17], Src, v18); v21[v19] = 0; v25 = -1; do ++v25; while ( Src[v25] ); if ( v48[v25 + 79] == 47 ) { v26 = (const CHAR *)lpPathName; if ( v45 > 0xF ) v26 = lpPathName[0]; if ( !CreateDirectoryA(v26, nullptr) && GetLastError() != 183 ) goto LABEL_73; } else { if ( cocos2d::unzOpenCurrentFile(v13, v24) ) goto LABEL_73; v28 = (const char *)lpPathName; if ( v45 > 0xF ) v28 = lpPathName[0]; v30 = fopen(v28, "wb"); if ( !v30 ) { LABEL_72: cocos2d::unzCloseCurrentFile(v13, v29); LABEL_73: cocos2d::unzClose(v13, v27); if ( v45 > 0xF ) { v35 = (CHAR *)lpPathName[0]; if ( v45 + 1 >= 0x1000 ) { v35 = *((CHAR **)lpPathName[0] - 1); if ( (unsigned __int64)(lpPathName[0] - (LPCSTR)v35 - 8) > 0x1F ) LABEL_76: invalid_parameter_noinfo_noreturn(); } j_j_free(v35); } goto LABEL_23; } while ( 1 ) { CurrentFile = cocos2d::unzReadCurrentFile(v13, Buffer, (void *)0x2000, v31); if ( CurrentFile < 0 ) goto LABEL_72; if ( CurrentFile <= 0 ) break; fwrite(Buffer, CurrentFile, 1u, v30); } fclose(v30); } cocos2d::unzCloseCurrentFile(v13, v27); v39 = v40 + 1; if ( v39 < v41 && cocos2d::unzGoToNextFile(v13, v33) ) goto LABEL_73; if ( v45 > 0xF ) { v34 = (CHAR *)lpPathName[0]; if ( v45 + 1 >= 0x1000 ) { v34 = *((CHAR **)lpPathName[0] - 1); if ( (unsigned __int64)(lpPathName[0] - (LPCSTR)v34 - 8) > 0x1F ) goto LABEL_76; } j_j_free(v34); } if ( v39 >= v41 ) goto LABEL_78; v1 = v42; } v20 = v19 | 0xF; if ( (v19 | 0xF) <= 0x7FFFFFFFFFFFFFFFLL ) { if ( v20 < 0x16 ) v20 = 22; if ( v20 + 1 < 0x1000 ) { if ( v20 == -1 ) v21 = nullptr; else v21 = (char *)operator new(v20 + 1); LABEL_47: lpPathName[0] = v21; goto LABEL_48; } v22 = v20 + 40; if ( v20 + 40 < v20 + 1 ) Concurrency::cancel_current_task(); } else { v20 = 0x7FFFFFFFFFFFFFFFLL; v22 = 0x8000000000000027uLL; } v23 = operator new(v22); if ( !v23 ) goto LABEL_76; v21 = (char *)(((unsigned __int64)v23 + 39) & 0xFFFFFFFFFFFFFFE0uLL); *((_QWORD *)v21 - 1) = v23; goto LABEL_47; } LABEL_78: v15 = 1; LABEL_24: if ( *((_QWORD *)&v47 + 1) > 0xFu ) { v16 = Block[0]; if ( (unsigned __int64)(*((_QWORD *)&v47 + 1) + 1LL) >= 0x1000 ) { v16 = *((void **)Block[0] - 1); if ( (unsigned __int64)((char *)Block[0] - (char *)v16 - 8) > 0x1F ) LABEL_27: invalid_parameter_noinfo_noreturn(); } j_j_free(v16); } return v15; }