{"type": "func", "start": 6443752108, "end": 6443752482, "name": "__crt_mbstring::__mbsrtowcs_utf8", "pseudocode": "// \n// __crt_mbstring::__mbsrtowcs_utf8 from 0x18013daac to 0x18013dc22 (374 bytes)\n// \n// 3 xrefs:\n// > write_double_translated_ansi_nolock @ 0x18013fbb0\n// > write_double_translated_ansi_nolock @ 0x18013fc18\n// > <???> @ 0x180203b18\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 __crt_mbstring::__mbsrtowcs_utf8(\n        __crt_mbstring *this,\n        wchar_t *a2,\n        const char **a3,\n        unsigned __int64 a4)\n{\n  __int64 v4; // rdi\n  const char **v6; // rbp\n  __crt_mbstring *v9; // rbx\n  __int64 v10; // r8\n  unsigned __int64 v11; // rax\n  __int16 v12; // cx\n  unsigned int v13; // ecx\n  __int64 i; // rbx\n  __int64 v16; // r8\n  unsigned __int64 v17; // rax\n  struct _Mbstatet *v18; // [rsp+20h] [rbp-28h]\n  unsigned int v19; // [rsp+50h] [rbp+8h] BYREF\n\n  v4 = *(_QWORD *)a2;\n  v6 = a3;\n  if ( !this )\n  {\n    for ( i = 0; ; ++i )\n    {\n      if ( *(_BYTE *)v4 )\n        v16 = *(_BYTE *)(v4 + 1) ? (*(_BYTE *)(v4 + 2) != 0) + 3LL : 2LL;\n      else\n        v16 = 1;\n      v17 = __crt_mbstring::__mbrtoc32_utf8(nullptr, (char32_t *)v4, (const char *)v16, a4, v18);\n      if ( v17 == -1 )\n        break;\n      if ( !v17 )\n        return i;\n      if ( v17 == 4 )\n        ++i;\n      v4 += v17;\n    }\n    goto LABEL_18;\n  }\n  v9 = this;\n  if ( a3 )\n  {\n    while ( 1 )\n    {\n      if ( *(_BYTE *)v4 )\n        v10 = *(_BYTE *)(v4 + 1) ? (*(_BYTE *)(v4 + 2) != 0) + 3LL : 2LL;\n      else\n        v10 = 1;\n      v11 = __crt_mbstring::__mbrtoc32_utf8((__crt_mbstring *)&v19, (char32_t *)v4, (const char *)v10, a4, v18);\n      if ( v11 == -1 )\n        break;\n      if ( !v11 )\n      {\n        v4 = 0;\n        *(_WORD *)v9 = 0;\n        goto LABEL_14;\n      }\n      v12 = v19;\n      if ( v19 > 0xFFFF )\n      {\n        if ( (unsigned __int64)v6 <= 1 )\n          goto LABEL_14;\n        v13 = v19 - 0x10000;\n        v19 = v13;\n        v6 = (const char **)((char *)v6 - 1);\n        *(_WORD *)v9 = (v13 >> 10) | 0xD800;\n        v9 = (__crt_mbstring *)((char *)v9 + 2);\n        v12 = v13 & 0x3FF | 0xDC00;\n      }\n      *(_WORD *)v9 = v12;\n      v4 += v11;\n      v9 = (__crt_mbstring *)((char *)v9 + 2);\n      v6 = (const char **)((char *)v6 - 1);\n      if ( !v6 )\n        goto LABEL_14;\n    }\n    *(_QWORD *)a2 = v4;\nLABEL_18:\n    *errno() = 42;\n    return -1;\n  }\nLABEL_14:\n  *(_QWORD *)a2 = v4;\n  return (v9 - this) >> 1;\n}", "assembly": "; \n; __crt_mbstring::__mbsrtowcs_utf8 from 0x18013daac to 0x18013dc22 (374 bytes)\n; \n; 3 xrefs:\n; > write_double_translated_ansi_nolock @ 0x18013fbb0\n; > write_double_translated_ansi_nolock @ 0x18013fc18\n; > <???> @ 0x180203b18\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_8], rbx                                               ; +0x0, 0x18013daac\nmov     [rsp+arg_10], rbp                                              ; +0x5, 0x18013dab1\npush    rdi                                                            ; +0xa, 0x18013dab6\npush    r12                                                            ; +0xb, 0x18013dab7\npush    r13                                                            ; +0xd, 0x18013dab9\npush    r14                                                            ; +0xf, 0x18013dabb\npush    r15; struct _Mbstatet *                                        ; +0x11, 0x18013dabd\nsub     rsp, 20h                                                       ; +0x13, 0x18013dabf\nmov     rdi, [rdx]                                                     ; +0x17, 0x18013dac3\nxor     r13d, r13d                                                     ; +0x1a, 0x18013dac6\nmov     r12, r9                                                        ; +0x1d, 0x18013dac9\nmov     rbp, r8                                                        ; +0x20, 0x18013dacc\nmov     r14, rdx                                                       ; +0x23, 0x18013dacf\nmov     r15, rcx                                                       ; +0x26, 0x18013dad2\ntest    rcx, rcx                                                       ; +0x29, 0x18013dad5\njz      loc_18013DBCC                                                  ; +0x2c, 0x18013dad8\nmov     rbx, rcx                                                       ; +0x32, 0x18013dade\ntest    r8, r8                                                         ; +0x35, 0x18013dae1\njz      loc_18013DB8B                                                  ; +0x38, 0x18013dae4\ncmp     [rdi], r13b                                                    ; +0x3e, 0x18013daea\njnz     short loc_18013DAF7                                            ; +0x41, 0x18013daed\nmov     r8d, 1                                                         ; +0x43, 0x18013daef\njmp     short loc_18013DB14                                            ; +0x49, 0x18013daf5\ncmp     [rdi+1], r13b                                                  ; +0x4b, 0x18013daf7\njnz     short loc_18013DB05                                            ; +0x4f, 0x18013dafb\nmov     r8d, 2                                                         ; +0x51, 0x18013dafd\njmp     short loc_18013DB14                                            ; +0x57, 0x18013db03\nmov     al, [rdi+2]                                                    ; +0x59, 0x18013db05\nneg     al                                                             ; +0x5c, 0x18013db08\nsbb     r8, r8                                                         ; +0x5e, 0x18013db0a\nneg     r8                                                             ; +0x61, 0x18013db0d\nadd     r8, 3; char *                                                  ; +0x64, 0x18013db10\nmov     r9, r12; unsigned __int64                                      ; +0x68, 0x18013db14\nlea     rcx, [rsp+48h+arg_0]; this                                     ; +0x6b, 0x18013db17\nmov     rdx, rdi; char32_t *                                           ; +0x70, 0x18013db1c\ncall    ?__mbrtoc32_utf8@__crt_mbstring@@YA_KPEA_UPEBD_KPEAU_Mbstatet@@@Z ; +0x73, 0x18013db1f\nmov     rdx, rax                                                       ; +0x78, 0x18013db24\ncmp     rax, 0FFFFFFFFFFFFFFFFh                                        ; +0x7b, 0x18013db27\njz      short loc_18013DBA2                                            ; +0x7f, 0x18013db2b\ntest    rax, rax                                                       ; +0x81, 0x18013db2d\njz      short loc_18013DB99                                            ; +0x84, 0x18013db30\nmov     ecx, [rsp+48h+arg_0]                                           ; +0x86, 0x18013db32\ncmp     ecx, 0FFFFh                                                    ; +0x8a, 0x18013db36\njbe     short loc_18013DB77                                            ; +0x90, 0x18013db3c\ncmp     rbp, 1                                                         ; +0x92, 0x18013db3e\njbe     short loc_18013DB8B                                            ; +0x96, 0x18013db42\nadd     ecx, 0FFFF0000h                                                ; +0x98, 0x18013db44\nmov     r8d, 0D800h                                                    ; +0x9e, 0x18013db4a\nmov     eax, ecx                                                       ; +0xa4, 0x18013db50\nmov     [rsp+48h+arg_0], ecx                                           ; +0xa6, 0x18013db52\nshr     eax, 0Ah                                                       ; +0xaa, 0x18013db56\ndec     rbp                                                            ; +0xad, 0x18013db59\nor      ax, r8w                                                        ; +0xb0, 0x18013db5c\nmov     [rbx], ax                                                      ; +0xb4, 0x18013db60\nmov     eax, 3FFh                                                      ; +0xb7, 0x18013db63\nand     cx, ax                                                         ; +0xbc, 0x18013db68\nadd     rbx, 2                                                         ; +0xbf, 0x18013db6b\nmov     eax, 0DC00h                                                    ; +0xc3, 0x18013db6f\nor      cx, ax                                                         ; +0xc8, 0x18013db74\nmov     [rbx], cx                                                      ; +0xcb, 0x18013db77\nadd     rdi, rdx                                                       ; +0xce, 0x18013db7a\nadd     rbx, 2                                                         ; +0xd1, 0x18013db7d\nsub     rbp, 1                                                         ; +0xd5, 0x18013db81\njnz     loc_18013DAEA                                                  ; +0xd9, 0x18013db85\nsub     rbx, r15                                                       ; +0xdf, 0x18013db8b\nmov     [r14], rdi                                                     ; +0xe2, 0x18013db8e\nsar     rbx, 1                                                         ; +0xe5, 0x18013db91\nmov     rax, rbx                                                       ; +0xe8, 0x18013db94\njmp     short loc_18013DBB4                                            ; +0xeb, 0x18013db97\nmov     rdi, r13                                                       ; +0xed, 0x18013db99\nmov     [rbx], r13w                                                    ; +0xf0, 0x18013db9c\njmp     short loc_18013DB8B                                            ; +0xf4, 0x18013dba0\nmov     [r14], rdi                                                     ; +0xf6, 0x18013dba2\ncall    _errno                                                         ; +0xf9, 0x18013dba5\nmov     dword ptr [rax], 2Ah ; '*'                                     ; +0xfe, 0x18013dbaa\nor      rax, 0FFFFFFFFFFFFFFFFh                                        ; +0x104, 0x18013dbb0\nmov     rbx, [rsp+48h+arg_8]                                           ; +0x108, 0x18013dbb4\nmov     rbp, [rsp+48h+arg_10]                                          ; +0x10d, 0x18013dbb9\nadd     rsp, 20h                                                       ; +0x112, 0x18013dbbe\npop     r15                                                            ; +0x116, 0x18013dbc2\npop     r14                                                            ; +0x118, 0x18013dbc4\npop     r13                                                            ; +0x11a, 0x18013dbc6\npop     r12                                                            ; +0x11c, 0x18013dbc8\npop     rdi                                                            ; +0x11e, 0x18013dbca\nretn                                                                   ; +0x11f, 0x18013dbcb\nmov     rbx, r13                                                       ; +0x120, 0x18013dbcc\ncmp     [rdi], r13b                                                    ; +0x123, 0x18013dbcf\njnz     short loc_18013DBDC                                            ; +0x126, 0x18013dbd2\nmov     r8d, 1                                                         ; +0x128, 0x18013dbd4\njmp     short loc_18013DBF9                                            ; +0x12e, 0x18013dbda\ncmp     [rdi+1], r13b                                                  ; +0x130, 0x18013dbdc\njnz     short loc_18013DBEA                                            ; +0x134, 0x18013dbe0\nmov     r8d, 2                                                         ; +0x136, 0x18013dbe2\njmp     short loc_18013DBF9                                            ; +0x13c, 0x18013dbe8\nmov     al, [rdi+2]                                                    ; +0x13e, 0x18013dbea\nneg     al                                                             ; +0x141, 0x18013dbed\nsbb     r8, r8                                                         ; +0x143, 0x18013dbef\nneg     r8                                                             ; +0x146, 0x18013dbf2\nadd     r8, 3; char *                                                  ; +0x149, 0x18013dbf5\nmov     r9, r12; unsigned __int64                                      ; +0x14d, 0x18013dbf9\nmov     rdx, rdi; char32_t *                                           ; +0x150, 0x18013dbfc\nxor     ecx, ecx; this                                                 ; +0x153, 0x18013dbff\ncall    ?__mbrtoc32_utf8@__crt_mbstring@@YA_KPEA_UPEBD_KPEAU_Mbstatet@@@Z ; +0x155, 0x18013dc01\ncmp     rax, 0FFFFFFFFFFFFFFFFh                                        ; +0x15a, 0x18013dc06\njz      short loc_18013DBA5                                            ; +0x15e, 0x18013dc0a\ntest    rax, rax                                                       ; +0x160, 0x18013dc0c\njz      short loc_18013DB94                                            ; +0x163, 0x18013dc0f\ncmp     rax, 4                                                         ; +0x165, 0x18013dc11\njnz     short loc_18013DC1A                                            ; +0x169, 0x18013dc15\ninc     rbx                                                            ; +0x16b, 0x18013dc17\nadd     rdi, rax                                                       ; +0x16e, 0x18013dc1a\ninc     rbx                                                            ; +0x171, 0x18013dc1d\njmp     short loc_18013DBCF                                            ; +0x174, 0x18013dc20", "xrefs": ["write_double_translated_ansi_nolock @ 0x18013fbb0", "write_double_translated_ansi_nolock @ 0x18013fc18", "<???> @ 0x180203b18"], "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"}