{"type": "func", "start": 6443725468, "end": 6443725850, "name": "_mbtowc_l", "pseudocode": "// \n// _mbtowc_l from 0x18013729c to 0x18013741a (382 bytes)\n// \n// 6 xrefs:\n// > unknown_libname_48 @ 0x18012e42a\n// > unknown_libname_49 @ 0x18012e4d2\n// > unknown_libname_57 @ 0x18012ee90\n// > unknown_libname_58 @ 0x18012ef92\n// > mbtowc @ 0x18013741f\n// > <???> @ 0x1802035cc\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\nint __cdecl mbtowc_l(wchar_t *DstCh, const char *SrcCh, size_t SrcSizeInBytes, _locale_t Locale)\n{\n  int v7; // ecx\n  struct __crt_locale_data *locinfo; // rcx\n  int v10; // r9d\n  int v11; // eax\n  int *v12; // rax\n  struct _Mbstatet *v13; // [rsp+20h] [rbp-38h]\n  __int64 v14; // [rsp+30h] [rbp-28h] BYREF\n  __crt_locale_pointers Localea; // [rsp+38h] [rbp-20h] BYREF\n  char v16; // [rsp+48h] [rbp-10h]\n\n  if ( !SrcCh || !SrcSizeInBytes )\n  {\n    qword_1801F5568 = 0;\n    return 0;\n  }\n  if ( !*SrcCh )\n  {\n    if ( DstCh )\n      *DstCh = 0;\n    return 0;\n  }\n  _LocaleUpdate::_LocaleUpdate((_LocaleUpdate *)&v14, Locale);\n  if ( *((_DWORD *)Localea.locinfo + 3) == 65001 )\n  {\n    v7 = __crt_mbstring::__mbrtowc_utf8(\n           (__crt_mbstring *)DstCh,\n           (wchar_t *)SrcCh,\n           (const char *)SrcSizeInBytes,\n           (unsigned __int64)&qword_1801F5568,\n           v13);\n    if ( v7 < 0 )\n      v7 = -1;\n    goto LABEL_14;\n  }\n  if ( !*((_QWORD *)Localea.locinfo + 39) )\n  {\n    if ( DstCh )\n      *DstCh = *(unsigned __int8 *)SrcCh;\n    goto LABEL_13;\n  }\n  if ( isleadbyte_l(*(unsigned __int8 *)SrcCh, &Localea) )\n  {\n    locinfo = Localea.locinfo;\n    v10 = *((_DWORD *)Localea.locinfo + 2);\n    if ( v10 > 1\n      && (int)SrcSizeInBytes >= v10\n      && (v11 = _acrt_MultiByteToWideChar(*((_DWORD *)Localea.locinfo + 3), 9, SrcCh, v10, DstCh, DstCh != nullptr),\n          locinfo = Localea.locinfo,\n          v11)\n      || SrcSizeInBytes >= *((int *)locinfo + 2) && SrcCh[1] )\n    {\n      v7 = *((_DWORD *)locinfo + 2);\n      goto LABEL_14;\n    }\nLABEL_25:\n    v12 = errno();\n    v7 = -1;\n    *v12 = 42;\n    goto LABEL_14;\n  }\n  if ( !_acrt_MultiByteToWideChar(*((_DWORD *)Localea.locinfo + 3), 9, SrcCh, 1, DstCh, DstCh != nullptr) )\n    goto LABEL_25;\nLABEL_13:\n  v7 = 1;\nLABEL_14:\n  if ( v16 )\n    *(_DWORD *)(v14 + 936) &= ~2u;\n  return v7;\n}", "assembly": "; \n; _mbtowc_l from 0x18013729c to 0x18013741a (382 bytes)\n; \n; 6 xrefs:\n; > unknown_libname_48 @ 0x18012e42a\n; > unknown_libname_49 @ 0x18012e4d2\n; > unknown_libname_57 @ 0x18012ee90\n; > unknown_libname_58 @ 0x18012ef92\n; > mbtowc @ 0x18013741f\n; > <???> @ 0x1802035cc\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_0], rbx                                               ; +0x0, 0x18013729c\nmov     [rsp+arg_8], rbp                                               ; +0x5, 0x1801372a1\nmov     [rsp+arg_10], rsi                                              ; +0xa, 0x1801372a6\npush    rdi                                                            ; +0xf, 0x1801372ab\nsub     rsp, 50h                                                       ; +0x10, 0x1801372ac\nxor     ebp, ebp                                                       ; +0x14, 0x1801372b0\nmov     rsi, r8                                                        ; +0x16, 0x1801372b2\nmov     rdi, rdx                                                       ; +0x19, 0x1801372b5\nmov     rbx, rcx                                                       ; +0x1c, 0x1801372b8\ntest    rdx, rdx                                                       ; +0x1f, 0x1801372bb\njz      loc_1801373FC                                                  ; +0x22, 0x1801372be\ntest    r8, r8                                                         ; +0x28, 0x1801372c4\njz      loc_1801373FC                                                  ; +0x2b, 0x1801372c7\ncmp     [rdx], bpl                                                     ; +0x31, 0x1801372cd\njnz     short loc_1801372E3                                            ; +0x34, 0x1801372d0\ntest    rcx, rcx                                                       ; +0x36, 0x1801372d2\njz      loc_180137403                                                  ; +0x39, 0x1801372d5\nmov     [rcx], bp                                                      ; +0x3f, 0x1801372db\njmp     loc_180137403                                                  ; +0x42, 0x1801372de\nmov     rdx, r9; struct __crt_locale_pointers *                        ; +0x47, 0x1801372e3\nlea     rcx, [rsp+58h+var_28]; this                                    ; +0x4a, 0x1801372e6\ncall    ??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z           ; +0x4f, 0x1801372eb\nmov     rax, [rsp+58h+Locale.locinfo]                                  ; +0x54, 0x1801372f0\ncmp     dword ptr [rax+0Ch], 0FDE9h                                    ; +0x59, 0x1801372f5\njnz     short loc_180137320                                            ; +0x60, 0x1801372fc\nlea     r9, qword_1801F5568; unsigned __int64                          ; +0x62, 0x1801372fe\nmov     r8, rsi; char *                                                ; +0x69, 0x180137305\nmov     rdx, rdi; wchar_t *                                            ; +0x6c, 0x180137308\nmov     rcx, rbx; this                                                 ; +0x6f, 0x18013730b\ncall    ?__mbrtowc_utf8@__crt_mbstring@@YA_KPEA_WPEBD_KPEAU_Mbstatet@@@Z ; +0x72, 0x18013730e\nmov     rcx, rax                                                       ; +0x77, 0x180137313\nor      eax, 0FFFFFFFFh                                                ; +0x7a, 0x180137316\ntest    ecx, ecx                                                       ; +0x7d, 0x180137319\ncmovs   ecx, eax                                                       ; +0x7f, 0x18013731b\njmp     short loc_180137339                                            ; +0x82, 0x18013731e\ncmp     [rax+138h], rbp                                                ; +0x84, 0x180137320\njnz     short loc_180137353                                            ; +0x8b, 0x180137327\ntest    rbx, rbx                                                       ; +0x8d, 0x180137329\njz      short loc_180137334                                            ; +0x90, 0x18013732c\nmovzx   eax, byte ptr [rdi]                                            ; +0x92, 0x18013732e\nmov     [rbx], ax                                                      ; +0x95, 0x180137331\nmov     ecx, 1                                                         ; +0x98, 0x180137334\ncmp     [rsp+58h+var_10], bpl                                          ; +0x9d, 0x180137339\njz      short loc_18013734C                                            ; +0xa2, 0x18013733e\nmov     rax, [rsp+58h+var_28]                                          ; +0xa4, 0x180137340\nand     dword ptr [rax+3A8h], 0FFFFFFFDh                               ; +0xa9, 0x180137345\nmov     eax, ecx                                                       ; +0xb0, 0x18013734c\njmp     loc_180137405                                                  ; +0xb2, 0x18013734e\nmovzx   ecx, byte ptr [rdi]; C                                         ; +0xb7, 0x180137353\nlea     rdx, [rsp+58h+Locale]; Locale                                  ; +0xba, 0x180137356\ncall    _isleadbyte_l                                                  ; +0xbf, 0x18013735b\ntest    eax, eax                                                       ; +0xc4, 0x180137360\njz      short loc_1801373B6                                            ; +0xc6, 0x180137362\nmov     rcx, [rsp+58h+Locale.locinfo]                                  ; +0xc8, 0x180137364\nmov     r9d, [rcx+8]                                                   ; +0xcd, 0x180137369\ncmp     r9d, 1                                                         ; +0xd1, 0x18013736d\njle     short loc_1801373A2                                            ; +0xd5, 0x180137371\ncmp     esi, r9d                                                       ; +0xd7, 0x180137373\njl      short loc_1801373A2                                            ; +0xda, 0x180137376\nmov     ecx, [rcx+0Ch]                                                 ; +0xdc, 0x180137378\nmov     eax, ebp                                                       ; +0xdf, 0x18013737b\ntest    rbx, rbx                                                       ; +0xe1, 0x18013737d\nmov     r8, rdi                                                        ; +0xe4, 0x180137380\nmov     edx, 9                                                         ; +0xe7, 0x180137383\nsetnz   al                                                             ; +0xec, 0x180137388\nmov     [rsp+58h+var_30], eax                                          ; +0xef, 0x18013738b\nmov     [rsp+58h+var_38], rbx                                          ; +0xf3, 0x18013738f\ncall    __acrt_MultiByteToWideChar                                     ; +0xf8, 0x180137394\nmov     rcx, [rsp+58h+Locale.locinfo]                                  ; +0xfd, 0x180137399\ntest    eax, eax                                                       ; +0x102, 0x18013739e\njnz     short loc_1801373B1                                            ; +0x104, 0x1801373a0\nmovsxd  rax, dword ptr [rcx+8]                                         ; +0x106, 0x1801373a2\ncmp     rsi, rax                                                       ; +0x10a, 0x1801373a6\njb      short loc_1801373E9                                            ; +0x10d, 0x1801373a9\ncmp     [rdi+1], bpl                                                   ; +0x10f, 0x1801373ab\njz      short loc_1801373E9                                            ; +0x113, 0x1801373af\nmov     ecx, [rcx+8]                                                   ; +0x115, 0x1801373b1\njmp     short loc_180137339                                            ; +0x118, 0x1801373b4\nmov     eax, ebp                                                       ; +0x11a, 0x1801373b6\nmov     r9d, 1                                                         ; +0x11c, 0x1801373b8\ntest    rbx, rbx                                                       ; +0x122, 0x1801373be\nmov     r8, rdi                                                        ; +0x125, 0x1801373c1\nsetnz   al                                                             ; +0x128, 0x1801373c4\nmov     [rsp+58h+var_30], eax                                          ; +0x12b, 0x1801373c7\nlea     edx, [r9+8]                                                    ; +0x12f, 0x1801373cb\nmov     rax, [rsp+58h+Locale.locinfo]                                  ; +0x133, 0x1801373cf\nmov     [rsp+58h+var_38], rbx                                          ; +0x138, 0x1801373d4\nmov     ecx, [rax+0Ch]                                                 ; +0x13d, 0x1801373d9\ncall    __acrt_MultiByteToWideChar                                     ; +0x140, 0x1801373dc\ntest    eax, eax                                                       ; +0x145, 0x1801373e1\njnz     loc_180137334                                                  ; +0x147, 0x1801373e3\ncall    _errno                                                         ; +0x14d, 0x1801373e9\nor      ecx, 0FFFFFFFFh                                                ; +0x152, 0x1801373ee\nmov     dword ptr [rax], 2Ah ; '*'                                     ; +0x155, 0x1801373f1\njmp     loc_180137339                                                  ; +0x15b, 0x1801373f7\nmov     cs:qword_1801F5568, rbp                                        ; +0x160, 0x1801373fc\nxor     eax, eax                                                       ; +0x167, 0x180137403\nmov     rbx, [rsp+58h+arg_0]                                           ; +0x169, 0x180137405\nmov     rbp, [rsp+58h+arg_8]                                           ; +0x16e, 0x18013740a\nmov     rsi, [rsp+58h+arg_10]                                          ; +0x173, 0x18013740f\nadd     rsp, 50h                                                       ; +0x178, 0x180137414\npop     rdi                                                            ; +0x17c, 0x180137418\nretn                                                                   ; +0x17d, 0x180137419", "xrefs": ["unknown_libname_48 @ 0x18012e42a", "unknown_libname_49 @ 0x18012e4d2", "unknown_libname_57 @ 0x18012ee90", "unknown_libname_58 @ 0x18012ef92", "mbtowc @ 0x18013741f", "<???> @ 0x1802035cc"], "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"}