Fix issue in NtUserEnumDisplayDevices and NtUserEnumDisplaySettings

This commit is contained in:
Igor Pissolati
2025-10-23 16:02:53 -03:00
parent 3c6c2e2dde
commit b6d7a012d7

View File

@@ -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<UNICODE_STRING<EmulatorTraits<Emu64>>> str_device, const DWORD dev_num,
const emulator_object<EMU_DISPLAY_DEVICEW> 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<UNICODE_STRING<EmulatorTraits<Emu64>>> device_name, const DWORD mode_num,
const emulator_object<EMU_DEVMODEW> dev_mode, const DWORD /*flags*/)
NTSTATUS handle_NtUserEnumDisplaySettings(const syscall_context& c,
const emulator_object<UNICODE_STRING<EmulatorTraits<Emu64>>> device_name,
const DWORD mode_num, const emulator_object<EMU_DEVMODEW> 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()