From c23da4484b26181965648390beb767b2bc4e29e7 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 9 Sep 2024 19:09:38 +0200 Subject: [PATCH] Fix module mapping --- src/emulator/memory_manager.cpp | 13 ++++++++++--- src/emulator/memory_manager.hpp | 2 +- src/windows_emulator/module/module_mapping.cpp | 4 ++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/emulator/memory_manager.cpp b/src/emulator/memory_manager.cpp index f55b2dde..ba53171f 100644 --- a/src/emulator/memory_manager.cpp +++ b/src/emulator/memory_manager.cpp @@ -285,18 +285,25 @@ bool memory_manager::release_memory(const uint64_t address, size_t size) return true; } -uint64_t memory_manager::find_free_allocation_base(const size_t size) const +uint64_t memory_manager::find_free_allocation_base(const size_t size, const uint64_t start) const { - uint64_t start_address = std::max(MIN_ALLOCATION_ADDRESS, 0x1000000000ULL); + uint64_t start_address = + std::max(MIN_ALLOCATION_ADDRESS, start ? start : 0x100000000ULL); for (const auto& region : this->reserved_regions_) { + const auto region_end = region.first + region.second.length; + if(region_end < start_address) + { + continue; + } + if (!regions_with_length_intersect(start_address, size, region.first, region.second.length)) { return start_address; } - start_address = page_align_up(region.first + region.second.length); + start_address = page_align_up(region_end); } if (start_address + size <= MAX_ALLOCATION_ADDRESS) diff --git a/src/emulator/memory_manager.hpp b/src/emulator/memory_manager.hpp index f946cc72..ca01cdac 100644 --- a/src/emulator/memory_manager.hpp +++ b/src/emulator/memory_manager.hpp @@ -59,7 +59,7 @@ public: bool release_memory(uint64_t address, size_t size); - uint64_t find_free_allocation_base(size_t size) const; + uint64_t find_free_allocation_base(size_t size, uint64_t start = 0) const; region_info get_region_info(uint64_t address); diff --git a/src/windows_emulator/module/module_mapping.cpp b/src/windows_emulator/module/module_mapping.cpp index 9a29ef9b..eee294f0 100644 --- a/src/windows_emulator/module/module_mapping.cpp +++ b/src/windows_emulator/module/module_mapping.cpp @@ -200,8 +200,8 @@ namespace if (!emu.allocate_memory(binary.image_base, binary.size_of_image, memory_permission::read)) { binary.image_base = emu.find_free_allocation_base(binary.size_of_image); - if ((optional_header.DllCharacteristics & - IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) == 0 || // + if (/*(optional_header.DllCharacteristics & + IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) == 0 ||*/ // !emu.allocate_memory( binary.image_base, binary.size_of_image, memory_permission::read)) {