{"type": "func", "start": 6442462224, "end": 6442462687, "name": "sub_180002C10", "pseudocode": "// \n// sub_180002C10 from 0x180002c10 to 0x180002ddf (463 bytes)\n// \n// 2 xrefs:\n// > <???> @ 0x180023428\n// > <???> @ 0x180049198\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=1\nvoid __fastcall sub_180002C10(__int64 a1)\n{\n  __int64 v2; // rdi\n  __int64 ***v3; // r8\n  __int64 **v4; // r9\n  __int64 *v5; // rcx\n  void **v6; // rbx\n  __int64 v7; // rdx\n  __int64 v8; // rcx\n  int v9; // ecx\n  int v10; // ecx\n  unsigned int *v11; // rdx\n  void (__fastcall ***v12)(_QWORD, _QWORD); // rcx\n  unsigned int *v13; // rdx\n  __int64 v14; // rcx\n  _QWORD *v15; // rdx\n  __int64 v16; // r8\n  __int64 v17; // rcx\n  __int64 v18; // rax\n  __int64 v19; // rcx\n  void *v20; // rcx\n  cocos2d::CCUserDefault *v21; // rax\n  void *Block[2]; // [rsp+20h] [rbp-38h] BYREF\n  __int128 v23; // [rsp+30h] [rbp-28h]\n\n  v2 = a1 + 64;\n  pthread_mutex_lock(a1 + 64);\n  v3 = *(__int64 ****)(a1 + 56);\n  v4 = v3[1];\n  if ( !v4 )\n  {\n    pthread_mutex_unlock(v2);\n    return;\n  }\n  v5 = **v3;\n  v6 = (void **)v5[2];\n  v7 = *v5;\n  v3[1] = (__int64 **)((char *)v4 - 1);\n  *(_QWORD *)v5[1] = v7;\n  *(_QWORD *)(v7 + 8) = v5[1];\n  j_j_free(v5);\n  pthread_mutex_unlock(v2);\n  v8 = *(unsigned int *)v6;\n  if ( !(_DWORD)v8 )\n  {\n    sub_180002DE0(v8, v6);\n    goto LABEL_23;\n  }\n  v9 = v8 - 1;\n  if ( !v9 )\n  {\n    v15 = (char *)v6[1] + 40;\n    if ( *((_QWORD *)v6[1] + 8) > 0xFu )\n      v15 = (_QWORD *)*v15;\n    *(_OWORD *)Block = 0;\n    v23 = 0;\n    v16 = -1;\n    do\n      ++v16;\n    while ( *((_BYTE *)v15 + v16) );\n    sub_180003AB0(Block, v15);\n    v18 = cocos2d::CCUserDefault::sharedUserDefault(v17);\n    cocos2d::CCUserDefault::setStringForKey(v18, \"downloaded-version-code\", Block);\n    if ( *((_QWORD *)&v23 + 1) > 0xFu )\n    {\n      v20 = Block[0];\n      if ( (unsigned __int64)(*((_QWORD *)&v23 + 1) + 1LL) >= 0x1000 )\n      {\n        v20 = *((void **)Block[0] - 1);\n        if ( (unsigned __int64)((char *)Block[0] - (char *)v20 - 8) > 0x1F )\n          invalid_parameter_noinfo_noreturn();\n      }\n      j_j_free(v20);\n    }\n    v21 = (cocos2d::CCUserDefault *)cocos2d::CCUserDefault::sharedUserDefault(v19);\n    cocos2d::CCUserDefault::flush(v21);\n    goto LABEL_23;\n  }\n  v10 = v9 - 1;\n  if ( !v10 )\n  {\n    v13 = (unsigned int *)v6[1];\n    v14 = *(_QWORD *)(*((_QWORD *)v13 + 1) + 200LL);\n    if ( v14 )\n      (*(void (__fastcall **)(__int64, _QWORD))(*(_QWORD *)v14 + 8LL))(v14, *v13);\n    goto LABEL_11;\n  }\n  if ( v10 == 1 )\n  {\n    v11 = (unsigned int *)v6[1];\n    v12 = *(void (__fastcall ****)(_QWORD, _QWORD))(*((_QWORD *)v11 + 1) + 200LL);\n    if ( v12 )\n    {\n      (**v12)(v12, *v11);\n      j_j_free(v6[1]);\n      goto LABEL_23;\n    }\nLABEL_11:\n    j_j_free(v6[1]);\n  }\nLABEL_23:\n  j_j_free(v6);\n}", "assembly": "; \n; sub_180002C10 from 0x180002c10 to 0x180002ddf (463 bytes)\n; \n; 2 xrefs:\n; > <???> @ 0x180023428\n; > <???> @ 0x180049198\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+arg_8], rbx                                               ; +0x0, 0x180002c10\npush    rdi                                                            ; +0x5, 0x180002c15\nsub     rsp, 50h                                                       ; +0x6, 0x180002c16\nmov     rax, cs:__security_cookie                                      ; +0xa, 0x180002c1a\nxor     rax, rsp                                                       ; +0x11, 0x180002c21\nmov     [rsp+58h+var_18], rax                                          ; +0x14, 0x180002c24\nmov     rbx, rcx                                                       ; +0x19, 0x180002c29\nlea     rdi, [rcx+40h]                                                 ; +0x1c, 0x180002c2c\nmov     rcx, rdi                                                       ; +0x20, 0x180002c30\ncall    cs:pthread_mutex_lock                                          ; +0x23, 0x180002c33\nmov     r8, [rbx+38h]                                                  ; +0x29, 0x180002c39\nmov     r9, [r8+8]                                                     ; +0x2d, 0x180002c3d\ntest    r9, r9                                                         ; +0x31, 0x180002c41\njnz     short loc_180002C54                                            ; +0x34, 0x180002c44\nmov     rcx, rdi                                                       ; +0x36, 0x180002c46\ncall    cs:pthread_mutex_unlock                                        ; +0x39, 0x180002c49\njmp     loc_180002DC7                                                  ; +0x3f, 0x180002c4f\nmov     rax, [r8]                                                      ; +0x44, 0x180002c54\nmov     rcx, [rax]; Block                                              ; +0x47, 0x180002c57\nmov     rbx, [rcx+10h]                                                 ; +0x4a, 0x180002c5a\nmov     rdx, [rcx]                                                     ; +0x4e, 0x180002c5e\nlea     rax, [r9-1]                                                    ; +0x51, 0x180002c61\nmov     [r8+8], rax                                                    ; +0x55, 0x180002c65\nmov     rax, [rcx+8]                                                   ; +0x59, 0x180002c69\nmov     [rax], rdx                                                     ; +0x5d, 0x180002c6d\nmov     rax, [rcx+8]                                                   ; +0x60, 0x180002c70\nmov     [rdx+8], rax                                                   ; +0x64, 0x180002c74\nmov     edx, 18h                                                       ; +0x68, 0x180002c78\ncall    j_j_free                                                       ; +0x6d, 0x180002c7d\nmov     rcx, rdi                                                       ; +0x72, 0x180002c82\ncall    cs:pthread_mutex_unlock                                        ; +0x75, 0x180002c85\nmov     ecx, [rbx]                                                     ; +0x7b, 0x180002c8b\ntest    ecx, ecx                                                       ; +0x7d, 0x180002c8d\njz      loc_180002DB2                                                  ; +0x7f, 0x180002c8f\nsub     ecx, 1                                                         ; +0x85, 0x180002c95\njz      short loc_180002D05                                            ; +0x88, 0x180002c98\nsub     ecx, 1                                                         ; +0x8a, 0x180002c9a\njz      short loc_180002CD6                                            ; +0x8d, 0x180002c9d\ncmp     ecx, 1                                                         ; +0x8f, 0x180002c9f\njnz     loc_180002DBA                                                  ; +0x92, 0x180002ca2\nmov     rdx, [rbx+8]                                                   ; +0x98, 0x180002ca8\nmov     rax, [rdx+8]                                                   ; +0x9c, 0x180002cac\nmov     rcx, [rax+0C8h]                                                ; +0xa0, 0x180002cb0\ntest    rcx, rcx                                                       ; +0xa7, 0x180002cb7\njz      short loc_180002CF2                                            ; +0xaa, 0x180002cba\nmov     rax, [rcx]                                                     ; +0xac, 0x180002cbc\nmov     edx, [rdx]                                                     ; +0xaf, 0x180002cbf\ncall    qword ptr [rax]                                                ; +0xb1, 0x180002cc1\nmov     edx, 10h                                                       ; +0xb3, 0x180002cc3\nmov     rcx, [rbx+8]; Block                                            ; +0xb8, 0x180002cc8\ncall    j_j_free                                                       ; +0xbc, 0x180002ccc\njmp     loc_180002DBA                                                  ; +0xc1, 0x180002cd1\nmov     rdx, [rbx+8]                                                   ; +0xc6, 0x180002cd6\nmov     rax, [rdx+8]                                                   ; +0xca, 0x180002cda\nmov     rcx, [rax+0C8h]                                                ; +0xce, 0x180002cde\ntest    rcx, rcx                                                       ; +0xd5, 0x180002ce5\njz      short loc_180002CF2                                            ; +0xd8, 0x180002ce8\nmov     rax, [rcx]                                                     ; +0xda, 0x180002cea\nmov     edx, [rdx]                                                     ; +0xdd, 0x180002ced\ncall    qword ptr [rax+8]                                              ; +0xdf, 0x180002cef\nmov     edx, 10h                                                       ; +0xe2, 0x180002cf2\nmov     rcx, [rbx+8]; Block                                            ; +0xe7, 0x180002cf7\ncall    j_j_free                                                       ; +0xeb, 0x180002cfb\njmp     loc_180002DBA                                                  ; +0xf0, 0x180002d00\nmov     rdx, [rbx+8]                                                   ; +0xf5, 0x180002d05\nadd     rdx, 28h ; '('                                                 ; +0xf9, 0x180002d09\ncmp     qword ptr [rdx+18h], 0Fh                                       ; +0xfd, 0x180002d0d\njbe     short loc_180002D17                                            ; +0x102, 0x180002d12\nmov     rdx, [rdx]                                                     ; +0x104, 0x180002d14\nxorps   xmm0, xmm0                                                     ; +0x107, 0x180002d17\nmovups  xmmword ptr [rsp+58h+Block], xmm0                              ; +0x10a, 0x180002d1a\nxorps   xmm1, xmm1                                                     ; +0x10f, 0x180002d1f\nmovdqu  [rsp+58h+var_28], xmm1                                         ; +0x112, 0x180002d22\nmov     r8, 0FFFFFFFFFFFFFFFFh                                         ; +0x118, 0x180002d28\nnop                                                                    ; +0x11f, 0x180002d2f\ninc     r8                                                             ; +0x120, 0x180002d30\ncmp     byte ptr [rdx+r8], 0                                           ; +0x123, 0x180002d33\njnz     short loc_180002D30                                            ; +0x128, 0x180002d38\nlea     rcx, [rsp+58h+Block]                                           ; +0x12a, 0x180002d3a\ncall    sub_180003AB0                                                  ; +0x12f, 0x180002d3f\nnop                                                                    ; +0x134, 0x180002d44\ncall    cs:?sharedUserDefault@CCUserDefault@cocos2d@@SAPEAV12@XZ; cocos2d::CCUserDefault::sharedUserDefault(void) ; +0x135, 0x180002d45\nmov     rcx, rax                                                       ; +0x13b, 0x180002d4b\nlea     r8, [rsp+58h+Block]                                            ; +0x13e, 0x180002d4e\nlea     rdx, aDownloadedVers; \"downloaded-version-code\"                ; +0x143, 0x180002d53\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 &) ; +0x14a, 0x180002d5a\nnop                                                                    ; +0x150, 0x180002d60\nmov     rdx, qword ptr [rsp+58h+var_28+8]                              ; +0x151, 0x180002d61\ncmp     rdx, 0Fh                                                       ; +0x156, 0x180002d66\njbe     short loc_180002DA1                                            ; +0x15a, 0x180002d6a\ninc     rdx                                                            ; +0x15c, 0x180002d6c\nmov     rcx, [rsp+58h+Block]; Block                                    ; +0x15f, 0x180002d6f\nmov     rax, rcx                                                       ; +0x164, 0x180002d74\ncmp     rdx, 1000h                                                     ; +0x167, 0x180002d77\njb      short loc_180002D9C                                            ; +0x16e, 0x180002d7e\nadd     rdx, 27h ; '''                                                 ; +0x170, 0x180002d80\nmov     rcx, [rcx-8]                                                   ; +0x174, 0x180002d84\nsub     rax, rcx                                                       ; +0x178, 0x180002d88\nadd     rax, 0FFFFFFFFFFFFFFF8h                                        ; +0x17b, 0x180002d8b\ncmp     rax, 1Fh                                                       ; +0x17f, 0x180002d8f\njbe     short loc_180002D9C                                            ; +0x183, 0x180002d93\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x185, 0x180002d95\nalign 4                                                                ; +0x18b, 0x180002d9b\ncall    j_j_free                                                       ; +0x18c, 0x180002d9c\ncall    cs:?sharedUserDefault@CCUserDefault@cocos2d@@SAPEAV12@XZ; cocos2d::CCUserDefault::sharedUserDefault(void) ; +0x191, 0x180002da1\nmov     rcx, rax                                                       ; +0x197, 0x180002da7\ncall    cs:?flush@CCUserDefault@cocos2d@@QEAAXXZ; cocos2d::CCUserDefault::flush(void) ; +0x19a, 0x180002daa\njmp     short loc_180002DBA                                            ; +0x1a0, 0x180002db0\nmov     rdx, rbx                                                       ; +0x1a2, 0x180002db2\ncall    sub_180002DE0                                                  ; +0x1a5, 0x180002db5\nmov     edx, 10h                                                       ; +0x1aa, 0x180002dba\nmov     rcx, rbx; Block                                                ; +0x1af, 0x180002dbf\ncall    j_j_free                                                       ; +0x1b2, 0x180002dc2\nmov     rcx, [rsp+58h+var_18]                                          ; +0x1b7, 0x180002dc7\nxor     rcx, rsp; StackCookie                                          ; +0x1bc, 0x180002dcc\ncall    __security_check_cookie                                        ; +0x1bf, 0x180002dcf\nmov     rbx, [rsp+58h+arg_8]                                           ; +0x1c4, 0x180002dd4\nadd     rsp, 50h                                                       ; +0x1c9, 0x180002dd9\npop     rdi                                                            ; +0x1cd, 0x180002ddd\nretn                                                                   ; +0x1ce, 0x180002dde", "xrefs": ["<???> @ 0x180023428", "<???> @ 0x180049198"], "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"}