// // CWin32InputBox::Utf8ToAnsi from 0x18001ea00 to 0x18001ebe5 (485 bytes) // // 5 xrefs: // > CWin32InputBox::InitDialog @ 0x18001e390 // > CWin32InputBox::InitDialog @ 0x18001e420 // > CWin32InputBox::InitDialog @ 0x18001e4fd // > @ 0x18002fdf8 // > @ 0x18004b124 // // 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 // void **__fastcall CWin32InputBox::Utf8ToAnsi(void **a1, __int64 a2) { const CHAR *v4; // r8 size_t v5; // rbx int v6; // esi void *lpWideCharStr; // r12 const CHAR *v8; // r8 int v9; // esi void *v10; // rbp unsigned __int64 v11; // rdx _QWORD *v12; // rcx *(_OWORD *)a1 = 0; a1[2] = nullptr; a1[3] = (void *)15; *(_BYTE *)a1 = 0; if ( *(_QWORD *)(a2 + 16) ) { v4 = (const CHAR *)a2; if ( *(_QWORD *)(a2 + 24) > 0xFu ) v4 = *(const CHAR **)a2; v5 = -1; v6 = MultiByteToWideChar(0xFDE9u, 0, v4, -1, nullptr, 0); lpWideCharStr = malloc(2LL * (v6 + 1)); memset(lpWideCharStr, 0, 2LL * (v6 + 1)); v8 = (const CHAR *)a2; if ( *(_QWORD *)(a2 + 24) > 0xFu ) v8 = *(const CHAR **)a2; MultiByteToWideChar(0xFDE9u, 0, v8, -1, (LPWSTR)lpWideCharStr, 2 * v6 + 2); v9 = WideCharToMultiByte(0, 0, (LPCWCH)lpWideCharStr, -1, nullptr, 0, nullptr, nullptr) + 1; v10 = malloc(v9); memset(v10, 0, v9); WideCharToMultiByte(0, 0, (LPCWCH)lpWideCharStr, -1, (LPSTR)v10, v9, nullptr, nullptr); do ++v5; while ( *((_BYTE *)v10 + v5) ); sub_180003BC0(a1, v10, v5); free(v10); free(lpWideCharStr); } v11 = *(_QWORD *)(a2 + 24); if ( v11 > 0xF ) { v12 = *(_QWORD **)a2; if ( v11 + 1 >= 0x1000 ) { if ( (unsigned __int64)v12 - *(v12 - 1) - 8 > 0x1F ) invalid_parameter_noinfo_noreturn(); v12 = (_QWORD *)*(v12 - 1); } j_j_free(v12); } *(_QWORD *)(a2 + 16) = 0; *(_QWORD *)(a2 + 24) = 15; *(_BYTE *)a2 = 0; return a1; }