[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