HRESULT DXDiagNVUtil::GetNumDisplayDevices( DWORD * out_pdwNumAdapters ) { HRESULT hr = S_OK; MSGVARNAME_AND_FAIL_IF_NULL( m_pDxDiagRoot ); MSGVARNAME_AND_FAIL_IF_NULL( out_pdwNumAdapters ); IDxDiagContainer * pChild; hr = GetChildContainer( L"DxDiag_DisplayDevices", & pChild ); MSG_AND_RET_VAL_IF( FAILED(hr), "GetNumDisplayDevices() Couldn't get display devices container!\n", hr ); hr = pChild->GetNumberOfChildContainers( out_pdwNumAdapters ); MSG_AND_BREAK_IF( FAILED(hr), "GetNumDisplayDevices() Couldn't get number of child containers!\n" ); SAFE_RELEASE( pChild ); return( hr ); }
HRESULT DXDiagNVUtil::GetChildContainer( LPCWSTR name0, LPCWSTR name1, IDxDiagContainer ** ppChild ) { // intermediate children are released before returning // you only have to release() *ppChild HRESULT hr = S_OK; IDxDiagContainer * pChild; hr = GetChildContainer( name0, &pChild ); TRACE0( MSG_IF( FAILED(hr), "GetChildContainer(<2>) GetChildContainer(<1>) failed\n" ) ); RET_VAL_IF_FAILED( hr ); FAIL_IF_NULL( pChild ); hr = pChild->GetChildContainer( name1, ppChild ); TRACE0( MSG_IF( FAILED(hr), "GetChildContainer(<2>) IDxDiagContainer->GetChildContainer() failed\n" ) ); SAFE_RELEASE( pChild ); // release the intermediate return( hr ); }
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; }
//----------------------------------------------------------------------------- // 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; }
ATOM_DisplayInfo::ATOM_DisplayInfo (void) { IDxDiagProvider* pDxDiagProvider = 0; IDxDiagContainer* pDxDiagRoot = 0; BOOL bComInitialized = FALSE; IDxDiagContainer* pContainer = NULL; IDxDiagContainer* pObject = NULL; IDxDiagContainer* pDxDiagSystemInfo = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; HRESULT hr = CoInitialize (NULL); bComInitialized = SUCCEEDED (hr); hr = CoCreateInstance (CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*)&pDxDiagProvider); if (FAILED(hr)) goto LCleanup; if (!pDxDiagProvider) { hr = E_POINTER; goto LCleanup; } DXDIAG_INIT_PARAMS dxDiagInitParam; memset(&dxDiagInitParam, 0, sizeof(DXDIAG_INIT_PARAMS)); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; dxDiagInitParam.bAllowWHQLChecks = false; dxDiagInitParam.pReserved = NULL; hr = pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) goto LCleanup; hr = pDxDiagProvider->GetRootContainer( &pDxDiagRoot ); if( FAILED(hr) ) goto LCleanup; if( FAILED( hr = pDxDiagRoot->GetChildContainer( L"DxDiag_DisplayDevices", &pContainer ) ) ) goto LCleanup; if( FAILED( hr = pContainer->GetNumberOfChildContainers( &nInstanceCount ) ) ) goto LCleanup; WCHAR wszContainer[256]; for (nItem = 0; nItem < nInstanceCount; nItem++) { DisplayDeviceInfo *di = ATOM_NEW(DisplayDeviceInfo); devices.push_back (di); hr = pContainer->EnumChildContainerNames( nItem, wszContainer, 256 ); if(FAILED(hr)) goto LCleanup; hr = pContainer->GetChildContainer( wszContainer, &pObject ); if( FAILED( hr ) || pObject == NULL ) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDescription", di->m_strDescription, ARRAY_SIZE(di->m_strDescription)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szManufacturer", di->m_strManufacturer, ARRAY_SIZE(di->m_strManufacturer)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szChipType", di->m_strChipType, ARRAY_SIZE(di->m_strChipType)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDisplayMemoryLocalized", di->m_strDisplayMemory, ARRAY_SIZE(di->m_strDisplayMemory)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDisplayModeLocalized", di->m_strATOM_DisplayMode, ARRAY_SIZE(di->m_strATOM_DisplayMode)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDriverName", di->m_strDriverName, ARRAY_SIZE(di->m_strDriverName)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDriverVersion", di->m_strDriverVersion, ARRAY_SIZE(di->m_strDriverVersion)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDriverDateLocalized", di->m_strDriverDate, ARRAY_SIZE(di->m_strDriverDate)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szVendorId", di->m_strVendorId, ARRAY_SIZE(di->m_strVendorId)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szDeviceId", di->m_strDeviceId, ARRAY_SIZE(di->m_strDeviceId)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szSubSysId", di->m_strSubSysId, ARRAY_SIZE(di->m_strSubSysId)))) goto LCleanup; if( FAILED( hr = GetStringValue( pObject, L"szRevisionId", di->m_strRevisionId, ARRAY_SIZE(di->m_strRevisionId)))) goto LCleanup; if( FAILED( hr = GetBoolValue( pObject, L"bDDAccelerationEnabled", &di->m_bDDAccelerationEnabled))) goto LCleanup; if( FAILED( hr = GetBoolValue( pObject, L"b3DAccelerationExists", &di->m_b3DAccelerationExists))) goto LCleanup; if( FAILED( hr = GetBoolValue( pObject, L"b3DAccelerationEnabled", &di->m_b3DAccelerationEnabled))) goto LCleanup; if( FAILED( hr = GetBoolValue( pObject, L"bAGPEnabled", &di->m_bAGPEnabled))) goto LCleanup; if( FAILED( hr = GetBoolValue( pObject, L"bAGPExists", &di->m_bAGPExists))) goto LCleanup; SAFE_RELEASE(pObject); } //get dx version if( FAILED( hr = pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pDxDiagSystemInfo ) ) ) goto LCleanup; if( FAILED( hr = GetIntValue( pDxDiagSystemInfo, L"dwDirectXVersionMajor", &dxverion.nDXVersionMajor))) goto LCleanup; if( FAILED( hr = GetIntValue( pDxDiagSystemInfo, L"dwDirectXVersionMinor", &dxverion.nDXVersionMinor))) goto LCleanup; if( FAILED( hr = GetStringValue( pDxDiagSystemInfo, L"szDirectXVersionLetter", dxverion.sDXVersionLetter, ARRAY_SIZE(dxverion.sDXVersionLetter)))) goto LCleanup; LCleanup: SAFE_RELEASE(pObject); SAFE_RELEASE(pContainer); SAFE_RELEASE(pDxDiagSystemInfo); SAFE_RELEASE(pDxDiagRoot); SAFE_RELEASE(pDxDiagProvider); if (FAILED(hr) && !devices.empty()) { ATOM_DELETE(devices.back ()); devices.pop_back (); } if (bComInitialized) CoUninitialize (); }
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; }