From e92f6e911d0582ec19b5ec2df4047a426c8c95ed Mon Sep 17 00:00:00 2001 From: rjkiv <76180273+rjkiv@users.noreply.github.com> Date: Tue, 2 Sep 2025 12:04:40 -0700 Subject: [PATCH] wideStringToString no longer cuts off wide chars --- dll/advapi32.cpp | 2 +- dll/msvcrt.cpp | 9 +++------ strutil.cpp | 26 ++++++++++++++++++++++---- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/dll/advapi32.cpp b/dll/advapi32.cpp index ebc4c1d..f3fc490 100644 --- a/dll/advapi32.cpp +++ b/dll/advapi32.cpp @@ -25,7 +25,7 @@ namespace advapi32 { return false; } - bool WIN_FUNC CryptGenRandom(void* hProv, unsigned int dwLen, char* pbBuffer){ + bool WIN_FUNC CryptGenRandom(void* hProv, unsigned int dwLen, unsigned char* pbBuffer){ DEBUG_LOG("STUB: CryptGenRandom(%p)\n", hProv); if (!pbBuffer || dwLen == 0) return false; diff --git a/dll/msvcrt.cpp b/dll/msvcrt.cpp index 422cc7f..ba67a2c 100644 --- a/dll/msvcrt.cpp +++ b/dll/msvcrt.cpp @@ -369,15 +369,12 @@ namespace msvcrt { std::string src_str = wideStringToString(src); DEBUG_LOG("wcscpy_s %s\n", src_str.c_str()); if (!dest || !src || dest_size == 0) { - return -1; + return 22; } - size_t src_len = 0; - while (src[src_len] != 0) src_len++; - - if (src_len + 1 > dest_size) { + if (wstrlen(src) + 1 > dest_size) { dest[0] = 0; - return -1; + return 34; } wstrcpy(dest, src); diff --git a/strutil.cpp b/strutil.cpp index 31eb9b1..b8192ec 100644 --- a/strutil.cpp +++ b/strutil.cpp @@ -2,6 +2,9 @@ #include "strings.h" #include #include +#include +#include +#include size_t wstrlen(const uint16_t *str) { size_t len = 0; @@ -108,14 +111,29 @@ size_t wstrncpy(uint16_t *dst, const uint16_t *src, size_t n) { } std::string wideStringToString(const uint16_t *src, int len = -1) { + if(!src) return std::string(); if (len < 0) { len = src ? wstrlen(src) : 0; } - std::string res(len, '\0'); - for (int i = 0; i < len; i++) { - res[i] = src[i] & 0xFF; + + std::u16string u16str; + for(const uint16_t* p = src; *p != 0; p++){ + u16str.push_back(*p); } - return res; + + std::wstring_convert, char16_t> convert; + return convert.to_bytes(reinterpret_cast(u16str.data())); + + // the old implementation + // std::string res(len, '\0'); + // for (int i = 0; i < len; i++) { + // if(src[i] > 255){ + // DEBUG_LOG("Encountered wide char with value 0x%X!\n", src[i]); + // assert(src[i] <= 255); + // } + // res[i] = src[i] & 0xFF; + // } + // return res; } std::vector stringToWideString(const char *src) {