From a2b3b5f1c2325da13b3ad4bcddd97c20c54fbd18 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 17 May 2025 11:50:44 +0200 Subject: [PATCH 1/4] Prepare UI support --- src/common/platform/platform.hpp | 1 + src/common/platform/window.hpp | 40 +++++++++++++++++++++++++++++++ src/windows-emulator/syscalls.cpp | 39 +++++++++++++++++++++++++++--- 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/common/platform/window.hpp diff --git a/src/common/platform/platform.hpp b/src/common/platform/platform.hpp index f26dc677..6e8dff89 100644 --- a/src/common/platform/platform.hpp +++ b/src/common/platform/platform.hpp @@ -25,6 +25,7 @@ #include "registry.hpp" #include "network.hpp" #include "threading.hpp" +#include "window.hpp" #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop diff --git a/src/common/platform/window.hpp b/src/common/platform/window.hpp new file mode 100644 index 00000000..26a67d55 --- /dev/null +++ b/src/common/platform/window.hpp @@ -0,0 +1,40 @@ +#pragma once + +using pointer = uint64_t; + +#ifndef OS_WINDOWS +typedef struct tagPOINT +{ + LONG x; + LONG y; +} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT; +#endif + +using wparam = pointer; +using lparam = pointer; +using lresult = pointer; + +typedef struct _LARGE_STRING +{ + ULONG Length; + ULONG MaximumLength : 31; + ULONG bAnsi : 1; + pointer Buffer; +} LARGE_STRING; + +using hwnd = pointer; +using hmenu = pointer; +using hinstance = pointer; + +struct msg +{ + hwnd hwnd; + UINT message; + wparam wParam; + lparam lParam; + DWORD time; + POINT pt; +#ifdef _MAC + DWORD lPrivate; +#endif +}; diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 6b1e39f8..e3203b3b 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -718,18 +718,51 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } - NTSTATUS handle_NtUserCreateWindowEx() + hwnd handle_NtUserCreateWindowEx(const syscall_context& c, const DWORD ex_style, + const emulator_object class_name, + const emulator_object cls_version, + const emulator_object window_name, const DWORD style, const int x, + const int y, const int width, const int height, const hwnd parent, + const hmenu menu, const hinstance instance, const pointer l_param, + const DWORD flags, const pointer acbi_buffer) { + (void)c; + (void)ex_style; + (void)class_name; + (void)cls_version; + (void)window_name; + (void)style; + (void)x; + (void)y; + (void)width; + (void)height; + (void)parent; + (void)menu; + (void)instance; + (void)l_param; + (void)flags; + (void)acbi_buffer; + return STATUS_NOT_SUPPORTED; } - NTSTATUS handle_NtUserShowWindow() + NTSTATUS handle_NtUserShowWindow(const syscall_context& c, const hwnd hwnd, const LONG cmd_show) { + (void)c; + (void)hwnd; + (void)cmd_show; return STATUS_NOT_SUPPORTED; } - NTSTATUS handle_NtUserGetMessage() + NTSTATUS handle_NtUserGetMessage(const syscall_context& c, const emulator_object message, const hwnd hwnd, + const UINT msg_filter_min, const UINT msg_filter_max) { + (void)c; + (void)message; + (void)hwnd; + (void)msg_filter_min; + (void)msg_filter_max; + return STATUS_NOT_SUPPORTED; } } From ab4ee843395140b4a40f712680dd7957292012ef Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 17 May 2025 12:01:04 +0200 Subject: [PATCH 2/4] Support arbitrary return types --- src/windows-emulator/syscall_utils.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/windows-emulator/syscall_utils.hpp b/src/windows-emulator/syscall_utils.hpp index 392daa89..d87995d0 100644 --- a/src/windows-emulator/syscall_utils.hpp +++ b/src/windows-emulator/syscall_utils.hpp @@ -139,11 +139,11 @@ T resolve_indexed_argument(x86_64_emulator& emu, size_t& index) return resolve_argument(emu, index++); } -inline void write_syscall_status(const syscall_context& c, const NTSTATUS status, const uint64_t initial_ip) +inline void write_syscall_result(const syscall_context& c, const uint64_t result, const uint64_t initial_ip) { if (c.write_status && !c.retrigger_syscall) { - c.emu.reg(x86_register::rax, static_cast(status)); + c.emu.reg(x86_register::rax, result); } const auto new_ip = c.emu.read_instruction_pointer(); @@ -158,11 +158,11 @@ inline void forward_syscall(const syscall_context& c, NTSTATUS (*handler)()) const auto ip = c.emu.read_instruction_pointer(); const auto ret = handler(); - write_syscall_status(c, ret, ip); + write_syscall_result(c, static_cast(ret), ip); } -template -void forward_syscall(const syscall_context& c, NTSTATUS (*handler)(const syscall_context&, Args...)) +template +void forward_syscall(const syscall_context& c, Result (*handler)(const syscall_context&, Args...)) { const auto ip = c.emu.read_instruction_pointer(); @@ -173,7 +173,7 @@ void forward_syscall(const syscall_context& c, NTSTATUS (*handler)(const syscall (void)index; const auto ret = std::apply(handler, std::move(func_args)); - write_syscall_status(c, ret, ip); + write_syscall_result(c, ret, ip); } template From 549d9e462501be052772bcf91f23d52b58f19312 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 17 May 2025 12:04:32 +0200 Subject: [PATCH 3/4] Fix compilation --- src/common/platform/primitives.hpp | 1 + src/common/platform/window.hpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/platform/primitives.hpp b/src/common/platform/primitives.hpp index 19fe4c4b..2a5d6de5 100644 --- a/src/common/platform/primitives.hpp +++ b/src/common/platform/primitives.hpp @@ -22,6 +22,7 @@ using ULONG = DWORD; using DWORD64 = std::uint64_t; using ULONGLONG = DWORD64; using LONGLONG = std::int64_t; +using UINT = std::uint32_t; typedef union _ULARGE_INTEGER { diff --git a/src/common/platform/window.hpp b/src/common/platform/window.hpp index 26a67d55..a0f20f9b 100644 --- a/src/common/platform/window.hpp +++ b/src/common/platform/window.hpp @@ -7,7 +7,7 @@ typedef struct tagPOINT { LONG x; LONG y; -} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT; +} POINT; #endif using wparam = pointer; @@ -28,7 +28,7 @@ using hinstance = pointer; struct msg { - hwnd hwnd; + hwnd window; UINT message; wparam wParam; lparam lParam; From 6a6f2fa0bc7f4a9ff694d5f01a24b4ba9626edb7 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 17 May 2025 12:14:32 +0200 Subject: [PATCH 4/4] Fix linter warnings --- src/common/platform/window.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/platform/window.hpp b/src/common/platform/window.hpp index a0f20f9b..1bf72168 100644 --- a/src/common/platform/window.hpp +++ b/src/common/platform/window.hpp @@ -1,5 +1,7 @@ #pragma once +// NOLINTBEGIN(modernize-use-using,cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + using pointer = uint64_t; #ifndef OS_WINDOWS @@ -38,3 +40,5 @@ struct msg DWORD lPrivate; #endif }; + +// NOLINTEND(modernize-use-using,cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)