From 6af8aff343ef8cedc877e91a1523cff2181b19df Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 7 Mar 2017 17:12:55 +0100 Subject: [PATCH 1/2] Removed unused variables --- src/CxbxKrnl/Emu.cpp | 6 ------ src/CxbxKrnl/Emu.h | 6 ------ 2 files changed, 12 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index c646755c2..a86fb19ca 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -68,12 +68,6 @@ CRITICAL_SECTION dbgCritical; // Global Variable(s) HANDLE g_hCurDir = NULL; CHAR *g_strCurDrive= NULL; -HANDLE g_hTDrive = NULL; -CHAR *g_strTDrive = NULL; -HANDLE g_hUDrive = NULL; -CHAR *g_strUDrive = NULL; -HANDLE g_hZDrive = NULL; -CHAR *g_strZDrive = NULL; volatile bool g_bEmuException = false; volatile bool g_bEmuSuspended = false; volatile bool g_bPrintfOn = true; diff --git a/src/CxbxKrnl/Emu.h b/src/CxbxKrnl/Emu.h index 62f4a3e61..054a428ba 100644 --- a/src/CxbxKrnl/Emu.h +++ b/src/CxbxKrnl/Emu.h @@ -68,12 +68,6 @@ extern void * funcExclude[2048]; // partition emulation directory handles extern HANDLE g_hCurDir; extern CHAR *g_strCurDrive; -extern HANDLE g_hTDrive; -extern CHAR *g_strTDrive; -extern HANDLE g_hUDrive; -extern CHAR *g_strUDrive; -extern HANDLE g_hZDrive; -extern CHAR *g_strZDrive; extern HWND g_hEmuWindow; // thread notification routine From 5deff290ab46cd370f4834a0fe53ce6ad2f0fef4 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 7 Mar 2017 18:09:30 +0100 Subject: [PATCH 2/2] Kernel : Implemented HalReturnToFirmware Used in XLaunchNewImage, which patch might be removed now --- src/CxbxKrnl/CxbxKrnl.cpp | 6 +++-- src/CxbxKrnl/EmuKrnlHal.cpp | 46 ++++++++++++++++++++++++++++++++++++- src/CxbxKrnl/EmuXapi.cpp | 42 +-------------------------------- 3 files changed, 50 insertions(+), 44 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 0f3b32201..7bca37a0f 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -261,7 +261,7 @@ void CxbxKrnlMain(int argc, char* argv[]) NewDosHeader = (PIMAGE_DOS_HEADER)VirtualAlloc(nullptr, ExeHeaderSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); memcpy(NewDosHeader, ExeDosHeader, ExeHeaderSize); - // Determine NewNtHeader and NewOptionalHeader, both required by RestoreExeImageHeader + // Determine NewOptionalHeader, required by RestoreExeImageHeader NewNtHeader = (PIMAGE_NT_HEADERS)((ULONG_PTR)NewDosHeader + ExeDosHeader->e_lfanew); NewOptionalHeader = (PIMAGE_OPTIONAL_HEADER)&(NewNtHeader->OptionalHeader); @@ -576,7 +576,9 @@ void CxbxKrnlInit // this will better aproximate the environment with regard to multi-threading) : DbgPrintf("EmuMain : Determining CPU affinity.\n"); { - GetProcessAffinityMask(g_CurrentProcessHandle, &g_CPUXbox, &g_CPUOthers); + if (!GetProcessAffinityMask(g_CurrentProcessHandle, &g_CPUXbox, &g_CPUOthers)) + CxbxKrnlCleanup("EmuMain: GetProcessAffinityMask failed."); + // For the other threads, remove one bit from the processor mask: g_CPUOthers = ((g_CPUXbox - 1) & g_CPUXbox); diff --git a/src/CxbxKrnl/EmuKrnlHal.cpp b/src/CxbxKrnl/EmuKrnlHal.cpp index af0e5bbc4..53a3f9eb4 100644 --- a/src/CxbxKrnl/EmuKrnlHal.cpp +++ b/src/CxbxKrnl/EmuKrnlHal.cpp @@ -43,12 +43,14 @@ namespace xboxkrnl #include // For HalReadSMCTrayState, etc. }; +#include // For PathRemoveFileSpec() #include "Logging.h" // For LOG_FUNC() #include "EmuKrnlLogging.h" #include "CxbxKrnl.h" // For CxbxKrnlCleanup #include "Emu.h" // For EmuWarning() #include "EmuX86.h" // HalReadWritePciSpace needs this #include "EmuKrnl.h" // For EEPROM +#include "EmuFile.h" // For FindNtSymbolicLinkObjectByDriveLetter // prevent name collisions namespace NtDll @@ -396,7 +398,49 @@ XBSYSAPI EXPORTNUM(49) xboxkrnl::VOID DECLSPEC_NORETURN xboxkrnl::HalReturnToFir ) { LOG_FUNC_ONE_ARG(Routine); - CxbxKrnlCleanup("Xbe has rebooted : HalReturnToFirmware(%d)", Routine); + + char *lpTitlePath = xboxkrnl::LaunchDataPage->Header.szLaunchPath; + char szXbePath[MAX_PATH]; + char szWorkingDirectoy[MAX_PATH]; + + // Convert Xbox XBE Path to Windows Path + { + EmuNtSymbolicLinkObject* symbolicLink = FindNtSymbolicLinkObjectByDriveLetter(lpTitlePath[0]); + snprintf(szXbePath, MAX_PATH, "%s%s", symbolicLink->HostSymbolicLinkPath.c_str(), &lpTitlePath[2]); + + // Determine Working Directory + strncpy_s(szWorkingDirectoy, szXbePath, MAX_PATH); + PathRemoveFileSpec(szWorkingDirectoy); + } + + // Save the launch data page to disk for later. + { + char szLaunchDataPagePath[MAX_PATH]; + snprintf(szLaunchDataPagePath, MAX_PATH, "%s\\CxbxLaunchDataPage.bin", szWorkingDirectoy); + + DbgPrintf("Saving launch data to %s\n", szLaunchDataPagePath); + // TODO : When reading Xbe files from read-only storage, we must use another location for "CxbxLaunchDataPage.bin" ! + FILE* fp = fopen(szLaunchDataPagePath, "wb"); + fseek(fp, 0, SEEK_SET); + fwrite(xboxkrnl::LaunchDataPage, sizeof(xboxkrnl::LAUNCH_DATA_PAGE), 1, fp); + fclose(fp); + } + + // Launch the new Xbe + { + char szExeFileName[MAX_PATH]; + GetModuleFileName(GetModuleHandle(NULL), szExeFileName, MAX_PATH); + + char szArgsBuffer[4096]; + snprintf(szArgsBuffer, 4096, "/load \"%s\" %u %d \"%s\"", szXbePath, CxbxKrnl_hEmuParent, CxbxKrnl_DebugMode, CxbxKrnl_DebugFileName); + + if ((int)ShellExecute(NULL, "open", szExeFileName, szArgsBuffer, szWorkingDirectoy, SW_SHOWDEFAULT) <= 32) + { + CxbxKrnlCleanup("Could not launch %s", lpTitlePath); + } + + ExitProcess(EXIT_SUCCESS); + } } // ****************************************************************** diff --git a/src/CxbxKrnl/EmuXapi.cpp b/src/CxbxKrnl/EmuXapi.cpp index e8764e32a..e01bd4ee7 100644 --- a/src/CxbxKrnl/EmuXapi.cpp +++ b/src/CxbxKrnl/EmuXapi.cpp @@ -959,47 +959,7 @@ DWORD WINAPI XTL::EMUPATCH(XLaunchNewImage) strncpy(&(xboxkrnl::LaunchDataPage->Header.szLaunchPath[0]), lpTitlePath, 520); } - char szXbePath[MAX_PATH]; - char szWorkingDirectoy[MAX_PATH]; - - // Convert Xbox XBE Path to Windows Path - { - EmuNtSymbolicLinkObject* symbolicLink = FindNtSymbolicLinkObjectByDriveLetter(lpTitlePath[0]); - snprintf(szXbePath, MAX_PATH, "%s%s", symbolicLink->HostSymbolicLinkPath.c_str(), &lpTitlePath[2]); - - // Determine Working Directory - strncpy_s(szWorkingDirectoy, szXbePath, MAX_PATH); - PathRemoveFileSpec(szWorkingDirectoy); - } - - // Save the launch data page to disk for later. - { - char szLaunchDataPagePath[MAX_PATH]; - snprintf(szLaunchDataPagePath, MAX_PATH, "%s\\CxbxLaunchDataPage.bin", szWorkingDirectoy); - - DbgPrintf("Saving launch data to %s\n", szLaunchDataPagePath); - // TODO : When reading Xbe files from read-only storage, we must use another location for "CxbxLaunchDataPage.bin" ! - FILE* fp = fopen(szLaunchDataPagePath, "wb"); - fseek(fp, 0, SEEK_SET); - fwrite(xboxkrnl::LaunchDataPage, sizeof(xboxkrnl::LAUNCH_DATA_PAGE), 1, fp); - fclose(fp); - } - - // Launch the new Xbe - { - char szExeFileName[MAX_PATH]; - GetModuleFileName(GetModuleHandle(NULL), szExeFileName, MAX_PATH); - - char szArgsBuffer[4096]; - snprintf(szArgsBuffer, 4096, "/load \"%s\" %u %d \"%s\"", szXbePath, CxbxKrnl_hEmuParent, CxbxKrnl_DebugMode, CxbxKrnl_DebugFileName); - - if ((int)ShellExecute(NULL, "open", szExeFileName, szArgsBuffer, szWorkingDirectoy, SW_SHOWDEFAULT) <= 32) - { - CxbxKrnlCleanup("Could not launch %s", lpTitlePath); - } - - ExitProcess(EXIT_SUCCESS); - } + xboxkrnl::HalReturnToFirmware(xboxkrnl::ReturnFirmwareQuickReboot); // If this function succeeds, it doesn't get a chance to return anything. RETURN(ERROR_GEN_FAILURE);