host_memory: Support staged VirtualProtect calls
This commit is contained in:
parent
5ba28325b2
commit
ee67460ff0
|
@ -110,10 +110,19 @@ public:
|
||||||
} else {
|
} else {
|
||||||
UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write);
|
UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write);
|
||||||
}
|
}
|
||||||
|
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{};
|
DWORD old_flags{};
|
||||||
if (!VirtualProtect(virtual_base + virtual_offset, length, new_flags, &old_flags)) {
|
if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) {
|
||||||
LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
|
LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
|
||||||
}
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t backing_size; ///< Size of the backing memory in bytes
|
const size_t backing_size; ///< Size of the backing memory in bytes
|
||||||
|
|
Loading…
Reference in New Issue