summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/host_memory.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp
index 8a328f916..c6d65aab9 100644
--- a/src/common/host_memory.cpp
+++ b/src/common/host_memory.cpp
@@ -110,9 +110,18 @@ public:
110 } else { 110 } else {
111 UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write); 111 UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write);
112 } 112 }
113 DWORD old_flags{}; 113 const size_t virtual_end = virtual_offset + length;
114 if (!VirtualProtect(virtual_base + virtual_offset, length, new_flags, &old_flags)) { 114
115 LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules"); 115 std::lock_guard lock{placeholder_mutex};
116 auto [it, end] = placeholders.equal_range({virtual_offset, virtual_end});
117 while (it != end) {
118 const size_t offset = std::max(it->lower(), virtual_offset);
119 const size_t protect_length = std::min(it->upper(), virtual_end) - offset;
120 DWORD old_flags{};
121 if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) {
122 LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
123 }
124 ++it;
116 } 125 }
117 } 126 }
118 127