From 84a0aed1d950f884ffc990ce49baf90256fa95c0 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 23 Nov 2024 16:44:49 +0100 Subject: [PATCH] Small fixes and additions --- src/emulator/address_utils.hpp | 18 +++++++++--------- src/windows-emulator/emulator_utils.hpp | 20 +++++++++++++------- src/windows-emulator/syscall_dispatcher.cpp | 2 +- src/windows-emulator/windows_emulator.cpp | 5 +++++ 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/emulator/address_utils.hpp b/src/emulator/address_utils.hpp index 84277ec7..b5b66145 100644 --- a/src/emulator/address_utils.hpp +++ b/src/emulator/address_utils.hpp @@ -13,43 +13,43 @@ const T* offset_pointer(const void* data, const size_t offset) return reinterpret_cast(static_cast(data) + offset); } -inline bool is_within_start_and_end(const uint64_t value, const uint64_t start, const uint64_t end) +constexpr bool is_within_start_and_end(const uint64_t value, const uint64_t start, const uint64_t end) { return value >= start && value < end; } -inline bool is_within_start_and_length(const uint64_t value, const uint64_t start, const uint64_t length) +constexpr bool is_within_start_and_length(const uint64_t value, const uint64_t start, const uint64_t length) { return is_within_start_and_end(value, start, start + length); } -inline bool regions_intersect(const uint64_t start1, const uint64_t end1, const uint64_t start2, const uint64_t end2) +constexpr bool regions_intersect(const uint64_t start1, const uint64_t end1, const uint64_t start2, const uint64_t end2) { return start1 < end2 && start2 < end1; } -inline bool regions_with_length_intersect(const uint64_t start1, const uint64_t length1, const uint64_t start2, - const uint64_t length2) +constexpr bool regions_with_length_intersect(const uint64_t start1, const uint64_t length1, const uint64_t start2, + const uint64_t length2) { return regions_intersect(start1, start1 + length1, start2, start2 + length2); } -inline uint64_t align_down(const uint64_t value, const uint64_t alignment) +constexpr uint64_t align_down(const uint64_t value, const uint64_t alignment) { return value & ~(alignment - 1); } -inline uint64_t align_up(const uint64_t value, const uint64_t alignment) +constexpr uint64_t align_up(const uint64_t value, const uint64_t alignment) { return align_down(value + (alignment - 1), alignment); } -inline uint64_t page_align_down(const uint64_t value, const uint64_t page_size = 0x1000) +constexpr uint64_t page_align_down(const uint64_t value, const uint64_t page_size = 0x1000) { return align_down(value, page_size); } -inline uint64_t page_align_up(const uint64_t value, const uint64_t page_size = 0x1000) +constexpr uint64_t page_align_up(const uint64_t value, const uint64_t page_size = 0x1000) { return align_up(value, page_size); } diff --git a/src/windows-emulator/emulator_utils.hpp b/src/windows-emulator/emulator_utils.hpp index ced2ce01..d64179c3 100644 --- a/src/windows-emulator/emulator_utils.hpp +++ b/src/windows-emulator/emulator_utils.hpp @@ -5,22 +5,23 @@ // TODO: Replace with pointer handling structure for future 32 bit support using emulator_pointer = uint64_t; -class x64_emulator_wrapper +template +class object_wrapper { - x64_emulator* emu_; + T* obj_; public: - x64_emulator_wrapper(x64_emulator& emu) - : emu_(&emu) + object_wrapper(T& obj) + : obj_(&obj) { } - x64_emulator& get() const + T& get() const { - return *this->emu_; + return *this->obj_; } - operator x64_emulator&() const + operator T&() const { return this->get(); } @@ -34,6 +35,11 @@ public: } }; +class windows_emulator; + +using x64_emulator_wrapper = object_wrapper; +using windows_emulator_wrapper = object_wrapper; + template class emulator_object { diff --git a/src/windows-emulator/syscall_dispatcher.cpp b/src/windows-emulator/syscall_dispatcher.cpp index 42b7a647..0b8ab978 100644 --- a/src/windows-emulator/syscall_dispatcher.cpp +++ b/src/windows-emulator/syscall_dispatcher.cpp @@ -41,7 +41,7 @@ void syscall_dispatcher::add_handlers() { std::map handler_mapping{}; - this->add_handlers(handler_mapping); + syscall_dispatcher::add_handlers(handler_mapping); for (auto& entry : this->handlers_) { diff --git a/src/windows-emulator/windows_emulator.cpp b/src/windows-emulator/windows_emulator.cpp index 43e6009b..920dea56 100644 --- a/src/windows-emulator/windows_emulator.cpp +++ b/src/windows-emulator/windows_emulator.cpp @@ -1051,6 +1051,11 @@ void windows_emulator::deserialize(utils::buffer_deserializer& buffer) return x64_emulator_wrapper{this->emu()}; }); + buffer.register_factory([this] + { + return windows_emulator_wrapper{*this}; + }); + buffer.read(this->use_relative_time_); this->emu().deserialize(buffer);