1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

Support/Windows: Add support modifying memory permissions on Windows. Patch by Aaron Ballman!

llvm-svn: 141910
This commit is contained in:
Michael J. Spencer 2011-10-13 23:16:01 +00:00
parent 219f1841f7
commit 5cbe7170de

View File

@ -54,20 +54,62 @@ bool Memory::ReleaseRWX(MemoryBlock &M, std::string *ErrMsg) {
return false;
}
static DWORD getProtection(const void *addr) {
MEMORY_BASIC_INFORMATION info;
if (sizeof(info) == ::VirtualQuery(addr, &info, sizeof(info))) {
return info.Protect;
}
return 0;
}
bool Memory::setWritable(MemoryBlock &M, std::string *ErrMsg) {
if (!setRangeWritable(M.Address, M.Size)) {
return MakeErrMsg(ErrMsg, "Cannot set memory to writeable: ");
}
return true;
}
bool Memory::setExecutable(MemoryBlock &M, std::string *ErrMsg) {
return false;
}
bool Memory::setRangeWritable(const void *Addr, size_t Size) {
if (!setRangeExecutable(M.Address, M.Size)) {
return MakeErrMsg(ErrMsg, "Cannot set memory to executable: ");
}
return true;
}
bool Memory::setRangeWritable(const void *Addr, size_t Size) {
DWORD prot = getProtection(Addr);
if (!prot)
return false;
if (prot == PAGE_EXECUTE || prot == PAGE_EXECUTE_READ) {
prot = PAGE_EXECUTE_READWRITE;
} else if (prot == PAGE_NOACCESS || prot == PAGE_READONLY) {
prot = PAGE_READWRITE;
}
DWORD oldProt;
sys::Memory::InvalidateInstructionCache(Addr, Size);
return ::VirtualProtect(const_cast<LPVOID>(Addr), Size, prot, &oldProt)
== TRUE;
}
bool Memory::setRangeExecutable(const void *Addr, size_t Size) {
return false;
DWORD prot = getProtection(Addr);
if (!prot)
return false;
if (prot == PAGE_NOACCESS) {
prot = PAGE_EXECUTE;
} else if (prot == PAGE_READONLY) {
prot = PAGE_EXECUTE_READ;
} else if (prot == PAGE_READWRITE) {
prot = PAGE_EXECUTE_READWRITE;
}
DWORD oldProt;
sys::Memory::InvalidateInstructionCache(Addr, Size);
return ::VirtualProtect(const_cast<LPVOID>(Addr), Size, prot, &oldProt)
== TRUE;
}
}