From f95081cb6e505b6c859f45ba46f3c6e1ccbb65f6 Mon Sep 17 00:00:00 2001 From: 66hh <49398720+66hh@users.noreply.github.com> Date: Sun, 28 Dec 2025 19:36:40 +0800 Subject: [PATCH] Introduce try_write_memory for the memory manager --- src/backends/icicle-emulator/icicle_x86_64_emulator.cpp | 7 ++++++- src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp | 5 +++++ src/emulator/memory_interface.hpp | 1 + src/windows-emulator/memory_manager.cpp | 5 +++++ src/windows-emulator/memory_manager.hpp | 1 + 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp b/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp index d240dc4a..856dc743 100644 --- a/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp +++ b/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp @@ -264,9 +264,14 @@ namespace icicle ice(res, "Failed to read memory"); } + bool try_write_memory(const uint64_t address, const void* data, const size_t size) override + { + return icicle_write_memory(this->emu_, address, data, size); + } + void write_memory(const uint64_t address, const void* data, const size_t size) override { - const auto res = icicle_write_memory(this->emu_, address, data, size); + const auto res = try_write_memory(address, data, size); ice(res, "Failed to write memory"); } diff --git a/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp b/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp index 31928ae7..e2aaf56a 100644 --- a/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp +++ b/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp @@ -380,6 +380,11 @@ namespace unicorn uce(uc_mem_read(*this, address, data, size)); } + bool try_write_memory(const uint64_t address, const void* data, const size_t size) override + { + return uc_mem_write(*this, address, data, size) == UC_ERR_OK; + } + void write_memory(const uint64_t address, const void* data, const size_t size) override { uce(uc_mem_write(*this, address, data, size)); diff --git a/src/emulator/memory_interface.hpp b/src/emulator/memory_interface.hpp index 2f735e9a..41145b24 100644 --- a/src/emulator/memory_interface.hpp +++ b/src/emulator/memory_interface.hpp @@ -19,6 +19,7 @@ class memory_interface 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; + virtual bool try_write_memory(uint64_t address, const void* data, size_t size) = 0; private: virtual void map_mmio(uint64_t address, size_t size, mmio_read_callback read_cb, mmio_write_callback write_cb) = 0; diff --git a/src/windows-emulator/memory_manager.cpp b/src/windows-emulator/memory_manager.cpp index 2b91105f..76422e02 100644 --- a/src/windows-emulator/memory_manager.cpp +++ b/src/windows-emulator/memory_manager.cpp @@ -649,6 +649,11 @@ void memory_manager::write_memory(const uint64_t address, const void* data, cons this->memory_->write_memory(address, data, size); } +bool memory_manager::try_write_memory(const uint64_t address, const void* data, const size_t size) +{ + return this->memory_->try_write_memory(address, data, size); +} + void memory_manager::map_mmio(const uint64_t address, const size_t size, mmio_read_callback read_cb, mmio_write_callback write_cb) { this->memory_->map_mmio(address, size, std::move(read_cb), std::move(write_cb)); diff --git a/src/windows-emulator/memory_manager.hpp b/src/windows-emulator/memory_manager.hpp index 44900aba..c7c3ea8f 100644 --- a/src/windows-emulator/memory_manager.hpp +++ b/src/windows-emulator/memory_manager.hpp @@ -65,6 +65,7 @@ class memory_manager : public memory_interface void read_memory(uint64_t address, void* data, size_t size) const final; bool try_read_memory(uint64_t address, void* data, size_t size) const final; void write_memory(uint64_t address, const void* data, size_t size) final; + bool try_write_memory(uint64_t address, const void* data, size_t size) final; bool protect_memory(uint64_t address, size_t size, nt_memory_permission permissions, nt_memory_permission* old_permissions = nullptr);