Gudenau's Sick RWE patch
parent
cbf427a9c8
commit
56691f48a6
|
@ -134,15 +134,15 @@ void WriteProtectMemory(void* ptr, size_t size, bool allowExecute)
|
|||
#endif
|
||||
}
|
||||
|
||||
void UnWriteProtectMemory(void* ptr, size_t size, bool allowExecute)
|
||||
// Do not modify this to allow execution, allowing RWE is a bad idea
|
||||
void UnWriteProtectMemory(void* ptr, size_t size)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
DWORD oldValue;
|
||||
if (!VirtualProtect(ptr, size, allowExecute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE, &oldValue))
|
||||
if (!VirtualProtect(ptr, size, PAGE_READWRITE, &oldValue))
|
||||
PanicAlert("UnWriteProtectMemory failed!\nVirtualProtect: %s", GetLastErrorString().c_str());
|
||||
#else
|
||||
if (mprotect(ptr, size,
|
||||
allowExecute ? (PROT_READ | PROT_WRITE | PROT_EXEC) : PROT_WRITE | PROT_READ) != 0)
|
||||
if (mprotect(ptr, size, PROT_WRITE | PROT_READ) != 0)
|
||||
{
|
||||
PanicAlert("UnWriteProtectMemory failed!\nmprotect: %s", LastStrerrorString().c_str());
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ void* AllocateAlignedMemory(size_t size, size_t alignment);
|
|||
void FreeAlignedMemory(void* ptr);
|
||||
void ReadProtectMemory(void* ptr, size_t size);
|
||||
void WriteProtectMemory(void* ptr, size_t size, bool executable = false);
|
||||
void UnWriteProtectMemory(void* ptr, size_t size, bool allowExecute = false);
|
||||
void UnWriteProtectMemory(void* ptr, size_t size);
|
||||
size_t MemPhysical();
|
||||
|
||||
} // namespace Common
|
||||
|
|
|
@ -288,7 +288,7 @@ static const u8* gdsp_idma_in(u16 dsp_addr, u32 addr, u32 size)
|
|||
const u8* code = &g_dsp.cpu_ram[addr & 0x0fffffff];
|
||||
g_dsp.iram_crc = HashEctor(code, size);
|
||||
|
||||
Common::UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false);
|
||||
Common::UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE);
|
||||
memcpy(dst, code, size);
|
||||
for (size_t i = 0; i < size / 2; i++)
|
||||
dst[i] = Common::swap16(dst[i]);
|
||||
|
|
|
@ -75,7 +75,7 @@ void DSPLLE::DoState(PointerWrap& p)
|
|||
g_dsp.accelerator->DoState(p);
|
||||
p.Do(g_dsp.mbox[0]);
|
||||
p.Do(g_dsp.mbox[1]);
|
||||
Common::UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false);
|
||||
Common::UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE);
|
||||
p.DoArray(g_dsp.iram, DSP_IRAM_SIZE);
|
||||
Common::WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false);
|
||||
if (p.GetMode() == PointerWrap::MODE_READ)
|
||||
|
|
|
@ -26,7 +26,7 @@ void WriteProtectMemory(void* ptr, size_t size, bool allowExecute)
|
|||
{
|
||||
}
|
||||
|
||||
void UnWriteProtectMemory(void* ptr, size_t size, bool allowExecute)
|
||||
void UnWriteProtectMemory(void* ptr, size_t size)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ public:
|
|||
virtual bool HandleFault(uintptr_t access_address, SContext* ctx) override
|
||||
{
|
||||
m_pre_unprotect_time = std::chrono::high_resolution_clock::now();
|
||||
Common::UnWriteProtectMemory(m_data, PAGE_GRAN, /*allowExecute*/ false);
|
||||
Common::UnWriteProtectMemory(m_data, PAGE_GRAN);
|
||||
m_post_unprotect_time = std::chrono::high_resolution_clock::now();
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue