{"type": "func", "start": 6442551760, "end": 6442552327, "name": "sub_1800189D0", "pseudocode": "// \n// sub_1800189D0 from 0x1800189d0 to 0x180018c07 (567 bytes)\n// \n// 5 xrefs:\n// > sub_180017930 @ 0x18001794d\n// > <???> @ 0x18002f370\n// > <???> @ 0x18002f380\n// > <???> @ 0x18002f398\n// > <???> @ 0x18004ab54\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\nvoid __fastcall sub_1800189D0(__int64 a1, _BYTE *a2, const void *a3, size_t a4)\n{\n  _BYTE *v4; // r15\n  _BYTE *v6; // r13\n  __int64 v8; // rcx\n  size_t v11; // rsi\n  signed __int64 v12; // r12\n  unsigned __int64 v13; // rcx\n  unsigned __int64 v14; // rdx\n  size_t v15; // rcx\n  void *v16; // rax\n  char *v17; // rdi\n  size_t v18; // r8\n  const void *v19; // rdx\n  char *v20; // rcx\n  _BYTE *v21; // rcx\n  signed __int64 v22; // rsi\n  char *v23; // rdi\n  size_t v25; // [rsp+88h] [rbp+20h]\n\n  if ( a4 )\n  {\n    v4 = *(_BYTE **)(a1 + 8);\n    v6 = *(_BYTE **)a1;\n    v8 = *(_QWORD *)(a1 + 16);\n    if ( a4 > v8 - (__int64)v4 )\n    {\n      v11 = 0x7FFFFFFFFFFFFFFFLL;\n      v12 = v4 - v6;\n      if ( a4 > 0x7FFFFFFFFFFFFFFFLL - (v4 - v6) )\n        sub_180003530();\n      v13 = v8 - (_QWORD)v6;\n      v25 = v12 + a4;\n      v14 = v13 >> 1;\n      if ( v13 <= 0x7FFFFFFFFFFFFFFFLL - (v13 >> 1) )\n      {\n        v11 = v12 + a4;\n        if ( v14 + v13 >= v12 + a4 )\n          v11 = v14 + v13;\n        if ( v11 < 0x1000 )\n        {\n          if ( v11 )\n            v17 = (char *)operator new(v11);\n          else\n            v17 = nullptr;\n          goto LABEL_16;\n        }\n        v15 = v11 + 39;\n        if ( v11 + 39 < v11 )\n          Concurrency::cancel_current_task();\n      }\n      else\n      {\n        v15 = 0x8000000000000026uLL;\n      }\n      v16 = operator new(v15);\n      if ( !v16 )\n        goto LABEL_26;\n      v17 = (char *)(((unsigned __int64)v16 + 39) & 0xFFFFFFFFFFFFFFE0uLL);\n      *((_QWORD *)v17 - 1) = v16;\nLABEL_16:\n      memmove(&v17[a2 - v6], a3, a4);\n      if ( a4 == 1 && a2 == v4 )\n      {\n        v18 = v4 - v6;\n        v19 = v6;\n        v20 = v17;\n      }\n      else\n      {\n        memmove(v17, v6, a2 - v6);\n        v20 = &v17[a2 - v6 + a4];\n        v18 = v4 - a2;\n        v19 = a2;\n      }\n      memmove(v20, v19, v18);\n      v21 = *(_BYTE **)a1;\n      if ( !*(_QWORD *)a1 )\n        goto LABEL_25;\n      if ( *(_QWORD *)(a1 + 16) - (_QWORD)v21 < 0x1000u )\n      {\nLABEL_24:\n        j_j_free(v21);\nLABEL_25:\n        *(_QWORD *)a1 = v17;\n        *(_QWORD *)(a1 + 8) = &v17[v25];\n        *(_QWORD *)(a1 + 16) = &v17[v11];\n        return;\n      }\n      if ( (unsigned __int64)&v21[-*((_QWORD *)v21 - 1) - 8] <= 0x1F )\n      {\n        v21 = *((_BYTE **)v21 - 1);\n        goto LABEL_24;\n      }\nLABEL_26:\n      invalid_parameter_noinfo_noreturn();\n    }\n    v22 = v4 - a2;\n    if ( a4 >= v4 - a2 )\n    {\n      v23 = &a2[a4];\n      memmove(&a2[a4], a2, v4 - a2);\n      *(_QWORD *)(a1 + 8) = &v23[v22];\n    }\n    else\n    {\n      memmove(v4, &v4[-a4], a4);\n      *(_QWORD *)(a1 + 8) = &v4[a4];\n      memmove(&v4[-(v22 - a4)], a2, v22 - a4);\n    }\n    memmove(a2, a3, a4);\n  }\n}", "assembly": "; \n; sub_1800189D0 from 0x1800189d0 to 0x180018c07 (567 bytes)\n; \n; 5 xrefs:\n; > sub_180017930 @ 0x18001794d\n; > <???> @ 0x18002f370\n; > <???> @ 0x18002f380\n; > <???> @ 0x18002f398\n; > <???> @ 0x18004ab54\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\ntest    r9, r9                                                         ; +0x0, 0x1800189d0\njz      locret_180018BFA                                               ; +0x3, 0x1800189d3\nmov     [rsp+Src], r8                                                  ; +0x9, 0x1800189d9\npush    rbx                                                            ; +0xe, 0x1800189de\npush    rbp                                                            ; +0xf, 0x1800189df\npush    r12                                                            ; +0x10, 0x1800189e0\npush    r13                                                            ; +0x12, 0x1800189e2\npush    r14                                                            ; +0x14, 0x1800189e4\npush    r15                                                            ; +0x16, 0x1800189e6\nsub     rsp, 38h                                                       ; +0x18, 0x1800189e8\nmov     r15, [rcx+8]                                                   ; +0x1c, 0x1800189ec\nmov     r14, rcx                                                       ; +0x20, 0x1800189f0\nmov     r13, [rcx]                                                     ; +0x23, 0x1800189f3\nmov     rbp, r9                                                        ; +0x26, 0x1800189f6\nmov     rcx, [rcx+10h]                                                 ; +0x29, 0x1800189f9\nmov     r12, r8                                                        ; +0x2d, 0x1800189fd\nmov     rax, rcx                                                       ; +0x30, 0x180018a00\nmov     [rsp+68h+var_38], rsi                                          ; +0x33, 0x180018a03\nsub     rax, r15                                                       ; +0x38, 0x180018a08\nmov     [rsp+68h+var_40], rdi                                          ; +0x3b, 0x180018a0b\nmov     rbx, rdx                                                       ; +0x40, 0x180018a10\ncmp     r9, rax                                                        ; +0x43, 0x180018a13\njbe     loc_180018B75                                                  ; +0x46, 0x180018a16\nmov     r12, r15                                                       ; +0x4c, 0x180018a1c\nmov     rsi, 7FFFFFFFFFFFFFFFh                                         ; +0x4f, 0x180018a1f\nsub     r12, r13                                                       ; +0x59, 0x180018a29\nmov     rax, rsi                                                       ; +0x5c, 0x180018a2c\nsub     rax, r12                                                       ; +0x5f, 0x180018a2f\ncmp     r9, rax                                                        ; +0x62, 0x180018a32\nja      loc_180018BFB                                                  ; +0x65, 0x180018a35\nsub     rcx, r13                                                       ; +0x6b, 0x180018a3b\nlea     r8, [r12+r9]                                                   ; +0x6e, 0x180018a3e\nmov     rdx, rcx                                                       ; +0x72, 0x180018a42\nmov     [rsp+68h+arg_18], r8                                           ; +0x75, 0x180018a45\nshr     rdx, 1                                                         ; +0x7d, 0x180018a4d\nmov     rax, rsi                                                       ; +0x80, 0x180018a50\nsub     rax, rdx                                                       ; +0x83, 0x180018a53\ncmp     rcx, rax                                                       ; +0x86, 0x180018a56\njbe     short loc_180018A81                                            ; +0x89, 0x180018a59\nmov     rcx, 8000000000000026h; Size                                   ; +0x8b, 0x180018a5b\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0x95, 0x180018a65\ntest    rax, rax                                                       ; +0x9a, 0x180018a6a\njz      loc_180018B6E                                                  ; +0x9d, 0x180018a6d\nlea     rdi, [rax+27h]                                                 ; +0xa3, 0x180018a73\nand     rdi, 0FFFFFFFFFFFFFFE0h                                        ; +0xa7, 0x180018a77\nmov     [rdi-8], rax                                                   ; +0xab, 0x180018a7b\njmp     short loc_180018ABB                                            ; +0xaf, 0x180018a7f\nlea     rax, [rdx+rcx]                                                 ; +0xb1, 0x180018a81\nmov     rsi, r8                                                        ; +0xb5, 0x180018a85\ncmp     rax, r8                                                        ; +0xb8, 0x180018a88\ncmovnb  rsi, rax                                                       ; +0xbb, 0x180018a8b\ncmp     rsi, 1000h                                                     ; +0xbf, 0x180018a8f\njb      short loc_180018AA7                                            ; +0xc6, 0x180018a96\nlea     rcx, [rsi+27h]                                                 ; +0xc8, 0x180018a98\ncmp     rcx, rsi                                                       ; +0xcc, 0x180018a9c\njbe     loc_180018C01                                                  ; +0xcf, 0x180018a9f\njmp     short loc_180018A65                                            ; +0xd5, 0x180018aa5\ntest    rsi, rsi                                                       ; +0xd7, 0x180018aa7\njz      short loc_180018AB9                                            ; +0xda, 0x180018aaa\nmov     rcx, rsi; Size                                                 ; +0xdc, 0x180018aac\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0xdf, 0x180018aaf\nmov     rdi, rax                                                       ; +0xe4, 0x180018ab4\njmp     short loc_180018ABB                                            ; +0xe7, 0x180018ab7\nxor     edi, edi                                                       ; +0xe9, 0x180018ab9\nmov     rdx, [rsp+68h+Src]; Src                                        ; +0xeb, 0x180018abb\nmov     rax, rbx                                                       ; +0xf3, 0x180018ac3\nsub     rax, r13                                                       ; +0xf6, 0x180018ac6\nmov     r8, rbp; Size                                                  ; +0xf9, 0x180018ac9\nmov     [rsp+68h+Size], rax                                            ; +0xfc, 0x180018acc\nadd     rax, rdi                                                       ; +0x101, 0x180018ad1\nmov     rcx, rax; void *                                               ; +0x104, 0x180018ad4\nmov     [rsp+68h+arg_8], rax                                           ; +0x107, 0x180018ad7\ncall    memmove                                                        ; +0x10c, 0x180018adc\ncmp     rbp, 1                                                         ; +0x111, 0x180018ae1\njnz     short loc_180018AF7                                            ; +0x115, 0x180018ae5\ncmp     rbx, r15                                                       ; +0x117, 0x180018ae7\njnz     short loc_180018AF7                                            ; +0x11a, 0x180018aea\nmov     r8, r12                                                        ; +0x11c, 0x180018aec\nmov     rdx, r13                                                       ; +0x11f, 0x180018aef\nmov     rcx, rdi                                                       ; +0x122, 0x180018af2\njmp     short loc_180018B18                                            ; +0x125, 0x180018af5\nmov     r8, [rsp+68h+Size]; Size                                       ; +0x127, 0x180018af7\nmov     rdx, r13; Src                                                  ; +0x12c, 0x180018afc\nmov     rcx, rdi; void *                                               ; +0x12f, 0x180018aff\ncall    memmove                                                        ; +0x132, 0x180018b02\nmov     rcx, [rsp+68h+arg_8]                                           ; +0x137, 0x180018b07\nsub     r15, rbx                                                       ; +0x13c, 0x180018b0c\nadd     rcx, rbp; void *                                               ; +0x13f, 0x180018b0f\nmov     r8, r15; Size                                                  ; +0x142, 0x180018b12\nmov     rdx, rbx; Src                                                  ; +0x145, 0x180018b15\ncall    memmove                                                        ; +0x148, 0x180018b18\nmov     rcx, [r14]                                                     ; +0x14d, 0x180018b1d\ntest    rcx, rcx                                                       ; +0x150, 0x180018b20\njz      short loc_180018B52                                            ; +0x153, 0x180018b23\nmov     rdx, [r14+10h]                                                 ; +0x155, 0x180018b25\nsub     rdx, rcx                                                       ; +0x159, 0x180018b29\ncmp     rdx, 1000h                                                     ; +0x15c, 0x180018b2c\njb      short loc_180018B4D                                            ; +0x163, 0x180018b33\nmov     r8, [rcx-8]                                                    ; +0x165, 0x180018b35\nadd     rdx, 27h ; '''                                                 ; +0x169, 0x180018b39\nsub     rcx, r8                                                        ; +0x16d, 0x180018b3d\nlea     rax, [rcx-8]                                                   ; +0x170, 0x180018b40\ncmp     rax, 1Fh                                                       ; +0x174, 0x180018b44\nja      short loc_180018B6E                                            ; +0x178, 0x180018b48\nmov     rcx, r8; Block                                                 ; +0x17a, 0x180018b4a\ncall    j_j_free                                                       ; +0x17d, 0x180018b4d\nmov     rax, [rsp+68h+arg_18]                                          ; +0x182, 0x180018b52\nadd     rax, rdi                                                       ; +0x18a, 0x180018b5a\nmov     [r14], rdi                                                     ; +0x18d, 0x180018b5d\nmov     [r14+8], rax                                                   ; +0x190, 0x180018b60\nlea     rax, [rdi+rsi]                                                 ; +0x194, 0x180018b64\nmov     [r14+10h], rax                                                 ; +0x198, 0x180018b68\njmp     short loc_180018BE2                                            ; +0x19c, 0x180018b6c\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x19e, 0x180018b6e\ndb 0CCh                                                                ; +0x1a4, 0x180018b74\nmov     rsi, r15                                                       ; +0x1a5, 0x180018b75\nsub     rsi, rbx                                                       ; +0x1a8, 0x180018b78\ncmp     rbp, rsi                                                       ; +0x1ab, 0x180018b7b\njnb     short loc_180018BBD                                            ; +0x1ae, 0x180018b7e\nmov     rdx, r15                                                       ; +0x1b0, 0x180018b80\nmov     r8, rbp; Size                                                  ; +0x1b3, 0x180018b83\nsub     rdx, rbp; Src                                                  ; +0x1b6, 0x180018b86\nmov     rcx, r15; void *                                               ; +0x1b9, 0x180018b89\ncall    memmove                                                        ; +0x1bc, 0x180018b8c\nlea     rax, [r15+rbp]                                                 ; +0x1c1, 0x180018b91\nsub     rsi, rbp                                                       ; +0x1c5, 0x180018b95\nsub     r15, rsi                                                       ; +0x1c8, 0x180018b98\nmov     [r14+8], rax                                                   ; +0x1cb, 0x180018b9b\nmov     rcx, r15; void *                                               ; +0x1cf, 0x180018b9f\nmov     r8, rsi; Size                                                  ; +0x1d2, 0x180018ba2\nmov     rdx, rbx; Src                                                  ; +0x1d5, 0x180018ba5\ncall    memmove                                                        ; +0x1d8, 0x180018ba8\nmov     r8, rbp; Size                                                  ; +0x1dd, 0x180018bad\nmov     rdx, r12; Src                                                  ; +0x1e0, 0x180018bb0\nmov     rcx, rbx; void *                                               ; +0x1e3, 0x180018bb3\ncall    memmove                                                        ; +0x1e6, 0x180018bb6\njmp     short loc_180018BE2                                            ; +0x1eb, 0x180018bbb\nlea     rdi, [rdx+r9]                                                  ; +0x1ed, 0x180018bbd\nmov     r8, rsi; Size                                                  ; +0x1f1, 0x180018bc1\nmov     rcx, rdi; void *                                               ; +0x1f4, 0x180018bc4\ncall    memmove                                                        ; +0x1f7, 0x180018bc7\nlea     rax, [rsi+rdi]                                                 ; +0x1fc, 0x180018bcc\nmov     r8, rbp; Size                                                  ; +0x200, 0x180018bd0\nmov     rdx, r12; Src                                                  ; +0x203, 0x180018bd3\nmov     [r14+8], rax                                                   ; +0x206, 0x180018bd6\nmov     rcx, rbx; void *                                               ; +0x20a, 0x180018bda\ncall    memmove                                                        ; +0x20d, 0x180018bdd\nmov     rsi, [rsp+68h+var_38]                                          ; +0x212, 0x180018be2\nmov     rdi, [rsp+68h+var_40]                                          ; +0x217, 0x180018be7\nadd     rsp, 38h                                                       ; +0x21c, 0x180018bec\npop     r15                                                            ; +0x220, 0x180018bf0\npop     r14                                                            ; +0x222, 0x180018bf2\npop     r13                                                            ; +0x224, 0x180018bf4\npop     r12                                                            ; +0x226, 0x180018bf6\npop     rbp                                                            ; +0x228, 0x180018bf8\npop     rbx                                                            ; +0x229, 0x180018bf9\nretn                                                                   ; +0x22a, 0x180018bfa\ncall    sub_180003530                                                  ; +0x22b, 0x180018bfb\ndb 0CCh                                                                ; +0x230, 0x180018c00\ncall    ?cancel_current_task@Concurrency@@YAXXZ; Concurrency::cancel_current_task(void) ; +0x231, 0x180018c01\ndb 0CCh                                                                ; +0x236, 0x180018c06", "xrefs": ["sub_180017930 @ 0x18001794d", "<???> @ 0x18002f370", "<???> @ 0x18002f380", "<???> @ 0x18002f398", "<???> @ 0x18004ab54"], "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"}