From f978402e020aae59b261ac11981c62b74a18b6ff Mon Sep 17 00:00:00 2001
From: Markus Weiland <kde@graph-ix.net>
Date: Mon, 7 Jul 2008 19:35:23 +0200
Subject: [dxdiagn] [resend] Implemented szDeviceIdentifier property in dxdiagn dll

If d3d9 could not be properly initialized, the value 'n/a' is set. This
behavior has been verified against the native dxdiagn.dll. The
corresponding testcase will follow once I have time.
---
 dlls/dxdiagn/provider.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 44b30d8..db687ad 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -32,6 +32,7 @@
 #include "vfw.h"
 #include "mmddk.h"
 #include "ddraw.h"
+#include "d3d9.h"
 
 #include "wine/debug.h"
 
@@ -415,6 +416,7 @@ static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont)
     static const WCHAR szKeyDeviceKey[] = {'s','z','K','e','y','D','e','v','i','c','e','K','e','y',0};
     static const WCHAR szVendorId[] = {'s','z','V','e','n','d','o','r','I','d',0};
     static const WCHAR szDeviceId[] = {'s','z','D','e','v','i','c','e','I','d',0};
+    static const WCHAR szDeviceIdentifier[] = {'s','z','D','e','v','i','c','e','I','d','e','n','t','i','f','i','e','r',0};
     static const WCHAR dwWidth[] = {'d','w','W','i','d','t','h',0};
     static const WCHAR dwHeight[] = {'d','w','H','e','i','g','h','t',0};
     static const WCHAR dwBpp[] = {'d','w','B','p','p',0};
@@ -422,6 +424,8 @@ static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont)
     static const WCHAR szDisplayMemoryEnglish[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','E','n','g','l','i','s','h',0};
 
     static const WCHAR szAdapterID[] = {'0',0};
+
+    static const WCHAR szNA[] = {'n','/','a',0};
     static const WCHAR szEmpty[] = {0};
 
     HRESULT                 hr;
@@ -434,6 +438,12 @@ static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont)
     DWORD                   tmp;
     WCHAR                   buffer[256];
 
+    HMODULE                 d3d9_handle;
+    IDirect3D9             *(WINAPI *pDirect3DCreate9)(UINT) = NULL;
+    IDirect3D9             *pD3d = NULL;
+    D3DADAPTER_IDENTIFIER9  adapter_ident;
+    WCHAR                   adapter_ident_str[39];
+
     hr = DXDiag_CreateDXDiagContainer( &IID_IDxDiagContainer, (void**) &pDisplayAdapterSubCont );
     if (FAILED( hr )) return hr;
     hr = IDxDiagContainerImpl_AddChildContainer( pSubCont, szAdapterID, pDisplayAdapterSubCont );
@@ -472,6 +482,39 @@ static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont)
             add_prop_ui4( pDisplayAdapterSubCont, dwBpp, surface_descr.u4.ddpfPixelFormat.u1.dwRGBBitCount );
     }
 
+    /* Retrieves display device properties from the d3d9 implementation. */
+    d3d9_handle = LoadLibraryA( "d3d9.dll" );
+    if (!d3d9_handle)
+    {
+        add_prop_str( pDisplayAdapterSubCont, szDeviceIdentifier, szNA );
+        goto doneDeviceIdentifier;
+    }
+    pDirect3DCreate9 = (void *)GetProcAddress( d3d9_handle, "Direct3DCreate9" );
+    if (!pDirect3DCreate9)
+    {
+        add_prop_str( pDisplayAdapterSubCont, szDeviceIdentifier, szNA );
+        goto doneDeviceIdentifier;
+    }
+    pD3d = pDirect3DCreate9( D3D_SDK_VERSION );
+    if (!pD3d)
+    {
+        add_prop_str( pDisplayAdapterSubCont, szDeviceIdentifier, szNA );
+        goto doneDeviceIdentifier;
+    }
+    memset(&adapter_ident, 0, sizeof(adapter_ident));
+    hr = IDirect3D9_GetAdapterIdentifier(pD3d, D3DADAPTER_DEFAULT, 0, &adapter_ident);
+    if (SUCCEEDED( hr ))
+    {
+        StringFromGUID2(&adapter_ident.DeviceIdentifier, adapter_ident_str, 39);
+        add_prop_str( pDisplayAdapterSubCont, szDeviceIdentifier, adapter_ident_str );
+    }
+    else
+    {
+        add_prop_str( pDisplayAdapterSubCont, szDeviceIdentifier, szNA );
+    }
+    IDirect3D9_Release(pD3d);
+
+    doneDeviceIdentifier:
     add_prop_str( pDisplayAdapterSubCont, szVendorId, szEmpty );
     add_prop_str( pDisplayAdapterSubCont, szDeviceId, szEmpty );
     add_prop_str( pDisplayAdapterSubCont, szKeyDeviceKey, szEmpty );
-- 
1.5.2.4

