// // sub_180017220 from 0x180017220 to 0x18001744f (559 bytes) // // 2 xrefs: // > StartAddress @ 0x180018c99 // > @ 0x18004aa28 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // // Hidden C++ exception states: #wind=1 int __fastcall sub_180017220(struct _Mtx_internal_imp_t **a1) { struct _Mtx_internal_imp_t *v2; // rdi __int64 v3; // rdx struct _Mtx_internal_imp_t *v4; // rbx struct _Mtx_internal_imp_t *i; // rbx struct _Mtx_internal_imp_t *v6; // rax __int64 v7; // rbx _BYTE *v8; // rdx __int64 v9; // rcx __int64 v10; // rcx __int64 v11; // rsi __int64 v12; // rcx _BYTE *v14; // rdx int result; // eax _BYTE *v16; // rdx _BYTE v17[56]; // [rsp+20h] [rbp-68h] BYREF _BYTE *v18; // [rsp+58h] [rbp-30h] v18 = nullptr; v2 = (struct _Mtx_internal_imp_t *)((char *)*a1 + 64); if ( Mtx_lock(v2) ) { LABEL_28: std::_Throw_Cpp_error(5); __debugbreak(); } v4 = v2; while ( 1 ) { if ( *((_DWORD *)v4 + 19) == 0x7FFFFFFF ) goto LABEL_33; for ( i = *a1; !*((_BYTE *)i + 216) && !*((_QWORD *)i + 7); Cnd_wait((struct _Mtx_internal_imp_t *)((char *)i + 144), v2) ) { ; } v6 = *a1; if ( *((_BYTE *)*a1 + 216) ) { if ( !*((_QWORD *)v6 + 7) ) break; } v7 = *(_QWORD *)(*((_QWORD *)v6 + 4) + 8 * (*((_QWORD *)v6 + 6) & (*((_QWORD *)v6 + 5) - 1LL))); if ( v17 != (_BYTE *)v7 ) { if ( v18 ) { v8 = v17; LOBYTE(v8) = v18 != v17; (*(void (__fastcall **)(_BYTE *, _BYTE *))(*(_QWORD *)v18 + 32LL))(v18, v8); v18 = nullptr; } v9 = *(_QWORD *)(v7 + 56); if ( v9 ) { if ( v9 == v7 ) { v18 = (_BYTE *)(*(__int64 (__fastcall **)(__int64, _BYTE *))(*(_QWORD *)v9 + 8LL))(v9, v17); v10 = *(_QWORD *)(v7 + 56); if ( !v10 ) goto LABEL_19; LOBYTE(v3) = v10 != v7; (*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)v10 + 32LL))(v10, v3); } else { v18 = *(_BYTE **)(v7 + 56); } *(_QWORD *)(v7 + 56) = 0; } } LABEL_19: v4 = *a1; v11 = *(_QWORD *)(*((_QWORD *)*a1 + 4) + 8 * (*((_QWORD *)*a1 + 6) & (*((_QWORD *)*a1 + 5) - 1LL))); v12 = *(_QWORD *)(v11 + 56); if ( v12 ) { LOBYTE(v3) = v12 != v11; (*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)v12 + 32LL))(v12, v3); *(_QWORD *)(v11 + 56) = 0; } if ( (*((_QWORD *)v4 + 7))-- == 1 ) *((_QWORD *)v4 + 6) = 0; else ++*((_QWORD *)v4 + 6); Mtx_unlock(v2); _InterlockedIncrement64((volatile signed __int64 *)*a1 + 28); if ( !v18 ) { std::_Xbad_function_call(); LABEL_33: *((_DWORD *)v4 + 19) = 2147483646; std::_Throw_Cpp_error(6); JUMPOUT(0x18001744ELL); } (*(void (__fastcall **)(_BYTE *))(*(_QWORD *)v18 + 16LL))(v18); _InterlockedDecrement64((volatile signed __int64 *)*a1 + 28); if ( v18 ) { v14 = v17; LOBYTE(v14) = v18 != v17; (*(void (__fastcall **)(_BYTE *, _BYTE *))(*(_QWORD *)v18 + 32LL))(v18, v14); } v18 = nullptr; v2 = (struct _Mtx_internal_imp_t *)((char *)*a1 + 64); v4 = v2; if ( Mtx_lock(v2) ) goto LABEL_28; } result = Mtx_unlock(v2); if ( v18 ) { v16 = v17; LOBYTE(v16) = v18 != v17; return (*(__int64 (__fastcall **)(_BYTE *, _BYTE *))(*(_QWORD *)v18 + 32LL))(v18, v16); } return result; }