diff --git a/src/common/platform/status.hpp b/src/common/platform/status.hpp index 7c2fd78e..ce3b27f3 100644 --- a/src/common/platform/status.hpp +++ b/src/common/platform/status.hpp @@ -23,7 +23,6 @@ using NTSTATUS = std::uint32_t; #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define STATUS_WAIT_1 ((NTSTATUS)0x00000001L) -#define STATUS_UNSUCCESSFUL ((NTSTATUS)0x00000001L) #define STATUS_ALERTED ((NTSTATUS)0x00000101L) #define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000L) @@ -31,6 +30,7 @@ using NTSTATUS = std::uint32_t; #define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L) #define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL) +#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L) diff --git a/src/common/platform/window.hpp b/src/common/platform/window.hpp index 1bf72168..9e02d09b 100644 --- a/src/common/platform/window.hpp +++ b/src/common/platform/window.hpp @@ -41,4 +41,14 @@ struct msg #endif }; +struct EMU_DISPLAY_DEVICEW +{ + DWORD cb; + char16_t DeviceName[32]; + char16_t DeviceString[128]; + DWORD StateFlags; + char16_t DeviceID[128]; + char16_t DeviceKey[128]; +}; + // NOLINTEND(modernize-use-using,cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index ae9e653b..31e87c46 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -803,6 +803,47 @@ namespace syscalls return FALSE; } + + template + static void copy_string(char16_t (&array)[Size], const std::u16string_view str) + { + if constexpr (Size == 0) + { + return; + } + + const auto size = std::min(Size, str.size()); + memcpy(array, str.data(), size * 2); + array[std::min(Size - 1, size)] = 0; + } + + NTSTATUS handle_NtUserEnumDisplayDevices(const syscall_context& /*c*/, + const emulator_object>> str_device, + const DWORD dev_num, + const emulator_object display_device, + const DWORD /*flags*/) + { + if (str_device && dev_num != 0) + { + return STATUS_UNSUCCESSFUL; + } + + if (dev_num > 0) + { + return STATUS_UNSUCCESSFUL; + } + + display_device.access([&](EMU_DISPLAY_DEVICEW& dev) { + dev.StateFlags = 0; + copy_string(dev.DeviceName, u"\\\\.\\DISPLAY1"); + copy_string(dev.DeviceID, u"PCI\\VEN_10DE&DEV_0000&SUBSYS_00000000&REV_A1"); + copy_string(dev.DeviceString, u"Emulator Display"); + copy_string(dev.DeviceKey, u"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\{00000001-" + u"0002-0003-0004-000000000005}\\0001"); + }); + + return STATUS_SUCCESS; + } } void syscall_dispatcher::add_handlers(std::map& handler_mapping) @@ -973,6 +1014,7 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtUserSetProcessDpiAwarenessContext); add_handler(NtUserGetRawInputDeviceList); add_handler(NtUserGetKeyboardType); + add_handler(NtUserEnumDisplayDevices); #undef add_handler }