[PATCH v2] gdi32: Support LUID in D3DKMTOpenAdapterFromGdiDisplayName().

Huw Davies huw at codeweavers.com
Thu Jun 11 05:15:50 CDT 2020


On Thu, Jun 11, 2020 at 05:19:17PM +0800, Zhiyi Zhang wrote:
>  /**********************************************************************
>   *	     DRIVER_load_driver
> @@ -1351,17 +1371,31 @@ NTSTATUS WINAPI D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc )
>  NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc )
>  {
>      static const WCHAR displayW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y'};
> +    static const WCHAR state_flagsW[] = {'S','t','a','t','e','F','l','a','g','s',0};
> +    static const WCHAR video_value_fmtW[] = {'\\','D','e','v','i','c','e','\\',
> +                                             'V','i','d','e','o','%','d',0};
> +    static const WCHAR video_keyW[] = {'H','A','R','D','W','A','R','E','\\',
> +                                       'D','E','V','I','C','E','M','A','P','\\',
> +                                       'V','I','D','E','O','\\',0};
> +    static const WCHAR gpu_idW[] = {'G','P','U','I','D',0};
> +    WCHAR *end, key_nameW[MAX_PATH], bufferW[MAX_PATH];
> +    HDEVINFO devinfo = INVALID_HANDLE_VALUE;
> +    NTSTATUS status = STATUS_UNSUCCESSFUL;
>      static D3DKMT_HANDLE handle_start = 0;
>      struct d3dkmt_adapter *adapter;
> -    WCHAR *end;
> -    int id;
> +    SP_DEVINFO_DATA device_data;
> +    DWORD size, state_flags;
> +    DEVPROPTYPE type;
> +    HANDLE mutex;
> +    LUID luid;
> +    int index;
>  
>      TRACE("(%p) semi-stub\n", desc);

Is this still a semi-stub?  Also, it might be useful to output desc->DeviceName.

 
>      if (!desc || strncmpiW( desc->DeviceName, displayW, ARRAY_SIZE(displayW) ))
>          return STATUS_UNSUCCESSFUL;
>  
> -    id = strtolW( desc->DeviceName + ARRAY_SIZE(displayW), &end, 10 ) - 1;
> +    index = strtolW( desc->DeviceName + ARRAY_SIZE(displayW), &end, 10 ) - 1;
>      if (*end)
>          return STATUS_UNSUCCESSFUL;
>  
> @@ -1369,6 +1403,35 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
>      if (!adapter)
>          return STATUS_NO_MEMORY;
>  
> +    /* Get adapter LUID from SetupAPI */
> +    mutex = get_display_device_init_mutex();
> +
> +    size = sizeof( bufferW );
> +    sprintfW( key_nameW, video_value_fmtW, index );
> +    if (RegGetValueW( HKEY_LOCAL_MACHINE, video_keyW, key_nameW, RRF_RT_REG_SZ, NULL, bufferW, &size ))
> +        goto done;
> +
> +    /* Strip \Registry\Machine\ prefix */
> +    lstrcpyW( key_nameW, bufferW + 18 );
> +    size = sizeof( state_flags );
> +    if (RegGetValueW( HKEY_CURRENT_CONFIG, key_nameW, state_flagsW, RRF_RT_REG_DWORD, NULL,
> +                      &state_flags, &size ))
> +        goto done;

\Registry\Machine is HKLM not HKCC; I know what Wine has the information
in both places, but still.

It might be better to use the Nt registry functions here (of course you'd
then lose the RegGetValue() helper).

Thanks,
Huw.



More information about the wine-devel mailing list