From 71232d51ab04d1ef45409529381dea2771f8610f Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 9 Nov 2024 16:10:19 +0100 Subject: [PATCH] Add memory reading/writing helpers --- src/emulator/memory_manager.hpp | 24 +++++++++++++++++-- src/windows-emulator/devices/afd_endpoint.cpp | 24 +++++++------------ src/windows-emulator/io_device.hpp | 9 +++++++ 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/emulator/memory_manager.hpp b/src/emulator/memory_manager.hpp index 9e16b6ce..d91c1297 100644 --- a/src/emulator/memory_manager.hpp +++ b/src/emulator/memory_manager.hpp @@ -33,7 +33,7 @@ public: virtual ~memory_manager() = default; template - T read_memory(const uint64_t address) + T read_memory(const uint64_t address) const { T value{}; this->read_memory(address, &value, sizeof(value)); @@ -41,17 +41,37 @@ public: } template - T read_memory(const void* address) + T read_memory(const void* address) const { return this->read_memory(reinterpret_cast(address)); } + std::vector read_memory(const uint64_t address, const size_t size) const + { + std::vector data{}; + data.resize(size); + + this->read_memory(address, data.data(), data.size()); + + return data; + } + + std::vector read_memory(const void* address, const size_t size) const + { + return this->read_memory(reinterpret_cast(address), size); + } + template void write_memory(const uint64_t address, const T& value) { this->write_memory(address, &value, sizeof(value)); } + void write_memory(void* address, const void* data, const size_t size) + { + this->write_memory(reinterpret_cast(address), data, size); + } + virtual void read_memory(uint64_t address, void* data, size_t size) const = 0; virtual bool try_read_memory(uint64_t address, void* data, size_t size) const = 0; virtual void write_memory(uint64_t address, const void* data, size_t size) = 0; diff --git a/src/windows-emulator/devices/afd_endpoint.cpp b/src/windows-emulator/devices/afd_endpoint.cpp index 59522eb6..dfad0920 100644 --- a/src/windows-emulator/devices/afd_endpoint.cpp +++ b/src/windows-emulator/devices/afd_endpoint.cpp @@ -134,9 +134,7 @@ namespace NTSTATUS ioctl_bind(windows_emulator& win_emu, const io_device_context& c) const { - std::vector data{}; - data.resize(c.input_buffer_length); - win_emu.emu().read_memory(c.input_buffer, data.data(), c.input_buffer_length); + const auto data = win_emu.emu().read_memory(c.input_buffer, c.input_buffer_length); constexpr auto address_offset = 4; @@ -206,13 +204,13 @@ namespace return STATUS_UNSUCCESSFUL; } - emu.write_memory(reinterpret_cast(buffer.buf), data.data(), - std::min(data.size(), static_cast(recevied_data))); + const auto data_size = std::min(data.size(), static_cast(recevied_data)); + emu.write_memory(buffer.buf, data.data(), data_size); if (receive_info.Address && address_length) { - emu.write_memory(reinterpret_cast(receive_info.Address), address.data(), - std::min(address.size(), static_cast(address_length))); + const auto address_size = std::min(address.size(), static_cast(address_length)); + emu.write_memory(receive_info.Address, address.data(), address_size); } if (c.io_status_block) @@ -237,17 +235,13 @@ namespace const auto send_info = emu.read_memory(c.input_buffer); const auto buffer = emu.read_memory(send_info.BufferArray); - std::vector address{}; - address.resize(send_info.TdiConnInfo.RemoteAddressLength); - emu.read_memory(reinterpret_cast(send_info.TdiConnInfo.RemoteAddress), address.data(), - address.size()); + const auto address = emu.read_memory(send_info.TdiConnInfo.RemoteAddress, + send_info.TdiConnInfo.RemoteAddressLength); - const network::address target(reinterpret_cast(address.data()), + const network::address target(reinterpret_cast(address.data()), static_cast(address.size())); - std::vector data{}; - data.resize(buffer.len); - emu.read_memory(reinterpret_cast(buffer.buf), data.data(), data.size()); + const auto data = emu.read_memory(buffer.buf, buffer.len); const auto sent_data = sendto(*this->s, reinterpret_cast(data.data()), static_cast(data.size()), 0 /* ? */, &target.get_addr(), diff --git a/src/windows-emulator/io_device.hpp b/src/windows-emulator/io_device.hpp index 1e275603..01986f69 100644 --- a/src/windows-emulator/io_device.hpp +++ b/src/windows-emulator/io_device.hpp @@ -133,6 +133,15 @@ public: this->device_->deserialize(buffer); } + template + requires(std::is_base_of_v || std::is_same_v) + T* get_internal_device() + { + this->assert_validity(); + auto* value = this->device_.get(); + return dynamic_cast(value); + } + private: std::wstring device_name_{}; std::unique_ptr device_{};