From afa9d02e2ed9b600f4015252e48eab7cf4229541 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Fri, 19 Aug 2016 19:55:18 +0100 Subject: [PATCH] Implement fake kernel header to allow XapiRestrictCodeSelectorLimit to succeed Cxbx now requires support for large address space on 32-bit applications, this may break some 32-bit operating systems. --- src/Cxbx/EmuExe.cpp | 2 +- src/CxbxKrnl/CxbxKrnl.cpp | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Cxbx/EmuExe.cpp b/src/Cxbx/EmuExe.cpp index 04c570d01..3d0d5f292 100644 --- a/src/Cxbx/EmuExe.cpp +++ b/src/Cxbx/EmuExe.cpp @@ -61,7 +61,7 @@ EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename, HWND m_Header.m_symbol_table_addr = 0; // unused m_Header.m_symbols = 0; // unused m_Header.m_sizeof_optional_header = sizeof(OptionalHeader); // size of optional header - m_Header.m_characteristics = 0x010F; // should be fine.. + m_Header.m_characteristics = 0x012F; // should be fine.. printf("OK\n"); } diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 6d77e200d..abf9b7366 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -297,6 +297,35 @@ extern "C" CXBXKRNL_API void CxbxKrnlInit #endif } + { + // Create a fake kernel header for XapiRestrictCodeSelectorLimit + // Thanks advancingdragon / DirtBox + typedef struct DUMMY_KERNEL + { + IMAGE_DOS_HEADER DosHeader; + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_SECTION_HEADER SectionHeader; + } *PDUMMY_KERNEL; + + PDUMMY_KERNEL DummyKernel = (PDUMMY_KERNEL)VirtualAlloc( + (PVOID)0x80010000, sizeof(DUMMY_KERNEL), + MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE + ); + + if (DummyKernel == NULL) + CxbxKrnlCleanup("InitializeDummyKernel: Could not allocate dummy kernel."); + memset(DummyKernel, 0, sizeof(DUMMY_KERNEL)); + + // XapiRestrictCodeSelectorLimit only checks these fields. + DummyKernel->DosHeader.e_lfanew = sizeof(IMAGE_DOS_HEADER); // RVA of NtHeaders + DummyKernel->FileHeader.SizeOfOptionalHeader = 0; + DummyKernel->FileHeader.NumberOfSections = 1; + // as long as this doesn't start with "INIT" + strncpy_s((PSTR)DummyKernel->SectionHeader.Name, 8, "DONGS", 8); + } + + // // load the necessary pieces of XbeHeader // @@ -320,7 +349,6 @@ extern "C" CXBXKRNL_API void CxbxKrnlInit } // Initialize devices : - char szBuffer[260]; SHGetSpecialFolderPath(NULL, szBuffer, CSIDL_APPDATA, TRUE); strcat(szBuffer, "\\Cxbx\\");