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/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 new file mode 100644 index 00000000..1bf72168 --- /dev/null +++ b/src/common/platform/window.hpp @@ -0,0 +1,44 @@ +#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 +typedef struct tagPOINT +{ + LONG x; + LONG y; +} POINT; +#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 window; + UINT message; + wparam wParam; + lparam lParam; + DWORD time; + POINT pt; +#ifdef _MAC + DWORD lPrivate; +#endif +}; + +// NOLINTEND(modernize-use-using,cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) 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 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; } }