diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index fce2ce37..92d45db8 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -559,8 +559,8 @@ namespace syscalls return STATUS_SUCCESS; } - NTSTATUS handle_NtUserGetAtomName(const syscall_context& c, const RTL_ATOM atom, const uint64_t atom_name, - const ULONG length) + NTSTATUS handle_NtUserGetAtomName(const syscall_context& c, const RTL_ATOM atom, + const emulator_object>> atom_name) { const auto* name = c.proc.get_atom_name(atom); if (!name) @@ -568,14 +568,22 @@ namespace syscalls return STATUS_INVALID_PARAMETER; } - if (length < name->size()) - { - return STATUS_BUFFER_TOO_SMALL; - } + const size_t name_length = name->size() * 2; + const size_t max_length = name_length + 2; - c.emu.write_memory(atom_name, name->data(), name->size()); + bool too_small = false; + atom_name.access([&](UNICODE_STRING>& str) { + if (str.MaximumLength < max_length) + { + too_small = true; + return; + } - return STATUS_SUCCESS; + str.Length = static_cast(name_length); + c.emu.write_memory(str.Buffer, name->data(), max_length); + }); + + return too_small ? STATUS_BUFFER_TOO_SMALL : STATUS_SUCCESS; } NTSTATUS handle_NtQueryDebugFilterState()