416 lines
9.9 KiB
C++
416 lines
9.9 KiB
C++
/*++
|
|
|
|
Copyright (C) 1997-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
// OpWrap.h
|
|
|
|
#ifndef _OPWRAP_H
|
|
#define _OPWRAP_H
|
|
|
|
#include "MainFrm.h"
|
|
|
|
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
|
|
_COM_SMARTPTR_TYPEDEF(IWbemObjectSink, __uuidof(IWbemObjectSink));
|
|
_COM_SMARTPTR_TYPEDEF(IWbemCallResult, __uuidof(IWbemCallResult));
|
|
_COM_SMARTPTR_TYPEDEF(IWbemObjectAccess, __uuidof(IWbemObjectAccess));
|
|
_COM_SMARTPTR_TYPEDEF(IWbemQualifierSet, __uuidof(IWbemQualifierSet));
|
|
|
|
CString GetEmbeddedObjectText(IUnknown *pUnk);
|
|
|
|
class CObjPtr : public IWbemClassObjectPtr
|
|
{
|
|
public:
|
|
CObjPtr() {}
|
|
CObjPtr(IWbemClassObject *pObj) : IWbemClassObjectPtr(pObj) {}
|
|
CObjPtr *operator&() { return this; }
|
|
};
|
|
|
|
#include "list"
|
|
|
|
typedef CArray<int, int> CIntArray;
|
|
typedef CMap<int, int, int, int> CIntMap;
|
|
typedef CMap<CString, LPCTSTR, CString, LPCTSTR> CStringMap;
|
|
|
|
class CBitmaskInfo
|
|
{
|
|
public:
|
|
CBitmaskInfo() :
|
|
m_dwBitmaskValue(0)
|
|
{
|
|
}
|
|
|
|
DWORD m_dwBitmaskValue;
|
|
CString m_strName;
|
|
};
|
|
|
|
typedef CArray<CBitmaskInfo, CBitmaskInfo&> CBitmaskInfoArray;
|
|
|
|
// Use this to get __ExtendedStatus.
|
|
IWbemClassObject *GetWMIErrorObject();
|
|
|
|
class CMethodInfo
|
|
{
|
|
public:
|
|
CString m_strName,
|
|
m_strDescription;
|
|
BOOL m_bStatic;
|
|
|
|
CMethodInfo() :
|
|
m_bStatic(FALSE)
|
|
{
|
|
}
|
|
};
|
|
|
|
typedef CList<CMethodInfo, CMethodInfo&> CMethodInfoList;
|
|
|
|
class CPropInfo
|
|
{
|
|
public:
|
|
CString m_strName;
|
|
long m_iHandle;
|
|
CIMTYPE m_type;
|
|
long m_iFlavor;
|
|
BOOL m_bKey;
|
|
DWORD m_dwExpectedSize;
|
|
VARENUM m_vt;
|
|
BOOL m_bSigned,
|
|
m_bValueMap,
|
|
m_bBitmask;
|
|
CStringMap m_mapValues;
|
|
CBitmaskInfoArray m_bitmaskValues;
|
|
|
|
|
|
CPropInfo() :
|
|
m_iHandle(0),
|
|
m_iFlavor(WBEM_FLAVOR_ORIGIN_LOCAL),
|
|
m_bKey(FALSE),
|
|
m_bValueMap(FALSE),
|
|
m_bBitmask(FALSE)
|
|
{
|
|
SetType(CIM_UINT32);
|
|
}
|
|
|
|
CPropInfo(const CPropInfo& other);
|
|
const CPropInfo& operator=(const CPropInfo& other);
|
|
void GetPropType(CString &strType, int *piImage, BOOL bIgnoreArrayFlag = FALSE);
|
|
|
|
// Funcs use to turn variants into strings. Works on arrays too.
|
|
BOOL VariantToString(VARIANT *pVar, CString &strValue, BOOL bTranslate,
|
|
BOOL bQuoteStrings = FALSE);
|
|
|
|
// Use this to get turn an array item into a string.
|
|
BOOL ArrayItemToString(VARIANT *pVar, DWORD dwIndex, CString &strValue, BOOL bTranslate);
|
|
DWORD GetArrayItem(VARIANT *pVar, DWORD dwIndex);
|
|
|
|
// Helper called by COpWrap::LoadPropInfoList.
|
|
void SetType(CIMTYPE type);
|
|
|
|
// Call this to allocate the safe array before calling StringToArrayItem.
|
|
// If dwSize is 0, pVar is set to VT_NULL.
|
|
BOOL PrepArrayVar(VARIANT *pVar, DWORD dwSize);
|
|
BOOL StringToArrayItem(LPCTSTR szItem, VARIANT *pVar, DWORD dwIndex,
|
|
BOOL bTranslate);
|
|
BOOL StringToVariant(LPCSTR szValue, VARIANT *pVar, BOOL bTranslate);
|
|
BOOL SetArrayItem(VARIANT *pVar, DWORD dwIndex, DWORD dwValue);
|
|
|
|
BOOL IsBitmask() { return m_bBitmask; }
|
|
BOOL IsArray() { return (m_vt & VT_ARRAY) != 0; }
|
|
BOOL HasValuemap() { return m_bValueMap; }
|
|
DWORD GetArrayItemCount(VARIANT *pVar);
|
|
|
|
// Masks off the array flag.
|
|
VARENUM GetRawType() { return (VARENUM) (m_vt & ~VT_ARRAY); }
|
|
CIMTYPE GetRawCIMType() { return (CIMTYPE) (m_type & ~CIM_FLAG_ARRAY); }
|
|
|
|
protected:
|
|
BOOL VariantBlobToString(VARENUM vt, LPVOID pData, CString &strValue,
|
|
BOOL bTranslate, BOOL bQuoteStrings);
|
|
BOOL StringToVariantBlob(LPCTSTR szValue, LPVOID pData, BOOL bTranslate);
|
|
|
|
static int GetArrayItemSize(VARENUM vt);
|
|
};
|
|
|
|
class CPropInfoArray : public CArray<CPropInfo, CPropInfo&>
|
|
{
|
|
public:
|
|
CPropInfoArray() :
|
|
m_nStaticMethods(0)
|
|
{
|
|
}
|
|
|
|
CIntMap m_mapGlobalToLocalIndex;
|
|
CMethodInfoList m_listMethods;
|
|
|
|
// Method stuff.
|
|
void LoadMethods(IWbemClassObject *pClass);
|
|
int GetMethodCount() { return m_listMethods.GetCount(); }
|
|
int GetStaticMethodCount() { return m_nStaticMethods; }
|
|
|
|
protected:
|
|
int m_nStaticMethods;
|
|
|
|
};
|
|
|
|
enum WMI_OP_TYPE
|
|
{
|
|
WMI_QUERY,
|
|
WMI_EVENT_QUERY,
|
|
WMI_ENUM_OBJ,
|
|
WMI_GET_OBJ,
|
|
WMI_ENUM_CLASS,
|
|
WMI_GET_CLASS,
|
|
WMI_CREATE_CLASS,
|
|
WMI_CREATE_OBJ,
|
|
};
|
|
|
|
class CObjInfo
|
|
{
|
|
public:
|
|
CObjInfo() :
|
|
m_ppProps(NULL),
|
|
m_bModified(FALSE)
|
|
{
|
|
}
|
|
|
|
~CObjInfo();
|
|
|
|
IWbemClassObjectPtr m_pObj;
|
|
|
|
void SetObj(IWbemClassObject *pObj);
|
|
|
|
HRESULT LoadProps(IWbemServices *pNamespace);
|
|
BOOL GetPropValue(int iIndex, CString &strValue, BOOL bTranslate);
|
|
CString GetStringPropValue(LPCWSTR szName);
|
|
CString GetStringPropValue(int iIndex);
|
|
void GetPropInfo(
|
|
int iIndex,
|
|
CString &strValue,
|
|
CString &strType,
|
|
int *piImage,
|
|
int *piFlavor,
|
|
BOOL bTranslate);
|
|
CString GetObjText();
|
|
BOOL ValueToVariant(int iIndex, VARIANT *pVar);
|
|
void SetModified(BOOL bModified) { m_bModified = bModified; }
|
|
BOOL IsModified() { return m_bModified; }
|
|
int GetImage() { return m_bModified ? m_iBaseImage + 3 : m_iBaseImage; }
|
|
void SetBaseImage(int iImage) { m_iBaseImage = iImage; }
|
|
BOOL IsInstance() { return m_iBaseImage == IMAGE_OBJECT; }
|
|
|
|
CPropInfoArray *GetProps() { return m_ppProps; }
|
|
void SetProps(CPropInfoArray *pProps) { m_ppProps = pProps; }
|
|
|
|
void Export(CStdioFile *pFile, BOOL bShowSystem, BOOL bTranslate,
|
|
int iLevel);
|
|
|
|
void DoDebugStuff();
|
|
|
|
protected:
|
|
BOOL m_bModified;
|
|
int m_iBaseImage;
|
|
IWbemObjectAccessPtr m_pAccess;
|
|
CPropInfoArray *m_ppProps;
|
|
//CPropInfoArray m_propsModified;
|
|
|
|
void GetPropType(CPropInfo &info, CString &strType, int *piImage);
|
|
static DWORD BitmaskStrToValue(LPCWSTR szStr);
|
|
};
|
|
|
|
class CClassToProps : public CMap<CString, LPCSTR, CPropInfoArray*, CPropInfoArray*&>
|
|
{
|
|
public:
|
|
~CClassToProps();
|
|
void Flush();
|
|
};
|
|
|
|
class COpWrap;
|
|
|
|
class CObjSink : public IWbemObjectSink
|
|
{
|
|
public:
|
|
COpWrap *m_pWrap;
|
|
LONG m_lRef;
|
|
|
|
CObjSink(COpWrap *pWrap) :
|
|
m_lRef(0)
|
|
{
|
|
m_pWrap = pWrap;
|
|
}
|
|
|
|
public:
|
|
STDMETHODIMP QueryInterface(REFIID refid, PVOID *ppThis)
|
|
{
|
|
/*
|
|
if (refid == IID_IUnknown || refid == IID_IWbemObjectSink)
|
|
{
|
|
*ppThis = this;
|
|
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
*/
|
|
HRESULT hr;
|
|
|
|
if (refid == IID_IUnknown)
|
|
{
|
|
*ppThis = (IUnknown*) this;
|
|
|
|
AddRef();
|
|
|
|
hr = S_OK;
|
|
}
|
|
else if (refid == IID_IWbemObjectSink)
|
|
{
|
|
*ppThis = (IWbemObjectSink*) this;
|
|
|
|
AddRef();
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_NOINTERFACE;
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void); //{ return 1; }
|
|
STDMETHODIMP_(ULONG) Release(void); //{ return 1; }
|
|
|
|
// IWbemObjectSink
|
|
HRESULT STDMETHODCALLTYPE Indicate(
|
|
LONG lObjectCount,
|
|
IWbemClassObject **ppObjArray);
|
|
|
|
HRESULT STDMETHODCALLTYPE SetStatus(
|
|
LONG lFlags,
|
|
HRESULT hResult,
|
|
BSTR strParam,
|
|
IWbemClassObject *pObjParam);
|
|
};
|
|
|
|
//class COpWrap : public IWbemObjectSink, public CObject
|
|
class COpWrap : public CObject
|
|
{
|
|
public:
|
|
CCriticalSection m_cs;
|
|
CString m_strOpText;
|
|
WMI_OP_TYPE m_type;
|
|
HTREEITEM m_item;
|
|
int m_iImageBase;
|
|
CClassToProps
|
|
m_mapClassToProps;
|
|
int m_nCount;
|
|
int m_status;
|
|
BOOL m_bOption;
|
|
CObjInfo m_objInfo;
|
|
CList<CObjPtr, CObjPtr&> m_listObj;
|
|
HRESULT m_hr;
|
|
|
|
CString m_strErrorText;
|
|
IWbemClassObjectPtr m_pErrorObj;
|
|
IWbemObjectSinkPtr m_pObjSink;
|
|
|
|
CStringArray m_strProps;
|
|
CIntArray m_piDisplayCols;
|
|
CIntArray m_piDisplayColsWidth;
|
|
|
|
COpWrap(); // For Serialize
|
|
COpWrap(WMI_OP_TYPE type, LPCTSTR szText, BOOL bOption = FALSE);
|
|
~COpWrap();
|
|
|
|
// This only copies over type, text and option.
|
|
const COpWrap& operator=(const COpWrap &other);
|
|
|
|
HRESULT Execute(IWbemServices *pNamespace);
|
|
void CancelOp(IWbemServices *pNamespace);
|
|
int GetPropIndex(LPCTSTR szName, BOOL bAddToDisplay);
|
|
CObjInfo *GetObjInfo() { return &m_objInfo; }
|
|
int GetObjCount() { return m_nCount; }
|
|
|
|
|
|
BOOL HoldsObjects() { return m_iChildImage == IMAGE_OBJECT; }
|
|
BOOL ShowPathsOnly() { return m_bShowPathsOnly; }
|
|
BOOL IsObject() { return m_type == WMI_GET_CLASS || m_type == WMI_GET_OBJ ||
|
|
m_type == WMI_CREATE_CLASS || m_type == WMI_CREATE_OBJ; }
|
|
CString GetClassName();
|
|
CString GetCaption();
|
|
int GetImage();
|
|
//HRESULT LoadPropInfoList(CObjInfo *pInfo, IWbemClassObject *pClass,
|
|
// CPropInfoArray *pProps);
|
|
HRESULT RefreshPropInfo(CObjInfo *pInfo);
|
|
|
|
void GetPropValue(
|
|
CObjInfo *pInfo,
|
|
int iIndex,
|
|
CString &strValue,
|
|
BOOL bTranslate);
|
|
|
|
// Serialize stuff
|
|
DECLARE_SERIAL(COpWrap)
|
|
void Serialize(CArchive &archive);
|
|
|
|
|
|
static CString GetWbemErrorText(HRESULT hres);
|
|
|
|
|
|
protected:
|
|
BOOL m_bShowPathsOnly;
|
|
int m_iChildImage,
|
|
m_nExpectedStatusCalls;
|
|
LONG m_lRef;
|
|
|
|
|
|
// We need this to get the amended qualifiers.
|
|
IWbemServices *m_pNamespace;
|
|
|
|
void SetHoldsObjects();
|
|
void AddPropsToGlobalIndex(CObjInfo *pInfo);
|
|
HRESULT LoadPropInfo(CObjInfo *pInfo);
|
|
|
|
|
|
// Called by constructor and Serialize after member vars are set.
|
|
void Init();
|
|
|
|
public:
|
|
// IUnknown
|
|
/*
|
|
STDMETHODIMP QueryInterface(REFIID refid, PVOID *ppThis)
|
|
{
|
|
if (refid == IID_IUnknown || refid == IID_IWbemObjectSink)
|
|
{
|
|
*ppThis = this;
|
|
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void); //{ return 1; }
|
|
STDMETHODIMP_(ULONG) Release(void); //{ return 1; }
|
|
*/
|
|
|
|
HRESULT STDMETHODCALLTYPE Indicate(
|
|
LONG lObjectCount,
|
|
IWbemClassObject **ppObjArray);
|
|
|
|
HRESULT STDMETHODCALLTYPE SetStatus(
|
|
LONG lFlags,
|
|
HRESULT hResult,
|
|
BSTR strParam,
|
|
IWbemClassObject *pObjParam);
|
|
};
|
|
|
|
typedef CList<COpWrap, COpWrap&> COpList;
|
|
|
|
#endif
|
|
|