// // _wcstombs_l_helper from 0x18012b490 to 0x18012b7eb (859 bytes) // // 2 xrefs: // > wcstombs @ 0x18012b7ef // > @ 0x180202b1c // // 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 unsigned __int64 __fastcall _wcstombs_l_helper( __crt_mbstring *this, const wchar_t *a2, const wchar_t **a3, struct __crt_locale_pointers *a4) { const wchar_t **v4; // rsi __int64 v6; // rbx int v8; // r10d unsigned __int16 *v9; // rcx __int16 v10; // ax int *v11; // rax unsigned __int16 *v12; // rax const wchar_t **v13; // rcx int v14; // eax int v15; // eax unsigned __int64 v16; // rdi int v17; // edx int v18; // eax int v19; // eax __int64 v20; // rdx __int64 v21; // rcx char v22; // al unsigned __int16 *v23; // rcx unsigned __int16 v24; // ax int v25; // eax struct _Mbstatet *v26; // [rsp+20h] [rbp-49h] int v27; // [rsp+40h] [rbp-29h] BYREF char v28[8]; // [rsp+48h] [rbp-21h] BYREF unsigned __int64 v29; // [rsp+50h] [rbp-19h] BYREF __int64 v30; // [rsp+58h] [rbp-11h] BYREF __int64 v31; // [rsp+60h] [rbp-9h] char v32; // [rsp+70h] [rbp+7h] __int64 v33; // [rsp+78h] [rbp+Fh] _BYTE v34[8]; // [rsp+80h] [rbp+17h] BYREF v33 = -2; v4 = a3; *(_QWORD *)v28 = a2; v6 = 0; v27 = 0; if ( this && !a3 ) return 0; if ( !a2 ) { *errno() = 22; invalid_parameter_noinfo(); return -1; } _LocaleUpdate::_LocaleUpdate((_LocaleUpdate *)&v30, a4); v8 = *(_DWORD *)(v31 + 12); if ( v8 == 65001 ) { v29 = 0; v6 = __crt_mbstring::__wcsrtombs_utf8(this, v28, v4, (unsigned __int64)&v29, v26); LABEL_59: v16 = v6; goto LABEL_60; } if ( !this ) { if ( !*(_QWORD *)(v31 + 312) ) { v16 = 0; v23 = *(unsigned __int16 **)v28; v24 = **(_WORD **)v28; if ( **(_WORD **)v28 ) { while ( v24 <= 0xFFu ) { ++v16; v24 = *++v23; if ( !*v23 ) goto LABEL_60; } *errno() = 42; v16 = -1; } goto LABEL_60; } v6 = -1; v25 = _acrt_WideCharToMultiByte(v8, 0, *(_DWORD *)v28, -1, 0, 0, 0, (__int64)&v27); if ( v25 && !v27 ) { v16 = v25 - 1LL; goto LABEL_60; } LABEL_57: v11 = errno(); goto LABEL_58; } if ( !*(_QWORD *)(v31 + 312) ) { if ( !v4 ) goto LABEL_59; v9 = *(unsigned __int16 **)v28; while ( *v9 <= 0xFFu ) { *((_BYTE *)this + v6) = *(_BYTE *)v9; v10 = *v9++; *(_QWORD *)v28 = v9; if ( v10 ) { if ( ++v6 < (unsigned __int64)v4 ) continue; } goto LABEL_59; } goto LABEL_16; } if ( *(_DWORD *)(v31 + 8) == 1 ) { if ( v4 ) { v12 = *(unsigned __int16 **)v28; v13 = v4; do { if ( !*v12 ) break; ++v12; v13 = (const wchar_t **)((char *)v13 - 1); } while ( v13 ); if ( v13 && !*v12 ) LODWORD(v4) = (((__int64)v12 - *(_QWORD *)v28) >> 1) + 1; } v14 = _acrt_WideCharToMultiByte(v8, 0, *(_DWORD *)v28, (_DWORD)v4, (_DWORD)this, (_DWORD)v4, 0, (__int64)&v27); if ( v14 && !v27 ) { v6 = v14 - 1LL; if ( *((_BYTE *)this + v14 - 1) ) v6 = v14; goto LABEL_59; } LABEL_16: v11 = errno(); v6 = -1; LABEL_58: *v11 = 42; goto LABEL_59; } v6 = -1; v15 = _acrt_WideCharToMultiByte(v8, 0, *(_DWORD *)v28, -1, (_DWORD)this, (_DWORD)v4, 0, (__int64)&v27); v16 = v15; if ( v27 ) goto LABEL_57; if ( v15 ) { v6 = v15 - 1LL; goto LABEL_59; } if ( GetLastError() != 122 ) goto LABEL_57; if ( v4 ) { v17 = *(_DWORD *)v28; LABEL_36: v18 = *(_DWORD *)(v31 + 8); if ( v18 > 5 ) v18 = 5; v19 = _acrt_WideCharToMultiByte(*(_DWORD *)(v31 + 12), 0, v17, 1, (unsigned int)v34, v18, 0, (__int64)&v27); if ( v19 ) { if ( !v27 && v19 >= 0 ) { v20 = v19; if ( (unsigned __int64)v19 <= 5 ) { if ( v19 + v16 <= (unsigned __int64)v4 ) { v21 = 0; while ( 1 ) { v22 = v34[v21]; *((_BYTE *)this + v16) = v22; if ( !v22 ) break; ++v21; ++v16; if ( v21 >= v20 ) { v17 = *(_DWORD *)v28 + 2; *(_QWORD *)v28 += 2LL; if ( v16 >= (unsigned __int64)v4 ) goto LABEL_60; goto LABEL_36; } } } goto LABEL_60; } } } goto LABEL_57; } LABEL_60: if ( v32 ) *(_DWORD *)(v30 + 936) &= ~2u; return v16; }