From 0f36366310dcf9f6560174be7f2383cb7ae7b9d5 Mon Sep 17 00:00:00 2001 From: Echelon9 Date: Sun, 29 Mar 2015 21:28:50 +1100 Subject: [PATCH] Add support for RtlFreeAnsiString (Kernel API 0x11E / 286) --- import/OpenXDK/include/xboxkrnl/rtl.h | 10 +++++++++- src/CxbxKrnl/EmuKrnl.cpp | 23 +++++++++++++++++++++++ src/CxbxKrnl/EmuNtDll.cpp | 1 + src/CxbxKrnl/EmuNtDll.h | 9 +++++++++ src/CxbxKrnl/KernelThunk.cpp | 2 +- 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/import/OpenXDK/include/xboxkrnl/rtl.h b/import/OpenXDK/include/xboxkrnl/rtl.h index cd5bae35b..c0fc4e2f2 100644 --- a/import/OpenXDK/include/xboxkrnl/rtl.h +++ b/import/OpenXDK/include/xboxkrnl/rtl.h @@ -111,7 +111,15 @@ XBSYSAPI VOID *RtlExtendedLargeIntegerDivide; XBSYSAPI VOID *RtlExtendedMagicDivide; XBSYSAPI VOID *RtlFillMemory; XBSYSAPI VOID *RtlFillMemoryUlong; -XBSYSAPI VOID *RtlFreeAnsiString; + +// ****************************************************************** +// * RtlFreeAnsiString +// ****************************************************************** +XBSYSAPI EXPORTNUM(286) VOID NTAPI RtlFreeAnsiString +( + IN OUT PANSI_STRING AnsiString +); + XBSYSAPI VOID *RtlFreeUnicodeString; XBSYSAPI VOID *RtlGetCallersAddress; diff --git a/src/CxbxKrnl/EmuKrnl.cpp b/src/CxbxKrnl/EmuKrnl.cpp index ea1300ddf..7a613bdb5 100644 --- a/src/CxbxKrnl/EmuKrnl.cpp +++ b/src/CxbxKrnl/EmuKrnl.cpp @@ -4302,6 +4302,29 @@ XBSYSAPI EXPORTNUM(279) xboxkrnl::BOOLEAN NTAPI xboxkrnl::RtlEqualString return bRet; } +// ****************************************************************** +// * 0x011E - RtlFreeAnsiString +// ****************************************************************** +XBSYSAPI EXPORTNUM(286) VOID NTAPI xboxkrnl::RtlFreeAnsiString +( + IN OUT PANSI_STRING AnsiString +) +{ + EmuSwapFS(); // Win2k/XP FS + + DbgPrintf("EmuKrnl (0x%X): RtlFreeAnsiString\n" + "(\n" + " AnsiString : 0x%.08X\n" + ");\n", + GetCurrentThreadId(), AnsiString); + + NtDll::RtlFreeAnsiString((NtDll::PANSI_STRING)AnsiString); + + EmuSwapFS(); // Xbox FS + + return; +} + // ****************************************************************** // * 0x0121 - RtlInitAnsiString // ****************************************************************** diff --git a/src/CxbxKrnl/EmuNtDll.cpp b/src/CxbxKrnl/EmuNtDll.cpp index 369712399..9ff8792ee 100644 --- a/src/CxbxKrnl/EmuNtDll.cpp +++ b/src/CxbxKrnl/EmuNtDll.cpp @@ -53,6 +53,7 @@ NtDll::FPTR_RtlInitAnsiString NtDll::RtlInitAnsiString = NtDll::FPTR_RtlInitUnicodeString NtDll::RtlInitUnicodeString = (NtDll::FPTR_RtlInitUnicodeString)GetProcAddress(hNtDll, "RtlInitUnicodeString"); NtDll::FPTR_RtlAnsiStringToUnicodeString NtDll::RtlAnsiStringToUnicodeString = (NtDll::FPTR_RtlAnsiStringToUnicodeString)GetProcAddress(hNtDll, "RtlAnsiStringToUnicodeString"); NtDll::FPTR_RtlUnicodeStringToAnsiString NtDll::RtlUnicodeStringToAnsiString = (NtDll::FPTR_RtlUnicodeStringToAnsiString)GetProcAddress(hNtDll, "RtlUnicodeStringToAnsiString"); +NtDll::FPTR_RtlFreeAnsiString NtDll::RtlFreeAnsiString = (NtDll::FPTR_RtlFreeAnsiString)GetProcAddress(hNtDll, "RtlFreeAnsiString"); NtDll::FPTR_RtlNtStatusToDosError NtDll::RtlNtStatusToDosError = (NtDll::FPTR_RtlNtStatusToDosError)GetProcAddress(hNtDll, "RtlNtStatusToDosError"); NtDll::FPTR_RtlTimeFieldsToTime NtDll::RtlTimeFieldsToTime = (NtDll::FPTR_RtlTimeFieldsToTime)GetProcAddress(hNtDll, "RtlTimeFieldsToTime"); NtDll::FPTR_RtlTimeToTimeFields NtDll::RtlTimeToTimeFields = (NtDll::FPTR_RtlTimeToTimeFields)GetProcAddress(hNtDll, "RtlTimeToTimeFields"); diff --git a/src/CxbxKrnl/EmuNtDll.h b/src/CxbxKrnl/EmuNtDll.h index ddb30fef9..659892440 100644 --- a/src/CxbxKrnl/EmuNtDll.h +++ b/src/CxbxKrnl/EmuNtDll.h @@ -663,6 +663,14 @@ typedef NTSTATUS (NTAPI *FPTR_RtlUnicodeStringToAnsiString) IN BOOLEAN AllocateDestinationString ); +// ****************************************************************** +// * RtlFreeAnsiString +// ****************************************************************** +typedef VOID (NTAPI *FPTR_RtlFreeAnsiString) +( + IN OUT PANSI_STRING AnsiString +); + // ****************************************************************** // * RtlEqualString // ****************************************************************** @@ -1077,6 +1085,7 @@ extern FPTR_RtlInitAnsiString RtlInitAnsiString; extern FPTR_RtlInitUnicodeString RtlInitUnicodeString; extern FPTR_RtlAnsiStringToUnicodeString RtlAnsiStringToUnicodeString; extern FPTR_RtlUnicodeStringToAnsiString RtlUnicodeStringToAnsiString; +extern FPTR_RtlFreeAnsiString RtlFreeAnsiString; extern FPTR_RtlNtStatusToDosError RtlNtStatusToDosError; extern FPTR_RtlTimeFieldsToTime RtlTimeFieldsToTime; extern FPTR_RtlTimeToTimeFields RtlTimeToTimeFields; diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index 9ca3abfdd..cca181db8 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -343,7 +343,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[367] = (uint32)PANIC(0x011B), // 0x011B (283) RtlExtendedMagicDivide (uint32)PANIC(0x011C), // 0x011C (284) RtlFillMemory (uint32)PANIC(0x011D), // 0x011D (285) RtlFillMemoryUlong - (uint32)PANIC(0x011E), // 0x011E (286) RtlFreeAnsiString + (uint32)xboxkrnl::RtlFreeAnsiString, // 0x011E (286) (uint32)PANIC(0x011F), // 0x011F (287) RtlFreeUnicodeString (uint32)PANIC(0x0120), // 0x0120 (288) RtlGetCallersAddress (uint32)&xboxkrnl::RtlInitAnsiString, // 0x0121 (289)