From 6deefb932f02f357cab553de2e14fc862884a08f Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Sun, 20 Apr 2025 16:30:48 -0300 Subject: [PATCH] Add NtUserGetAtomName syscall --- src/windows-emulator/process_context.cpp | 11 +++++++++++ src/windows-emulator/process_context.hpp | 1 + src/windows-emulator/syscalls.cpp | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+) 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);