diff --git a/src/windows-emulator/memory_manager.cpp b/src/windows-emulator/memory_manager.cpp index d879dee6..7c1a3de8 100644 --- a/src/windows-emulator/memory_manager.cpp +++ b/src/windows-emulator/memory_manager.cpp @@ -78,6 +78,7 @@ namespace utils static void serialize(buffer_serializer& buffer, const memory_manager::reserved_region& region) { buffer.write(region.is_mmio); + buffer.write(region.initial_permission); buffer.write(region.length); buffer.write_map(region.committed_regions); } @@ -85,6 +86,7 @@ namespace utils static void deserialize(buffer_deserializer& buffer, memory_manager::reserved_region& region) { buffer.read(region.is_mmio); + buffer.read(region.initial_permission); region.length = static_cast(buffer.read()); buffer.read_map(region.committed_regions); } @@ -258,6 +260,7 @@ bool memory_manager::allocate_memory(const uint64_t address, const size_t size, .try_emplace(address, reserved_region{ .length = size, + .initial_permission = permissions, }) .first; @@ -497,6 +500,7 @@ region_info memory_manager::get_region_info(const uint64_t address) result.start = MIN_ALLOCATION_ADDRESS; result.length = MAX_ALLOCATION_ADDRESS - result.start; result.permissions = memory_permission::none; + result.initial_permissions = memory_permission::none; result.allocation_base = {}; result.allocation_length = result.length; result.is_committed = false; @@ -532,6 +536,7 @@ region_info memory_manager::get_region_info(const uint64_t address) result.allocation_length = reserved_region.length; result.start = result.allocation_base; result.length = result.allocation_length; + result.initial_permissions = entry->second.initial_permission; if (committed_regions.empty()) { diff --git a/src/windows-emulator/memory_manager.hpp b/src/windows-emulator/memory_manager.hpp index 92daab60..4b5f087e 100644 --- a/src/windows-emulator/memory_manager.hpp +++ b/src/windows-emulator/memory_manager.hpp @@ -18,6 +18,7 @@ struct region_info : basic_memory_region size_t allocation_length{}; bool is_reserved{}; bool is_committed{}; + memory_permission initial_permissions{}; }; using mmio_read_callback = std::function; @@ -42,6 +43,7 @@ class memory_manager : public memory_interface struct reserved_region { size_t length{}; + memory_permission initial_permission{}; committed_region_map committed_regions{}; bool is_mmio{false}; }; diff --git a/src/windows-emulator/module/module_mapping.cpp b/src/windows-emulator/module/module_mapping.cpp index 2e20e6e9..939705e8 100644 --- a/src/windows-emulator/module/module_mapping.cpp +++ b/src/windows-emulator/module/module_mapping.cpp @@ -219,20 +219,22 @@ mapped_module map_module_from_data(memory_manager& memory, const std::span(region_info.start); image_info.AllocationBase = reinterpret_cast(region_info.allocation_base); - image_info.AllocationProtect = 0; image_info.PartitionId = 0; image_info.RegionSize = static_cast(region_info.length); image_info.Protect = map_emulator_to_nt_protection(region_info.permissions); + image_info.AllocationProtect = map_emulator_to_nt_protection(region_info.initial_permissions); image_info.Type = MEM_PRIVATE; });