207 lines
9.3 KiB
C++
207 lines
9.3 KiB
C++
//=============================================================================
|
|
// This file describes classes used by MSInfo to abstract its access to WMI
|
|
// classes and enumerations. This abstraction allows for displaying data
|
|
// from live WMI or from a saved XML file.
|
|
//=============================================================================
|
|
|
|
#pragma once
|
|
|
|
#include "resource.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MSInfo has a couple of specific errors - one where there is no property
|
|
// by the specified name, and when where the value returned for the requested
|
|
// property is NULL.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
typedef enum tag_MSINFOSTATUS
|
|
{
|
|
MSINFO_NO_ERROR = 0,
|
|
E_MSINFO_NOVALUE = 0x80043001,
|
|
E_MSINFO_NOPROPERTY = 0x80043002
|
|
} MSINFOSTATUS;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The CWMIObject abstract base class encapsulates a WMI object, which may
|
|
// in reality be a live WMI object, or an object recreated from the XML
|
|
// storage of an object.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class CWMIObject
|
|
{
|
|
public:
|
|
CWMIObject() {};
|
|
virtual ~CWMIObject() {};
|
|
|
|
// The following methods return information about a property of this object.
|
|
//
|
|
// S_OK implies success
|
|
// E_MSINFO_NOPROPERTY means the named property doesn't exist
|
|
// E_MSINFO_NOVALUE means the property exists, but is empty
|
|
|
|
virtual HRESULT GetValue(LPCTSTR szProperty, VARIANT * pvarValue) = 0;
|
|
virtual HRESULT GetValueString(LPCTSTR szProperty, CString * pstrValue) = 0;
|
|
virtual HRESULT GetValueDWORD(LPCTSTR szProperty, DWORD * pdwValue) = 0;
|
|
virtual HRESULT GetValueTime(LPCTSTR szProperty, SYSTEMTIME * psystimeValue) = 0;
|
|
virtual HRESULT GetValueDoubleFloat(LPCTSTR szProperty, double * pdblValue) = 0;
|
|
virtual HRESULT GetValueValueMap(LPCTSTR szProperty, CString * pstrValue) = 0;
|
|
|
|
// Some shortcuts and helper functions.
|
|
|
|
virtual CString GetString(LPCTSTR szProperty)
|
|
{
|
|
CString strReturn;
|
|
if (SUCCEEDED(GetValueString(szProperty, &strReturn)))
|
|
return strReturn;
|
|
else
|
|
return CString(_T(""));
|
|
}
|
|
|
|
virtual HRESULT GetInterpretedValue(LPCTSTR szProperty, LPCTSTR szFormat, TCHAR chFormat, CString * pstrValue, DWORD * pdwValue);
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The CWMIObjectCollection abstract base class encapsulates a collection
|
|
// of CWMIObject's. This collection may be treated like an enumeration.
|
|
// Subclases of this class may implement the collection as a WMI enumerator,
|
|
// or an existing blob of XML data.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class CWMIObjectCollection
|
|
{
|
|
public:
|
|
CWMIObjectCollection() {};
|
|
virtual ~CWMIObjectCollection() {};
|
|
|
|
// The Create function creates the collection of objects (note - Create
|
|
// may be called multiple times on the same object). If the szProperties
|
|
// parameter is non-NULL, then it contains a comma delimited list of the
|
|
// minimum set of properties which should be included in the collection
|
|
// of objects. If it's NULL, then all available properties should be
|
|
// included.
|
|
|
|
virtual HRESULT Create(LPCTSTR szClass, LPCTSTR szProperties = NULL) = 0;
|
|
|
|
// The following two functions are used to manage the enumeration. GetNext
|
|
// returns the next enumerated CWMIObject. When there are no more objects,
|
|
// GetNext returns S_FALSE. Obviously, the caller is responsible for
|
|
// deleting the object returned.
|
|
//
|
|
// Note - if the ppObject points to a non-NULL pointer, it's assumed that
|
|
// the object has already been created, and can be reused.
|
|
|
|
virtual HRESULT GetNext(CWMIObject ** ppObject) = 0;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The CEnumMap is a utility class to cache IEnumWbemClassObject pointers.
|
|
// There will be one instance of this class used to improve performance
|
|
// by avoiding the high overhead associated with creating enumerators for
|
|
// certain classes.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
struct IEnumWbemClassObject;
|
|
class CEnumMap
|
|
{
|
|
public:
|
|
CEnumMap() { };
|
|
~CEnumMap() { Reset(); };
|
|
|
|
IEnumWbemClassObject * GetEnumerator(const CString & strClass);
|
|
void SetEnumerator(const CString & strClass, IEnumWbemClassObject * pEnum);
|
|
void Reset();
|
|
|
|
private:
|
|
CMapStringToPtr m_mapEnum;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The CWMIHelper function encapsulates a WMI connection (which might be to
|
|
// XML).
|
|
//-----------------------------------------------------------------------------
|
|
|
|
struct GATH_FIELD;
|
|
struct IWbemServices;
|
|
struct IWbemClassObject;
|
|
class CMSIEnumerator;
|
|
class CMSIObject;
|
|
|
|
class CWMIHelper
|
|
{
|
|
public:
|
|
CWMIHelper() : m_pIWbemServices(NULL)
|
|
{
|
|
::AfxSetResourceHandle(_Module.GetResourceInstance());
|
|
m_strTrue.LoadString(IDS_VERSION5YES);
|
|
m_strFalse.LoadString(IDS_VERSION5NO);
|
|
m_strPropertyUnavail.LoadString(IDS_ERROR_NOVALUE);
|
|
m_strBadProperty.LoadString(IDS_ERROR_NOPROPERTY);
|
|
};
|
|
virtual ~CWMIHelper() {};
|
|
|
|
// Enumerate creates a CWMIObjectCollection derived object which enumerates the specified class.
|
|
// If szProperties is not null, then it points to a string containing a list of properties to be
|
|
// gathered; otherwise all the properties are included.
|
|
//
|
|
// Note - if ppCollection points to a non-NULL pointer, it's assumed that this object
|
|
// can be reused, and no new collection is created.
|
|
|
|
virtual HRESULT Enumerate(LPCTSTR szClass, CWMIObjectCollection ** ppCollection, LPCTSTR szProperties = NULL) = 0;
|
|
|
|
// Performs a WQL query (if the subclass supports it).
|
|
|
|
virtual HRESULT WQLQuery(LPCTSTR szQuery, CWMIObjectCollection ** ppCollection)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
virtual void LoadColumnsFromResource(UINT uiResourceID, CPtrList * aColValues, int iColCount);
|
|
virtual void LoadColumnsFromString(LPCTSTR szColumns, CPtrList * aColValues, int iColCount);
|
|
virtual CWMIObject * GetSingleObject(LPCTSTR szClass, LPCTSTR szProperties = NULL);
|
|
virtual HRESULT NewNamespace(LPCTSTR szNamespace, CWMIHelper **ppNewHelper) { return E_FAIL; };
|
|
virtual HRESULT GetNamespace(CString * pstrNamespace) { return E_FAIL; };
|
|
virtual HRESULT GetObject(LPCTSTR szObjectPath, CWMIObject ** ppObject) { return E_FAIL; };
|
|
virtual void AddObjectToOutput(CPtrList * aColValues, int iColCount, CWMIObject * pObject, LPCTSTR szProperties, UINT uiColumns);
|
|
virtual void AddObjectToOutput(CPtrList * aColValues, int iColCount, CWMIObject * pObject, LPCTSTR szProperties, LPCTSTR szColumns);
|
|
virtual void AppendBlankLine(CPtrList * aColValues, int iColCount, BOOL fOnlyIfNotEmpty = TRUE);
|
|
virtual void AppendCell(CPtrList & listColumns, const CString & strValue, DWORD dwValue, BOOL fAdvanced = FALSE);
|
|
|
|
// These functions are specific to version 5.0 refreshes, and will be overloaded by the
|
|
// live WMI helper.
|
|
|
|
virtual BOOL Version5ResetClass(const CString & strClass, GATH_FIELD * pConstraintFields) { return FALSE; };
|
|
virtual BOOL Version5EnumClass(const CString & strClass, GATH_FIELD * pConstraintFields) { return FALSE; };
|
|
|
|
virtual BOOL Version5QueryValueDWORD(const CString & strClass, const CString & strProperty, DWORD & dwResult, CString & strMessage) { return FALSE; };
|
|
virtual BOOL Version5QueryValueDateTime(const CString & strClass, const CString & strProperty, COleDateTime & datetime, CString & strMessage) { return FALSE; };
|
|
virtual BOOL Version5QueryValueDoubleFloat(const CString & strClass, const CString & strProperty, double & dblResult, CString & strMessage) { return FALSE; };
|
|
virtual BOOL Version5QueryValue(const CString & strClass, const CString & strProperty, CString & strResult) { return FALSE; };
|
|
|
|
virtual CMSIEnumerator * Version5GetEnumObject(const CString & strClass, const GATH_FIELD * pConstraints = NULL) { return NULL; };
|
|
virtual void Version5RemoveObject(const CString & strClass) {};
|
|
virtual CMSIObject * Version5GetObject(const CString & strClass, const GATH_FIELD * pConstraints, CString * pstrLabel = NULL) { return NULL; };
|
|
virtual IWbemServices * Version5GetWBEMService(CString * pstrNamespace = NULL) { return NULL; };
|
|
virtual BOOL Version5EvaluateFilter(IWbemClassObject * pObject, const GATH_FIELD * pConstraints) { return FALSE; };
|
|
virtual void Version5EvaluateJoin(const CString & strClass, IWbemClassObject * pObject, const GATH_FIELD * pConstraints) {};
|
|
virtual BOOL Version5IsDependencyJoin(const GATH_FIELD * pConstraints) { return FALSE; };
|
|
virtual void Version5EvaluateDependencyJoin(IWbemClassObject * pObject) {};
|
|
virtual void Version5RemoveEnumObject(const CString & strClass) {};
|
|
virtual void Version5ClearCache() {};
|
|
virtual HRESULT Version5CheckValueMap(const CString& strClass, const CString& strProperty, const CString& strVal, CString &strResult) { return E_FAIL; };
|
|
|
|
public:
|
|
CString m_strTrue, m_strFalse, m_strPropertyUnavail, m_strBadProperty;
|
|
CMapStringToPtr m_mapClassToInterface;
|
|
CMapStringToPtr m_mapClassToEnumInterface;
|
|
CEnumMap m_enumMap;
|
|
IWbemServices * m_pIWbemServices;
|
|
HRESULT m_hrLastVersion5Error;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Useful utility functions.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
extern void StringReplace(CString & str, LPCTSTR szLookFor, LPCTSTR szReplaceWith);
|
|
extern CString GetMSInfoHRESULTString(HRESULT hr);
|