diff --git a/src/windows-emulator/process_context.cpp b/src/windows-emulator/process_context.cpp index 36205f3e..f75395a3 100644 --- a/src/windows-emulator/process_context.cpp +++ b/src/windows-emulator/process_context.cpp @@ -312,3 +312,14 @@ bool process_context::delete_atom(uint16_t atom_id) return true; } + +const std::u16string* process_context::get_atom_name(uint16_t atom_id) const +{ + const auto it = atoms.find(atom_id); + if (it == atoms.end()) + { + return nullptr; + } + + return &it->second.name; +} diff --git a/src/windows-emulator/process_context.hpp b/src/windows-emulator/process_context.hpp index ac42f5f1..7fe34f27 100644 --- a/src/windows-emulator/process_context.hpp +++ b/src/windows-emulator/process_context.hpp @@ -68,6 +68,7 @@ struct process_context uint16_t add_or_find_atom(std::u16string name); bool delete_atom(const std::u16string& name); bool delete_atom(uint16_t atom_id); + const std::u16string* get_atom_name(uint16_t atom_id) const; void serialize(utils::buffer_serializer& buffer) const; void deserialize(utils::buffer_deserializer& buffer); diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 605f000e..0152cefa 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -548,6 +548,25 @@ namespace syscalls return STATUS_SUCCESS; } + NTSTATUS handle_NtUserGetAtomName(const syscall_context& c, const RTL_ATOM atom, const uint64_t atom_name, + const ULONG length) + { + const auto* name = c.proc.get_atom_name(atom); + if (!name) + { + return STATUS_INVALID_PARAMETER; + } + + if (length < name->size()) + { + return STATUS_BUFFER_TOO_SMALL; + } + + c.emu.write_memory(atom_name, name->data(), name->size()); + + return STATUS_SUCCESS; + } + NTSTATUS handle_NtQueryDebugFilterState() { return FALSE; @@ -719,6 +738,7 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtAddAtomEx); add_handler(NtAddAtom); add_handler(NtDeleteAtom); + add_handler(NtUserGetAtomName); add_handler(NtInitializeNlsFiles); add_handler(NtUnmapViewOfSection); add_handler(NtUnmapViewOfSectionEx);