From b6d7a012d727ab82b374afae8db8178a5c4575a2 Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Thu, 23 Oct 2025 16:02:53 -0300 Subject: [PATCH] Fix issue in NtUserEnumDisplayDevices and NtUserEnumDisplaySettings --- src/windows-emulator/syscalls.cpp | 63 ++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 35fbec27..4d0d6276 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -912,37 +912,58 @@ namespace syscalls return FALSE; } - NTSTATUS handle_NtUserEnumDisplayDevices(const syscall_context& /*c*/, + 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) + if (!str_device) { - return STATUS_UNSUCCESSFUL; - } + if (dev_num > 0) + { + return STATUS_UNSUCCESSFUL; + } - if (dev_num > 0) + display_device.access([&](EMU_DISPLAY_DEVICEW& dev) { + dev.StateFlags = 0x5; // DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_ATTACHED_TO_DESKTOP + utils::string::copy(dev.DeviceName, u"\\\\.\\DISPLAY1"); + utils::string::copy(dev.DeviceString, u"Emulated Virtual Adapter"); + utils::string::copy(dev.DeviceID, u"PCI\\VEN_10DE&DEV_0000&SUBSYS_00000000&REV_A1"); + utils::string::copy(dev.DeviceKey, u"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\{00000001-" + u"0002-0003-0004-000000000005}\\0000"); + }); + } + else { - return STATUS_UNSUCCESSFUL; - } + const auto dev_name = read_unicode_string(c.emu, str_device); - display_device.access([&](EMU_DISPLAY_DEVICEW& dev) { - dev.StateFlags = 0x80005; // DISPLAY_DEVICE_UNSAFE_MODES_ON | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_ATTACHED_TO_DESKTOP - utils::string::copy(dev.DeviceName, u"\\\\.\\DISPLAY1"); - utils::string::copy(dev.DeviceID, u"PCI\\VEN_10DE&DEV_0000&SUBSYS_00000000&REV_A1"); - utils::string::copy(dev.DeviceString, u"Emulator Display"); - utils::string::copy(dev.DeviceKey, u"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\{00000001-" - u"0002-0003-0004-000000000005}\\0001"); - }); + if (dev_name != u"\\\\.\\DISPLAY1") + { + return STATUS_UNSUCCESSFUL; + } + + if (dev_num > 0) + { + return STATUS_UNSUCCESSFUL; + } + + display_device.access([&](EMU_DISPLAY_DEVICEW& dev) { + dev.StateFlags = 0x1; // DISPLAY_DEVICE_ACTIVE + utils::string::copy(dev.DeviceName, u"\\\\.\\DISPLAY1\\Monitor0"); + utils::string::copy(dev.DeviceString, u"Generic PnP Monitor"); + utils::string::copy(dev.DeviceID, u"MONITOR\\EMU1234\\{4d36e96e-e325-11ce-bfc1-08002be10318}\\0000"); + utils::string::copy(dev.DeviceKey, u"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\DISPLAY\\EMU1234\\" + u"1&23a45b&0&UID67568640"); + }); + } return STATUS_SUCCESS; } - BOOL handle_NtUserEnumDisplaySettings(const syscall_context& c, - const emulator_object>> device_name, const DWORD mode_num, - const emulator_object dev_mode, const DWORD /*flags*/) + NTSTATUS handle_NtUserEnumDisplaySettings(const syscall_context& c, + const emulator_object>> device_name, + const DWORD mode_num, const emulator_object dev_mode, const DWORD /*flags*/) { - if (dev_mode && mode_num == ENUM_CURRENT_SETTINGS) + if (dev_mode && (mode_num == ENUM_CURRENT_SETTINGS || mode_num == 0)) { const auto dev_name = read_unicode_string(c.emu, device_name); @@ -956,11 +977,11 @@ namespace syscalls dm.dmDisplayFrequency = 60; }); - return TRUE; + return STATUS_SUCCESS; } } - return FALSE; + return STATUS_UNSUCCESSFUL; } NTSTATUS handle_NtAssociateWaitCompletionPacket()