From 4e38ddc3234fa877a81f6a177931c86064f86d12 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 11:01:46 +0100 Subject: [PATCH 1/4] Ensure proper allocation granularity --- src/emulator/memory_manager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/emulator/memory_manager.cpp b/src/emulator/memory_manager.cpp index c16eddb7..660dad75 100644 --- a/src/emulator/memory_manager.cpp +++ b/src/emulator/memory_manager.cpp @@ -10,6 +10,7 @@ namespace { + constexpr auto ALLOCATION_GRANULARITY = 0x0000000000010000ULL; constexpr auto MIN_ALLOCATION_ADDRESS = 0x0000000000010000ULL; constexpr auto MAX_ALLOCATION_ADDRESS = 0x00007ffffffeffffULL; @@ -446,6 +447,7 @@ void memory_manager::unmap_all_memory() uint64_t memory_manager::find_free_allocation_base(const size_t size, const uint64_t start) const { uint64_t start_address = std::max(MIN_ALLOCATION_ADDRESS, start ? start : 0x100000000ULL); + start_address = align_up(start_address, ALLOCATION_GRANULARITY); for (const auto& region : this->reserved_regions_) { @@ -460,7 +462,7 @@ uint64_t memory_manager::find_free_allocation_base(const size_t size, const uint return start_address; } - start_address = page_align_up(region_end); + start_address = align_up(region_end, ALLOCATION_GRANULARITY); } if (start_address + size <= MAX_ALLOCATION_ADDRESS) From 4c7450b93715f192dddd68a5f37ebe6831df7493 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 11:01:52 +0100 Subject: [PATCH 2/4] Log allocations --- src/windows-emulator/syscalls.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 82567f8f..0fe24a59 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -2102,6 +2102,8 @@ namespace if (!potential_base) { + c.win_emu.log.print(color::dark_gray, "--> Not allocated\n"); + return STATUS_MEMORY_NOT_ALLOCATED; } @@ -2117,9 +2119,15 @@ namespace if (commit && !reserve && c.emu.commit_memory(potential_base, allocation_bytes, protection)) { + c.win_emu.log.print(color::dark_gray, "--> Committed 0x%" PRIx64 " - 0x%" PRIx64 "\n", potential_base, + potential_base + allocation_bytes); + return STATUS_SUCCESS; } + c.win_emu.log.print(color::dark_gray, "--> Allocated 0x%" PRIx64 " - 0x%" PRIx64 "\n", potential_base, + potential_base + allocation_bytes); + return c.emu.allocate_memory(potential_base, allocation_bytes, protection, !commit) ? STATUS_SUCCESS : STATUS_MEMORY_NOT_ALLOCATED; From 148b2b19dc91639c5d73db00a44fdc07c108fb26 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 11:07:08 +0100 Subject: [PATCH 3/4] Add NtQueryDefaultLocale --- src/windows-emulator/syscalls.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 0fe24a59..c2d113dd 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -2741,6 +2741,13 @@ namespace return STATUS_SUCCESS; } + NTSTATUS handle_NtQueryDefaultLocale(const syscall_context&, BOOLEAN /*user_profile*/, + const emulator_object default_locale_id) + { + default_locale_id.write(0x407); + return STATUS_SUCCESS; + } + NTSTATUS handle_NtContinue(const syscall_context& c, const emulator_object thread_context, const BOOLEAN /*raise_alert*/) { @@ -3910,6 +3917,7 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtUserMoveWindow); add_handler(NtSystemDebugControl); add_handler(NtRequestWaitReplyPort); + add_handler(NtQueryDefaultLocale); #undef add_handler } From 01093aa5446a688ff70ba80df93a25e08d4e10bc Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Feb 2025 11:15:39 +0100 Subject: [PATCH 4/4] Forward unaltered stdout data --- src/windows-emulator/syscalls.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index c2d113dd..e85aeba6 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -2833,12 +2833,13 @@ namespace io_status_block.write(block); } + c.win_emu.callbacks().stdout_callback(temp_buffer); + if (!temp_buffer.ends_with("\n")) { temp_buffer.push_back('\n'); } - c.win_emu.callbacks().stdout_callback(temp_buffer); c.win_emu.log.info("%.*s", static_cast(temp_buffer.size()), temp_buffer.data()); return STATUS_SUCCESS;