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

Zhiyi Zhang zzhang at codeweavers.com
Thu Jun 11 07:56:16 CDT 2020



On 6/11/20 6:15 PM, Huw Davies wrote:
> 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.
The VidPnSourceId is still fake. But yeah, I guess it's ok to remove semi-stub.

>  
>>      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