{"type": "func", "start": 6442462688, "end": 6442463412, "name": "sub_180002DE0", "pseudocode": "// \n// sub_180002DE0 from 0x180002de0 to 0x1800030b4 (724 bytes)\n// \n// 2 xrefs:\n// > sub_180002C10 @ 0x180002db5\n// > <???> @ 0x1800491a4\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n// Hidden C++ exception states: #wind=2\nvoid __fastcall sub_180002DE0(__int64 a1, __int64 a2)\n{\n  __int64 v2; // r14\n  _QWORD *v3; // rdx\n  __int64 v4; // r8\n  __int64 v5; // rcx\n  __int64 v6; // rax\n  __int64 v7; // rcx\n  void *v8; // rcx\n  unsigned __int64 v9; // rbx\n  __int64 v10; // rax\n  __int64 v11; // rcx\n  void *v12; // rcx\n  cocos2d::CCUserDefault *v13; // rax\n  _QWORD *v14; // rsi\n  size_t v15; // r13\n  size_t v16; // r15\n  char *v17; // rdi\n  size_t v18; // rax\n  void *v19; // rax\n  const char *v20; // rcx\n  char *v21; // rcx\n  void *Block[2]; // [rsp+28h] [rbp-48h] BYREF\n  __int128 v23; // [rsp+38h] [rbp-38h]\n  char *FileName[2]; // [rsp+48h] [rbp-28h] BYREF\n  __int128 v25; // [rsp+58h] [rbp-18h]\n\n  v2 = *(_QWORD *)(a2 + 8);\n  v3 = (_QWORD *)(v2 + 40);\n  if ( *(_QWORD *)(v2 + 64) > 0xFu )\n    v3 = (_QWORD *)*v3;\n  *(_OWORD *)Block = 0;\n  v23 = 0;\n  v4 = -1;\n  do\n    ++v4;\n  while ( *((_BYTE *)v3 + v4) );\n  sub_180003AB0(Block, v3);\n  v6 = cocos2d::CCUserDefault::sharedUserDefault(v5);\n  cocos2d::CCUserDefault::setStringForKey(v6, \"current-version-code\", Block);\n  if ( *((_QWORD *)&v23 + 1) > 0xFu )\n  {\n    v8 = Block[0];\n    if ( (unsigned __int64)(*((_QWORD *)&v23 + 1) + 1LL) >= 0x1000 )\n    {\n      v8 = *((void **)Block[0] - 1);\n      if ( (unsigned __int64)((char *)Block[0] - (char *)v8 - 8) > 0x1F )\n        invalid_parameter_noinfo_noreturn();\n    }\n    j_j_free(v8);\n  }\n  *(_OWORD *)Block = 0;\n  *(_QWORD *)&v23 = 0;\n  v9 = 15;\n  *((_QWORD *)&v23 + 1) = 15;\n  LOBYTE(Block[0]) = 0;\n  v10 = cocos2d::CCUserDefault::sharedUserDefault(v7);\n  cocos2d::CCUserDefault::setStringForKey(v10, \"downloaded-version-code\", Block);\n  if ( *((_QWORD *)&v23 + 1) > 0xFu )\n  {\n    v12 = Block[0];\n    if ( (unsigned __int64)(*((_QWORD *)&v23 + 1) + 1LL) >= 0x1000 )\n    {\n      v12 = *((void **)Block[0] - 1);\n      if ( (unsigned __int64)((char *)Block[0] - (char *)v12 - 8) > 0x1F )\n        invalid_parameter_noinfo_noreturn();\n    }\n    j_j_free(v12);\n  }\n  v13 = (cocos2d::CCUserDefault *)cocos2d::CCUserDefault::sharedUserDefault(v11);\n  cocos2d::CCUserDefault::flush(v13);\n  cocos2d::extension::AssetsManager::setSearchPath((cocos2d::extension::AssetsManager *)v2);\n  v14 = (_QWORD *)(v2 + 8);\n  v15 = *(_QWORD *)(v2 + 24);\n  if ( 0x7FFFFFFFFFFFFFFFLL - v15 < 0x20 )\n    sub_180003D90();\n  if ( *(_QWORD *)(v2 + 32) > 0xFu )\n    v14 = (_QWORD *)*v14;\n  *(_OWORD *)FileName = 0;\n  v25 = 0;\n  v16 = v15 + 32;\n  v17 = (char *)FileName;\n  if ( v15 + 32 > 0xF )\n  {\n    v9 = v16 | 0xF;\n    if ( (v16 | 0xF) <= 0x7FFFFFFFFFFFFFFFLL )\n    {\n      if ( v9 < 0x16 )\n        v9 = 22;\n      if ( v9 + 1 < 0x1000 )\n      {\n        if ( v9 == -1 )\n          v17 = nullptr;\n        else\n          v17 = (char *)operator new(v9 + 1);\nLABEL_31:\n        FileName[0] = v17;\n        goto LABEL_32;\n      }\n      v18 = v9 + 40;\n      if ( v9 + 40 < v9 + 1 )\n        Concurrency::cancel_current_task();\n    }\n    else\n    {\n      v9 = 0x7FFFFFFFFFFFFFFFLL;\n      v18 = 0x8000000000000027uLL;\n    }\n    v19 = operator new(v18);\n    if ( !v19 )\n      goto LABEL_39;\n    v17 = (char *)(((unsigned __int64)v19 + 39) & 0xFFFFFFFFFFFFFFE0uLL);\n    *((_QWORD *)v17 - 1) = v19;\n    goto LABEL_31;\n  }\nLABEL_32:\n  *(_QWORD *)&v25 = v15 + 32;\n  *((_QWORD *)&v25 + 1) = v9;\n  memcpy(v17, v14, v15);\n  qmemcpy(&v17[v15], \"cocos2dx-update-temp-package.zip\", 32);\n  v17[v16] = 0;\n  v20 = (const char *)FileName;\n  if ( *((_QWORD *)&v25 + 1) > 0xFu )\n    v20 = FileName[0];\n  remove(v20);\n  if ( v2 )\n    (*(void (__fastcall **)(_QWORD))(**(_QWORD **)(v2 + 200) + 16LL))(*(_QWORD *)(v2 + 200));\n  if ( *((_QWORD *)&v25 + 1) > 0xFu )\n  {\n    v21 = FileName[0];\n    if ( (unsigned __int64)(*((_QWORD *)&v25 + 1) + 1LL) >= 0x1000 )\n    {\n      v21 = *((char **)FileName[0] - 1);\n      if ( (unsigned __int64)(FileName[0] - v21 - 8) > 0x1F )\nLABEL_39:\n        invalid_parameter_noinfo_noreturn();\n    }\n    j_j_free(v21);\n  }\n}", "assembly": "; \n; sub_180002DE0 from 0x180002de0 to 0x1800030b4 (724 bytes)\n; \n; 2 xrefs:\n; > sub_180002C10 @ 0x180002db5\n; > <???> @ 0x1800491a4\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nmov     [rsp-28h+arg_0], rbx                                           ; +0x0, 0x180002de0\nmov     [rsp-28h+arg_10], rsi                                          ; +0x5, 0x180002de5\npush    rbp                                                            ; +0xa, 0x180002dea\npush    rdi                                                            ; +0xb, 0x180002deb\npush    r13                                                            ; +0xc, 0x180002dec\npush    r14                                                            ; +0xe, 0x180002dee\npush    r15                                                            ; +0x10, 0x180002df0\nmov     rbp, rsp                                                       ; +0x12, 0x180002df2\nsub     rsp, 70h                                                       ; +0x15, 0x180002df5\nmov     rax, cs:__security_cookie                                      ; +0x19, 0x180002df9\nxor     rax, rsp                                                       ; +0x20, 0x180002e00\nmov     [rbp+var_8], rax                                               ; +0x23, 0x180002e03\nmov     r14, [rdx+8]                                                   ; +0x27, 0x180002e07\nlea     rdx, [r14+28h]                                                 ; +0x2b, 0x180002e0b\ncmp     qword ptr [rdx+18h], 0Fh                                       ; +0x2f, 0x180002e0f\njbe     short loc_180002E19                                            ; +0x34, 0x180002e14\nmov     rdx, [rdx]                                                     ; +0x36, 0x180002e16\nxorps   xmm0, xmm0                                                     ; +0x39, 0x180002e19\nmovups  xmmword ptr [rbp+Block], xmm0                                  ; +0x3c, 0x180002e1c\nxorps   xmm1, xmm1                                                     ; +0x40, 0x180002e20\nmovdqu  [rbp+var_38], xmm1                                             ; +0x43, 0x180002e23\nmov     r8, 0FFFFFFFFFFFFFFFFh                                         ; +0x48, 0x180002e28\nnop                                                                    ; +0x4f, 0x180002e2f\ninc     r8                                                             ; +0x50, 0x180002e30\ncmp     byte ptr [rdx+r8], 0                                           ; +0x53, 0x180002e33\njnz     short loc_180002E30                                            ; +0x58, 0x180002e38\nlea     rcx, [rbp+Block]                                               ; +0x5a, 0x180002e3a\ncall    sub_180003AB0                                                  ; +0x5e, 0x180002e3e\nnop                                                                    ; +0x63, 0x180002e43\ncall    cs:?sharedUserDefault@CCUserDefault@cocos2d@@SAPEAV12@XZ; cocos2d::CCUserDefault::sharedUserDefault(void) ; +0x64, 0x180002e44\nmov     rcx, rax                                                       ; +0x6a, 0x180002e4a\nlea     r8, [rbp+Block]                                                ; +0x6d, 0x180002e4d\nlea     rdx, aCurrentVersion; \"current-version-code\"                   ; +0x71, 0x180002e51\ncall    cs:?setStringForKey@CCUserDefault@cocos2d@@QEAAXPEBDAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z; cocos2d::CCUserDefault::setStringForKey(char const *,std::string const &) ; +0x78, 0x180002e58\nnop                                                                    ; +0x7e, 0x180002e5e\nmov     rdx, qword ptr [rbp+var_38+8]                                  ; +0x7f, 0x180002e5f\ncmp     rdx, 0Fh                                                       ; +0x83, 0x180002e63\njbe     short loc_180002E9D                                            ; +0x87, 0x180002e67\ninc     rdx                                                            ; +0x89, 0x180002e69\nmov     rcx, [rbp+Block]; Block                                        ; +0x8c, 0x180002e6c\nmov     rax, rcx                                                       ; +0x90, 0x180002e70\ncmp     rdx, 1000h                                                     ; +0x93, 0x180002e73\njb      short loc_180002E98                                            ; +0x9a, 0x180002e7a\nadd     rdx, 27h ; '''                                                 ; +0x9c, 0x180002e7c\nmov     rcx, [rcx-8]                                                   ; +0xa0, 0x180002e80\nsub     rax, rcx                                                       ; +0xa4, 0x180002e84\nadd     rax, 0FFFFFFFFFFFFFFF8h                                        ; +0xa7, 0x180002e87\ncmp     rax, 1Fh                                                       ; +0xab, 0x180002e8b\njbe     short loc_180002E98                                            ; +0xaf, 0x180002e8f\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0xb1, 0x180002e91\nalign 8                                                                ; +0xb7, 0x180002e97\ncall    j_j_free                                                       ; +0xb8, 0x180002e98\nxorps   xmm0, xmm0                                                     ; +0xbd, 0x180002e9d\nmovups  xmmword ptr [rbp+Block], xmm0                                  ; +0xc0, 0x180002ea0\nmov     qword ptr [rbp+var_38], 0                                      ; +0xc4, 0x180002ea4\nmov     ebx, 0Fh                                                       ; +0xcc, 0x180002eac\nmov     qword ptr [rbp+var_38+8], rbx                                  ; +0xd1, 0x180002eb1\nmov     byte ptr [rbp+Block], 0                                        ; +0xd5, 0x180002eb5\ncall    cs:?sharedUserDefault@CCUserDefault@cocos2d@@SAPEAV12@XZ; cocos2d::CCUserDefault::sharedUserDefault(void) ; +0xd9, 0x180002eb9\nmov     rcx, rax                                                       ; +0xdf, 0x180002ebf\nlea     r8, [rbp+Block]                                                ; +0xe2, 0x180002ec2\nlea     rdx, aDownloadedVers; \"downloaded-version-code\"                ; +0xe6, 0x180002ec6\ncall    cs:?setStringForKey@CCUserDefault@cocos2d@@QEAAXPEBDAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z; cocos2d::CCUserDefault::setStringForKey(char const *,std::string const &) ; +0xed, 0x180002ecd\nnop                                                                    ; +0xf3, 0x180002ed3\nmov     rdx, qword ptr [rbp+var_38+8]                                  ; +0xf4, 0x180002ed4\ncmp     rdx, rbx                                                       ; +0xf8, 0x180002ed8\njbe     short loc_180002F11                                            ; +0xfb, 0x180002edb\ninc     rdx                                                            ; +0xfd, 0x180002edd\nmov     rcx, [rbp+Block]; Block                                        ; +0x100, 0x180002ee0\nmov     rax, rcx                                                       ; +0x104, 0x180002ee4\ncmp     rdx, 1000h                                                     ; +0x107, 0x180002ee7\njb      short loc_180002F0C                                            ; +0x10e, 0x180002eee\nadd     rdx, 27h ; '''                                                 ; +0x110, 0x180002ef0\nmov     rcx, [rcx-8]                                                   ; +0x114, 0x180002ef4\nsub     rax, rcx                                                       ; +0x118, 0x180002ef8\nadd     rax, 0FFFFFFFFFFFFFFF8h                                        ; +0x11b, 0x180002efb\ncmp     rax, 1Fh                                                       ; +0x11f, 0x180002eff\njbe     short loc_180002F0C                                            ; +0x123, 0x180002f03\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x125, 0x180002f05\nalign 4                                                                ; +0x12b, 0x180002f0b\ncall    j_j_free                                                       ; +0x12c, 0x180002f0c\ncall    cs:?sharedUserDefault@CCUserDefault@cocos2d@@SAPEAV12@XZ; cocos2d::CCUserDefault::sharedUserDefault(void) ; +0x131, 0x180002f11\nmov     rcx, rax                                                       ; +0x137, 0x180002f17\ncall    cs:?flush@CCUserDefault@cocos2d@@QEAAXXZ; cocos2d::CCUserDefault::flush(void) ; +0x13a, 0x180002f1a\nmov     rcx, r14; this                                                 ; +0x140, 0x180002f20\ncall    ?setSearchPath@AssetsManager@extension@cocos2d@@IEAAXXZ; cocos2d::extension::AssetsManager::setSearchPath(void) ; +0x143, 0x180002f23\nlea     rsi, [r14+8]                                                   ; +0x148, 0x180002f28\nmov     r13, [rsi+10h]                                                 ; +0x14c, 0x180002f2c\nmov     rcx, 7FFFFFFFFFFFFFFFh                                         ; +0x150, 0x180002f30\nmov     rax, rcx                                                       ; +0x15a, 0x180002f3a\nsub     rax, r13                                                       ; +0x15d, 0x180002f3d\ncmp     rax, 20h ; ' '                                                 ; +0x160, 0x180002f40\njb      loc_1800030A8                                                  ; +0x164, 0x180002f44\ncmp     qword ptr [rsi+18h], 0Fh                                       ; +0x16a, 0x180002f4a\njbe     short loc_180002F54                                            ; +0x16f, 0x180002f4f\nmov     rsi, [rsi]                                                     ; +0x171, 0x180002f51\nxorps   xmm0, xmm0                                                     ; +0x174, 0x180002f54\nmovups  xmmword ptr [rbp+FileName], xmm0                               ; +0x177, 0x180002f57\nxorps   xmm1, xmm1                                                     ; +0x17b, 0x180002f5b\nmovdqu  [rbp+var_18], xmm1                                             ; +0x17e, 0x180002f5e\nlea     r15, [r13+20h]                                                 ; +0x183, 0x180002f63\nlea     rdi, [rbp+FileName]                                            ; +0x187, 0x180002f67\ncmp     r15, 0Fh                                                       ; +0x18b, 0x180002f6b\njbe     short loc_180002FEA                                            ; +0x18f, 0x180002f6f\nmov     rbx, r15                                                       ; +0x191, 0x180002f71\nor      rbx, 0Fh                                                       ; +0x194, 0x180002f74\ncmp     rbx, rcx                                                       ; +0x198, 0x180002f78\njbe     short loc_180002FAD                                            ; +0x19b, 0x180002f7b\nmov     rbx, rcx                                                       ; +0x19d, 0x180002f7d\nmov     rax, 8000000000000000h                                         ; +0x1a0, 0x180002f80\nadd     rax, 27h ; '''                                                 ; +0x1aa, 0x180002f8a\nmov     rcx, rax; Size                                                 ; +0x1ae, 0x180002f8e\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0x1b1, 0x180002f91\ntest    rax, rax                                                       ; +0x1b6, 0x180002f96\njz      loc_180003077                                                  ; +0x1b9, 0x180002f99\nlea     rdi, [rax+27h]                                                 ; +0x1bf, 0x180002f9f\nand     rdi, 0FFFFFFFFFFFFFFE0h                                        ; +0x1c3, 0x180002fa3\nmov     [rdi-8], rax                                                   ; +0x1c7, 0x180002fa7\njmp     short loc_180002FE6                                            ; +0x1cb, 0x180002fab\nmov     eax, 16h                                                       ; +0x1cd, 0x180002fad\ncmp     rbx, rax                                                       ; +0x1d2, 0x180002fb2\ncmovb   rbx, rax                                                       ; +0x1d5, 0x180002fb5\nlea     rcx, [rbx+1]; Size                                             ; +0x1d9, 0x180002fb9\ncmp     rcx, 1000h                                                     ; +0x1dd, 0x180002fbd\njb      short loc_180002FD5                                            ; +0x1e4, 0x180002fc4\nlea     rax, [rcx+27h]                                                 ; +0x1e6, 0x180002fc6\ncmp     rax, rcx                                                       ; +0x1ea, 0x180002fca\njbe     loc_1800030AE                                                  ; +0x1ed, 0x180002fcd\njmp     short loc_180002F8E                                            ; +0x1f3, 0x180002fd3\ntest    rcx, rcx                                                       ; +0x1f5, 0x180002fd5\njz      short loc_180002FE4                                            ; +0x1f8, 0x180002fd8\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0x1fa, 0x180002fda\nmov     rdi, rax                                                       ; +0x1ff, 0x180002fdf\njmp     short loc_180002FE6                                            ; +0x202, 0x180002fe2\nxor     edi, edi                                                       ; +0x204, 0x180002fe4\nmov     [rbp+FileName], rdi                                            ; +0x206, 0x180002fe6\nmov     qword ptr [rbp+var_18], r15                                    ; +0x20a, 0x180002fea\nmov     qword ptr [rbp+var_18+8], rbx                                  ; +0x20e, 0x180002fee\nmov     r8, r13; Size                                                  ; +0x212, 0x180002ff2\nmov     rdx, rsi; Src                                                  ; +0x215, 0x180002ff5\nmov     rcx, rdi; void *                                               ; +0x218, 0x180002ff8\ncall    memcpy                                                         ; +0x21b, 0x180002ffb\nmovups  xmm0, cs:xmmword_1800233C8                                     ; +0x220, 0x180003000\nmovups  xmmword ptr [rdi+r13], xmm0                                    ; +0x227, 0x180003007\nmovups  xmm1, cs:xmmword_1800233D8                                     ; +0x22c, 0x18000300c\nmovups  xmmword ptr [rdi+r13+10h], xmm1                                ; +0x233, 0x180003013\nmov     byte ptr [rdi+r15], 0                                          ; +0x239, 0x180003019\nlea     rcx, [rbp+FileName]                                            ; +0x23e, 0x18000301e\ncmp     qword ptr [rbp+var_18+8], 0Fh                                  ; +0x242, 0x180003022\ncmova   rcx, [rbp+FileName]; FileName                                  ; +0x247, 0x180003027\ncall    cs:remove                                                      ; +0x24c, 0x18000302c\ntest    r14, r14                                                       ; +0x252, 0x180003032\njz      short loc_180003045                                            ; +0x255, 0x180003035\nmov     rcx, [r14+0C8h]                                                ; +0x257, 0x180003037\nmov     rax, [rcx]                                                     ; +0x25e, 0x18000303e\ncall    qword ptr [rax+10h]                                            ; +0x261, 0x180003041\nnop                                                                    ; +0x264, 0x180003044\nmov     rdx, qword ptr [rbp+var_18+8]                                  ; +0x265, 0x180003045\ncmp     rdx, 0Fh                                                       ; +0x269, 0x180003049\njbe     short loc_180003083                                            ; +0x26d, 0x18000304d\ninc     rdx                                                            ; +0x26f, 0x18000304f\nmov     rcx, [rbp+FileName]; Block                                     ; +0x272, 0x180003052\nmov     rax, rcx                                                       ; +0x276, 0x180003056\ncmp     rdx, 1000h                                                     ; +0x279, 0x180003059\njb      short loc_18000307E                                            ; +0x280, 0x180003060\nadd     rdx, 27h ; '''                                                 ; +0x282, 0x180003062\nmov     rcx, [rcx-8]                                                   ; +0x286, 0x180003066\nsub     rax, rcx                                                       ; +0x28a, 0x18000306a\nadd     rax, 0FFFFFFFFFFFFFFF8h                                        ; +0x28d, 0x18000306d\ncmp     rax, 1Fh                                                       ; +0x291, 0x180003071\njbe     short loc_18000307E                                            ; +0x295, 0x180003075\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x297, 0x180003077\nalign 2                                                                ; +0x29d, 0x18000307d\ncall    j_j_free                                                       ; +0x29e, 0x18000307e\nmov     rcx, [rbp+var_8]                                               ; +0x2a3, 0x180003083\nxor     rcx, rsp; StackCookie                                          ; +0x2a7, 0x180003087\ncall    __security_check_cookie                                        ; +0x2aa, 0x18000308a\nlea     r11, [rsp+70h+var_s0]                                          ; +0x2af, 0x18000308f\nmov     rbx, [r11+30h]                                                 ; +0x2b4, 0x180003094\nmov     rsi, [r11+40h]                                                 ; +0x2b8, 0x180003098\nmov     rsp, r11                                                       ; +0x2bc, 0x18000309c\npop     r15                                                            ; +0x2bf, 0x18000309f\npop     r14                                                            ; +0x2c1, 0x1800030a1\npop     r13                                                            ; +0x2c3, 0x1800030a3\npop     rdi                                                            ; +0x2c5, 0x1800030a5\npop     rbp                                                            ; +0x2c6, 0x1800030a6\nretn                                                                   ; +0x2c7, 0x1800030a7\ncall    sub_180003D90                                                  ; +0x2c8, 0x1800030a8\nalign 2                                                                ; +0x2cd, 0x1800030ad\ncall    ?cancel_current_task@Concurrency@@YAXXZ; Concurrency::cancel_current_task(void) ; +0x2ce, 0x1800030ae\ndb 0CCh                                                                ; +0x2d3, 0x1800030b3", "xrefs": ["sub_180002C10 @ 0x180002db5", "<???> @ 0x1800491a4"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}