From ee67460ff0e12a1603431d86fe3919a24b3858fb Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Sun, 6 Jun 2021 20:53:26 -0300
Subject: [PATCH] host_memory: Support staged VirtualProtect calls

---
 src/common/host_memory.cpp | 15 ++++++++++++---
 1 file 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:
         } else {
             UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write);
         }
-        DWORD old_flags{};
-        if (!VirtualProtect(virtual_base + virtual_offset, length, new_flags, &old_flags)) {
-            LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
+        const size_t virtual_end = virtual_offset + length;
+
+        std::lock_guard lock{placeholder_mutex};
+        auto [it, end] = placeholders.equal_range({virtual_offset, virtual_end});
+        while (it != end) {
+            const size_t offset = std::max(it->lower(), virtual_offset);
+            const size_t protect_length = std::min(it->upper(), virtual_end) - offset;
+            DWORD old_flags{};
+            if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) {
+                LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
+            }
+            ++it;
         }
     }