Exemple #1
0
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 );
}
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;
}
Exemple #3
0
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 ();
}