diff --git a/import/OpenXDK/include/xboxkrnl/rtl.h b/import/OpenXDK/include/xboxkrnl/rtl.h index 388a66011..096266764 100644 --- a/import/OpenXDK/include/xboxkrnl/rtl.h +++ b/import/OpenXDK/include/xboxkrnl/rtl.h @@ -431,7 +431,18 @@ XBSYSAPI EXPORTNUM(309) NTSTATUS NTAPI RtlUnicodeStringToInteger IN PULONG Value ); -XBSYSAPI VOID *RtlUnicodeToMultiByteN; +// ****************************************************************** +// * 0x0136 - RtlUnicodeToMultiByteN() +// ****************************************************************** +XBSYSAPI EXPORTNUM(310) NTSTATUS NTAPI RtlUnicodeToMultiByteN +( + IN PCHAR MultiByteString, + IN ULONG MaxBytesInMultiByteString, + IN PULONG BytesInMultiByteString, + IN PWSTR UnicodeString, + IN ULONG BytesInUnicodeString +); + XBSYSAPI VOID *RtlUnicodeToMultiByteSize; XBSYSAPI VOID *RtlUnwind; XBSYSAPI VOID *RtlUpcaseUnicodeChar; diff --git a/src/CxbxKrnl/EmuKrnlRtl.cpp b/src/CxbxKrnl/EmuKrnlRtl.cpp index a26eb4df9..e73c9d97a 100644 --- a/src/CxbxKrnl/EmuKrnlRtl.cpp +++ b/src/CxbxKrnl/EmuKrnlRtl.cpp @@ -1023,6 +1023,36 @@ XBSYSAPI EXPORTNUM(309) xboxkrnl::NTSTATUS NTAPI xboxkrnl::RtlUnicodeStringToInt RETURN(ret); } +// ****************************************************************** +// * 0x0136 - RtlUnicodeToMultiByteN() +// ****************************************************************** +XBSYSAPI EXPORTNUM(310) xboxkrnl::NTSTATUS NTAPI xboxkrnl::RtlUnicodeToMultiByteN +( + IN PCHAR MultiByteString, + IN ULONG MaxBytesInMultiByteString, + IN PULONG BytesInMultiByteString, + IN PWSTR UnicodeString, + IN ULONG BytesInUnicodeString +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG_OUT(MultiByteString) + LOG_FUNC_ARG(MaxBytesInMultiByteString) + LOG_FUNC_ARG(BytesInMultiByteString) + LOG_FUNC_ARG(UnicodeString) + LOG_FUNC_ARG(BytesInUnicodeString) + LOG_FUNC_END; + + NTSTATUS ret = NtDll::RtlUnicodeToMultiByteN( + MultiByteString, + MaxBytesInMultiByteString, + BytesInMultiByteString, + UnicodeString, + BytesInUnicodeString); + + RETURN(ret); +} + // Prevent errors compiling RtlZeroMemory (TODO : How should we really do this?) #undef RtlZeroMemory diff --git a/src/CxbxKrnl/EmuNtDll.cpp b/src/CxbxKrnl/EmuNtDll.cpp index 492297e84..67f547c2e 100644 --- a/src/CxbxKrnl/EmuNtDll.cpp +++ b/src/CxbxKrnl/EmuNtDll.cpp @@ -148,4 +148,5 @@ IMPORT(RtlTimeToTimeFields); IMPORT(RtlTryEnterCriticalSection); IMPORT(RtlUlongByteSwap); IMPORT(RtlUnicodeStringToAnsiString); -IMPORT(RtlUnicodeStringToInteger); +IMPORT(RtlUnicodeStringToInteger); +IMPORT(RtlUnicodeToMultiByteN); diff --git a/src/CxbxKrnl/EmuNtDll.h b/src/CxbxKrnl/EmuNtDll.h index 3302d5a15..fbd0de1ec 100644 --- a/src/CxbxKrnl/EmuNtDll.h +++ b/src/CxbxKrnl/EmuNtDll.h @@ -925,6 +925,18 @@ typedef NTSTATUS (NTAPI *FPTR_RtlUnicodeStringToInteger) OUT PULONG Value ); +// ****************************************************************** +// * RtlUnicodeToMultiByteN +// ****************************************************************** +typedef NTSTATUS (NTAPI *FPTR_RtlUnicodeToMultiByteN) +( + OUT PCHAR MultiByteString, + IN ULONG MaxBytesInMultiByteString, + OUT PULONG BytesInMultiByteString OPTIONAL, + IN PCWCH UnicodeString, + IN ULONG BytesInUnicodeString +); + // ****************************************************************** // * RtlCompareMemory // ****************************************************************** @@ -1889,6 +1901,7 @@ EXTERN(RtlTryEnterCriticalSection); EXTERN(RtlUlongByteSwap); EXTERN(RtlUnicodeStringToAnsiString); EXTERN(RtlUnicodeStringToInteger); +EXTERN(RtlUnicodeToMultiByteN); #if defined(__cplusplus) } diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index b3c0fa48f..8b3acd80e 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -375,7 +375,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[379] = (uint32)FUNC(&xboxkrnl::RtlUlongByteSwap), // 0x0133 (307) (uint32)FUNC(&xboxkrnl::RtlUnicodeStringToAnsiString), // 0x0134 (308) (uint32)FUNC(&xboxkrnl::RtlUnicodeStringToInteger), // 0x0135 (309) - (uint32)PANIC(0x0136), // 0x0136 (310) RtlUnicodeToMultiByteN + (uint32)FUNC(&xboxkrnl::RtlUnicodeToMultiByteN), // 0x0136 (310) (uint32)PANIC(0x0137), // 0x0137 (311) RtlUnicodeToMultiByteSize (uint32)PANIC(0x0138), // 0x0138 (312) RtlUnwind (uint32)PANIC(0x0139), // 0x0139 (313) RtlUpcaseUnicodeChar