Unicode fixes & sizeof asserts.

This commit is contained in:
Skyth 2024-12-17 19:19:38 +00:00
parent 7d41a3dfc5
commit ed025a7a5e
3 changed files with 14 additions and 20 deletions

View file

@ -520,9 +520,9 @@ void XexGetModuleSection()
LOG_UTILITY("!!! STUB !!!"); LOG_UTILITY("!!! STUB !!!");
} }
uint32_t RtlUnicodeToMultiByteN(char* MultiByteString, uint32_t MaxBytesInMultiByteString, be<uint32_t>* BytesInMultiByteString, const wchar_t* UnicodeString, uint32_t BytesInUnicodeString) uint32_t RtlUnicodeToMultiByteN(char* MultiByteString, uint32_t MaxBytesInMultiByteString, be<uint32_t>* BytesInMultiByteString, const be<uint16_t>* UnicodeString, uint32_t BytesInUnicodeString)
{ {
const auto reqSize = BytesInUnicodeString / sizeof(wchar_t); const auto reqSize = BytesInUnicodeString / sizeof(uint16_t);
if (BytesInMultiByteString) if (BytesInMultiByteString)
*BytesInMultiByteString = reqSize; *BytesInMultiByteString = reqSize;
@ -532,7 +532,7 @@ uint32_t RtlUnicodeToMultiByteN(char* MultiByteString, uint32_t MaxBytesInMultiB
for (size_t i = 0; i < reqSize; i++) for (size_t i = 0; i < reqSize; i++)
{ {
const auto c = ByteSwap(UnicodeString[i]); const auto c = UnicodeString[i].get();
MultiByteString[i] = c < 256 ? c : '?'; MultiByteString[i] = c < 256 ? c : '?';
} }
@ -1254,26 +1254,15 @@ void NtQueryFullAttributesFile()
LOG_UTILITY("!!! STUB !!!"); LOG_UTILITY("!!! STUB !!!");
} }
uint32_t RtlMultiByteToUnicodeN(wchar_t* UnicodeString, uint32_t MaxBytesInUnicodeString, be<uint32_t>* BytesInUnicodeString, const char* MultiByteString, uint32_t BytesInMultiByteString) uint32_t RtlMultiByteToUnicodeN(be<uint16_t>* UnicodeString, uint32_t MaxBytesInUnicodeString, be<uint32_t>* BytesInUnicodeString, const char* MultiByteString, uint32_t BytesInMultiByteString)
{ {
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; uint32_t length = std::min(MaxBytesInUnicodeString / 2, BytesInMultiByteString);
std::wstring wideString = converter.from_bytes( for (size_t i = 0; i < length; i++)
MultiByteString, MultiByteString + (BytesInMultiByteString - 1) UnicodeString[i] = MultiByteString[i];
);
uint32_t bytesRequired = static_cast<uint32_t>((wideString.size() + 1) * sizeof(wchar_t));
uint32_t bytesToCopy = (bytesRequired > MaxBytesInUnicodeString)
? MaxBytesInUnicodeString
: bytesRequired;
memcpy(UnicodeString, wideString.data(), bytesToCopy);
for (size_t i = 0; i < bytesToCopy / 2; i++)
UnicodeString[i] = ByteSwap(UnicodeString[i]);
if (BytesInUnicodeString != nullptr) if (BytesInUnicodeString != nullptr)
*BytesInUnicodeString = bytesToCopy; *BytesInUnicodeString = length * 2;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -53,12 +53,16 @@ typedef union _LARGE_INTEGER {
int64_t QuadPart; int64_t QuadPart;
} LARGE_INTEGER; } LARGE_INTEGER;
static_assert(sizeof(LARGE_INTEGER) == 8);
typedef struct _FILETIME typedef struct _FILETIME
{ {
uint32_t dwLowDateTime; uint32_t dwLowDateTime;
uint32_t dwHighDateTime; uint32_t dwHighDateTime;
} FILETIME; } FILETIME;
static_assert(sizeof(FILETIME) == 8);
typedef struct _WIN32_FIND_DATAA typedef struct _WIN32_FIND_DATAA
{ {
uint32_t dwFileAttributes; uint32_t dwFileAttributes;
@ -73,6 +77,8 @@ typedef struct _WIN32_FIND_DATAA
char cAlternateFileName[14]; char cAlternateFileName[14];
} WIN32_FIND_DATAA; } WIN32_FIND_DATAA;
static_assert(sizeof(WIN32_FIND_DATAA) == 320);
#endif #endif
struct KernelObject struct KernelObject

View file

@ -46,7 +46,6 @@ using Microsoft::WRL::ComPtr;
#include <miniaudio.h> #include <miniaudio.h>
#include <extras/miniaudio_libvorbis.h> #include <extras/miniaudio_libvorbis.h>
#include <fmt/core.h> #include <fmt/core.h>
#include <codecvt>
#include <list> #include <list>
#include "framework.h" #include "framework.h"