[Connon] Fix protect memory for non win32 system
This commit is contained in:
parent
6bb560a387
commit
264666e2bb
|
@ -6,9 +6,9 @@
|
||||||
#endif
|
#endif
|
||||||
#include "MemoryManagement.h"
|
#include "MemoryManagement.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
static bool TranslateFromMemProtect(MEM_PROTECTION memProtection, int & OsMemProtection)
|
static bool TranslateFromMemProtect(MEM_PROTECTION memProtection, int & OsMemProtection)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
switch (memProtection)
|
switch (memProtection)
|
||||||
{
|
{
|
||||||
case MEM_NOACCESS: OsMemProtection = PAGE_NOACCESS; break;
|
case MEM_NOACCESS: OsMemProtection = PAGE_NOACCESS; break;
|
||||||
|
@ -18,9 +18,21 @@ static bool TranslateFromMemProtect(MEM_PROTECTION memProtection, int & OsMemPro
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
switch (memProtection)
|
||||||
|
{
|
||||||
|
case MEM_NOACCESS: OsMemProtection = PROT_NONE; break;
|
||||||
|
case MEM_READONLY: OsMemProtection = PROT_READ; break;
|
||||||
|
case MEM_READWRITE: OsMemProtection = PROT_READ|PROT_WRITE; break;
|
||||||
|
case MEM_EXECUTE_READWRITE: OsMemProtection = PROT_READ|PROT_WRITE|PROT_EXEC; break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
static bool TranslateToMemProtect(int OsMemProtection, MEM_PROTECTION & memProtection)
|
static bool TranslateToMemProtect(int OsMemProtection, MEM_PROTECTION & memProtection)
|
||||||
{
|
{
|
||||||
switch (OsMemProtection)
|
switch (OsMemProtection)
|
||||||
|
@ -59,28 +71,15 @@ bool FreeAddressSpace(void* addr, size_t size)
|
||||||
|
|
||||||
void* CommitMemory(void* addr, size_t size, MEM_PROTECTION memProtection)
|
void* CommitMemory(void* addr, size_t size, MEM_PROTECTION memProtection)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
|
||||||
int OsMemProtection;
|
int OsMemProtection;
|
||||||
if (!TranslateFromMemProtect(memProtection, OsMemProtection))
|
if (!TranslateFromMemProtect(memProtection, OsMemProtection))
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#ifdef _WIN32
|
||||||
return VirtualAlloc(addr, size, MEM_COMMIT, OsMemProtection);
|
return VirtualAlloc(addr, size, MEM_COMMIT, OsMemProtection);
|
||||||
#else
|
#else
|
||||||
int prot = 0;
|
void * ptr = mmap(addr, size, OsMemProtection, MAP_FIXED|MAP_SHARED|MAP_ANON, -1, 0);
|
||||||
if (memProtection == MEM_READWRITE)
|
|
||||||
{
|
|
||||||
prot = PROT_READ|PROT_WRITE;
|
|
||||||
}
|
|
||||||
else if (memProtection == MEM_EXECUTE_READWRITE)
|
|
||||||
{
|
|
||||||
prot = PROT_READ|PROT_WRITE|PROT_EXEC;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
void * ptr = mmap(addr, size, prot, MAP_FIXED|MAP_SHARED|MAP_ANON, -1, 0);
|
|
||||||
msync(addr, size, MS_SYNC|MS_INVALIDATE);
|
msync(addr, size, MS_SYNC|MS_INVALIDATE);
|
||||||
return ptr;
|
return ptr;
|
||||||
#endif
|
#endif
|
||||||
|
@ -104,13 +103,13 @@ bool DecommitMemory(void* addr, size_t size)
|
||||||
|
|
||||||
bool ProtectMemory(void* addr, size_t size, MEM_PROTECTION memProtection, MEM_PROTECTION * OldProtect)
|
bool ProtectMemory(void* addr, size_t size, MEM_PROTECTION memProtection, MEM_PROTECTION * OldProtect)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
|
||||||
int OsMemProtection;
|
int OsMemProtection;
|
||||||
if (!TranslateFromMemProtect(memProtection, OsMemProtection))
|
if (!TranslateFromMemProtect(memProtection, OsMemProtection))
|
||||||
{
|
{
|
||||||
return NULL;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
DWORD OldOsProtect;
|
DWORD OldOsProtect;
|
||||||
BOOL res = VirtualProtect(addr, size, OsMemProtection, &OldOsProtect);
|
BOOL res = VirtualProtect(addr, size, OsMemProtection, &OldOsProtect);
|
||||||
if (OldProtect != NULL)
|
if (OldProtect != NULL)
|
||||||
|
@ -122,6 +121,6 @@ bool ProtectMemory(void* addr, size_t size, MEM_PROTECTION memProtection, MEM_PR
|
||||||
}
|
}
|
||||||
return res != 0;
|
return res != 0;
|
||||||
#else
|
#else
|
||||||
return false;
|
return mprotect(addr,size,OsMemProtection) == 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
Loading…
Reference in New Issue