{"type": "func", "start": 6442463584, "end": 6442464029, "name": "sub_180003160", "pseudocode": "// \n// sub_180003160 from 0x180003160 to 0x18000331d (445 bytes)\n// \n// 2 xrefs:\n// > sub_180003320 @ 0x1800034fb\n// > <???> @ 0x1800491bc\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\nchar *__fastcall sub_180003160(__int64 *a1, __int64 a2, __int64 a3)\n{\n  __int64 v5; // r12\n  __int64 v6; // r15\n  unsigned __int64 v7; // r15\n  unsigned __int64 v8; // rcx\n  unsigned __int64 v9; // rdx\n  unsigned __int64 v10; // r14\n  unsigned __int64 v11; // rsi\n  void *v12; // rax\n  _OWORD *v13; // rbx\n  char *v14; // r14\n  __int64 v15; // rdx\n  __int64 v16; // rcx\n  _OWORD *v17; // r8\n  void *v18; // rcx\n  __int64 v20; // rcx\n  char *v21; // [rsp+70h] [rbp+8h]\n  unsigned __int64 v22; // [rsp+78h] [rbp+10h]\n  __int64 v23; // [rsp+80h] [rbp+18h]\n\n  v23 = a3;\n  v5 = a2 - *a1;\n  v6 = (a1[1] - *a1) >> 5;\n  if ( v6 == 0x7FFFFFFFFFFFFFFLL )\n    sub_180003530();\n  v7 = v6 + 1;\n  v8 = (a1[2] - *a1) >> 5;\n  v9 = v8 >> 1;\n  if ( v8 > 0x7FFFFFFFFFFFFFFLL - (v8 >> 1) )\n    goto LABEL_25;\n  v10 = v7;\n  if ( v9 + v8 >= v7 )\n    v10 = v9 + v8;\n  if ( v10 > 0x7FFFFFFFFFFFFFFLL )\n    goto LABEL_25;\n  v11 = 32 * v10;\n  v22 = v10;\n  if ( 32 * v10 < 0x1000 )\n  {\n    if ( v11 )\n    {\n      v13 = operator new(32 * v10);\n      a3 = v23;\n    }\n    else\n    {\n      v13 = nullptr;\n    }\n    v22 = v10;\n    goto LABEL_14;\n  }\n  if ( v11 + 39 < v11 )\nLABEL_25:\n    Concurrency::cancel_current_task();\n  v12 = operator new(v11 + 39);\n  if ( !v12 )\n    goto LABEL_24;\n  v13 = (_OWORD *)(((unsigned __int64)v12 + 39) & 0xFFFFFFFFFFFFFFE0uLL);\n  *((_QWORD *)v13 - 1) = v12;\n  a3 = v23;\nLABEL_14:\n  v14 = (char *)v13 + (v5 & 0xFFFFFFFFFFFFFFE0uLL);\n  try\n  {\n    sub_180003F50(v14, a3);\n    v21 = (char *)v13 + (v5 & 0xFFFFFFFFFFFFFFE0uLL);\n    v15 = a1[1];\n    v16 = *a1;\n    v17 = v13;\n    if ( a2 != v15 )\n    {\n      sub_1800030E0(v16, a2, v13);\n      v21 = (char *)v13;\n      v17 = v14 + 32;\n      v15 = a1[1];\n      v16 = a2;\n    }\n    sub_1800030E0(v16, v15, v17);\n  }\n  catch ( ... )\n  {\n    sub_1800036B0(v21, v14 + 32);\n    sub_1800035E0(v20, v13, v22);\n    throw;\n  }\n  if ( *a1 )\n  {\n    sub_1800036B0(*a1, a1[1]);\n    v18 = (void *)*a1;\n    if ( ((a1[2] - *a1) & 0xFFFFFFFFFFFFFFE0uLL) < 0x1000 )\n    {\nLABEL_22:\n      j_j_free(v18);\n      goto LABEL_23;\n    }\n    if ( (unsigned __int64)v18 - *((_QWORD *)v18 - 1) - 8 <= 0x1F )\n    {\n      v18 = *((void **)v18 - 1);\n      goto LABEL_22;\n    }\nLABEL_24:\n    invalid_parameter_noinfo_noreturn();\n  }\nLABEL_23:\n  *a1 = (__int64)v13;\n  a1[1] = (__int64)&v13[2 * v7];\n  a1[2] = (__int64)&v13[v11 / 0x10];\n  return (char *)v13 + (v5 & 0xFFFFFFFFFFFFFFE0uLL);\n}", "assembly": "; \n; sub_180003160 from 0x180003160 to 0x18000331d (445 bytes)\n; \n; 2 xrefs:\n; > sub_180003320 @ 0x1800034fb\n; > <???> @ 0x1800491bc\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_10], r8                                               ; +0x0, 0x180003160\npush    rbx                                                            ; +0x5, 0x180003165\npush    rsi                                                            ; +0x6, 0x180003166\npush    rdi                                                            ; +0x7, 0x180003167\npush    r12                                                            ; +0x8, 0x180003168\npush    r13                                                            ; +0xa, 0x18000316a\npush    r14                                                            ; +0xc, 0x18000316c\npush    r15                                                            ; +0xe, 0x18000316e\nsub     rsp, 30h                                                       ; +0x10, 0x180003170\nmov     r13, rdx                                                       ; +0x14, 0x180003174\nmov     rdi, rcx                                                       ; +0x17, 0x180003177\nmov     rax, [rcx]                                                     ; +0x1a, 0x18000317a\nmov     r12, rdx                                                       ; +0x1d, 0x18000317d\nsub     r12, rax                                                       ; +0x20, 0x180003180\nmov     r15, [rcx+8]                                                   ; +0x23, 0x180003183\nsub     r15, rax                                                       ; +0x27, 0x180003187\nsar     r15, 5                                                         ; +0x2a, 0x18000318a\nmov     r9, 7FFFFFFFFFFFFFFh                                           ; +0x2e, 0x18000318e\ncmp     r15, r9                                                        ; +0x38, 0x180003198\njz      loc_180003317                                                  ; +0x3b, 0x18000319b\ninc     r15                                                            ; +0x41, 0x1800031a1\nmov     rcx, [rcx+10h]                                                 ; +0x44, 0x1800031a4\nsub     rcx, rax                                                       ; +0x48, 0x1800031a8\nsar     rcx, 5                                                         ; +0x4b, 0x1800031ab\nmov     rdx, rcx                                                       ; +0x4f, 0x1800031af\nshr     rdx, 1                                                         ; +0x52, 0x1800031b2\nmov     rax, r9                                                        ; +0x55, 0x1800031b5\nsub     rax, rdx                                                       ; +0x58, 0x1800031b8\ncmp     rcx, rax                                                       ; +0x5b, 0x1800031bb\nja      loc_180003311                                                  ; +0x5e, 0x1800031be\nlea     rax, [rdx+rcx]                                                 ; +0x64, 0x1800031c4\nmov     r14, r15                                                       ; +0x68, 0x1800031c8\ncmp     rax, r15                                                       ; +0x6b, 0x1800031cb\ncmovnb  r14, rax                                                       ; +0x6e, 0x1800031ce\ncmp     r14, r9                                                        ; +0x72, 0x1800031d2\nja      loc_180003311                                                  ; +0x75, 0x1800031d5\nmov     rsi, r14                                                       ; +0x7b, 0x1800031db\nshl     rsi, 5                                                         ; +0x7e, 0x1800031de\nmov     [rsp+68h+arg_8], r14                                           ; +0x82, 0x1800031e2\ncmp     rsi, 1000h                                                     ; +0x87, 0x1800031e7\njb      short loc_180003221                                            ; +0x8e, 0x1800031ee\nlea     rcx, [rsi+27h]; Size                                           ; +0x90, 0x1800031f0\ncmp     rcx, rsi                                                       ; +0x94, 0x1800031f4\njbe     loc_180003311                                                  ; +0x97, 0x1800031f7\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0x9d, 0x1800031fd\ntest    rax, rax                                                       ; +0xa2, 0x180003202\njz      loc_18000330A                                                  ; +0xa5, 0x180003205\nlea     rbx, [rax+27h]                                                 ; +0xab, 0x18000320b\nand     rbx, 0FFFFFFFFFFFFFFE0h                                        ; +0xaf, 0x18000320f\nmov     [rbx-8], rax                                                   ; +0xb3, 0x180003213\nmov     r8, [rsp+68h+arg_10]                                           ; +0xb7, 0x180003217\njmp     short loc_180003242                                            ; +0xbf, 0x18000321f\ntest    rsi, rsi                                                       ; +0xc1, 0x180003221\njz      short loc_18000323B                                            ; +0xc4, 0x180003224\nmov     rcx, rsi; Size                                                 ; +0xc6, 0x180003226\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0xc9, 0x180003229\nmov     rbx, rax                                                       ; +0xce, 0x18000322e\nmov     r8, [rsp+68h+arg_10]                                           ; +0xd1, 0x180003231\njmp     short loc_18000323D                                            ; +0xd9, 0x180003239\nxor     ebx, ebx                                                       ; +0xdb, 0x18000323b\nmov     [rsp+68h+arg_8], r14                                           ; +0xdd, 0x18000323d\nmov     [rsp+68h+arg_18], rbx                                          ; +0xe2, 0x180003242\nand     r12, 0FFFFFFFFFFFFFFE0h                                        ; +0xea, 0x18000324a\nlea     r14, [r12+rbx]                                                 ; +0xee, 0x18000324e\nlea     r12, [r14+20h]                                                 ; +0xf2, 0x180003252\nmov     [rsp+68h+var_48], r12                                          ; +0xf6, 0x180003256\nmov     [rsp+68h+arg_0], r12                                           ; +0xfb, 0x18000325b\nmov     rdx, r8                                                        ; +0x100, 0x180003260\nmov     rcx, r14                                                       ; +0x103, 0x180003263\ncall    sub_180003F50                                                  ; +0x106, 0x180003266\nmov     [rsp+68h+arg_0], r14                                           ; +0x10b, 0x18000326b\nmov     rdx, [rdi+8]                                                   ; +0x110, 0x180003270\nmov     rcx, [rdi]                                                     ; +0x114, 0x180003274\nmov     r8, rbx                                                        ; +0x117, 0x180003277\ncmp     r13, rdx                                                       ; +0x11a, 0x18000327a\njz      short loc_180003296                                            ; +0x11d, 0x18000327d\nmov     rdx, r13                                                       ; +0x11f, 0x18000327f\ncall    sub_1800030E0                                                  ; +0x122, 0x180003282\nmov     [rsp+68h+arg_0], rbx                                           ; +0x127, 0x180003287\nmov     r8, r12                                                        ; +0x12c, 0x18000328c\nmov     rdx, [rdi+8]                                                   ; +0x12f, 0x18000328f\nmov     rcx, r13                                                       ; +0x133, 0x180003293\ncall    sub_1800030E0                                                  ; +0x136, 0x180003296\nnop                                                                    ; +0x13b, 0x18000329b\nmov     rcx, [rdi]                                                     ; +0x13c, 0x18000329c\ntest    rcx, rcx                                                       ; +0x13f, 0x18000329f\njz      short loc_1800032E1                                            ; +0x142, 0x1800032a2\nmov     rdx, [rdi+8]                                                   ; +0x144, 0x1800032a4\ncall    sub_1800036B0                                                  ; +0x148, 0x1800032a8\nmov     rcx, [rdi]                                                     ; +0x14d, 0x1800032ad\nmov     rdx, [rdi+10h]                                                 ; +0x150, 0x1800032b0\nsub     rdx, rcx                                                       ; +0x154, 0x1800032b4\nand     rdx, 0FFFFFFFFFFFFFFE0h                                        ; +0x157, 0x1800032b7\ncmp     rdx, 1000h                                                     ; +0x15b, 0x1800032bb\njb      short loc_1800032DC                                            ; +0x162, 0x1800032c2\nadd     rdx, 27h ; '''                                                 ; +0x164, 0x1800032c4\nmov     r8, [rcx-8]                                                    ; +0x168, 0x1800032c8\nsub     rcx, r8                                                        ; +0x16c, 0x1800032cc\nlea     rax, [rcx-8]                                                   ; +0x16f, 0x1800032cf\ncmp     rax, 1Fh                                                       ; +0x173, 0x1800032d3\nja      short loc_18000330A                                            ; +0x177, 0x1800032d7\nmov     rcx, r8; Block                                                 ; +0x179, 0x1800032d9\ncall    j_j_free                                                       ; +0x17c, 0x1800032dc\nmov     [rdi], rbx                                                     ; +0x181, 0x1800032e1\nshl     r15, 5                                                         ; +0x184, 0x1800032e4\nadd     r15, rbx                                                       ; +0x188, 0x1800032e8\nmov     [rdi+8], r15                                                   ; +0x18b, 0x1800032eb\nlea     rcx, [rsi+rbx]                                                 ; +0x18f, 0x1800032ef\nmov     [rdi+10h], rcx                                                 ; +0x193, 0x1800032f3\nmov     rax, r14                                                       ; +0x197, 0x1800032f7\nadd     rsp, 30h                                                       ; +0x19a, 0x1800032fa\npop     r15                                                            ; +0x19e, 0x1800032fe\npop     r14                                                            ; +0x1a0, 0x180003300\npop     r13                                                            ; +0x1a2, 0x180003302\npop     r12                                                            ; +0x1a4, 0x180003304\npop     rdi                                                            ; +0x1a6, 0x180003306\npop     rsi                                                            ; +0x1a7, 0x180003307\npop     rbx                                                            ; +0x1a8, 0x180003308\nretn                                                                   ; +0x1a9, 0x180003309\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x1aa, 0x18000330a\ndb 0CCh                                                                ; +0x1b0, 0x180003310\ncall    ?cancel_current_task@Concurrency@@YAXXZ; Concurrency::cancel_current_task(void) ; +0x1b1, 0x180003311\ndb 0CCh                                                                ; +0x1b6, 0x180003316\ncall    sub_180003530                                                  ; +0x1b7, 0x180003317\ndb 0CCh                                                                ; +0x1bc, 0x18000331c", "xrefs": ["sub_180003320 @ 0x1800034fb", "<???> @ 0x1800491bc"], "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"}