//----------------------------------------------------------------------------- // Name: GetDirectXVersionViaDxDiag() // Desc: Tries to get the DirectX version from DxDiag's COM interface //----------------------------------------------------------------------------- HRESULT GetDirectXVersionViaDxDiag( DWORD* pdwDirectXVersionMajor, DWORD* pdwDirectXVersionMinor, TCHAR* pcDirectXVersionLetter ) { HRESULT hr; bool bCleanupCOM = false; bool bSuccessGettingMajor = false; bool bSuccessGettingMinor = false; bool bSuccessGettingLetter = false; // Init COM. COM may fail if its already been inited with a different // concurrency model. And if it fails you shouldn't release it. hr = CoInitialize(NULL); bCleanupCOM = SUCCEEDED(hr); // Get an IDxDiagProvider bool bGotDirectXVersion = false; IDxDiagProvider* pDxDiagProvider = NULL; hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &pDxDiagProvider ); if( SUCCEEDED(hr) ) { // Fill out a DXDIAG_INIT_PARAMS struct DXDIAG_INIT_PARAMS dxDiagInitParam; ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; dxDiagInitParam.bAllowWHQLChecks = false; dxDiagInitParam.pReserved = NULL; // Init the m_pDxDiagProvider hr = pDxDiagProvider->Initialize( &dxDiagInitParam ); if( SUCCEEDED(hr) ) { IDxDiagContainer* pDxDiagRoot = NULL; IDxDiagContainer* pDxDiagSystemInfo = NULL; // Get the DxDiag root container hr = pDxDiagProvider->GetRootContainer( &pDxDiagRoot ); if( SUCCEEDED(hr) ) { // Get the object called DxDiag_SystemInfo hr = pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pDxDiagSystemInfo ); if( SUCCEEDED(hr) ) { VARIANT var; VariantInit( &var ); // Get the "dwDirectXVersionMajor" property hr = pDxDiagSystemInfo->GetProp( L"dwDirectXVersionMajor", &var ); if( SUCCEEDED(hr) && var.vt == VT_UI4 ) { if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = var.ulVal; bSuccessGettingMajor = true; } VariantClear( &var ); // Get the "dwDirectXVersionMinor" property hr = pDxDiagSystemInfo->GetProp( L"dwDirectXVersionMinor", &var ); if( SUCCEEDED(hr) && var.vt == VT_UI4 ) { if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = var.ulVal; bSuccessGettingMinor = true; } VariantClear( &var ); // Get the "szDirectXVersionLetter" property hr = pDxDiagSystemInfo->GetProp( L"szDirectXVersionLetter", &var ); if( SUCCEEDED(hr) && var.vt == VT_BSTR && var.bstrVal != NULL ) { #ifdef UNICODE *pcDirectXVersionLetter = var.bstrVal[0]; #else char strDestination[10]; WideCharToMultiByte( CP_ACP, 0, var.bstrVal, -1, strDestination, 10*sizeof(CHAR), NULL, NULL ); if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = strDestination[0]; #endif bSuccessGettingLetter = true; } VariantClear( &var ); // If it all worked right, then mark it down if( bSuccessGettingMajor && bSuccessGettingMinor && bSuccessGettingLetter ) bGotDirectXVersion = true; pDxDiagSystemInfo->Release(); } pDxDiagRoot->Release(); } } pDxDiagProvider->Release(); } if( bCleanupCOM ) CoUninitialize(); if( bGotDirectXVersion ) return S_OK; else return E_FAIL; }
bool WMIVideoInfo::_queryPropertyDxDiag( const PVIQueryType queryType, const U32 adapterId, String *outValue ) { if( mDxDiagProvider != 0 ) { IDxDiagContainer* rootContainer = 0; IDxDiagContainer* displayDevicesContainer = 0; IDxDiagContainer* deviceContainer = 0; // Special case to deal with PVI_NumAdapters if(queryType == PVI_NumAdapters) { DWORD count = 0; String value; if( mDxDiagProvider->GetRootContainer( &rootContainer ) == S_OK && rootContainer->GetChildContainer( L"DxDiag_DisplayDevices", &displayDevicesContainer ) == S_OK && displayDevicesContainer->GetNumberOfChildContainers( &count ) == S_OK ) { value = String::ToString("%d", count); } if( rootContainer ) SAFE_RELEASE( rootContainer ); if( displayDevicesContainer ) SAFE_RELEASE( displayDevicesContainer ); *outValue = value; return true; } WCHAR adapterIdString[ 2 ]; adapterIdString[ 0 ] = L'0' + adapterId; adapterIdString[ 1 ] = L'\0'; String value; if( mDxDiagProvider->GetRootContainer( &rootContainer ) == S_OK && rootContainer->GetChildContainer( L"DxDiag_DisplayDevices", &displayDevicesContainer ) == S_OK && displayDevicesContainer->GetChildContainer( adapterIdString, &deviceContainer ) == S_OK ) { const WCHAR* propertyName = 0; switch( queryType ) { case PVI_Description: propertyName = L"szDescription"; break; case PVI_Name: propertyName = L"szDeviceName"; break; case PVI_ChipSet: propertyName = L"szChipType"; break; case PVI_DriverVersion: propertyName = L"szDriverVersion"; break; // Don't get VRAM via DxDiag as that won't tell us about the actual amount of dedicated // video memory but rather some dedicated+shared RAM value. } if( propertyName ) { VARIANT val; if( deviceContainer->GetProp( propertyName, &val ) == S_OK ) switch( val.vt ) { case VT_BSTR: value = String( val.bstrVal ); break; default: AssertWarn( false, avar( "WMIVideoInfo: property type '%i' not implemented", val.vt ) ); } } } if( rootContainer ) SAFE_RELEASE( rootContainer ); if( displayDevicesContainer ) SAFE_RELEASE( displayDevicesContainer ); if( deviceContainer ) SAFE_RELEASE( deviceContainer ); if( value.isNotEmpty() ) { // Try to get the DxDiag data into some canonical form. Otherwise, we // won't be giving the card profiler much opportunity for matching up // its data with profile scripts. switch( queryType ) { case PVI_ChipSet: if( value.compare( "ATI", 3, String::NoCase ) == 0 ) value = "ATI Technologies Inc."; else if( value.compare( "NVIDIA", 6, String::NoCase ) == 0 ) value = "NVIDIA"; else if( value.compare( "INTEL", 5, String::NoCase ) == 0 ) value = "INTEL"; else if( value.compare( "MATROX", 6, String::NoCase ) == 0 ) value = "MATROX"; break; case PVI_Description: if( value.compare( "ATI ", 4, String::NoCase ) == 0 ) { value = value.substr( 4, value.length() - 4 ); if( value.compare( " Series", 7, String::NoCase | String::Right ) == 0 ) value = value.substr( 0, value.length() - 7 ); } else if( value.compare( "NVIDIA ", 7, String::NoCase ) == 0 ) value = value.substr( 7, value.length() - 7 ); else if( value.compare( "INTEL ", 6, String::NoCase ) == 0 ) value = value.substr( 6, value.length() - 6 ); else if( value.compare( "MATROX ", 7, String::NoCase ) == 0 ) value = value.substr( 7, value.length() - 7 ); break; } *outValue = value; return true; } } return false; }
HRESULT GetDirectXVersionViaDxDiag(CString& strDXVersionString) { HRESULT hr; bool bCleanupCOM = false; bool bSuccessGettingLetter = false; // Init COM. COM may fail if its already been inited with a different // concurrency model. And if it fails you shouldn't release it. hr = CoInitialize(NULL); bCleanupCOM = SUCCEEDED(hr); // Get an IDxDiagProvider bool bGotDirectXVersion = false; IDxDiagProvider* pDxDiagProvider = NULL; hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &pDxDiagProvider ); if( SUCCEEDED(hr) ) { // Fill out a DXDIAG_INIT_PARAMS struct DXDIAG_INIT_PARAMS dxDiagInitParam; ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; dxDiagInitParam.bAllowWHQLChecks = false; dxDiagInitParam.pReserved = NULL; // Init the m_pDxDiagProvider hr = pDxDiagProvider->Initialize( &dxDiagInitParam ); if( SUCCEEDED(hr) ) { IDxDiagContainer* pDxDiagRoot = NULL; IDxDiagContainer* pDxDiagSystemInfo = NULL; // Get the DxDiag root container hr = pDxDiagProvider->GetRootContainer( &pDxDiagRoot ); if( SUCCEEDED(hr) ) { // Get the object called DxDiag_SystemInfo hr = pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pDxDiagSystemInfo ); if( SUCCEEDED(hr) ) { VARIANT var; VariantInit( &var ); // Get the "szDirectXVersionLetter" property hr = pDxDiagSystemInfo->GetProp( L"szDirectXVersionLongEnglish", &var ); if( SUCCEEDED(hr) && var.vt == VT_BSTR && SysStringLen( var.bstrVal ) != 0 ) { strDXVersionString = CComBSTR(var.bstrVal); bSuccessGettingLetter = true; } VariantClear( &var ); // If it all worked right, then mark it down if( bSuccessGettingLetter ) bGotDirectXVersion = true; pDxDiagSystemInfo->Release(); } pDxDiagRoot->Release(); } } pDxDiagProvider->Release(); } if( bCleanupCOM ) CoUninitialize(); if( bGotDirectXVersion ) return S_OK; else return E_FAIL; }