And only keep the interface name internally.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/user32/sysparams.c | 48 +++++++++++++++---------------------- dlls/user32/tests/monitor.c | 1 - 2 files changed, 19 insertions(+), 30 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 6327e05517f..5842c0ae0c0 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -115,8 +115,7 @@ struct display_device WCHAR device_name[32]; /* as DeviceName in DISPLAY_DEVICEW */ WCHAR device_string[128]; /* as DeviceString in DISPLAY_DEVICEW */ DWORD state_flags; /* as StateFlags in DISPLAY_DEVICEW */ - WCHAR device_id[128]; /* as DeviceID in DISPLAY_DEVICEW when EDD_GET_DEVICE_INTERFACE_NAME is not set */ - WCHAR interface_name[128]; /* as DeviceID in DISPLAY_DEVICEW when EDD_GET_DEVICE_INTERFACE_NAME is set */ + WCHAR device_id[128]; /* as DeviceID in DISPLAY_DEVICEW */ WCHAR device_key[128]; /* as DeviceKey in DISPLAY_DEVICEW */ };
@@ -4223,6 +4222,7 @@ BOOL WINAPI EnumDisplayDevicesA( LPCSTR device, DWORD index, DISPLAY_DEVICEA *in BOOL WINAPI EnumDisplayDevicesW( LPCWSTR device, DWORD index, DISPLAY_DEVICEW *info, DWORD flags ) { struct display_device *adapter, *monitor, *found = NULL; + WCHAR buffer[MAX_PATH]; DWORD device_idx = 0;
TRACE("%s %u %p %#x\n", debugstr_w( device ), index, info, flags); @@ -4282,7 +4282,16 @@ BOOL WINAPI EnumDisplayDevicesW( LPCWSTR device, DWORD index, DISPLAY_DEVICEW *i if (info->cb >= offsetof(DISPLAY_DEVICEW, StateFlags) + sizeof(info->StateFlags)) info->StateFlags = found->state_flags; if (info->cb >= offsetof(DISPLAY_DEVICEW, DeviceID) + sizeof(info->DeviceID)) - lstrcpyW( info->DeviceID, (flags & EDD_GET_DEVICE_INTERFACE_NAME) ? found->interface_name : found->device_id ); + { + if (!device || (flags & EDD_GET_DEVICE_INTERFACE_NAME)) + lstrcpyW( info->DeviceID, found->device_id ); + else + { + swscanf( found->device_id, L"\\?\DISPLAY#%[^#]#%*[^#]#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}", buffer ); + swprintf( info->DeviceID, ARRAY_SIZE(info->DeviceID), L"MONITOR\%s\{4d36e96e-e325-11ce-bfc1-08002be10318}\%s", + buffer, wcsrchr( found->device_key, '\' ) + 1 ); + } + } if (info->cb >= offsetof(DISPLAY_DEVICEW, DeviceKey) + sizeof(info->DeviceKey)) lstrcpyW( info->DeviceKey, found->device_key ); LeaveCriticalSection( &display_section ); @@ -4333,9 +4342,6 @@ static BOOL enum_display_device( WCHAR *device, DWORD index, struct display_devi &info->state_flags, &size )) goto done;
- /* Interface name */ - info->interface_name[0] = 0; - /* DeviceID */ size = sizeof(bufferW); if (RegGetValueW( HKEY_CURRENT_CONFIG, key_nameW, L"GPUID", RRF_RT_REG_SZ | RRF_ZEROONFAILURE, NULL, @@ -4398,29 +4404,15 @@ static BOOL enum_display_device( WCHAR *device, DWORD index, struct display_devi lstrcatW( info->device_key, bufferW );
/* Interface name */ - lstrcpyW( info->interface_name, L"\\?\" ); - lstrcatW( info->interface_name, instanceW ); - lstrcatW( info->interface_name, L"#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}" ); + lstrcpyW( info->device_id, L"\\?\" ); + lstrcatW( info->device_id, instanceW ); + lstrcatW( info->device_id, L"#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}" ); /* Replace '\' with '#' after prefix */ - for (next_charW = info->interface_name + lstrlenW( L"\\?\" ); *next_charW; next_charW++) + for (next_charW = info->device_id + lstrlenW( L"\\?\" ); *next_charW; next_charW++) { if (*next_charW == '\') *next_charW = '#'; } - - /* DeviceID */ - if (!SetupDiGetDeviceRegistryPropertyW( set, &device_data, SPDRP_HARDWAREID, NULL, (BYTE *)bufferW, - sizeof(bufferW), NULL )) - goto done; - - lstrcpyW( info->device_id, bufferW ); - lstrcatW( info->device_id, L"\" ); - - if (!SetupDiGetDeviceRegistryPropertyW( set, &device_data, SPDRP_DRIVER, NULL, (BYTE *)bufferW, - sizeof(bufferW), NULL )) - goto done; - - lstrcatW( info->device_id, bufferW ); }
ret = TRUE; @@ -4447,9 +4439,8 @@ done: lstrcpyW( info->device_name, L"\\.\DISPLAY1" ); lstrcpyW( info->device_string, L"Wine Adapter" ); info->state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE; - info->interface_name[0] = 0; lstrcpyW( info->device_id, L"PCI\VEN_0000&DEV_0000&SUBSYS_00000000&REV_00" ); - info->device_key[0] = 0; + lstrcpyW( info->device_key, L"\Registry\Machine\System\CurrentControlSet\Control\Video\{71c91c84-1064-400f-a994-95e3ff2716d6}\0000" ); } /* Monitor */ else @@ -4460,9 +4451,8 @@ done: lstrcpyW( info->device_name, L"\\.\DISPLAY1\Monitor0" ); lstrcpyW( info->device_string, L"Generic Non-PnP Monitor" ); info->state_flags = DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED; - lstrcpyW( info->interface_name, L"\\?\DISPLAY#Default_Monitor#4&17f0ff54&0&UID0#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}" ); - lstrcpyW( info->device_id, L"MONITOR\Default_Monitor\{4d36e96e-e325-11ce-bfc1-08002be10318}\0000" ); - info->device_key[0] = 0; + lstrcpyW( info->device_id, L"\\?\DISPLAY#Default_Monitor#4&17f0ff54&0&UID0#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}" ); + lstrcpyW( info->device_key, L"\Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0000" ); }
return TRUE; diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c index bd89a8d9a40..7490ed2923f 100644 --- a/dlls/user32/tests/monitor.c +++ b/dlls/user32/tests/monitor.c @@ -162,7 +162,6 @@ static void test_EnumDisplayDevices(void) /* DeviceID should equal to the first string of HardwareID value data in PCI GPU instance. You can verify this * by changing the data and rerun EnumDisplayDevices. But it's difficult to find corresponding PCI device on * userland. So here we check the expected format instead. */ - todo_wine ok( broken( !*adapter_iface.DeviceID ) || swscanf( adapter_iface.DeviceID, L"PCI\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X", &number, &number, &number, &number ) == 4,