windows-nt/Source/XPSP1/NT/admin/pchealth/sysinfo/control/wmiabstraction.h
2020-09-26 16:20:57 +08:00

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);