Memory-map contiguous memory
This commit is contained in:
parent
4235c48fb7
commit
d3d37be902
|
@ -83,6 +83,7 @@ char szFilePath_CxbxReloaded_Exe[MAX_PATH] = { 0 };
|
||||||
char szFolder_CxbxReloadedData[MAX_PATH] = { 0 };
|
char szFolder_CxbxReloadedData[MAX_PATH] = { 0 };
|
||||||
char szFilePath_LaunchDataPage_bin[MAX_PATH] = { 0 };
|
char szFilePath_LaunchDataPage_bin[MAX_PATH] = { 0 };
|
||||||
char szFilePath_EEPROM_bin[MAX_PATH] = { 0 };
|
char szFilePath_EEPROM_bin[MAX_PATH] = { 0 };
|
||||||
|
char szFilePath_memory_bin[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
std::string CxbxBasePath;
|
std::string CxbxBasePath;
|
||||||
HANDLE CxbxBasePathHandle;
|
HANDLE CxbxBasePathHandle;
|
||||||
|
@ -224,6 +225,77 @@ void RestoreExeImageHeader()
|
||||||
ExeOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS] = NewOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS];
|
ExeOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS] = NewOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CONTIGUOUS_MEMORY_SIZE (64 * 1024 * 1024)
|
||||||
|
|
||||||
|
void *CxbxRestoreContiguousMemory(char *szFilePath_memory_bin)
|
||||||
|
{
|
||||||
|
// First, try to open an existing memory.bin file :
|
||||||
|
HANDLE hFile = CreateFile(szFilePath_memory_bin,
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
/* lpSecurityAttributes */nullptr,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL, // FILE_FLAG_WRITE_THROUGH
|
||||||
|
/* hTemplateFile */nullptr);
|
||||||
|
|
||||||
|
bool NeedsInitialization = (hFile == INVALID_HANDLE_VALUE);
|
||||||
|
if (NeedsInitialization)
|
||||||
|
{
|
||||||
|
// If the memory.bin file doesn't exist yet, create it :
|
||||||
|
hFile = CreateFile(szFilePath_memory_bin,
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
/* lpSecurityAttributes */nullptr,
|
||||||
|
OPEN_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL, // FILE_FLAG_WRITE_THROUGH
|
||||||
|
/* hTemplateFile */nullptr);
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CxbxKrnlCleanup("CxbxRestoreContiguousMemory : Couldn't create memory.bin file!\n");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO : Make sure memory.bin is at least 64 MB in size - FileSeek(hFile, CONTIGUOUS_MEMORY_SIZE, soFromBeginning);
|
||||||
|
|
||||||
|
HANDLE hFileMapping = CreateFileMapping(
|
||||||
|
hFile,
|
||||||
|
/* lpFileMappingAttributes */nullptr,
|
||||||
|
PAGE_READWRITE,
|
||||||
|
/* dwMaximumSizeHigh */0,
|
||||||
|
/* dwMaximumSizeLow */CONTIGUOUS_MEMORY_SIZE,
|
||||||
|
/**/nullptr);
|
||||||
|
if (hFileMapping == NULL)
|
||||||
|
{
|
||||||
|
CxbxKrnlCleanup("CxbxRestoreContiguousMemory : Couldn't create contiguous memory.bin file mapping!\n");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map memory.bin contents into memory :
|
||||||
|
void *memory = (void *)MapViewOfFileEx(
|
||||||
|
hFileMapping,
|
||||||
|
FILE_MAP_READ | FILE_MAP_WRITE,
|
||||||
|
/* dwFileOffsetHigh */0,
|
||||||
|
/* dwFileOffsetLow */0,
|
||||||
|
CONTIGUOUS_MEMORY_SIZE,
|
||||||
|
(void *)MM_SYSTEM_PHYSICAL_MAP);
|
||||||
|
if (memory == NULL)
|
||||||
|
{
|
||||||
|
CxbxKrnlCleanup("CxbxRestoreContiguousMemory: Couldn't map contiguous memory.bin into memory!");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NeedsInitialization)
|
||||||
|
{
|
||||||
|
memset(memory, 0, CONTIGUOUS_MEMORY_SIZE);
|
||||||
|
DbgPrintf("EmuMain: Initialized contiguous memory\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DbgPrintf("EmuMain: Loaded contiguous memory.bin\n");
|
||||||
|
|
||||||
|
return memory;
|
||||||
|
}
|
||||||
|
|
||||||
void CxbxKrnlMain(int argc, char* argv[])
|
void CxbxKrnlMain(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
// Skip '/load' switch
|
// Skip '/load' switch
|
||||||
|
@ -286,18 +358,21 @@ void CxbxKrnlMain(int argc, char* argv[])
|
||||||
// Clear out the entire memory range
|
// Clear out the entire memory range
|
||||||
memset((void*)ExeDosHeader, 0, EMU_MAX_MEMORY_SIZE);
|
memset((void*)ExeDosHeader, 0, EMU_MAX_MEMORY_SIZE);
|
||||||
|
|
||||||
|
|
||||||
// Restore enough of the executable image headers to keep WinAPI's working :
|
// Restore enough of the executable image headers to keep WinAPI's working :
|
||||||
RestoreExeImageHeader();
|
RestoreExeImageHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
CxbxInitFilePaths();
|
CxbxInitFilePaths();
|
||||||
|
|
||||||
|
CxbxRestoreContiguousMemory(szFilePath_memory_bin);
|
||||||
|
|
||||||
|
CxbxRestorePersistentMemoryRegions();
|
||||||
|
|
||||||
EEPROM = CxbxRestoreEEPROM(szFilePath_EEPROM_bin);
|
EEPROM = CxbxRestoreEEPROM(szFilePath_EEPROM_bin);
|
||||||
if (EEPROM == nullptr)
|
if (EEPROM == nullptr)
|
||||||
CxbxKrnlCleanup("EmuMain : Couldn't init EEPROM!");
|
CxbxKrnlCleanup("EmuMain : Couldn't init EEPROM!");
|
||||||
|
|
||||||
CxbxRestorePersistentMemoryRegions();
|
|
||||||
|
|
||||||
// TODO : Instead of loading an Xbe here, initialize the kernel so that it will launch the Xbe on itself.
|
// TODO : Instead of loading an Xbe here, initialize the kernel so that it will launch the Xbe on itself.
|
||||||
|
|
||||||
// Now we can load and run the XBE :
|
// Now we can load and run the XBE :
|
||||||
|
@ -477,13 +552,7 @@ void CxbxKrnlInit
|
||||||
IMAGE_SECTION_HEADER SectionHeader;
|
IMAGE_SECTION_HEADER SectionHeader;
|
||||||
} *PDUMMY_KERNEL;
|
} *PDUMMY_KERNEL;
|
||||||
|
|
||||||
PDUMMY_KERNEL DummyKernel = (PDUMMY_KERNEL)VirtualAlloc(
|
PDUMMY_KERNEL DummyKernel = (PDUMMY_KERNEL)XBOX_KERNEL_BASE;
|
||||||
(PVOID)XBOX_KERNEL_BASE, 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));
|
memset(DummyKernel, 0, sizeof(DUMMY_KERNEL));
|
||||||
|
|
||||||
// XapiRestrictCodeSelectorLimit only checks these fields.
|
// XapiRestrictCodeSelectorLimit only checks these fields.
|
||||||
|
@ -661,7 +730,8 @@ void CxbxInitFilePaths()
|
||||||
CxbxKrnlCleanup("CxbxInitFilePaths : Couldn't create CxbxReloaded AppData folder!");
|
CxbxKrnlCleanup("CxbxInitFilePaths : Couldn't create CxbxReloaded AppData folder!");
|
||||||
|
|
||||||
snprintf(szFilePath_LaunchDataPage_bin, MAX_PATH, "%s\\CxbxLaunchDataPage.bin", szFolder_CxbxReloadedData);
|
snprintf(szFilePath_LaunchDataPage_bin, MAX_PATH, "%s\\CxbxLaunchDataPage.bin", szFolder_CxbxReloadedData);
|
||||||
snprintf(szFilePath_EEPROM_bin, MAX_PATH, "%s\\EEPROM.bin", szFolder_CxbxReloadedData); // TODO : Start using this
|
snprintf(szFilePath_EEPROM_bin, MAX_PATH, "%s\\EEPROM.bin", szFolder_CxbxReloadedData);
|
||||||
|
snprintf(szFilePath_memory_bin, MAX_PATH, "%s\\memory.bin", szFolder_CxbxReloadedData);
|
||||||
|
|
||||||
GetModuleFileName(GetModuleHandle(NULL), szFilePath_CxbxReloaded_Exe, MAX_PATH);
|
GetModuleFileName(GetModuleHandle(NULL), szFilePath_CxbxReloaded_Exe, MAX_PATH);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue