diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/host_memory.cpp | 15 |
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 | ||