{"type": "func", "start": 6442465296, "end": 6442465691, "name": "sub_180003810", "pseudocode": "// \n// sub_180003810 from 0x180003810 to 0x18000399b (395 bytes)\n// \n// 8 xrefs:\n// > sub_180001880 @ 0x1800018eb\n// > sub_1800039A0 @ 0x180003a10\n// > sub_180003A20 @ 0x180003a9d\n// > cocos2d::extension::WebSocket::init @ 0x180019f15\n// > <???> @ 0x18002d2b4\n// > <???> @ 0x18002d2c4\n// > <???> @ 0x18002d2e4\n// > <???> @ 0x180049258\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_QWORD *__fastcall sub_180003810(_QWORD *Src, unsigned __int64 a2, __int64 a3, const void *a4, size_t Size)\n{\n  size_t v5; // r14\n  __int64 v6; // rbx\n  size_t v9; // rbp\n  unsigned __int64 v10; // rdx\n  unsigned __int64 v11; // r13\n  __int64 v12; // rcx\n  size_t v13; // rcx\n  void *v14; // rax\n  _QWORD *v15; // rdi\n  char *v16; // r15\n  _QWORD *v17; // rbx\n\n  v5 = Src[2];\n  v6 = 0x7FFFFFFFFFFFFFFFLL;\n  if ( 0x7FFFFFFFFFFFFFFFLL - v5 < a2 )\n    sub_180003D90();\n  v9 = v5 + a2;\n  v10 = (v5 + a2) | 0xF;\n  v11 = Src[3];\n  if ( v10 > 0x7FFFFFFFFFFFFFFFLL || (v12 = v11 >> 1, v11 > 0x7FFFFFFFFFFFFFFFLL - (v11 >> 1)) )\n  {\n    v13 = 0x8000000000000027uLL;\n  }\n  else\n  {\n    v6 = v10;\n    if ( v10 < v12 + v11 )\n      v6 = v12 + v11;\n    if ( (unsigned __int64)(v6 + 1) < 0x1000 )\n    {\n      if ( v6 == -1 )\n        v15 = nullptr;\n      else\n        v15 = operator new(v6 + 1);\n      goto LABEL_15;\n    }\n    v13 = v6 + 40;\n    if ( v6 + 40 < (unsigned __int64)(v6 + 1) )\n      Concurrency::cancel_current_task();\n  }\n  v14 = operator new(v13);\n  if ( !v14 )\n    goto LABEL_20;\n  v15 = (_QWORD *)(((unsigned __int64)v14 + 39) & 0xFFFFFFFFFFFFFFE0uLL);\n  *(v15 - 1) = v14;\nLABEL_15:\n  Src[2] = v9;\n  v16 = (char *)v15 + v5;\n  Src[3] = v6;\n  if ( v11 <= 0xF )\n  {\n    memcpy(v15, Src, v5);\n    memcpy((char *)v15 + v5, a4, Size);\n    v16[Size] = 0;\n    goto LABEL_22;\n  }\n  v17 = (_QWORD *)*Src;\n  memcpy(v15, (const void *)*Src, v5);\n  memcpy((char *)v15 + v5, a4, Size);\n  v16[Size] = 0;\n  if ( v11 + 1 >= 0x1000 )\n  {\n    if ( (unsigned __int64)v17 - *(v17 - 1) - 8 <= 0x1F )\n    {\n      v17 = (_QWORD *)*(v17 - 1);\n      goto LABEL_19;\n    }\nLABEL_20:\n    invalid_parameter_noinfo_noreturn();\n  }\nLABEL_19:\n  j_j_free(v17);\nLABEL_22:\n  *Src = v15;\n  return Src;\n}", "assembly": "; \n; sub_180003810 from 0x180003810 to 0x18000399b (395 bytes)\n; \n; 8 xrefs:\n; > sub_180001880 @ 0x1800018eb\n; > sub_1800039A0 @ 0x180003a10\n; > sub_180003A20 @ 0x180003a9d\n; > cocos2d::extension::WebSocket::init @ 0x180019f15\n; > <???> @ 0x18002d2b4\n; > <???> @ 0x18002d2c4\n; > <???> @ 0x18002d2e4\n; > <???> @ 0x180049258\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\npush    rbx                                                            ; +0x0, 0x180003810\npush    rsi                                                            ; +0x2, 0x180003812\npush    r12                                                            ; +0x3, 0x180003813\npush    r14                                                            ; +0x5, 0x180003815\nsub     rsp, 28h                                                       ; +0x7, 0x180003817\nmov     r14, [rcx+10h]                                                 ; +0xb, 0x18000381b\nmov     rbx, 7FFFFFFFFFFFFFFFh                                         ; +0xf, 0x18000381f\nmov     rax, rbx                                                       ; +0x19, 0x180003829\nmov     r12, r9                                                        ; +0x1c, 0x18000382c\nsub     rax, r14                                                       ; +0x1f, 0x18000382f\nmov     rsi, rcx                                                       ; +0x22, 0x180003832\ncmp     rax, rdx                                                       ; +0x25, 0x180003835\njb      loc_18000398F                                                  ; +0x28, 0x180003838\nmov     [rsp+48h+arg_0], rbp                                           ; +0x2e, 0x18000383e\nlea     rbp, [r14+rdx]                                                 ; +0x33, 0x180003843\nmov     [rsp+48h+arg_8], rdi                                           ; +0x37, 0x180003847\nmov     rdx, rbp                                                       ; +0x3c, 0x18000384c\nmov     [rsp+48h+arg_10], r13                                          ; +0x3f, 0x18000384f\nor      rdx, 0Fh                                                       ; +0x44, 0x180003854\nmov     r13, [rcx+18h]                                                 ; +0x48, 0x180003858\nmov     [rsp+48h+var_28], r15                                          ; +0x4c, 0x18000385c\ncmp     rdx, rbx                                                       ; +0x51, 0x180003861\nja      short loc_1800038A0                                            ; +0x54, 0x180003864\nmov     rcx, r13                                                       ; +0x56, 0x180003866\nmov     rax, rbx                                                       ; +0x59, 0x180003869\nshr     rcx, 1                                                         ; +0x5c, 0x18000386c\nsub     rax, rcx                                                       ; +0x5f, 0x18000386f\ncmp     r13, rax                                                       ; +0x62, 0x180003872\nja      short loc_1800038A0                                            ; +0x65, 0x180003875\nlea     rax, [rcx+r13]                                                 ; +0x67, 0x180003877\nmov     rbx, rdx                                                       ; +0x6b, 0x18000387b\ncmp     rdx, rax                                                       ; +0x6e, 0x18000387e\ncmovb   rbx, rax                                                       ; +0x71, 0x180003881\nlea     rax, [rbx+1]                                                   ; +0x75, 0x180003885\ncmp     rax, 1000h                                                     ; +0x79, 0x180003889\njb      short loc_1800038CA                                            ; +0x7f, 0x18000388f\nlea     rcx, [rax+27h]                                                 ; +0x81, 0x180003891\ncmp     rcx, rax                                                       ; +0x85, 0x180003895\njbe     loc_180003995                                                  ; +0x88, 0x180003898\njmp     short loc_1800038AE                                            ; +0x8e, 0x18000389e\nmov     rcx, 8000000000000000h                                         ; +0x90, 0x1800038a0\nadd     rcx, 27h ; '''; Size                                           ; +0x9a, 0x1800038aa\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0x9e, 0x1800038ae\ntest    rax, rax                                                       ; +0xa3, 0x1800038b3\njz      loc_180003948                                                  ; +0xa6, 0x1800038b6\nlea     rdi, [rax+27h]                                                 ; +0xac, 0x1800038bc\nand     rdi, 0FFFFFFFFFFFFFFE0h                                        ; +0xb0, 0x1800038c0\nmov     [rdi-8], rax                                                   ; +0xb4, 0x1800038c4\njmp     short loc_1800038DE                                            ; +0xb8, 0x1800038c8\ntest    rax, rax                                                       ; +0xba, 0x1800038ca\njz      short loc_1800038DC                                            ; +0xbd, 0x1800038cd\nmov     rcx, rax; Size                                                 ; +0xbf, 0x1800038cf\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0xc2, 0x1800038d2\nmov     rdi, rax                                                       ; +0xc7, 0x1800038d7\njmp     short loc_1800038DE                                            ; +0xca, 0x1800038da\nxor     edi, edi                                                       ; +0xcc, 0x1800038dc\nmov     [rsi+10h], rbp                                                 ; +0xce, 0x1800038de\nlea     r15, [rdi+r14]                                                 ; +0xd2, 0x1800038e2\nmov     rbp, [rsp+48h+Size]                                            ; +0xd6, 0x1800038e6\nmov     r8, r14; Size                                                  ; +0xdb, 0x1800038eb\nmov     [rsi+18h], rbx                                                 ; +0xde, 0x1800038ee\nmov     rcx, rdi; void *                                               ; +0xe2, 0x1800038f2\ncmp     r13, 0Fh                                                       ; +0xe5, 0x1800038f5\njbe     short loc_18000394F                                            ; +0xe9, 0x1800038f9\nmov     rbx, [rsi]                                                     ; +0xeb, 0x1800038fb\nmov     rdx, rbx; Src                                                  ; +0xee, 0x1800038fe\ncall    memcpy                                                         ; +0xf1, 0x180003901\nmov     r8, rbp; Size                                                  ; +0xf6, 0x180003906\nmov     rdx, r12; Src                                                  ; +0xf9, 0x180003909\nmov     rcx, r15; void *                                               ; +0xfc, 0x18000390c\ncall    memcpy                                                         ; +0xff, 0x18000390f\nlea     rdx, [r13+1]                                                   ; +0x104, 0x180003914\nmov     byte ptr [r15+rbp], 0                                          ; +0x108, 0x180003918\ncmp     rdx, 1000h                                                     ; +0x10d, 0x18000391d\njb      short loc_18000393E                                            ; +0x114, 0x180003924\nmov     rcx, [rbx-8]                                                   ; +0x116, 0x180003926\nadd     rdx, 27h ; '''                                                 ; +0x11a, 0x18000392a\nsub     rbx, rcx                                                       ; +0x11e, 0x18000392e\nlea     rax, [rbx-8]                                                   ; +0x121, 0x180003931\ncmp     rax, 1Fh                                                       ; +0x125, 0x180003935\nja      short loc_180003948                                            ; +0x129, 0x180003939\nmov     rbx, rcx                                                       ; +0x12b, 0x18000393b\nmov     rcx, rbx; Block                                                ; +0x12e, 0x18000393e\ncall    j_j_free                                                       ; +0x131, 0x180003941\njmp     short loc_18000396A                                            ; +0x136, 0x180003946\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x138, 0x180003948\ndb 0CCh                                                                ; +0x13e, 0x18000394e\nmov     rdx, rsi; Src                                                  ; +0x13f, 0x18000394f\ncall    memcpy                                                         ; +0x142, 0x180003952\nmov     r8, rbp; Size                                                  ; +0x147, 0x180003957\nmov     rdx, r12; Src                                                  ; +0x14a, 0x18000395a\nmov     rcx, r15; void *                                               ; +0x14d, 0x18000395d\ncall    memcpy                                                         ; +0x150, 0x180003960\nmov     byte ptr [r15+rbp], 0                                          ; +0x155, 0x180003965\nmov     [rsi], rdi                                                     ; +0x15a, 0x18000396a\nmov     rax, rsi                                                       ; +0x15d, 0x18000396d\nmov     r13, [rsp+48h+arg_10]                                          ; +0x160, 0x180003970\nmov     rdi, [rsp+48h+arg_8]                                           ; +0x165, 0x180003975\nmov     rbp, [rsp+48h+arg_0]                                           ; +0x16a, 0x18000397a\nmov     r15, [rsp+48h+var_28]                                          ; +0x16f, 0x18000397f\nadd     rsp, 28h                                                       ; +0x174, 0x180003984\npop     r14                                                            ; +0x178, 0x180003988\npop     r12                                                            ; +0x17a, 0x18000398a\npop     rsi                                                            ; +0x17c, 0x18000398c\npop     rbx                                                            ; +0x17d, 0x18000398d\nretn                                                                   ; +0x17e, 0x18000398e\ncall    sub_180003D90                                                  ; +0x17f, 0x18000398f\ndb 0CCh                                                                ; +0x184, 0x180003994\ncall    ?cancel_current_task@Concurrency@@YAXXZ; Concurrency::cancel_current_task(void) ; +0x185, 0x180003995\ndb 0CCh                                                                ; +0x18a, 0x18000399a", "xrefs": ["sub_180001880 @ 0x1800018eb", "sub_1800039A0 @ 0x180003a10", "sub_180003A20 @ 0x180003a9d", "cocos2d::extension::WebSocket::init @ 0x180019f15", "<???> @ 0x18002d2b4", "<???> @ 0x18002d2c4", "<???> @ 0x18002d2e4", "<???> @ 0x180049258"], "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"}