diff --git a/src/Core/Memory.cpp b/src/Core/Memory.cpp index a3bc36d1..8e77c876 100644 --- a/src/Core/Memory.cpp +++ b/src/Core/Memory.cpp @@ -1,4 +1,5 @@ #include "../Core/PS4/Loader/Elf.h" +#include "Memory.h" #ifdef _WIN64 #include @@ -11,15 +12,33 @@ namespace Memory { namespace VirtualMemory { + static DWORD convertMemoryMode(MemoryMode mode) + { + switch (mode) + { + case MemoryMode::Read: return PAGE_READONLY; + case MemoryMode::Write: + case MemoryMode::ReadWrite: return PAGE_READWRITE; - u64 memory_alloc(u64 address, u64 size) + case MemoryMode::Execute: return PAGE_EXECUTE; + case MemoryMode::ExecuteRead: return PAGE_EXECUTE_READ; + case MemoryMode::ExecuteWrite: + case MemoryMode::ExecuteReadWrite: return PAGE_EXECUTE_READWRITE; + + case MemoryMode::NoAccess: return PAGE_NOACCESS; + default: + return PAGE_NOACCESS; + } + } + + u64 memory_alloc(u64 address, u64 size, MemoryMode mode) { //TODO it supports only execute_read_write mode #ifdef _WIN64 auto ptr = reinterpret_cast(VirtualAlloc(reinterpret_cast(static_cast(address)), size, static_cast(MEM_COMMIT) | static_cast(MEM_RESERVE), - PAGE_EXECUTE_READWRITE)); + convertMemoryMode(mode))); if (ptr == 0) { diff --git a/src/Core/Memory.h b/src/Core/Memory.h index fb66e6d2..7bc5ba0f 100644 --- a/src/Core/Memory.h +++ b/src/Core/Memory.h @@ -1,11 +1,24 @@ #pragma once +#include "../types.h" constexpr u64 SYSTEM_RESERVED = 0x800000000u; constexpr u64 CODE_BASE_OFFSET = 0x100000000u; namespace Memory { + enum class MemoryMode : u32 + { + NoAccess = 0, + Read = 1, + Write = 2, + ReadWrite =3, + Execute = 4, + ExecuteRead = 5, + ExecuteWrite = 6, + ExecuteReadWrite = 7, + }; + namespace VirtualMemory { - u64 memory_alloc(u64 address, u64 size); + u64 memory_alloc(u64 address, u64 size, MemoryMode mode); } } \ No newline at end of file diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index 0572d179..c0144d10 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -109,7 +109,7 @@ void Linker::LoadModuleToMemory(Module* m) u64 base_size = calculate_base_size(elf_header, elf_pheader); m->aligned_base_size = (base_size & ~(static_cast(0x1000) - 1)) + 0x1000;//align base size to 0x1000 block size (TODO is that the default block size or it can be changed? - m->base_virtual_addr = Memory::VirtualMemory::memory_alloc(g_load_addr, m->aligned_base_size); + m->base_virtual_addr = Memory::VirtualMemory::memory_alloc(g_load_addr, m->aligned_base_size, Memory::MemoryMode::ExecuteReadWrite); LOG_INFO_IF(debug_loader, "====Load Module to Memory ========\n"); LOG_INFO_IF(debug_loader, "base_virtual_addr ......: {:#018x}\n", m->base_virtual_addr);