// // _setmbcp_nolock from 0x18013a890 to 0x18013ab49 (697 bytes) // // 3 xrefs: // > setmbcp_internal @ 0x18013a67a // > @ 0x180203884 // > @ 0x180203890 // // 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 // __int64 __fastcall setmbcp_nolock(UINT a1, __int64 a2) { const wchar_t *v3; // rbx UINT SystemCP; // edi unsigned int v5; // r14d _DWORD *v6; // rax int v7; // ebp _WORD *v8; // rdi __int64 j; // rcx bool v10; // zf BYTE *i; // rcx unsigned int v12; // eax unsigned int v13; // edx __int64 v14; // rdi __int64 v15; // rdx _BYTE *v16; // rax __int64 v17; // rcx const wchar_t *v18; // rax __int64 v20; // rax _BYTE *v21; // r15 __int64 v22; // r14 char *v23; // r9 unsigned __int8 *v24; // rdx unsigned int v25; // r8d __int64 v26; // r10 UINT v27; // edi UINT v28; // edi UINT v29; // edi _WORD *v30; // rdx __int64 v31; // rcx struct _cpinfo CPInfo; // [rsp+20h] [rbp-58h] BYREF v3 = nullptr; SystemCP = getSystemCP(a1); if ( SystemCP ) { v5 = 0; v6 = &unk_1801B1EA0; v7 = 1; do { if ( *v6 == SystemCP ) { memset((void *)(a2 + 24), 0, 0x101u); v20 = v5; v21 = &unk_1801B1E90; v22 = 4; v23 = (char *)&unk_1801B1EB0 + 48 * v20; do { v24 = (unsigned __int8 *)v23; if ( *v23 ) { do { if ( !v24[1] ) break; v25 = *v24; if ( v25 <= v24[1] ) { v26 = v25 + 1; do { if ( (unsigned int)v26 >= 0x101 ) break; ++v25; *(_BYTE *)(v26 + a2 + 24) |= *v21; v26 = (unsigned int)(v26 + 1); } while ( v25 <= v24[1] ); } v24 += 2; } while ( *v24 ); } v23 += 8; ++v21; --v22; } while ( v22 ); *(_DWORD *)(a2 + 4) = SystemCP; *(_DWORD *)(a2 + 8) = 1; v27 = SystemCP - 932; if ( v27 ) { v28 = v27 - 4; if ( v28 ) { v29 = v28 - 13; if ( v29 ) { if ( v29 == 1 ) v3 = L"zh-TW"; } else { v3 = L"ko-KR"; } } else { v3 = L"zh-CN"; } } else { v3 = L"ja-JP"; } *(_QWORD *)(a2 + 544) = v3; v30 = (_WORD *)(a2 + 12); v31 = 6; do { *v30 = *(_WORD *)((char *)v30 + (_QWORD)&unk_1801B1EA0 + 48 * v20 - a2 - 8); ++v30; --v31; } while ( v31 ); goto LABEL_12; } ++v5; v6 += 12; } while ( v5 < 5 ); if ( SystemCP == 65000 || !IsValidCodePage((unsigned __int16)SystemCP) ) return 0xFFFFFFFFLL; if ( SystemCP == 65001 ) { *(_QWORD *)(a2 + 4) = 65001; *(_QWORD *)(a2 + 544) = 0; *(_DWORD *)(a2 + 24) = 0; *(_WORD *)(a2 + 28) = 0; goto LABEL_9; } if ( GetCPInfo(SystemCP, &CPInfo) ) { memset((void *)(a2 + 24), 0, 0x101u); v10 = CPInfo.MaxCharSize == 2; *(_DWORD *)(a2 + 4) = SystemCP; *(_QWORD *)(a2 + 544) = 0; if ( v10 ) { for ( i = CPInfo.LeadByte; *i; i += 2 ) { if ( !i[1] ) break; v12 = i[1]; v13 = *i; if ( v13 <= v12 ) { v14 = v13 + 1; v15 = v12 - v13 + 1; do { *(_BYTE *)(v14 + a2 + 24) |= 4u; v14 = (unsigned int)(v14 + 1); --v15; } while ( v15 ); } } v16 = (_BYTE *)(a2 + 26); v17 = 254; do { *v16++ |= 8u; --v17; } while ( v17 ); switch ( *(_DWORD *)(a2 + 4) ) { case 0x3A4: v18 = L"ja-JP"; break; case 0x3A8: v18 = L"zh-CN"; break; case 0x3B5: v18 = L"ko-KR"; break; case 0x3B6: v18 = L"zh-TW"; break; default: v18 = nullptr; break; } *(_QWORD *)(a2 + 544) = v18; } else { v7 = 0; } *(_DWORD *)(a2 + 8) = v7; LABEL_9: v8 = (_WORD *)(a2 + 12); for ( j = 6; j; --j ) *v8++ = 0; LABEL_12: setSBUpLow((struct __crt_multibyte_data *)a2); return 0; } if ( !dword_1801F55D8 ) return 0xFFFFFFFFLL; } setSBCS((struct threadmbcinfostruct *)a2); return 0; }