From c702bedaee6db0ba34b9e5c3866b8f223981d8c1 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sat, 19 Apr 2025 16:33:34 -0300 Subject: [PATCH] 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)