diff --git a/src/emulator/memory_interface.hpp b/src/emulator/memory_interface.hpp index 2f735e9a..3f472040 100644 --- a/src/emulator/memory_interface.hpp +++ b/src/emulator/memory_interface.hpp @@ -2,7 +2,7 @@ #include #include -#include "memory_permission.hpp" +#include "windows-emulator/memory_permission_ext.hpp" using mmio_read_callback = std::function; using mmio_write_callback = std::function; diff --git a/src/windows-emulator/memory_utils.hpp b/src/windows-emulator/memory_utils.hpp index 70b1a1f8..d524ffd3 100644 --- a/src/windows-emulator/memory_utils.hpp +++ b/src/windows-emulator/memory_utils.hpp @@ -19,28 +19,43 @@ inline std::string get_permission_string(const memory_permission permission) return res; } -inline memory_permission map_nt_to_emulator_protection(uint32_t nt_protection) +inline nt_memory_permission map_nt_to_emulator_protection(uint32_t nt_protection) { - nt_protection &= ~static_cast(PAGE_GUARD); // TODO: Implement that + memory_permission_ext ext = memory_permission_ext::none; + // TODO: Check for invalid combinations + if (nt_protection & PAGE_GUARD) + { + // Unset the guard flag so the following switch statement will still work + nt_protection &= ~static_cast(PAGE_GUARD); + ext = memory_permission_ext::guard; + } + memory_permission common = memory_permission::none; switch (nt_protection) { - case PAGE_NOACCESS: - return memory_permission::none; - case PAGE_READONLY: - return memory_permission::read; - case PAGE_READWRITE: - case PAGE_WRITECOPY: - return memory_permission::read | memory_permission::write; - case PAGE_EXECUTE: - case PAGE_EXECUTE_READ: - return memory_permission::read | memory_permission::exec; - case PAGE_EXECUTE_READWRITE: - return memory_permission::all; - case PAGE_EXECUTE_WRITECOPY: - default: - throw std::runtime_error("Failed to map protection"); + case PAGE_NOACCESS: + common = memory_permission::none; + break; + case PAGE_READONLY: + common = memory_permission::read; + break; + case PAGE_READWRITE: + case PAGE_WRITECOPY: + common = memory_permission::read | memory_permission::write; + break; + case PAGE_EXECUTE: + case PAGE_EXECUTE_READ: + common = memory_permission::read | memory_permission::exec; + break; + case PAGE_EXECUTE_READWRITE: + common = memory_permission::all; + break; + case PAGE_EXECUTE_WRITECOPY: + default: + throw std::runtime_error("Failed to map protection"); } + + return nt_memory_permission { common, ext }; } inline uint32_t map_emulator_to_nt_protection(const memory_permission permission)