From 162101bcb34f22ade7b2851d40b503ead7943e3b Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Mon, 24 Oct 2022 17:27:16 -0500 Subject: [PATCH] win32u: Move NtUserDisplayConfigGetDeviceInfo implementation from user32. --- dlls/user32/sysparams.c | 107 +------------------------------------ dlls/win32u/syscall.c | 1 + dlls/win32u/sysparams.c | 85 +++++++++++++++++++++++++++++ dlls/win32u/tests/win32u.c | 20 +++++++ dlls/win32u/win32u.spec | 2 +- dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 7 +++ include/ntuser.h | 1 + 8 files changed, 117 insertions(+), 107 deletions(-) diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 7ebe8099419..c7bd702726a 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -1300,112 +1300,7 @@ done: */ LONG WINAPI DisplayConfigGetDeviceInfo(DISPLAYCONFIG_DEVICE_INFO_HEADER *packet) { - LONG ret = ERROR_GEN_FAILURE; - HANDLE mutex; - HDEVINFO devinfo; - SP_DEVINFO_DATA device_data = {sizeof(device_data)}; - DWORD index = 0, type; - LUID gpu_luid; - - TRACE("(%p)\n", packet); - - if (!packet || packet->size < sizeof(*packet)) - return ERROR_GEN_FAILURE; - wait_graphics_driver_ready(); - - switch (packet->type) - { - case DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME: - { - DISPLAYCONFIG_SOURCE_DEVICE_NAME *source_name = (DISPLAYCONFIG_SOURCE_DEVICE_NAME *)packet; - WCHAR device_name[CCHDEVICENAME]; - LONG source_id; - - TRACE("DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME\n"); - - if (packet->size < sizeof(*source_name)) - return ERROR_INVALID_PARAMETER; - - mutex = get_display_device_init_mutex(); - devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_MONITOR, L"DISPLAY", NULL, DIGCF_PRESENT); - if (devinfo == INVALID_HANDLE_VALUE) - { - release_display_device_init_mutex(mutex); - return ret; - } - - while (SetupDiEnumDeviceInfo(devinfo, index++, &device_data)) - { - if (!SetupDiGetDevicePropertyW(devinfo, &device_data, &DEVPROPKEY_MONITOR_GPU_LUID, - &type, (BYTE *)&gpu_luid, sizeof(gpu_luid), NULL, 0)) - continue; - - if ((source_name->header.adapterId.LowPart != gpu_luid.LowPart) || - (source_name->header.adapterId.HighPart != gpu_luid.HighPart)) - continue; - - /* QueryDisplayConfig() derives the source ID from the adapter name. */ - if (!SetupDiGetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, - &type, (BYTE *)device_name, sizeof(device_name), NULL, 0)) - continue; - - source_id = wcstol(device_name + lstrlenW(L"\\\\.\\DISPLAY"), NULL, 10); - source_id--; - if (source_name->header.id != source_id) - continue; - - lstrcpyW(source_name->viewGdiDeviceName, device_name); - ret = ERROR_SUCCESS; - break; - } - SetupDiDestroyDeviceInfoList(devinfo); - release_display_device_init_mutex(mutex); - return ret; - } - case DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME: - { - DISPLAYCONFIG_TARGET_DEVICE_NAME *target_name = (DISPLAYCONFIG_TARGET_DEVICE_NAME *)packet; - - FIXME("DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME: stub\n"); - - if (packet->size < sizeof(*target_name)) - return ERROR_INVALID_PARAMETER; - - return ERROR_NOT_SUPPORTED; - } - case DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE: - { - DISPLAYCONFIG_TARGET_PREFERRED_MODE *preferred_mode = (DISPLAYCONFIG_TARGET_PREFERRED_MODE *)packet; - - FIXME("DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE: stub\n"); - - if (packet->size < sizeof(*preferred_mode)) - return ERROR_INVALID_PARAMETER; - - return ERROR_NOT_SUPPORTED; - } - case DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME: - { - DISPLAYCONFIG_ADAPTER_NAME *adapter_name = (DISPLAYCONFIG_ADAPTER_NAME *)packet; - - FIXME("DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME: stub\n"); - - if (packet->size < sizeof(*adapter_name)) - return ERROR_INVALID_PARAMETER; - - return ERROR_NOT_SUPPORTED; - } - case DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE: - case DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE: - case DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION: - case DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION: - case DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO: - case DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE: - case DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL: - default: - FIXME("Unimplemented packet type: %u\n", packet->type); - return ERROR_INVALID_PARAMETER; - } + return RtlNtStatusToDosError(NtUserDisplayConfigGetDeviceInfo(packet)); } /*********************************************************************** diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index f9e608ed0b7..ec21f7f5984 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -139,6 +139,7 @@ static void * const syscalls[] = NtUserDestroyWindow, NtUserDisableThreadIme, NtUserDispatchMessage, + NtUserDisplayConfigGetDeviceInfo, NtUserDragDetect, NtUserDrawIconEx, NtUserEmptyClipboard, diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 59f8ed0411e..6555e3ef653 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -5491,3 +5491,88 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code return 0; } } + +/*********************************************************************** + * NtUserDisplayConfigGetDeviceInfo (win32u.@) + */ +NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEADER *packet ) +{ + NTSTATUS ret = STATUS_UNSUCCESSFUL; + + TRACE( "packet %p.\n", packet ); + + if (!packet || packet->size < sizeof(*packet)) + return STATUS_UNSUCCESSFUL; + + switch (packet->type) + { + case DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME: + { + DISPLAYCONFIG_SOURCE_DEVICE_NAME *source_name = (DISPLAYCONFIG_SOURCE_DEVICE_NAME *)packet; + struct adapter *adapter; + + TRACE( "DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME.\n" ); + + if (packet->size < sizeof(*source_name)) + return STATUS_INVALID_PARAMETER; + + if (!lock_display_devices()) return STATUS_UNSUCCESSFUL; + + LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) + { + if (source_name->header.id != adapter->id) continue; + if (memcmp( &source_name->header.adapterId, &adapter->gpu_luid, sizeof(adapter->gpu_luid) )) continue; + + lstrcpyW( source_name->viewGdiDeviceName, adapter->dev.device_name ); + ret = STATUS_SUCCESS; + break; + } + + unlock_display_devices(); + return ret; + } + case DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME: + { + DISPLAYCONFIG_TARGET_DEVICE_NAME *target_name = (DISPLAYCONFIG_TARGET_DEVICE_NAME *)packet; + + FIXME( "DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME stub.\n" ); + + if (packet->size < sizeof(*target_name)) + return STATUS_INVALID_PARAMETER; + + return STATUS_NOT_SUPPORTED; + } + case DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE: + { + DISPLAYCONFIG_TARGET_PREFERRED_MODE *preferred_mode = (DISPLAYCONFIG_TARGET_PREFERRED_MODE *)packet; + + FIXME( "DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE stub.\n" ); + + if (packet->size < sizeof(*preferred_mode)) + return STATUS_INVALID_PARAMETER; + + return STATUS_NOT_SUPPORTED; + } + case DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME: + { + DISPLAYCONFIG_ADAPTER_NAME *adapter_name = (DISPLAYCONFIG_ADAPTER_NAME *)packet; + + FIXME( "DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME stub.\n" ); + + if (packet->size < sizeof(*adapter_name)) + return STATUS_INVALID_PARAMETER; + + return STATUS_NOT_SUPPORTED; + } + case DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE: + case DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE: + case DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION: + case DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION: + case DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO: + case DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE: + case DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL: + default: + FIXME( "Unimplemented packet type %u.\n", packet->type ); + return STATUS_INVALID_PARAMETER; + } +} diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 502b6b91b5a..bcfafbf13b3 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -675,6 +675,25 @@ static void test_timer(void) DestroyWindow( hwnd ); } +static void test_NtUserDisplayConfigGetDeviceInfo(void) +{ + DISPLAYCONFIG_SOURCE_DEVICE_NAME source_name; + NTSTATUS status; + + source_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; + source_name.header.size = sizeof(source_name.header); + status = NtUserDisplayConfigGetDeviceInfo(&source_name.header); + ok(status == STATUS_INVALID_PARAMETER, "got %#lx.\n", status); + + source_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; + source_name.header.size = sizeof(source_name); + source_name.header.adapterId.LowPart = 0xFFFF; + source_name.header.adapterId.HighPart = 0xFFFF; + source_name.header.id = 0; + status = NtUserDisplayConfigGetDeviceInfo(&source_name.header); + ok(status == STATUS_UNSUCCESSFUL || status == STATUS_NOT_SUPPORTED, "got %#lx.\n", status); +} + START_TEST(win32u) { /* native win32u.dll fails if user32 is not loaded, so make sure it's fully initialized */ @@ -692,4 +711,5 @@ START_TEST(win32u) test_timer(); test_NtUserCloseWindowStation(); + test_NtUserDisplayConfigGetDeviceInfo(); } diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index df722586ded..8a3344257ed 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -840,7 +840,7 @@ @ stdcall -syscall NtUserDisableThreadIme(long) @ stub NtUserDiscardPointerFrameMessages @ stdcall -syscall NtUserDispatchMessage(ptr) -@ stub NtUserDisplayConfigGetDeviceInfo +@ stdcall -syscall NtUserDisplayConfigGetDeviceInfo(ptr) @ stub NtUserDisplayConfigSetDeviceInfo @ stub NtUserDoSoundConnect @ stub NtUserDoSoundDisconnect diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index 009a457fe6e..683e7978653 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -125,6 +125,7 @@ SYSCALL_ENTRY( NtUserDestroyWindow ) \ SYSCALL_ENTRY( NtUserDisableThreadIme ) \ SYSCALL_ENTRY( NtUserDispatchMessage ) \ + SYSCALL_ENTRY( NtUserDisplayConfigGetDeviceInfo ) \ SYSCALL_ENTRY( NtUserDragDetect ) \ SYSCALL_ENTRY( NtUserDrawIconEx ) \ SYSCALL_ENTRY( NtUserEmptyClipboard ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 041285fa37f..8d15c84ac30 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -4077,3 +4077,10 @@ NTSTATUS WINAPI wow64_NtUserWindowFromPoint( UINT *args ) return HandleToUlong( NtUserWindowFromPoint( x, y )); } + +NTSTATUS WINAPI wow64_NtUserDisplayConfigGetDeviceInfo( UINT *args ) +{ + DISPLAYCONFIG_DEVICE_INFO_HEADER *packet = get_ptr( &args ); + + return NtUserDisplayConfigGetDeviceInfo( packet ); +} diff --git a/include/ntuser.h b/include/ntuser.h index d724ccad103..1ec4898dcd1 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -677,6 +677,7 @@ BOOL WINAPI NtUserDestroyMenu( HMENU menu ); BOOL WINAPI NtUserDestroyWindow( HWND hwnd ); BOOL WINAPI NtUserDisableThreadIme( DWORD thread_id ); LRESULT WINAPI NtUserDispatchMessage( const MSG *msg ); +NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEADER *packet ); BOOL WINAPI NtUserDragDetect( HWND hwnd, int x, int y ); BOOL WINAPI NtUserDrawCaptionTemp( HWND hwnd, HDC hdc, const RECT *rect, HFONT font, HICON icon, const WCHAR *str, UINT flags );