mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-02 21:11:17 +12:00
67 lines
No EOL
1.8 KiB
C++
67 lines
No EOL
1.8 KiB
C++
#include "util/MemMapper/MemMapper.h"
|
|
|
|
#if BOOST_OS_WINDOWS
|
|
|
|
#include <Windows.h>
|
|
|
|
namespace MemMapper
|
|
{
|
|
const size_t sPageSize{ []()
|
|
{
|
|
SYSTEM_INFO si;
|
|
GetSystemInfo(&si);
|
|
return (size_t)si.dwPageSize;
|
|
}()
|
|
};
|
|
|
|
size_t GetPageSize()
|
|
{
|
|
return sPageSize;
|
|
}
|
|
|
|
DWORD GetPageProtection(PAGE_PERMISSION permissionFlags)
|
|
{
|
|
DWORD p = 0;
|
|
if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
|
p = PAGE_EXECUTE_READWRITE;
|
|
else if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
|
p = PAGE_READWRITE;
|
|
else if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
|
p = PAGE_READONLY;
|
|
else
|
|
cemu_assert_unimplemented();
|
|
return p;
|
|
}
|
|
|
|
void* ReserveMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags)
|
|
{
|
|
void* r = VirtualAlloc(baseAddr, size, MEM_RESERVE, GetPageProtection(permissionFlags));
|
|
return r;
|
|
}
|
|
|
|
void FreeReservation(void* baseAddr, size_t size)
|
|
{
|
|
VirtualFree(baseAddr, size, MEM_RELEASE);
|
|
}
|
|
|
|
void* AllocateMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags, bool fromReservation)
|
|
{
|
|
void* r;
|
|
if(fromReservation)
|
|
r = VirtualAlloc(baseAddr, size, MEM_COMMIT, GetPageProtection(permissionFlags));
|
|
else
|
|
r = VirtualAlloc(baseAddr, size, MEM_RESERVE | MEM_COMMIT, GetPageProtection(permissionFlags));
|
|
return r;
|
|
}
|
|
|
|
void FreeMemory(void* baseAddr, size_t size, bool fromReservation)
|
|
{
|
|
if(fromReservation)
|
|
VirtualFree(baseAddr, size, MEM_DECOMMIT);
|
|
else
|
|
VirtualFree(baseAddr, size, MEM_RELEASE);
|
|
}
|
|
|
|
};
|
|
|
|
#endif |