{"type": "func", "start": 6443725064, "end": 6443725347, "name": "__crt_mbstring::__wcsrtombs_utf8", "pseudocode": "// \n// __crt_mbstring::__wcsrtombs_utf8 from 0x180137108 to 0x180137223 (283 bytes)\n// \n// 2 xrefs:\n// > _wcstombs_l_helper @ 0x18012b530\n// > <???> @ 0x1802035b4\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\nunsigned __int64 __fastcall __crt_mbstring::__wcsrtombs_utf8(\n        __crt_mbstring *this,\n        char *a2,\n        const wchar_t **a3,\n        struct _Mbstatet *a4)\n{\n  unsigned __int16 *v4; // rsi\n  char16_t v5; // bp\n  __crt_mbstring *v9; // rbx\n  unsigned __int16 *v10; // rdi\n  __crt_mbstring *v11; // r12\n  size_t v12; // rax\n  size_t v13; // rbp\n  unsigned __int64 result; // rax\n  __int64 v15; // rbx\n  struct _Mbstatet *v16; // [rsp+20h] [rbp-58h]\n  _BYTE v17[8]; // [rsp+28h] [rbp-50h] BYREF\n\n  v4 = *(unsigned __int16 **)a2;\n  v5 = (unsigned __int16)a4;\n  v16 = a4;\n  if ( this )\n  {\n    v9 = this;\n    v10 = v4;\n    while ( 1 )\n    {\n      v11 = (__crt_mbstring *)v17;\n      if ( (unsigned __int64)a3 >= 4 )\n        v11 = v9;\n      v12 = __crt_mbstring::__c16rtomb_utf8(v11, (char *)*v4, v5, a4);\n      v13 = v12;\n      if ( v12 == -1 )\n        break;\n      if ( v11 != v9 )\n      {\n        if ( (unsigned __int64)a3 < v12 )\n          goto LABEL_15;\n        memmove(v9, v11, v12);\n      }\n      if ( v13 && !*((_BYTE *)v9 + v13 - 1) )\n      {\n        v10 = nullptr;\n        v9 = (__crt_mbstring *)((char *)v9 + v13 - 1);\nLABEL_15:\n        *(_QWORD *)a2 = v10;\n        return v9 - this;\n      }\n      ++v4;\n      if ( v13 )\n        v10 = v4;\n      a3 = (const wchar_t **)((char *)a3 - v13);\n      v9 = (__crt_mbstring *)((char *)v9 + v13);\n      v5 = (unsigned __int16)v16;\n    }\n    *(_QWORD *)a2 = v10;\n    return -1;\n  }\n  else\n  {\n    v15 = 0;\n    while ( 1 )\n    {\n      result = __crt_mbstring::__c16rtomb_utf8((__crt_mbstring *)v17, (char *)*v4, v5, a4);\n      if ( result == -1 )\n        break;\n      if ( result && !v17[result - 1] )\n        return v15 + result - 1;\n      v15 += result;\n      ++v4;\n    }\n  }\n  return result;\n}", "assembly": "; \n; __crt_mbstring::__wcsrtombs_utf8 from 0x180137108 to 0x180137223 (283 bytes)\n; \n; 2 xrefs:\n; > _wcstombs_l_helper @ 0x18012b530\n; > <???> @ 0x1802035b4\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, 0x180137108\npush    rbp                                                            ; +0x5, 0x18013710d\npush    rsi                                                            ; +0x6, 0x18013710e\npush    rdi                                                            ; +0x7, 0x18013710f\npush    r12                                                            ; +0x8, 0x180137110\npush    r13                                                            ; +0xa, 0x180137112\npush    r14                                                            ; +0xc, 0x180137114\npush    r15                                                            ; +0xe, 0x180137116\nsub     rsp, 40h                                                       ; +0x10, 0x180137118\nmov     rax, cs:__security_cookie                                      ; +0x14, 0x18013711c\nxor     rax, rsp                                                       ; +0x1b, 0x180137123\nmov     [rsp+78h+var_48], rax                                          ; +0x1e, 0x180137126\nmov     rsi, [rdx]                                                     ; +0x23, 0x18013712b\nmov     rbp, r9                                                        ; +0x26, 0x18013712e\nmov     [rsp+78h+var_58], r9                                           ; +0x29, 0x180137131\nmov     r13, r8                                                        ; +0x2e, 0x180137136\nmov     r14, rdx                                                       ; +0x31, 0x180137139\nmov     r15, rcx                                                       ; +0x34, 0x18013713c\ntest    rcx, rcx                                                       ; +0x37, 0x18013713f\njz      loc_1801371CB                                                  ; +0x3a, 0x180137142\nmov     rbx, rcx                                                       ; +0x40, 0x180137148\nmov     rdi, rsi                                                       ; +0x43, 0x18013714b\nmovzx   edx, word ptr [rsi]; char *                                    ; +0x46, 0x18013714e\nlea     r12, [rsp+78h+var_50]                                          ; +0x49, 0x180137151\ncmp     r13, 4                                                         ; +0x4e, 0x180137156\nmov     r8, rbp; char16_t                                              ; +0x52, 0x18013715a\ncmovnb  r12, rbx                                                       ; +0x55, 0x18013715d\nmov     rcx, r12; this                                                 ; +0x59, 0x180137161\ncall    ?__c16rtomb_utf8@__crt_mbstring@@YA_KPEAD_SPEAU_Mbstatet@@@Z   ; +0x5c, 0x180137164\nmov     rbp, rax                                                       ; +0x61, 0x180137169\ncmp     rax, 0FFFFFFFFFFFFFFFFh                                        ; +0x64, 0x18013716c\njz      short loc_1801371C2                                            ; +0x68, 0x180137170\ncmp     r12, rbx                                                       ; +0x6a, 0x180137172\njz      short loc_18013718A                                            ; +0x6d, 0x180137175\ncmp     r13, rax                                                       ; +0x6f, 0x180137177\njb      short loc_1801371B7                                            ; +0x72, 0x18013717a\nmov     r8, rax; Size                                                  ; +0x74, 0x18013717c\nmov     rdx, r12; Src                                                  ; +0x77, 0x18013717f\nmov     rcx, rbx; void *                                               ; +0x7a, 0x180137182\ncall    memmove                                                        ; +0x7d, 0x180137185\ntest    rbp, rbp                                                       ; +0x82, 0x18013718a\njz      short loc_180137199                                            ; +0x85, 0x18013718d\nlea     rax, [rbx+rbp]                                                 ; +0x87, 0x18013718f\ncmp     byte ptr [rax-1], 0                                            ; +0x8b, 0x180137193\njz      short loc_1801371B1                                            ; +0x8f, 0x180137197\nadd     rsi, 2                                                         ; +0x91, 0x180137199\ntest    rbp, rbp                                                       ; +0x95, 0x18013719d\ncmovnz  rdi, rsi                                                       ; +0x98, 0x1801371a0\nsub     r13, rbp                                                       ; +0x9c, 0x1801371a4\nadd     rbx, rbp                                                       ; +0x9f, 0x1801371a7\nmov     rbp, [rsp+78h+var_58]                                          ; +0xa2, 0x1801371aa\njmp     short loc_18013714E                                            ; +0xa7, 0x1801371af\nxor     edi, edi                                                       ; +0xa9, 0x1801371b1\nlea     rbx, [rax-1]                                                   ; +0xab, 0x1801371b3\nsub     rbx, r15                                                       ; +0xaf, 0x1801371b7\nmov     [r14], rdi                                                     ; +0xb2, 0x1801371ba\nmov     rax, rbx                                                       ; +0xb5, 0x1801371bd\njmp     short loc_1801371FE                                            ; +0xb8, 0x1801371c0\nmov     [r14], rdi                                                     ; +0xba, 0x1801371c2\nor      rax, 0FFFFFFFFFFFFFFFFh                                        ; +0xbd, 0x1801371c5\njmp     short loc_1801371FE                                            ; +0xc1, 0x1801371c9\nxor     ebx, ebx                                                       ; +0xc3, 0x1801371cb\nmovzx   edx, word ptr [rsi]; char *                                    ; +0xc5, 0x1801371cd\nlea     rcx, [rsp+78h+var_50]; this                                    ; +0xc8, 0x1801371d0\nmov     r8, rbp; char16_t                                              ; +0xcd, 0x1801371d5\ncall    ?__c16rtomb_utf8@__crt_mbstring@@YA_KPEAD_SPEAU_Mbstatet@@@Z   ; +0xd0, 0x1801371d8\ncmp     rax, 0FFFFFFFFFFFFFFFFh                                        ; +0xd5, 0x1801371dd\njz      short loc_1801371FE                                            ; +0xd9, 0x1801371e1\ntest    rax, rax                                                       ; +0xdb, 0x1801371e3\njz      short loc_1801371EF                                            ; +0xde, 0x1801371e6\ncmp     byte ptr [rsp+rax+78h+var_58+7], 0                             ; +0xe0, 0x1801371e8\njz      short loc_1801371F8                                            ; +0xe5, 0x1801371ed\nadd     rbx, rax                                                       ; +0xe7, 0x1801371ef\nadd     rsi, 2                                                         ; +0xea, 0x1801371f2\njmp     short loc_1801371CD                                            ; +0xee, 0x1801371f6\ndec     rax                                                            ; +0xf0, 0x1801371f8\nadd     rax, rbx                                                       ; +0xf3, 0x1801371fb\nmov     rcx, [rsp+78h+var_48]                                          ; +0xf6, 0x1801371fe\nxor     rcx, rsp; StackCookie                                          ; +0xfb, 0x180137203\ncall    __security_check_cookie                                        ; +0xfe, 0x180137206\nmov     rbx, [rsp+78h+arg_10]                                          ; +0x103, 0x18013720b\nadd     rsp, 40h                                                       ; +0x10b, 0x180137213\npop     r15                                                            ; +0x10f, 0x180137217\npop     r14                                                            ; +0x111, 0x180137219\npop     r13                                                            ; +0x113, 0x18013721b\npop     r12                                                            ; +0x115, 0x18013721d\npop     rdi                                                            ; +0x117, 0x18013721f\npop     rsi                                                            ; +0x118, 0x180137220\npop     rbp                                                            ; +0x119, 0x180137221\nretn                                                                   ; +0x11a, 0x180137222", "xrefs": ["_wcstombs_l_helper @ 0x18012b530", "<???> @ 0x1802035b4"], "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"}