From 851fe3acba21d6e373cd47d4bc7689833bd40196 Mon Sep 17 00:00:00 2001 From: Maurice Heumann Date: Thu, 20 Mar 2025 16:15:00 +0100 Subject: [PATCH] Create proper emulator --- src/windows-emulator-test/emulation_test.cpp | 4 +-- .../emulation_test_utils.hpp | 32 +++++++++++++++++-- .../serialization_test.cpp | 21 ++++-------- src/windows-emulator/windows_emulator.cpp | 13 ++++---- src/windows-emulator/windows_emulator.hpp | 3 +- 5 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/windows-emulator-test/emulation_test.cpp b/src/windows-emulator-test/emulation_test.cpp index 8d92439b..f5833843 100644 --- a/src/windows-emulator-test/emulation_test.cpp +++ b/src/windows-emulator-test/emulation_test.cpp @@ -22,14 +22,14 @@ namespace test TEST(EmulationTest, CountedEmulationIsAccurate) { - auto emu = create_reproducible_sample_emulator(); + auto emu = create_sample_emulator(); emu.start(); ASSERT_TERMINATED_SUCCESSFULLY(emu); const auto executedInstructions = emu.get_executed_instructions(); - auto new_emu = create_reproducible_sample_emulator(); + auto new_emu = create_sample_emulator(); constexpr auto offset = 1; const auto instructionsToExecute = executedInstructions - offset; diff --git a/src/windows-emulator-test/emulation_test_utils.hpp b/src/windows-emulator-test/emulation_test_utils.hpp index 67776802..7764dd7d 100644 --- a/src/windows-emulator-test/emulation_test_utils.hpp +++ b/src/windows-emulator-test/emulation_test_utils.hpp @@ -57,6 +57,29 @@ namespace test return settings; } + inline windows_emulator create_emulator(emulator_settings settings, emulator_callbacks callbacks = {}) + { + const auto is_verbose = enable_verbose_logging(); + + if (is_verbose) + { + settings.disable_logging = false; + } + + settings.emulation_root = get_emulator_root(); + + settings.path_mappings["C:\\a.txt"] = + std::filesystem::temp_directory_path() / ("emulator-test-file-" + std::to_string(getpid()) + ".txt"); + + return windows_emulator{ + settings, + std::move(callbacks), + emulator_interfaces{ + .socket_factory = network::create_static_socket_factory(), + }, + }; + } + inline windows_emulator create_sample_emulator(emulator_settings settings, const sample_configuration& config = {}, emulator_callbacks callbacks = {}) { @@ -93,9 +116,14 @@ namespace test return create_sample_emulator(std::move(settings), config); } - inline windows_emulator create_reproducible_sample_emulator() + inline windows_emulator create_empty_emulator() { - return create_sample_emulator(); + emulator_settings settings{ + .disable_logging = true, + .use_relative_time = true, + }; + + return create_emulator(std::move(settings)); } inline void bisect_emulation(windows_emulator& emu) diff --git a/src/windows-emulator-test/serialization_test.cpp b/src/windows-emulator-test/serialization_test.cpp index 8518537b..1ca329a2 100644 --- a/src/windows-emulator-test/serialization_test.cpp +++ b/src/windows-emulator-test/serialization_test.cpp @@ -4,7 +4,7 @@ namespace test { TEST(SerializationTest, ResettingEmulatorWorks) { - auto emu = create_reproducible_sample_emulator(); + auto emu = create_sample_emulator(); utils::buffer_serializer start_state{}; emu.serialize(start_state); @@ -31,7 +31,7 @@ namespace test TEST(SerializationTest, SerializedDataIsReproducible) { - auto emu1 = create_reproducible_sample_emulator(); + auto emu1 = create_sample_emulator(); emu1.start(); ASSERT_TERMINATED_SUCCESSFULLY(emu1); @@ -41,7 +41,7 @@ namespace test utils::buffer_deserializer deserializer{serializer1.get_buffer()}; - windows_emulator new_emu{{.emulation_root = get_emulator_root(), .use_relative_time = true}}; + auto new_emu = create_empty_emulator(); new_emu.deserialize(deserializer); utils::buffer_serializer serializer2{}; @@ -55,7 +55,7 @@ namespace test TEST(SerializationTest, EmulationIsReproducible) { - auto emu1 = create_reproducible_sample_emulator(); + auto emu1 = create_sample_emulator(); emu1.start(); ASSERT_TERMINATED_SUCCESSFULLY(emu1); @@ -63,7 +63,7 @@ namespace test utils::buffer_serializer serializer1{}; emu1.serialize(serializer1); - auto emu2 = create_reproducible_sample_emulator(); + auto emu2 = create_sample_emulator(); emu2.start(); ASSERT_TERMINATED_SUCCESSFULLY(emu2); @@ -76,7 +76,7 @@ namespace test TEST(SerializationTest, DeserializedEmulatorBehavesLikeSource) { - auto emu = create_reproducible_sample_emulator(); + auto emu = create_sample_emulator(); emu.start({}, 100); utils::buffer_serializer serializer{}; @@ -84,14 +84,7 @@ namespace test utils::buffer_deserializer deserializer{serializer.get_buffer()}; - windows_emulator new_emu{ - {.emulation_root = get_emulator_root(), .use_relative_time = true}, - { - .socket_factory = network::create_static_socket_factory(), - }, - }; - - new_emu.log.disable_output(true); + auto new_emu = create_empty_emulator(); new_emu.deserialize(deserializer); new_emu.start(); diff --git a/src/windows-emulator/windows_emulator.cpp b/src/windows-emulator/windows_emulator.cpp index 8a837876..cf8584e8 100644 --- a/src/windows-emulator/windows_emulator.cpp +++ b/src/windows-emulator/windows_emulator.cpp @@ -213,25 +213,24 @@ std::unique_ptr create_default_x64_emulator() windows_emulator::windows_emulator(application_settings app_settings, const emulator_settings& settings, emulator_callbacks callbacks, emulator_interfaces interfaces, std::unique_ptr emu) - : windows_emulator(settings, std::move(interfaces), std::move(emu)) + : windows_emulator(settings, std::move(callbacks), std::move(interfaces), std::move(emu)) { - this->callbacks = std::move(callbacks); - fixup_application_settings(app_settings); this->setup_process(app_settings); } -windows_emulator::windows_emulator(const emulator_settings& settings, emulator_interfaces interfaces, - std::unique_ptr emu) +windows_emulator::windows_emulator(const emulator_settings& settings, emulator_callbacks callbacks, + emulator_interfaces interfaces, std::unique_ptr emu) : emu_(std::move(emu)), clock_(get_clock(interfaces, this->executed_instructions_, settings.use_relative_time)), socket_factory_(get_socket_factory(interfaces)), emulation_root{settings.emulation_root.empty() ? settings.emulation_root : absolute(settings.emulation_root)}, + callbacks(std::move(callbacks)), file_sys(emulation_root.empty() ? emulation_root : emulation_root / "filesys"), memory(*this->emu_), registry(emulation_root.empty() ? settings.registry_directory : emulation_root / "registry"), - mod_manager(memory, file_sys, callbacks), - process(*this->emu_, memory, *this->clock_, callbacks) + mod_manager(memory, file_sys, this->callbacks), + process(*this->emu_, memory, *this->clock_, this->callbacks) { #ifndef OS_WINDOWS if (this->emulation_root.empty()) diff --git a/src/windows-emulator/windows_emulator.hpp b/src/windows-emulator/windows_emulator.hpp index e1ad9533..7da1b18b 100644 --- a/src/windows-emulator/windows_emulator.hpp +++ b/src/windows-emulator/windows_emulator.hpp @@ -71,7 +71,8 @@ class windows_emulator process_context process; syscall_dispatcher dispatcher; - windows_emulator(const emulator_settings& settings = {}, emulator_interfaces interfaces = {}, + windows_emulator(const emulator_settings& settings = {}, emulator_callbacks callbacks = {}, + emulator_interfaces interfaces = {}, std::unique_ptr emu = create_default_x64_emulator()); windows_emulator(application_settings app_settings, const emulator_settings& settings = {}, emulator_callbacks callbacks = {}, emulator_interfaces interfaces = {},