{"type": "func", "start": 6442545696, "end": 6442546255, "name": "sub_180017220", "pseudocode": "// \n// sub_180017220 from 0x180017220 to 0x18001744f (559 bytes)\n// \n// 2 xrefs:\n// > StartAddress @ 0x180018c99\n// > <???> @ 0x18004aa28\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\nint __fastcall sub_180017220(struct _Mtx_internal_imp_t **a1)\n{\n  struct _Mtx_internal_imp_t *v2; // rdi\n  __int64 v3; // rdx\n  struct _Mtx_internal_imp_t *v4; // rbx\n  struct _Mtx_internal_imp_t *i; // rbx\n  struct _Mtx_internal_imp_t *v6; // rax\n  __int64 v7; // rbx\n  _BYTE *v8; // rdx\n  __int64 v9; // rcx\n  __int64 v10; // rcx\n  __int64 v11; // rsi\n  __int64 v12; // rcx\n  _BYTE *v14; // rdx\n  int result; // eax\n  _BYTE *v16; // rdx\n  _BYTE v17[56]; // [rsp+20h] [rbp-68h] BYREF\n  _BYTE *v18; // [rsp+58h] [rbp-30h]\n\n  v18 = nullptr;\n  v2 = (struct _Mtx_internal_imp_t *)((char *)*a1 + 64);\n  if ( Mtx_lock(v2) )\n  {\nLABEL_28:\n    std::_Throw_Cpp_error(5);\n    __debugbreak();\n  }\n  v4 = v2;\n  while ( 1 )\n  {\n    if ( *((_DWORD *)v4 + 19) == 0x7FFFFFFF )\n      goto LABEL_33;\n    for ( i = *a1;\n          !*((_BYTE *)i + 216) && !*((_QWORD *)i + 7);\n          Cnd_wait((struct _Mtx_internal_imp_t *)((char *)i + 144), v2) )\n    {\n      ;\n    }\n    v6 = *a1;\n    if ( *((_BYTE *)*a1 + 216) )\n    {\n      if ( !*((_QWORD *)v6 + 7) )\n        break;\n    }\n    v7 = *(_QWORD *)(*((_QWORD *)v6 + 4) + 8 * (*((_QWORD *)v6 + 6) & (*((_QWORD *)v6 + 5) - 1LL)));\n    if ( v17 != (_BYTE *)v7 )\n    {\n      if ( v18 )\n      {\n        v8 = v17;\n        LOBYTE(v8) = v18 != v17;\n        (*(void (__fastcall **)(_BYTE *, _BYTE *))(*(_QWORD *)v18 + 32LL))(v18, v8);\n        v18 = nullptr;\n      }\n      v9 = *(_QWORD *)(v7 + 56);\n      if ( v9 )\n      {\n        if ( v9 == v7 )\n        {\n          v18 = (_BYTE *)(*(__int64 (__fastcall **)(__int64, _BYTE *))(*(_QWORD *)v9 + 8LL))(v9, v17);\n          v10 = *(_QWORD *)(v7 + 56);\n          if ( !v10 )\n            goto LABEL_19;\n          LOBYTE(v3) = v10 != v7;\n          (*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)v10 + 32LL))(v10, v3);\n        }\n        else\n        {\n          v18 = *(_BYTE **)(v7 + 56);\n        }\n        *(_QWORD *)(v7 + 56) = 0;\n      }\n    }\nLABEL_19:\n    v4 = *a1;\n    v11 = *(_QWORD *)(*((_QWORD *)*a1 + 4) + 8 * (*((_QWORD *)*a1 + 6) & (*((_QWORD *)*a1 + 5) - 1LL)));\n    v12 = *(_QWORD *)(v11 + 56);\n    if ( v12 )\n    {\n      LOBYTE(v3) = v12 != v11;\n      (*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)v12 + 32LL))(v12, v3);\n      *(_QWORD *)(v11 + 56) = 0;\n    }\n    if ( (*((_QWORD *)v4 + 7))-- == 1 )\n      *((_QWORD *)v4 + 6) = 0;\n    else\n      ++*((_QWORD *)v4 + 6);\n    Mtx_unlock(v2);\n    _InterlockedIncrement64((volatile signed __int64 *)*a1 + 28);\n    if ( !v18 )\n    {\n      std::_Xbad_function_call();\nLABEL_33:\n      *((_DWORD *)v4 + 19) = 2147483646;\n      std::_Throw_Cpp_error(6);\n      JUMPOUT(0x18001744ELL);\n    }\n    (*(void (__fastcall **)(_BYTE *))(*(_QWORD *)v18 + 16LL))(v18);\n    _InterlockedDecrement64((volatile signed __int64 *)*a1 + 28);\n    if ( v18 )\n    {\n      v14 = v17;\n      LOBYTE(v14) = v18 != v17;\n      (*(void (__fastcall **)(_BYTE *, _BYTE *))(*(_QWORD *)v18 + 32LL))(v18, v14);\n    }\n    v18 = nullptr;\n    v2 = (struct _Mtx_internal_imp_t *)((char *)*a1 + 64);\n    v4 = v2;\n    if ( Mtx_lock(v2) )\n      goto LABEL_28;\n  }\n  result = Mtx_unlock(v2);\n  if ( v18 )\n  {\n    v16 = v17;\n    LOBYTE(v16) = v18 != v17;\n    return (*(__int64 (__fastcall **)(_BYTE *, _BYTE *))(*(_QWORD *)v18 + 32LL))(v18, v16);\n  }\n  return result;\n}", "assembly": "; \n; sub_180017220 from 0x180017220 to 0x18001744f (559 bytes)\n; \n; 2 xrefs:\n; > StartAddress @ 0x180018c99\n; > <???> @ 0x18004aa28\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, 0x180017220\nmov     [rsp+arg_10], rbp                                              ; +0x5, 0x180017225\npush    rsi                                                            ; +0xa, 0x18001722a\npush    rdi                                                            ; +0xb, 0x18001722b\npush    r14                                                            ; +0xc, 0x18001722c\nsub     rsp, 70h                                                       ; +0xe, 0x18001722e\nmov     rax, cs:__security_cookie                                      ; +0x12, 0x180017232\nxor     rax, rsp                                                       ; +0x19, 0x180017239\nmov     [rsp+88h+var_28], rax                                          ; +0x1c, 0x18001723c\nmov     r14, rcx                                                       ; +0x21, 0x180017241\nxor     ebp, ebp                                                       ; +0x24, 0x180017244\nmov     [rsp+88h+var_30], rbp                                          ; +0x26, 0x180017246\nmov     rdi, [rcx]                                                     ; +0x2b, 0x18001724b\nadd     rdi, 40h ; '@'                                                 ; +0x2e, 0x18001724e\nmov     rcx, rdi; _Mtx_t                                               ; +0x32, 0x180017252\ncall    cs:_Mtx_lock                                                   ; +0x35, 0x180017255\ntest    eax, eax                                                       ; +0x3b, 0x18001725b\njnz     loc_1800173E2                                                  ; +0x3d, 0x18001725d\nmov     rbx, rdi                                                       ; +0x43, 0x180017263\nnop     word ptr [rax+rax+00000000h]                                   ; +0x46, 0x180017266\ncmp     dword ptr [rbx+4Ch], 7FFFFFFFh                                 ; +0x50, 0x180017270\njz      loc_18001743C                                                  ; +0x57, 0x180017277\nmov     rbx, [r14]                                                     ; +0x5d, 0x18001727d\ncmp     byte ptr [rbx+0D8h], 0                                         ; +0x60, 0x180017280\njnz     short loc_1800172A2                                            ; +0x67, 0x180017287\ncmp     qword ptr [rbx+38h], 0                                         ; +0x69, 0x180017289\njnz     short loc_1800172A2                                            ; +0x6e, 0x18001728e\nmov     rdx, rdi; _Mtx_t                                               ; +0x70, 0x180017290\nlea     rcx, [rbx+90h]; _Cnd_t                                         ; +0x73, 0x180017293\ncall    cs:_Cnd_wait                                                   ; +0x7a, 0x18001729a\njmp     short loc_180017280                                            ; +0x80, 0x1800172a0\nmov     rax, [r14]                                                     ; +0x82, 0x1800172a2\ncmp     byte ptr [rax+0D8h], 0                                         ; +0x85, 0x1800172a5\njz      short loc_1800172B9                                            ; +0x8c, 0x1800172ac\ncmp     qword ptr [rax+38h], 0                                         ; +0x8e, 0x1800172ae\njz      loc_1800173EE                                                  ; +0x93, 0x1800172b3\nmov     rcx, [rax+28h]                                                 ; +0x99, 0x1800172b9\ndec     rcx                                                            ; +0x9d, 0x1800172bd\nand     rcx, [rax+30h]                                                 ; +0xa0, 0x1800172c0\nmov     rax, [rax+20h]                                                 ; +0xa4, 0x1800172c4\nmov     rbx, [rax+rcx*8]                                               ; +0xa8, 0x1800172c8\nlea     rax, [rsp+88h+var_68]                                          ; +0xac, 0x1800172cc\ncmp     rax, rbx                                                       ; +0xb1, 0x1800172d1\njz      short loc_180017334                                            ; +0xb4, 0x1800172d4\nmov     rcx, [rsp+88h+var_30]                                          ; +0xb6, 0x1800172d6\ntest    rcx, rcx                                                       ; +0xbb, 0x1800172db\njz      short loc_1800172F6                                            ; +0xbe, 0x1800172de\nmov     rax, [rcx]                                                     ; +0xc0, 0x1800172e0\nlea     rdx, [rsp+88h+var_68]                                          ; +0xc3, 0x1800172e3\ncmp     rcx, rdx                                                       ; +0xc8, 0x1800172e8\nsetnz   dl                                                             ; +0xcb, 0x1800172eb\ncall    qword ptr [rax+20h]                                            ; +0xce, 0x1800172ee\nmov     [rsp+88h+var_30], rbp                                          ; +0xd1, 0x1800172f1\nmov     rcx, [rbx+38h]                                                 ; +0xd6, 0x1800172f6\ntest    rcx, rcx                                                       ; +0xda, 0x1800172fa\njz      short loc_180017334                                            ; +0xdd, 0x1800172fd\ncmp     rcx, rbx                                                       ; +0xdf, 0x1800172ff\njnz     short loc_18001732B                                            ; +0xe2, 0x180017302\nmov     rax, [rcx]                                                     ; +0xe4, 0x180017304\nlea     rdx, [rsp+88h+var_68]                                          ; +0xe7, 0x180017307\ncall    qword ptr [rax+8]                                              ; +0xec, 0x18001730c\nmov     [rsp+88h+var_30], rax                                          ; +0xef, 0x18001730f\nmov     rcx, [rbx+38h]                                                 ; +0xf4, 0x180017314\ntest    rcx, rcx                                                       ; +0xf8, 0x180017318\njz      short loc_180017334                                            ; +0xfb, 0x18001731b\nmov     rax, [rcx]                                                     ; +0xfd, 0x18001731d\ncmp     rcx, rbx                                                       ; +0x100, 0x180017320\nsetnz   dl                                                             ; +0x103, 0x180017323\ncall    qword ptr [rax+20h]                                            ; +0x106, 0x180017326\njmp     short loc_180017330                                            ; +0x109, 0x180017329\nmov     [rsp+88h+var_30], rcx                                          ; +0x10b, 0x18001732b\nmov     [rbx+38h], rbp                                                 ; +0x110, 0x180017330\nmov     rbx, [r14]                                                     ; +0x114, 0x180017334\nmov     rcx, [rbx+28h]                                                 ; +0x117, 0x180017337\ndec     rcx                                                            ; +0x11b, 0x18001733b\nand     rcx, [rbx+30h]                                                 ; +0x11e, 0x18001733e\nmov     rax, [rbx+20h]                                                 ; +0x122, 0x180017342\nmov     rsi, [rax+rcx*8]                                               ; +0x126, 0x180017346\nmov     rcx, [rsi+38h]                                                 ; +0x12a, 0x18001734a\ntest    rcx, rcx                                                       ; +0x12e, 0x18001734e\njz      short loc_180017363                                            ; +0x131, 0x180017351\nmov     rax, [rcx]                                                     ; +0x133, 0x180017353\ncmp     rcx, rsi                                                       ; +0x136, 0x180017356\nsetnz   dl                                                             ; +0x139, 0x180017359\ncall    qword ptr [rax+20h]                                            ; +0x13c, 0x18001735c\nmov     [rsi+38h], rbp                                                 ; +0x13f, 0x18001735f\nsub     qword ptr [rbx+38h], 1                                         ; +0x143, 0x180017363\njnz     short loc_180017370                                            ; +0x148, 0x180017368\nmov     [rbx+30h], rbp                                                 ; +0x14a, 0x18001736a\njmp     short loc_180017374                                            ; +0x14e, 0x18001736e\ninc     qword ptr [rbx+30h]                                            ; +0x150, 0x180017370\nmov     rcx, rdi; _Mtx_t                                               ; +0x154, 0x180017374\ncall    cs:_Mtx_unlock                                                 ; +0x157, 0x180017377\nmov     rax, [r14]                                                     ; +0x15d, 0x18001737d\nlock inc qword ptr [rax+0E0h]                                          ; +0x160, 0x180017380\nmov     rcx, [rsp+88h+var_30]                                          ; +0x168, 0x180017388\ntest    rcx, rcx                                                       ; +0x16d, 0x18001738d\njz      loc_180017435                                                  ; +0x170, 0x180017390\nmov     rax, [rcx]                                                     ; +0x176, 0x180017396\ncall    qword ptr [rax+10h]                                            ; +0x179, 0x180017399\nmov     rax, [r14]                                                     ; +0x17c, 0x18001739c\nlock dec qword ptr [rax+0E0h]                                          ; +0x17f, 0x18001739f\nmov     rcx, [rsp+88h+var_30]                                          ; +0x187, 0x1800173a7\ntest    rcx, rcx                                                       ; +0x18c, 0x1800173ac\njz      short loc_1800173C2                                            ; +0x18f, 0x1800173af\nmov     rax, [rcx]                                                     ; +0x191, 0x1800173b1\nlea     rdx, [rsp+88h+var_68]                                          ; +0x194, 0x1800173b4\ncmp     rcx, rdx                                                       ; +0x199, 0x1800173b9\nsetnz   dl                                                             ; +0x19c, 0x1800173bc\ncall    qword ptr [rax+20h]                                            ; +0x19f, 0x1800173bf\nmov     [rsp+88h+var_30], rbp                                          ; +0x1a2, 0x1800173c2\nmov     rdi, [r14]                                                     ; +0x1a7, 0x1800173c7\nadd     rdi, 40h ; '@'                                                 ; +0x1aa, 0x1800173ca\nmov     rbx, rdi                                                       ; +0x1ae, 0x1800173ce\nmov     rcx, rdi; _Mtx_t                                               ; +0x1b1, 0x1800173d1\ncall    cs:_Mtx_lock                                                   ; +0x1b4, 0x1800173d4\ntest    eax, eax                                                       ; +0x1ba, 0x1800173da\njz      loc_180017270                                                  ; +0x1bc, 0x1800173dc\nmov     ecx, 5                                                         ; +0x1c2, 0x1800173e2\ncall    cs:?_Throw_Cpp_error@std@@YAXH@Z; std::_Throw_Cpp_error(int)   ; +0x1c7, 0x1800173e7\nint     3; Trap to Debugger                                            ; +0x1cd, 0x1800173ed\nmov     rcx, rdi; _Mtx_t                                               ; +0x1ce, 0x1800173ee\ncall    cs:_Mtx_unlock                                                 ; +0x1d1, 0x1800173f1\nnop                                                                    ; +0x1d7, 0x1800173f7\nmov     rcx, [rsp+88h+var_30]                                          ; +0x1d8, 0x1800173f8\ntest    rcx, rcx                                                       ; +0x1dd, 0x1800173fd\njz      short loc_180017413                                            ; +0x1e0, 0x180017400\nmov     rax, [rcx]                                                     ; +0x1e2, 0x180017402\nlea     rdx, [rsp+88h+var_68]                                          ; +0x1e5, 0x180017405\ncmp     rcx, rdx                                                       ; +0x1ea, 0x18001740a\nsetnz   dl                                                             ; +0x1ed, 0x18001740d\ncall    qword ptr [rax+20h]                                            ; +0x1f0, 0x180017410\nmov     rcx, [rsp+88h+var_28]                                          ; +0x1f3, 0x180017413\nxor     rcx, rsp; StackCookie                                          ; +0x1f8, 0x180017418\ncall    __security_check_cookie                                        ; +0x1fb, 0x18001741b\nlea     r11, [rsp+88h+var_18]                                          ; +0x200, 0x180017420\nmov     rbx, [r11+28h]                                                 ; +0x205, 0x180017425\nmov     rbp, [r11+30h]                                                 ; +0x209, 0x180017429\nmov     rsp, r11                                                       ; +0x20d, 0x18001742d\npop     r14                                                            ; +0x210, 0x180017430\npop     rdi                                                            ; +0x212, 0x180017432\npop     rsi                                                            ; +0x213, 0x180017433\nretn                                                                   ; +0x214, 0x180017434\ncall    cs:?_Xbad_function_call@std@@YAXXZ; std::_Xbad_function_call(void) ; +0x215, 0x180017435\nnop                                                                    ; +0x21b, 0x18001743b\nmov     dword ptr [rbx+4Ch], 7FFFFFFEh                                 ; +0x21c, 0x18001743c\nmov     ecx, 6                                                         ; +0x223, 0x180017443\ncall    cs:?_Throw_Cpp_error@std@@YAXH@Z; std::_Throw_Cpp_error(int)   ; +0x228, 0x180017448\ndb 0CCh                                                                ; +0x22e, 0x18001744e", "xrefs": ["StartAddress @ 0x180018c99", "<???> @ 0x18004aa28"], "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"}