diff --git a/src/windows-emulator/process_context.hpp b/src/windows-emulator/process_context.hpp index 5c41be57..8d4c8855 100644 --- a/src/windows-emulator/process_context.hpp +++ b/src/windows-emulator/process_context.hpp @@ -42,7 +42,7 @@ struct process_context std::u16string name; uint32_t ref_count = 0; - atom_entry(std::u16string n, uint32_t count) + atom_entry(std::u16string n, const uint32_t count) : name(std::move(n)), ref_count(count) { diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 923ddc74..2cc1867b 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -770,6 +770,36 @@ namespace syscalls return c.proc.windows.store(std::move(win)).bits; } + BOOL handle_NtUserSetProp(const syscall_context& c, const hwnd window, const uint16_t atom, const uint64_t data) + { + auto* win = c.proc.windows.get(window); + auto* prop = c.proc.get_atom_name(atom); + + if (!win || !prop) + { + return FALSE; + } + + win->props[*prop] = data; + + return TRUE; + } + + BOOL handle_NtUserSetProp2(const syscall_context& c, const hwnd window, + const emulator_object>> str, const uint64_t data) + { + auto* win = c.proc.windows.get(window); + if (!win || !str) + { + return FALSE; + } + + auto prop = read_unicode_string(c.emu, str); + win->props[std::move(prop)] = data; + + return TRUE; + } + ULONG handle_NtUserGetRawInputDeviceList() { return 0; @@ -1012,6 +1042,8 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtUserGetRawInputDeviceList); add_handler(NtUserGetKeyboardType); add_handler(NtUserEnumDisplayDevices); + add_handler(NtUserSetProp); + add_handler(NtUserSetProp2); #undef add_handler } diff --git a/src/windows-emulator/windows_objects.hpp b/src/windows-emulator/windows_objects.hpp index 2c0bebaf..4db28449 100644 --- a/src/windows-emulator/windows_objects.hpp +++ b/src/windows-emulator/windows_objects.hpp @@ -48,6 +48,7 @@ struct window : ref_counted_object int32_t height; int32_t x; int32_t y; + std::unordered_map props; void serialize_object(utils::buffer_serializer& buffer) const override { @@ -58,6 +59,7 @@ struct window : ref_counted_object buffer.write(this->height); buffer.write(this->x); buffer.write(this->y); + buffer.write_map(this->props); } void deserialize_object(utils::buffer_deserializer& buffer) override @@ -69,6 +71,7 @@ struct window : ref_counted_object buffer.read(this->height); buffer.read(this->x); buffer.read(this->y); + buffer.read_map(this->props); } };