This commit is contained in:
PatrickvL 2017-03-08 16:29:23 +01:00
commit f8fc7d09dc
5 changed files with 50 additions and 56 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -43,12 +43,14 @@ namespace xboxkrnl
#include <xboxkrnl/xboxkrnl.h> // For HalReadSMCTrayState, etc.
};
#include <Shlwapi.h> // 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);
}
}
// ******************************************************************

View File

@ -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);