From cafa0ebd0b4e73e1ede7d00fb025b7b34c134314 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Mon, 5 Jan 2026 13:57:31 -0800 Subject: [PATCH 1/5] NTSTATUS: add STATUS_NOT_SAME_OBJECT --- src/common/platform/status.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/platform/status.hpp b/src/common/platform/status.hpp index a1321ad0..aafc55f2 100644 --- a/src/common/platform/status.hpp +++ b/src/common/platform/status.hpp @@ -78,6 +78,7 @@ using NTSTATUS = std::uint32_t; #define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014BL) #define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020DL) #define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L) +#define STATUS_NOT_SAME_OBJECT ((NTSTATUS)0xC00001ACL) #define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236L) #define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245L) #define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000328L) From 6f8dca661476336ffc015b0d78a2fad730529487 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Mon, 5 Jan 2026 18:41:32 -0800 Subject: [PATCH 2/5] object syscalls: implement NtWaitForMultipleObjects32 --- src/windows-emulator/syscalls/object.cpp | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/windows-emulator/syscalls/object.cpp b/src/windows-emulator/syscalls/object.cpp index afd1a53a..da88c55c 100644 --- a/src/windows-emulator/syscalls/object.cpp +++ b/src/windows-emulator/syscalls/object.cpp @@ -304,6 +304,44 @@ namespace syscalls return STATUS_SUCCESS; } + NTSTATUS handle_NtWaitForMultipleObjects32(const syscall_context& c, const ULONG count, const emulator_object handles, + const WAIT_TYPE wait_type, const BOOLEAN alertable, + const emulator_object timeout) + { + if (wait_type != WaitAny && wait_type != WaitAll) + { + c.win_emu.log.error("Wait type not supported!\n"); + c.emu.stop(); + return STATUS_NOT_SUPPORTED; + } + + auto& t = c.win_emu.current_thread(); + t.await_objects.clear(); + t.await_any = wait_type == WaitAny; + + for (ULONG i = 0; i < count; ++i) + { + const auto raw_handle = handles.read(i); + const auto h = make_handle(static_cast(raw_handle)); + + if (!is_awaitable_object_type(h)) + { + c.win_emu.log.warn("Unsupported handle type for NtWaitForMultipleObjects32: %d!\n", h.value.type); + return STATUS_INVALID_HANDLE; + } + + t.await_objects.push_back(h); + } + + if (timeout.value() && !t.await_time.has_value()) + { + t.await_time = utils::convert_delay_interval_to_time_point(c.win_emu.clock(), timeout.read()); + } + + c.win_emu.yield_thread(alertable); + return STATUS_SUCCESS; + } + NTSTATUS handle_NtWaitForSingleObject(const syscall_context& c, const handle h, const BOOLEAN alertable, const emulator_object timeout) { From a2a119aec29862da0682768fc1e30fdeb11634c6 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Mon, 5 Jan 2026 18:41:45 -0800 Subject: [PATCH 3/5] object syscalls: implement NtCompareObjects --- src/windows-emulator/syscalls/object.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/windows-emulator/syscalls/object.cpp b/src/windows-emulator/syscalls/object.cpp index da88c55c..ee18b0cd 100644 --- a/src/windows-emulator/syscalls/object.cpp +++ b/src/windows-emulator/syscalls/object.cpp @@ -267,6 +267,11 @@ namespace syscalls || h.value.type == handle_types::event; } + NTSTATUS handle_NtCompareObjects(const syscall_context&, const handle first, const handle second) + { + return (first == second) ? STATUS_SUCCESS : STATUS_NOT_SAME_OBJECT; + } + NTSTATUS handle_NtWaitForMultipleObjects(const syscall_context& c, const ULONG count, const emulator_object handles, const WAIT_TYPE wait_type, const BOOLEAN alertable, const emulator_object timeout) From 51034297bf0e08a86ed6edd11631bdd9daf98afc Mon Sep 17 00:00:00 2001 From: redthing1 Date: Mon, 5 Jan 2026 18:43:04 -0800 Subject: [PATCH 4/5] object syscalls: wire up the new syscalls --- src/windows-emulator/syscalls.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index c3bf4699..32775ee5 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -155,8 +155,11 @@ namespace syscalls NTSTATUS handle_NtQueryObject(const syscall_context& c, handle handle, OBJECT_INFORMATION_CLASS object_information_class, emulator_pointer object_information, ULONG object_information_length, emulator_object return_length); + NTSTATUS handle_NtCompareObjects(const syscall_context& c, handle first, handle second); NTSTATUS handle_NtWaitForMultipleObjects(const syscall_context& c, ULONG count, emulator_object handles, WAIT_TYPE wait_type, BOOLEAN alertable, emulator_object timeout); + NTSTATUS handle_NtWaitForMultipleObjects32(const syscall_context& c, ULONG count, emulator_object handles, WAIT_TYPE wait_type, + BOOLEAN alertable, emulator_object timeout); NTSTATUS handle_NtWaitForSingleObject(const syscall_context& c, handle h, BOOLEAN alertable, emulator_object timeout); NTSTATUS handle_NtSetInformationObject(); NTSTATUS handle_NtQuerySecurityObject(const syscall_context& c, handle /*h*/, SECURITY_INFORMATION /*security_information*/, @@ -1151,8 +1154,10 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtGetCurrentProcessorNumberEx); add_handler(NtGetCurrentProcessorNumber); add_handler(NtQueryObject); + add_handler(NtCompareObjects); add_handler(NtQueryAttributesFile); add_handler(NtWaitForMultipleObjects); + add_handler(NtWaitForMultipleObjects32); add_handler(NtCreateMutant); add_handler(NtReleaseMutant); add_handler(NtDuplicateToken); From 17d1e23b601aae5c145e9aa096e296dd033948ef Mon Sep 17 00:00:00 2001 From: redthing1 Date: Mon, 5 Jan 2026 23:15:02 -0800 Subject: [PATCH 5/5] syscalls.cpp: clang format --- src/windows-emulator/syscalls.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 32775ee5..94190ed7 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -158,8 +158,8 @@ namespace syscalls NTSTATUS handle_NtCompareObjects(const syscall_context& c, handle first, handle second); NTSTATUS handle_NtWaitForMultipleObjects(const syscall_context& c, ULONG count, emulator_object handles, WAIT_TYPE wait_type, BOOLEAN alertable, emulator_object timeout); - NTSTATUS handle_NtWaitForMultipleObjects32(const syscall_context& c, ULONG count, emulator_object handles, WAIT_TYPE wait_type, - BOOLEAN alertable, emulator_object timeout); + NTSTATUS handle_NtWaitForMultipleObjects32(const syscall_context& c, ULONG count, emulator_object handles, + WAIT_TYPE wait_type, BOOLEAN alertable, emulator_object timeout); NTSTATUS handle_NtWaitForSingleObject(const syscall_context& c, handle h, BOOLEAN alertable, emulator_object timeout); NTSTATUS handle_NtSetInformationObject(); NTSTATUS handle_NtQuerySecurityObject(const syscall_context& c, handle /*h*/, SECURITY_INFORMATION /*security_information*/,