From 83aa3b663a867ce97fcc87480086a045d3766ac7 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Wed, 22 Oct 2025 17:21:34 -0300 Subject: [PATCH] Optimize module_manager::get_module --- src/windows-emulator/module/mapped_module.hpp | 2 +- src/windows-emulator/module/module_manager.cpp | 3 +++ src/windows-emulator/module/module_manager.hpp | 7 +++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/windows-emulator/module/mapped_module.hpp b/src/windows-emulator/module/mapped_module.hpp index aaabaee8..6e7ced61 100644 --- a/src/windows-emulator/module/mapped_module.hpp +++ b/src/windows-emulator/module/mapped_module.hpp @@ -46,7 +46,7 @@ struct mapped_module bool contains(const uint64_t address) const { - return address >= this->image_base && address < (this->image_base + this->size_of_image); + return (address - this->image_base) < this->size_of_image; } uint64_t find_export(const std::string_view export_name) const diff --git a/src/windows-emulator/module/module_manager.cpp b/src/windows-emulator/module/module_manager.cpp index 448103a7..9294e066 100644 --- a/src/windows-emulator/module/module_manager.cpp +++ b/src/windows-emulator/module/module_manager.cpp @@ -156,6 +156,7 @@ mapped_module* module_manager::map_memory_module(uint64_t base_address, uint64_t const auto image_base = mod.image_base; const auto entry = this->modules_.try_emplace(image_base, std::move(mod)); + this->last_module_cache_ = this->modules_.end(); this->callbacks_->on_module_load(entry.first->second); return &entry.first->second; } @@ -183,6 +184,7 @@ void module_manager::serialize(utils::buffer_serializer& buffer) const void module_manager::deserialize(utils::buffer_deserializer& buffer) { buffer.read_map(this->modules_); + this->last_module_cache_ = this->modules_.end(); const auto executable_base = buffer.read(); const auto ntdll_base = buffer.read(); @@ -209,6 +211,7 @@ bool module_manager::unmap(const uint64_t address) this->callbacks_->on_module_unload(mod->second); unmap_module(*this->memory_, mod->second); this->modules_.erase(mod); + this->last_module_cache_ = this->modules_.end(); return true; } diff --git a/src/windows-emulator/module/module_manager.hpp b/src/windows-emulator/module/module_manager.hpp index eec4b04a..06afef9c 100644 --- a/src/windows-emulator/module/module_manager.hpp +++ b/src/windows-emulator/module/module_manager.hpp @@ -83,9 +83,15 @@ class module_manager callbacks* callbacks_{}; module_map modules_{}; + mutable module_map::iterator last_module_cache_{modules_.end()}; module_map::iterator get_module(const uint64_t address) { + if (last_module_cache_ != this->modules_.end() && last_module_cache_->second.contains(address)) + { + return last_module_cache_; + } + if (this->modules_.empty()) { return this->modules_.end(); @@ -101,6 +107,7 @@ class module_manager if (upper_bound->second.contains(address)) { + last_module_cache_ = upper_bound; return upper_bound; }