{"type": "func", "start": 6443739280, "end": 6443739977, "name": "_setmbcp_nolock", "pseudocode": "// \n// _setmbcp_nolock from 0x18013a890 to 0x18013ab49 (697 bytes)\n// \n// 3 xrefs:\n// > setmbcp_internal @ 0x18013a67a\n// > <???> @ 0x180203884\n// > <???> @ 0x180203890\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__int64 __fastcall setmbcp_nolock(UINT a1, __int64 a2)\n{\n  const wchar_t *v3; // rbx\n  UINT SystemCP; // edi\n  unsigned int v5; // r14d\n  _DWORD *v6; // rax\n  int v7; // ebp\n  _WORD *v8; // rdi\n  __int64 j; // rcx\n  bool v10; // zf\n  BYTE *i; // rcx\n  unsigned int v12; // eax\n  unsigned int v13; // edx\n  __int64 v14; // rdi\n  __int64 v15; // rdx\n  _BYTE *v16; // rax\n  __int64 v17; // rcx\n  const wchar_t *v18; // rax\n  __int64 v20; // rax\n  _BYTE *v21; // r15\n  __int64 v22; // r14\n  char *v23; // r9\n  unsigned __int8 *v24; // rdx\n  unsigned int v25; // r8d\n  __int64 v26; // r10\n  UINT v27; // edi\n  UINT v28; // edi\n  UINT v29; // edi\n  _WORD *v30; // rdx\n  __int64 v31; // rcx\n  struct _cpinfo CPInfo; // [rsp+20h] [rbp-58h] BYREF\n\n  v3 = nullptr;\n  SystemCP = getSystemCP(a1);\n  if ( SystemCP )\n  {\n    v5 = 0;\n    v6 = &unk_1801B1EA0;\n    v7 = 1;\n    do\n    {\n      if ( *v6 == SystemCP )\n      {\n        memset((void *)(a2 + 24), 0, 0x101u);\n        v20 = v5;\n        v21 = &unk_1801B1E90;\n        v22 = 4;\n        v23 = (char *)&unk_1801B1EB0 + 48 * v20;\n        do\n        {\n          v24 = (unsigned __int8 *)v23;\n          if ( *v23 )\n          {\n            do\n            {\n              if ( !v24[1] )\n                break;\n              v25 = *v24;\n              if ( v25 <= v24[1] )\n              {\n                v26 = v25 + 1;\n                do\n                {\n                  if ( (unsigned int)v26 >= 0x101 )\n                    break;\n                  ++v25;\n                  *(_BYTE *)(v26 + a2 + 24) |= *v21;\n                  v26 = (unsigned int)(v26 + 1);\n                }\n                while ( v25 <= v24[1] );\n              }\n              v24 += 2;\n            }\n            while ( *v24 );\n          }\n          v23 += 8;\n          ++v21;\n          --v22;\n        }\n        while ( v22 );\n        *(_DWORD *)(a2 + 4) = SystemCP;\n        *(_DWORD *)(a2 + 8) = 1;\n        v27 = SystemCP - 932;\n        if ( v27 )\n        {\n          v28 = v27 - 4;\n          if ( v28 )\n          {\n            v29 = v28 - 13;\n            if ( v29 )\n            {\n              if ( v29 == 1 )\n                v3 = L\"zh-TW\";\n            }\n            else\n            {\n              v3 = L\"ko-KR\";\n            }\n          }\n          else\n          {\n            v3 = L\"zh-CN\";\n          }\n        }\n        else\n        {\n          v3 = L\"ja-JP\";\n        }\n        *(_QWORD *)(a2 + 544) = v3;\n        v30 = (_WORD *)(a2 + 12);\n        v31 = 6;\n        do\n        {\n          *v30 = *(_WORD *)((char *)v30 + (_QWORD)&unk_1801B1EA0 + 48 * v20 - a2 - 8);\n          ++v30;\n          --v31;\n        }\n        while ( v31 );\n        goto LABEL_12;\n      }\n      ++v5;\n      v6 += 12;\n    }\n    while ( v5 < 5 );\n    if ( SystemCP == 65000 || !IsValidCodePage((unsigned __int16)SystemCP) )\n      return 0xFFFFFFFFLL;\n    if ( SystemCP == 65001 )\n    {\n      *(_QWORD *)(a2 + 4) = 65001;\n      *(_QWORD *)(a2 + 544) = 0;\n      *(_DWORD *)(a2 + 24) = 0;\n      *(_WORD *)(a2 + 28) = 0;\n      goto LABEL_9;\n    }\n    if ( GetCPInfo(SystemCP, &CPInfo) )\n    {\n      memset((void *)(a2 + 24), 0, 0x101u);\n      v10 = CPInfo.MaxCharSize == 2;\n      *(_DWORD *)(a2 + 4) = SystemCP;\n      *(_QWORD *)(a2 + 544) = 0;\n      if ( v10 )\n      {\n        for ( i = CPInfo.LeadByte; *i; i += 2 )\n        {\n          if ( !i[1] )\n            break;\n          v12 = i[1];\n          v13 = *i;\n          if ( v13 <= v12 )\n          {\n            v14 = v13 + 1;\n            v15 = v12 - v13 + 1;\n            do\n            {\n              *(_BYTE *)(v14 + a2 + 24) |= 4u;\n              v14 = (unsigned int)(v14 + 1);\n              --v15;\n            }\n            while ( v15 );\n          }\n        }\n        v16 = (_BYTE *)(a2 + 26);\n        v17 = 254;\n        do\n        {\n          *v16++ |= 8u;\n          --v17;\n        }\n        while ( v17 );\n        switch ( *(_DWORD *)(a2 + 4) )\n        {\n          case 0x3A4:\n            v18 = L\"ja-JP\";\n            break;\n          case 0x3A8:\n            v18 = L\"zh-CN\";\n            break;\n          case 0x3B5:\n            v18 = L\"ko-KR\";\n            break;\n          case 0x3B6:\n            v18 = L\"zh-TW\";\n            break;\n          default:\n            v18 = nullptr;\n            break;\n        }\n        *(_QWORD *)(a2 + 544) = v18;\n      }\n      else\n      {\n        v7 = 0;\n      }\n      *(_DWORD *)(a2 + 8) = v7;\nLABEL_9:\n      v8 = (_WORD *)(a2 + 12);\n      for ( j = 6; j; --j )\n        *v8++ = 0;\nLABEL_12:\n      setSBUpLow((struct __crt_multibyte_data *)a2);\n      return 0;\n    }\n    if ( !dword_1801F55D8 )\n      return 0xFFFFFFFFLL;\n  }\n  setSBCS((struct threadmbcinfostruct *)a2);\n  return 0;\n}", "assembly": "; \n; _setmbcp_nolock from 0x18013a890 to 0x18013ab49 (697 bytes)\n; \n; 3 xrefs:\n; > setmbcp_internal @ 0x18013a67a\n; > <???> @ 0x180203884\n; > <???> @ 0x180203890\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], rbx                                              ; +0x0, 0x18013a890\npush    rbp                                                            ; +0x5, 0x18013a895\npush    rsi                                                            ; +0x6, 0x18013a896\npush    rdi                                                            ; +0x7, 0x18013a897\npush    r12                                                            ; +0x8, 0x18013a898\npush    r13                                                            ; +0xa, 0x18013a89a\npush    r14                                                            ; +0xc, 0x18013a89c\npush    r15                                                            ; +0xe, 0x18013a89e\nsub     rsp, 40h                                                       ; +0x10, 0x18013a8a0\nmov     rax, cs:__security_cookie                                      ; +0x14, 0x18013a8a4\nxor     rax, rsp                                                       ; +0x1b, 0x18013a8ab\nmov     [rsp+78h+var_40], rax                                          ; +0x1e, 0x18013a8ae\nmov     rsi, rdx                                                       ; +0x23, 0x18013a8b3\ncall    ?getSystemCP@@YAHH@Z                                           ; +0x26, 0x18013a8b6\nxor     ebx, ebx                                                       ; +0x2b, 0x18013a8bb\nmov     edi, eax                                                       ; +0x2d, 0x18013a8bd\ntest    eax, eax                                                       ; +0x2f, 0x18013a8bf\njz      loc_18013AB1A                                                  ; +0x31, 0x18013a8c1\nlea     r13, unk_1801B1EA0                                             ; +0x37, 0x18013a8c7\nmov     r14d, ebx                                                      ; +0x3e, 0x18013a8ce\nmov     rax, r13                                                       ; +0x41, 0x18013a8d1\nlea     ebp, [rbx+1]                                                   ; +0x44, 0x18013a8d4\ncmp     [rax], edi                                                     ; +0x47, 0x18013a8d7\njz      loc_18013AA2D                                                  ; +0x49, 0x18013a8d9\nadd     r14d, ebp                                                      ; +0x4f, 0x18013a8df\nadd     rax, 30h ; '0'                                                 ; +0x52, 0x18013a8e2\ncmp     r14d, 5                                                        ; +0x56, 0x18013a8e6\njb      short loc_18013A8D7                                            ; +0x5a, 0x18013a8ea\ncmp     edi, 0FDE8h                                                    ; +0x5c, 0x18013a8ec\njz      loc_18013AA25                                                  ; +0x62, 0x18013a8f2\nmovzx   ecx, di; CodePage                                              ; +0x68, 0x18013a8f8\ncall    cs:IsValidCodePage                                             ; +0x6b, 0x18013a8fb\ntest    eax, eax                                                       ; +0x71, 0x18013a901\njz      loc_18013AA25                                                  ; +0x73, 0x18013a903\nmov     eax, 0FDE9h                                                    ; +0x79, 0x18013a909\ncmp     edi, eax                                                       ; +0x7e, 0x18013a90e\njnz     short loc_18013A940                                            ; +0x80, 0x18013a910\nmov     [rsi+4], rax                                                   ; +0x82, 0x18013a912\nmov     [rsi+220h], rbx                                                ; +0x86, 0x18013a916\nmov     [rsi+18h], ebx                                                 ; +0x8d, 0x18013a91d\nmov     [rsi+1Ch], bx                                                  ; +0x90, 0x18013a920\nlea     rdi, [rsi+0Ch]                                                 ; +0x94, 0x18013a924\nmovzx   eax, bx                                                        ; +0x98, 0x18013a928\nmov     ecx, 6                                                         ; +0x9b, 0x18013a92b\nrep stosw                                                              ; +0xa0, 0x18013a930\nmov     rcx, rsi; struct __crt_multibyte_data *                        ; +0xa3, 0x18013a933\ncall    ?setSBUpLow@@YAXPEAU__crt_multibyte_data@@@Z                   ; +0xa6, 0x18013a936\njmp     loc_18013AB22                                                  ; +0xab, 0x18013a93b\nlea     rdx, [rsp+78h+CPInfo]; lpCPInfo                                ; +0xb0, 0x18013a940\nmov     ecx, edi; CodePage                                             ; +0xb5, 0x18013a945\ncall    cs:GetCPInfo                                                   ; +0xb7, 0x18013a947\ntest    eax, eax                                                       ; +0xbd, 0x18013a94d\njz      loc_18013AA19                                                  ; +0xbf, 0x18013a94f\nxor     edx, edx; Val                                                  ; +0xc5, 0x18013a955\nlea     rcx, [rsi+18h]; void *                                         ; +0xc7, 0x18013a957\nmov     r8d, 101h; Size                                                ; +0xcb, 0x18013a95b\ncall    memset                                                         ; +0xd1, 0x18013a961\ncmp     [rsp+78h+CPInfo.MaxCharSize], 2                                ; +0xd6, 0x18013a966\nmov     [rsi+4], edi                                                   ; +0xdb, 0x18013a96b\nmov     [rsi+220h], rbx                                                ; +0xde, 0x18013a96e\njnz     loc_18013AA0F                                                  ; +0xe5, 0x18013a975\nlea     rcx, [rsp+78h+CPInfo.LeadByte]                                 ; +0xeb, 0x18013a97b\ncmp     [rsp+78h+CPInfo.LeadByte], bl                                  ; +0xf0, 0x18013a980\njz      short loc_18013A9B2                                            ; +0xf4, 0x18013a984\ncmp     [rcx+1], bl                                                    ; +0xf6, 0x18013a986\njz      short loc_18013A9B2                                            ; +0xf9, 0x18013a989\nmovzx   eax, byte ptr [rcx+1]                                          ; +0xfb, 0x18013a98b\nmovzx   edx, byte ptr [rcx]                                            ; +0xff, 0x18013a98f\ncmp     edx, eax                                                       ; +0x102, 0x18013a992\nja      short loc_18013A9AA                                            ; +0x104, 0x18013a994\nsub     eax, edx                                                       ; +0x106, 0x18013a996\nlea     edi, [rdx+1]                                                   ; +0x108, 0x18013a998\nlea     edx, [rax+rbp]                                                 ; +0x10b, 0x18013a99b\nor      byte ptr [rdi+rsi+18h], 4                                      ; +0x10e, 0x18013a99e\nadd     edi, ebp                                                       ; +0x113, 0x18013a9a3\nsub     rdx, rbp                                                       ; +0x115, 0x18013a9a5\njnz     short loc_18013A99E                                            ; +0x118, 0x18013a9a8\nadd     rcx, 2                                                         ; +0x11a, 0x18013a9aa\ncmp     [rcx], bl                                                      ; +0x11e, 0x18013a9ae\njnz     short loc_18013A986                                            ; +0x120, 0x18013a9b0\nlea     rax, [rsi+1Ah]                                                 ; +0x122, 0x18013a9b2\nmov     ecx, 0FEh                                                      ; +0x126, 0x18013a9b6\nor      byte ptr [rax], 8                                              ; +0x12b, 0x18013a9bb\nadd     rax, rbp                                                       ; +0x12e, 0x18013a9be\nsub     rcx, rbp                                                       ; +0x131, 0x18013a9c1\njnz     short loc_18013A9BB                                            ; +0x134, 0x18013a9c4\nmov     ecx, [rsi+4]                                                   ; +0x136, 0x18013a9c6\nsub     ecx, 3A4h                                                      ; +0x139, 0x18013a9c9\njz      short loc_18013A9FF                                            ; +0x13f, 0x18013a9cf\nsub     ecx, 4                                                         ; +0x141, 0x18013a9d1\njz      short loc_18013A9F6                                            ; +0x144, 0x18013a9d4\nsub     ecx, 0Dh                                                       ; +0x146, 0x18013a9d6\njz      short loc_18013A9ED                                            ; +0x149, 0x18013a9d9\ncmp     ecx, ebp                                                       ; +0x14b, 0x18013a9db\njz      short loc_18013A9E4                                            ; +0x14d, 0x18013a9dd\nmov     rax, rbx                                                       ; +0x14f, 0x18013a9df\njmp     short loc_18013AA06                                            ; +0x152, 0x18013a9e2\nmov     rax, cs:off_1801772A0                                          ; +0x154, 0x18013a9e4\njmp     short loc_18013AA06                                            ; +0x15b, 0x18013a9eb\nmov     rax, cs:off_180177298                                          ; +0x15d, 0x18013a9ed\njmp     short loc_18013AA06                                            ; +0x164, 0x18013a9f4\nmov     rax, cs:off_180177290                                          ; +0x166, 0x18013a9f6\njmp     short loc_18013AA06                                            ; +0x16d, 0x18013a9fd\nmov     rax, cs:off_180177288                                          ; +0x16f, 0x18013a9ff\nmov     [rsi+220h], rax                                                ; +0x176, 0x18013aa06\njmp     short loc_18013AA11                                            ; +0x17d, 0x18013aa0d\nmov     ebp, ebx                                                       ; +0x17f, 0x18013aa0f\nmov     [rsi+8], ebp                                                   ; +0x181, 0x18013aa11\njmp     loc_18013A924                                                  ; +0x184, 0x18013aa14\ncmp     cs:dword_1801F55D8, ebx                                        ; +0x189, 0x18013aa19\njnz     loc_18013AB1A                                                  ; +0x18f, 0x18013aa1f\nor      eax, 0FFFFFFFFh                                                ; +0x195, 0x18013aa25\njmp     loc_18013AB24                                                  ; +0x198, 0x18013aa28\nxor     edx, edx; Val                                                  ; +0x19d, 0x18013aa2d\nlea     rcx, [rsi+18h]; void *                                         ; +0x19f, 0x18013aa2f\nmov     r8d, 101h; Size                                                ; +0x1a3, 0x18013aa33\ncall    memset                                                         ; +0x1a9, 0x18013aa39\nmov     eax, r14d                                                      ; +0x1ae, 0x18013aa3e\nlea     r9, [r13+10h]                                                  ; +0x1b1, 0x18013aa41\nlea     r15, unk_1801B1E90                                             ; +0x1b5, 0x18013aa45\nmov     r14d, 4                                                        ; +0x1bc, 0x18013aa4c\nlea     r11, [rax+rax*2]                                               ; +0x1c2, 0x18013aa52\nshl     r11, 4                                                         ; +0x1c6, 0x18013aa56\nadd     r9, r11                                                        ; +0x1ca, 0x18013aa5a\nmov     rdx, r9                                                        ; +0x1cd, 0x18013aa5d\ncmp     [r9], bl                                                       ; +0x1d0, 0x18013aa60\njz      short loc_18013AAA3                                            ; +0x1d3, 0x18013aa63\ncmp     [rdx+1], bl                                                    ; +0x1d5, 0x18013aa65\njz      short loc_18013AAA3                                            ; +0x1d8, 0x18013aa68\nmovzx   r8d, byte ptr [rdx]                                            ; +0x1da, 0x18013aa6a\nmovzx   eax, byte ptr [rdx+1]                                          ; +0x1de, 0x18013aa6e\ncmp     r8d, eax                                                       ; +0x1e2, 0x18013aa72\nja      short loc_18013AA9B                                            ; +0x1e5, 0x18013aa75\nlea     r10d, [r8+1]                                                   ; +0x1e7, 0x18013aa77\ncmp     r10d, 101h                                                     ; +0x1eb, 0x18013aa7b\njnb     short loc_18013AA9B                                            ; +0x1f2, 0x18013aa82\nmov     al, [r15]                                                      ; +0x1f4, 0x18013aa84\nadd     r8d, ebp                                                       ; +0x1f7, 0x18013aa87\nor      [r10+rsi+18h], al                                              ; +0x1fa, 0x18013aa8a\nadd     r10d, ebp                                                      ; +0x1ff, 0x18013aa8f\nmovzx   eax, byte ptr [rdx+1]                                          ; +0x202, 0x18013aa92\ncmp     r8d, eax                                                       ; +0x206, 0x18013aa96\njbe     short loc_18013AA7B                                            ; +0x209, 0x18013aa99\nadd     rdx, 2                                                         ; +0x20b, 0x18013aa9b\ncmp     [rdx], bl                                                      ; +0x20f, 0x18013aa9f\njnz     short loc_18013AA65                                            ; +0x211, 0x18013aaa1\nadd     r9, 8                                                          ; +0x213, 0x18013aaa3\nadd     r15, rbp                                                       ; +0x217, 0x18013aaa7\nsub     r14, rbp                                                       ; +0x21a, 0x18013aaaa\njnz     short loc_18013AA5D                                            ; +0x21d, 0x18013aaad\nmov     [rsi+4], edi                                                   ; +0x21f, 0x18013aaaf\nmov     [rsi+8], ebp                                                   ; +0x222, 0x18013aab2\nsub     edi, 3A4h                                                      ; +0x225, 0x18013aab5\njz      short loc_18013AAE6                                            ; +0x22b, 0x18013aabb\nsub     edi, 4                                                         ; +0x22d, 0x18013aabd\njz      short loc_18013AADD                                            ; +0x230, 0x18013aac0\nsub     edi, 0Dh                                                       ; +0x232, 0x18013aac2\njz      short loc_18013AAD4                                            ; +0x235, 0x18013aac5\ncmp     edi, ebp                                                       ; +0x237, 0x18013aac7\njnz     short loc_18013AAED                                            ; +0x239, 0x18013aac9\nmov     rbx, cs:off_1801772A0                                          ; +0x23b, 0x18013aacb\njmp     short loc_18013AAED                                            ; +0x242, 0x18013aad2\nmov     rbx, cs:off_180177298                                          ; +0x244, 0x18013aad4\njmp     short loc_18013AAED                                            ; +0x24b, 0x18013aadb\nmov     rbx, cs:off_180177290                                          ; +0x24d, 0x18013aadd\njmp     short loc_18013AAED                                            ; +0x254, 0x18013aae4\nmov     rbx, cs:off_180177288                                          ; +0x256, 0x18013aae6\nsub     r11, rsi                                                       ; +0x25d, 0x18013aaed\nmov     [rsi+220h], rbx                                                ; +0x260, 0x18013aaf0\nlea     rdx, [rsi+0Ch]                                                 ; +0x267, 0x18013aaf7\nmov     ecx, 6                                                         ; +0x26b, 0x18013aafb\nlea     rdi, [r11+r13]                                                 ; +0x270, 0x18013ab00\nmovzx   eax, word ptr [rdi+rdx-8]                                      ; +0x274, 0x18013ab04\nmov     [rdx], ax                                                      ; +0x279, 0x18013ab09\nlea     rdx, [rdx+2]                                                   ; +0x27c, 0x18013ab0c\nsub     rcx, rbp                                                       ; +0x280, 0x18013ab10\njnz     short loc_18013AB04                                            ; +0x283, 0x18013ab13\njmp     loc_18013A933                                                  ; +0x285, 0x18013ab15\nmov     rcx, rsi; struct threadmbcinfostruct *                         ; +0x28a, 0x18013ab1a\ncall    ?setSBCS@@YAXPEAUthreadmbcinfostruct@@@Z                       ; +0x28d, 0x18013ab1d\nxor     eax, eax                                                       ; +0x292, 0x18013ab22\nmov     rcx, [rsp+78h+var_40]                                          ; +0x294, 0x18013ab24\nxor     rcx, rsp; StackCookie                                          ; +0x299, 0x18013ab29\ncall    __security_check_cookie                                        ; +0x29c, 0x18013ab2c\nmov     rbx, [rsp+78h+arg_10]                                          ; +0x2a1, 0x18013ab31\nadd     rsp, 40h                                                       ; +0x2a9, 0x18013ab39\npop     r15                                                            ; +0x2ad, 0x18013ab3d\npop     r14                                                            ; +0x2af, 0x18013ab3f\npop     r13                                                            ; +0x2b1, 0x18013ab41\npop     r12                                                            ; +0x2b3, 0x18013ab43\npop     rdi                                                            ; +0x2b5, 0x18013ab45\npop     rsi                                                            ; +0x2b6, 0x18013ab46\npop     rbp                                                            ; +0x2b7, 0x18013ab47\nretn                                                                   ; +0x2b8, 0x18013ab48", "xrefs": ["setmbcp_internal @ 0x18013a67a", "<???> @ 0x180203884", "<???> @ 0x180203890"], "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"}