From 5d19803020e876ca5d075f26f279893d9554f52b Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sat, 19 Apr 2025 16:29:47 -0300 Subject: [PATCH 1/4] Fix NtOpenSection --- src/windows-emulator/syscalls/section.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls/section.cpp b/src/windows-emulator/syscalls/section.cpp index 3bcaaa90..bb0aa437 100644 --- a/src/windows-emulator/syscalls/section.cpp +++ b/src/windows-emulator/syscalls/section.cpp @@ -82,7 +82,8 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } - if (attributes.RootDirectory != KNOWN_DLLS_DIRECTORY) + if (attributes.RootDirectory != KNOWN_DLLS_DIRECTORY && + attributes.RootDirectory != BASE_NAMED_OBJECTS_DIRECTORY) { c.win_emu.log.error("Unsupported section\n"); c.emu.stop(); From c702bedaee6db0ba34b9e5c3866b8f223981d8c1 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sat, 19 Apr 2025 16:33:34 -0300 Subject: [PATCH 2/4] Add 3 new syscall handlers --- src/windows-emulator/syscalls.cpp | 15 ++++++++++++++- src/windows-emulator/syscalls/file.cpp | 20 +++++++++++++++++++- src/windows-emulator/syscalls/thread.cpp | 7 +++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index bf18f69c..77830139 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -109,6 +109,8 @@ namespace syscalls emulator_object>> io_status_block, ULONG fs_control_code, uint64_t input_buffer, ULONG input_buffer_length, uint64_t output_buffer, ULONG output_buffer_length); + NTSTATUS handle_NtFlushBuffersFile(const syscall_context& c, handle file_handle, + emulator_object>> /*io_status_block*/); // syscalls/locale.cpp: NTSTATUS handle_NtInitializeNlsFiles(const syscall_context& c, emulator_object base_address, @@ -269,6 +271,9 @@ namespace syscalls NTSTATUS handle_NtQueryInformationThread(const syscall_context& c, handle thread_handle, uint32_t info_class, uint64_t thread_information, uint32_t thread_information_length, emulator_object return_length); + NTSTATUS handle_NtOpenThread(const syscall_context&, handle thread_handle, ACCESS_MASK /*desired_access*/, + emulator_object>> /*object_attributes*/, + emulator_pointer /*client_id*/); NTSTATUS handle_NtOpenThreadToken(const syscall_context&, handle thread_handle, ACCESS_MASK /*desired_access*/, BOOLEAN /*open_as_self*/, emulator_object token_handle); NTSTATUS handle_NtOpenThreadTokenEx(const syscall_context& c, handle thread_handle, ACCESS_MASK desired_access, @@ -643,6 +648,11 @@ namespace syscalls { return 0; } + + NTSTATUS handle_NtUserGetProcessWindowStation() + { + return NULL; + } } void syscall_dispatcher::add_handlers(std::map& handler_mapping) @@ -663,6 +673,7 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtSetInformationVirtualMemory); add_handler(NtFreeVirtualMemory); add_handler(NtQueryVirtualMemory); + add_handler(NtOpenThread); add_handler(NtOpenThreadToken); add_handler(NtOpenThreadTokenEx); add_handler(NtQueryPerformanceCounter); @@ -788,6 +799,8 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtCreateNamedPipeFile); add_handler(NtFsControlFile); add_handler(NtQueryFullAttributesFile); + add_handler(NtFlushBuffersFile); + add_handler(NtUserGetProcessWindowStation); #undef add_handler -} +} \ No newline at end of file diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 006e3ba2..730b6e9e 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -846,4 +846,22 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } -} + + NTSTATUS handle_NtFlushBuffersFile(const syscall_context& c, const handle file_handle, + const emulator_object>> /*io_status_block*/) + { + if (file_handle == STDOUT_HANDLE) + { + return STATUS_SUCCESS; + } + + const auto* f = c.proc.files.get(file_handle); + if (!f) + { + return STATUS_INVALID_HANDLE; + } + + (void)fflush(f->handle); + return STATUS_SUCCESS; + } +} \ No newline at end of file diff --git a/src/windows-emulator/syscalls/thread.cpp b/src/windows-emulator/syscalls/thread.cpp index 827dc0e1..4952759e 100644 --- a/src/windows-emulator/syscalls/thread.cpp +++ b/src/windows-emulator/syscalls/thread.cpp @@ -239,6 +239,13 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } + NTSTATUS handle_NtOpenThread(const syscall_context&, handle /*thread_handle*/, ACCESS_MASK /*desired_access*/, + emulator_object>> /*object_attributes*/, + emulator_pointer /*client_id*/) + { + return STATUS_NOT_SUPPORTED; + } + NTSTATUS handle_NtOpenThreadToken(const syscall_context&, const handle thread_handle, const ACCESS_MASK /*desired_access*/, const BOOLEAN /*open_as_self*/, const emulator_object token_handle) From d8f8bd07f9ef632b799b11578cdf53ffab39c159 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sat, 19 Apr 2025 17:12:27 -0300 Subject: [PATCH 3/4] Fix failed check --- src/windows-emulator/syscalls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 77830139..5e2e9aff 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -651,7 +651,7 @@ namespace syscalls NTSTATUS handle_NtUserGetProcessWindowStation() { - return NULL; + return 0; } } From 8e48793f47e71aa08cbd96b1483e030cf3a07319 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sat, 19 Apr 2025 17:12:41 -0300 Subject: [PATCH 4/4] Fix formatting --- src/windows-emulator/syscalls/file.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 730b6e9e..17e07e0c 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -847,8 +847,9 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } - NTSTATUS handle_NtFlushBuffersFile(const syscall_context& c, const handle file_handle, - const emulator_object>> /*io_status_block*/) + NTSTATUS handle_NtFlushBuffersFile( + const syscall_context& c, const handle file_handle, + const emulator_object>> /*io_status_block*/) { if (file_handle == STDOUT_HANDLE) {