Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1198 lines
41 KiB

//***************************************************************************
//
// Copyright (c) 1997-2002 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#ifndef _WMICOM_HEADER
#define _WMICOM_HEADER
#define THISPROVIDER LOG_WIMPROV
///////////////////////////////////////////////////////////////////////
// Forward declarations
///////////////////////////////////////////////////////////////////////
class CWMIManagement;
class CWMIDataBlock;
class CWMIProcessClass;
class CNamespaceManagement;
#define FROM_DATA_BLOCK 1
#define FROM_INITIALIZATION 2
#define RUNTIME_BINARY_MOFS_ADDED L"RuntimeBinaryMofsAdded"
#define RUNTIME_BINARY_MOFS_DELETED L"RuntimeBinaryMofsDeleted"
///////////////////////////////////////////////////////////////////////
//#pragma warning( disable : 4005 )
#include <objbase.h>
//#pragma warning( default : 4005 )
// kill warning: "nonstandard extension ...
//#pragma warning( disable : 4200 )
#include "wmi\wmium.h"
//#pragma warning( default : 4200 )
#include <wbemint.h>
#include <wchar.h>
#include <wbemidl.h>
#include <GENLEX.H>
#include <OPATHLEX.H>
#include <OBJPATH.H>
#include <flexarry.h>
#include <oahelp.inl>
#include <mofcomp.h>
#include <wbemutil.h>
#include <cominit.h>
#define SERVICES m_pWMI->Services()
#define REPOSITORY m_pWMI->Repository()
#define CONTEXT m_pWMI->Context()
#define HANDLER m_pWMI->Handler()
SAFEARRAY * OMSSafeArrayCreate( IN VARTYPE vt, IN int iNumElements);
#define WMI_BINARY_MOF_GUID L"{05901221-D566-11d1-B2F0-00A0C9062910}"
///////////////////////////////////////////////////////////////////////
// Defines
/////////////////////////////////////////////////////////////////////
#define SAFE_DELETE_PTR(pv) \
{ if(pv) delete pv; \
pv = NULL; }
#define SAFE_RELEASE_PTR(pv) \
{ if(pv){ pv->Release(); } \
pv = NULL; }
#define SAFE_DELETE_ARRAY(pv) \
{ if(pv) delete []pv; \
pv = NULL; }
#define GUID_SIZE 128
#define NAME_SIZE 256*2
#define ProcessOneFixedInstance 1
#define ProcessUnfixedInstance 2
#define NoMore 3
#define MEMSIZETOALLOCATE 512
#define MSG_SIZE 512
#define INTERNAL_EVENT 5
#define PERMANENT_EVENT 6
#define SIZEOFWBEMDATETIME sizeof(WCHAR)*25
#define WMI_NO_MORE 0x80044001
#define PUT_WHOLE_INSTANCE 0
#define PUT_PROPERTIES_ONLY 1
#define PUT_PROPERTIES_IN_LIST_ONLY 2
#define WMI_RESOURCE_MOF_ADDED_GUID L"{B48D49A2-E777-11D0-A50C-00A0C9062910}"
#define WMI_RESOURCE_MOF_REMOVED_GUID L"{B48D49A3-E777-11d0-A50C-00A0C9062910}"
#define MSG_DATA_INSTANCE_NOT_FOUND L"The instance name passed was not recognized as valid"
#define MSG_DATA_NOT_AVAILABLE L"The WDM data block is no longer available."
#define MSG_SUCCESS L"Operation completed successfully"
#define MSG_INVALID_BLOCK_POINTER L"WDM Buffer size and actual size of data do not match"
#define MSG_DRIVER_ERROR L"WDM specific error code: 4209 (Driver specific error, driver could not complete request)"
#define MSG_READONLY_ERROR L"WDM specific error code: 4213 (The WDM data item or data block is read-only)"
#define MSG_ARRAY_ERROR L"Array is the wrong size"
#define IDS_ImpersonationFailedWide L"Impersonation failed - Access denied\n"
#define IDS_ImpersonationFailed "Impersonation failed - Access denied\n"
#define ANSI_MSG_DATA_INSTANCE_NOT_FOUND "The instance name passed was not recognized as valid"
#define ANSI_MSG_DRIVER_ERROR "WDM specific error code: 4209 (Driver specific error, driver could not complete request)"
#define ANSI_MSG_INVALID_PARAMETER "Invalid Parameter"
#define ANSI_MSG_INVALID_DATA "Invalid Data"
#define ANSI_MSG_INVALID_NAME_BLOCK "Invalid Name Block"
#define ANSI_MSG_INVALID_DATA_BLOCK "Invalid Data Block"
#define ANSI_MSG_ACCESS_DENIED "Access Denied"
#define MOF_ADDED 1
#define MOF_DELETED 2
#define STANDARD_EVENT 0
//************************************************************************************************************
//============================================================================================================
//
// The Utility Functions
//
//============================================================================================================
//************************************************************************************************************
BOOL IsBinaryMofResourceEvent(LPOLESTR pGuid, GUID gGuid);
bool IsNT(void);
BOOL GetUserThreadToken(HANDLE * phThreadTok);
void TranslateAndLog( WCHAR * wcsMsg, BOOL bVerbose = FALSE );
BOOL SetGuid(WCHAR * wcsGuid, CLSID & Guid);
HRESULT AllocAndCopy(WCHAR * wcsSource, WCHAR ** pwcsDest );
HRESULT CheckIfThisIsAValidKeyProperty(WCHAR * wcsClass, WCHAR * wcsProperty, IWbemServices * p);
HRESULT GetParsedPath( BSTR ObjectPath,WCHAR * wcsClass, int cchSizeClass, WCHAR * wcsInstance, int cchSizeInstance, IWbemServices * p );
BOOL GetParsedPropertiesAndClass( BSTR Query,WCHAR * wcsClass, int cchSize );
//************************************************************************************************************
//============================================================================================================
//
// The Utility Classes / struct definitions
//
//============================================================================================================
//************************************************************************************************************
class CAutoWChar
{
WCHAR * m_pStr;
public:
CAutoWChar(int nSize) { m_pStr = new WCHAR[nSize+1]; if( m_pStr ) memset( m_pStr,NULL,nSize+1); }
~CAutoWChar() { SAFE_DELETE_ARRAY(m_pStr);}
BOOL Valid() { if( !m_pStr ) return FALSE; return TRUE; }
operator PWCHAR() { return m_pStr; }
};
///////////////////////////////////////////////////////////////////////
class CCriticalSection
{
public:
CCriticalSection() : m_bInitialized ( FALSE )
{
}
~CCriticalSection() { }
inline BOOL Init() {
m_bInitialized = InitializeCriticalSectionAndSpinCount(&m_criticalsection, 0);
return m_bInitialized ;
}
inline void Delete() {
if ( m_bInitialized )
{
DeleteCriticalSection(&m_criticalsection);
m_bInitialized = FALSE;
}
}
inline BOOL TryEnter() { return TryEnterCriticalSection(&m_criticalsection); }
inline void Enter() { EnterCriticalSection(&m_criticalsection); }
inline void Leave() { LeaveCriticalSection(&m_criticalsection); }
BOOL IsValid () { return m_bInitialized; }
private:
CRITICAL_SECTION m_criticalsection; // standby critical section
BOOL m_bInitialized; // validity flag
};
///////////////////////////////////////////////////////////////////////
class CAutoBlock
{
private:
CCriticalSection *m_pCriticalSection;
public:
CAutoBlock(CCriticalSection *pCriticalSection)
{
m_pCriticalSection = NULL;
if(pCriticalSection)
{
pCriticalSection->Enter();
}
m_pCriticalSection = pCriticalSection;
}
~CAutoBlock()
{
if(m_pCriticalSection)
m_pCriticalSection->Leave();
}
};
typedef struct _AccessList
{
CFlexArray m_List;
HRESULT Add(IWbemObjectAccess * pPtr)
{
HRESULT hr = S_OK;
pPtr->AddRef();
if(CFlexArray::out_of_memory == m_List.Add(pPtr))
{
pPtr->Release();
hr = E_OUTOFMEMORY;
}
return hr;
}
inline long Size() { return m_List.Size(); }
inline void ** List() { return m_List.GetArrayPtr(); }
_AccessList() {}
~_AccessList(); // code elsewhere
}AccessList;
typedef struct _IdList
{
CFlexArray m_List;
// 170635
HRESULT Add( ULONG_PTR l)
{
HRESULT hr = S_OK;
ULONG_PTR * lp = new ULONG_PTR;
if(lp)
{
*lp = l;
if(CFlexArray::out_of_memory == m_List.Add(lp))
{
SAFE_DELETE_PTR(lp);
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_OUTOFMEMORY;
}
return hr;
}
inline long Size() { return m_List.Size(); }
inline void ** List() { return m_List.GetArrayPtr(); }
_IdList() {}
~_IdList(); // code elsewhere
} IdList;
typedef struct _HandleList
{
CFlexArray m_List;
// 170635
HRESULT Add( HANDLE l )
{
HRESULT hr = S_OK;
HANDLE * lp = new HANDLE;
if(lp)
{
*lp = l;
if(CFlexArray::out_of_memory == m_List.Add(lp))
{
SAFE_DELETE_PTR(lp);
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_OUTOFMEMORY;
}
return hr;
}
inline long Size() { return m_List.Size(); }
inline void ** List() { return m_List.GetArrayPtr(); }
_HandleList() {}
~_HandleList(); // code elsewhere
} HandleList;
typedef struct _KeyList
{
CWStringArray m_List;
// ================================================================
// Appends a new element to the end of the array. Copies the param.
// ================================================================
int Add(WCHAR * pStr)
{
return m_List.Add( pStr );
}
// ================================================================
// Locates a string or returns -1 if not found.
// ================================================================
int Find(WCHAR * pStr)
{
int nFlags = 0;
return m_List.FindStr( pStr, nFlags );
}
// ================================================================
// Removes a string
// ================================================================
HRESULT Remove(WCHAR * pStr)
{
int nIndex = Find(pStr);
if( nIndex > -1 )
{
m_List.RemoveAt( nIndex );
}
return S_OK;
}
// ================================================================
// Removes a string
// ================================================================
BOOL OldDriversLeftOver()
{
if( m_List.Size() > 0 )
{
return TRUE;
}
return FALSE;
}
// ================================================================
// Get how many are in there
// ================================================================
int GetSize()
{
return m_List.Size();
}
// ================================================================
// Get at a specific position
// ================================================================
WCHAR * GetAt(int n)
{
return m_List.GetAt(n);
}
_KeyList() {}
~_KeyList(){}
} KeyList;
typedef struct _InstanceList
{
CFlexArray m_List;
// 170635
HRESULT Add( WCHAR * p )
{
HRESULT hr = S_OK;
WCHAR * pNew = NULL;
if(SUCCEEDED(hr = AllocAndCopy(p, &pNew)))
{
if(CFlexArray::out_of_memory == m_List.Add(pNew))
{
hr = E_OUTOFMEMORY;
SAFE_DELETE_ARRAY(pNew);
}
}
return hr;
}
inline long Size() { return m_List.Size(); }
inline void ** List() { return m_List.GetArrayPtr(); }
_InstanceList() {}
~_InstanceList(); // code elsewhere
} InstanceList;
typedef struct _OldClassInfo
{
WCHAR * m_pClass;
WCHAR * m_pPath;
_OldClassInfo() { m_pClass = m_pPath = NULL; }
~_OldClassInfo(); // code elsewhere
} OldClassInfo;
typedef struct _OldClassList
{
CFlexArray m_List;
HRESULT Add( WCHAR * pClass, WCHAR * pPath )
{
HRESULT hr = S_OK;
if ( !pClass )
{
return WBEM_E_INVALID_PARAMETER;
}
if ( !pPath)
{
return WBEM_E_INVALID_PARAMETER;
}
OldClassInfo * pInfo = new OldClassInfo;
if( pInfo )
{
if(SUCCEEDED(hr = AllocAndCopy(pClass, &(pInfo)->m_pClass)))
{
if(SUCCEEDED(hr = AllocAndCopy(pPath, &(pInfo)->m_pPath)))
{
if(CFlexArray::out_of_memory == m_List.Add(pInfo))
{
hr = E_OUTOFMEMORY;
SAFE_DELETE_PTR(pInfo);
}
}
}
}
else
{
hr = E_OUTOFMEMORY;
}
return hr;
}
WCHAR * GetClass( int nIndex )
{
HRESULT hr = S_OK;
OldClassInfo * pInfo = NULL;
pInfo = (OldClassInfo *) m_List[nIndex];
return pInfo->m_pClass;
}
WCHAR * GetPath( int nIndex )
{
HRESULT hr = S_OK;
OldClassInfo * pInfo = NULL;
pInfo = (OldClassInfo *)m_List[nIndex];
return pInfo->m_pPath;
}
inline long Size() { return m_List.Size(); }
inline void ** List() { return m_List.GetArrayPtr(); }
_OldClassList() {}
~_OldClassList(); // code elsewhere
} OldClassList;
//
// IGlobalInterfaceTable
//
extern IGlobalInterfaceTable * g_pGIT;
//
// GlobalInterfaceTable
//
template <class Itf, const IID* piid>
class GlobalInterfaceTable
{
DWORD m_dwCookie; // the GIT cookie
GlobalInterfaceTable(const GlobalInterfaceTable&);
void operator =(const GlobalInterfaceTable&);
// revoke an interface pointer in GIT
HRESULT Unglobalize(void)
{
HRESULT hr = g_pGIT->RevokeInterfaceFromGlobal(m_dwCookie);
m_dwCookie = 0;
return hr;
}
public:
// start with invalid cookie
GlobalInterfaceTable()
: m_dwCookie(0)
{
}
// auto-unglobalize
~GlobalInterfaceTable(void)
{
if (m_dwCookie)
{
Unglobalize();
}
}
// register an interface pointer in GIT
HRESULT Globalize(Itf *pItf)
{
HRESULT hr = E_UNEXPECTED;
if ( m_dwCookie )
{
#ifdef DBG
DebugBreak();
#endif DBG
}
else
{
if ( pItf )
{
hr = g_pGIT->RegisterInterfaceInGlobal(pItf, *piid, &m_dwCookie);
}
else
{
hr = S_FALSE;
}
}
return hr;
}
// get a local interface pointer from GIT
HRESULT Localize(Itf **ppItf) const
{
return g_pGIT->GetInterfaceFromGlobal(m_dwCookie, *piid,(void**)ppItf);
}
};
#define GIP(Itf) GlobalInterfaceTable<Itf, &IID_##Itf>
typedef struct _WMIEventRequest
{
DWORD dwId;
WCHAR wcsGuid[GUID_SIZE];
WCHAR * pwcsClass;
BOOL fHardCoded;
CLSID gGuid;
IWbemObjectSink __RPC_FAR * pHandler;
GIP(IWbemServices) gipServices;
GIP(IWbemServices) gipRepository;
IWbemContext __RPC_FAR * pCtx;
_WMIEventRequest();
~_WMIEventRequest();
HRESULT AddPtrs (
IWbemObjectSink __RPC_FAR * pHandler,
IWbemServices __RPC_FAR * Services,
IWbemServices __RPC_FAR * Repository,
IWbemContext __RPC_FAR * pCtx
);
BOOL SetClassName( WCHAR * p ) { SAFE_DELETE_ARRAY(pwcsClass); return SUCCEEDED(AllocAndCopy( p, &pwcsClass)) ? TRUE : FALSE; }
} WMIEventRequest;
typedef struct _WMIHandleMap
{
HANDLE WMIHandle;
GUID Guid;
ULONG uDesiredAccess;
LONG RefCount;
void AddRef();
LONG Release();
_WMIHandleMap() { WMIHandle = 0; uDesiredAccess = 0; RefCount = 0; }
~_WMIHandleMap() { }
}WMIHandleMap;
typedef struct _WMIHiPerfHandleMap
{
WMIHANDLE WMIHandle;
ULONG_PTR lHiPerfId;
BOOL m_fEnumerator;
CWMIProcessClass * m_pClass;
IWbemHiPerfEnum * m_pEnum;
_WMIHiPerfHandleMap(CWMIProcessClass * p, IWbemHiPerfEnum * pEnum);
~_WMIHiPerfHandleMap();
}WMIHiPerfHandleMap;
typedef struct _IDOrder
{
WCHAR * pwcsPropertyName;
WCHAR * pwcsEmbeddedObject;
long lType;
int nWMISize;
long lHandle;
DWORD dwArraySize;
BOOL fPutProperty;
//
// recognize that item was set
//
BOOL bIsDirty ;
_IDOrder() { pwcsPropertyName = NULL; pwcsEmbeddedObject = NULL; lType = 0L; nWMISize = 0; lHandle = 0L; dwArraySize = 0; fPutProperty = FALSE; bIsDirty = FALSE; }
~_IDOrder() { SAFE_DELETE_PTR(pwcsPropertyName); SAFE_DELETE_PTR(pwcsEmbeddedObject); bIsDirty = FALSE; }
BOOL SetPropertyName( WCHAR * p ) { SAFE_DELETE_PTR(pwcsPropertyName); return SUCCEEDED(AllocAndCopy( p, &pwcsPropertyName)) ? TRUE : FALSE; }
BOOL SetEmbeddedName( WCHAR * p ) { SAFE_DELETE_PTR(pwcsEmbeddedObject);return SUCCEEDED(AllocAndCopy( p, &pwcsEmbeddedObject)) ? TRUE : FALSE; }
} IDOrder;
///////////////////////////////////////////////////////////////////////
class CAutoChangePointer
{
private:
CWMIProcessClass * m_pTmp;
CWMIProcessClass ** m_pOriginal;
public:
CAutoChangePointer(CWMIProcessClass ** ppOriginal, CWMIProcessClass * pNew)
{ m_pTmp = *ppOriginal; m_pOriginal = ppOriginal; *ppOriginal = pNew; }
~CAutoChangePointer()
{ *m_pOriginal = m_pTmp; }
};
//************************************************************************************************************
//============================================================================================================
//
// The Common Base Classes
//
//============================================================================================================
//************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Common functions regarding binary mof processing & security
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
class CHandleMap
{
protected:
CFlexArray m_List;
CCriticalSection m_HandleCs;
private:
BOOL m_Initialized ;
public:
BOOL IsValid ()
{
return m_Initialized ;
}
CHandleMap() { m_Initialized = m_HandleCs.Init(); }
~CHandleMap()
{
CloseAllOutstandingWMIHandles() ;
if ( m_HandleCs.IsValid () )
{
m_HandleCs.Delete() ;
}
}
inline CCriticalSection * GetCriticalSection() { return (CCriticalSection*)&m_HandleCs;}
HRESULT Add(CLSID Guid, HANDLE hCurrent, ULONG uDesiredAccess);
int ExistingHandleAlreadyExistsForThisGuidUseIt(CLSID Guid, HANDLE & hCurrentWMIHandle, BOOL & fCloseHandle, ULONG uDesiredAccess);
void CloseAllOutstandingWMIHandles();
int ReleaseHandle( HANDLE hCurrentWMIHandle );
int GetHandle(CLSID Guid, HANDLE & hCurrentWMIHandle );
};
///////////////////////////////////////////////////////////////////////
class CHiPerfHandleMap : public CHandleMap
{
private:
int m_nIndex;
public:
CHiPerfHandleMap() { m_nIndex = 0; }
~CHiPerfHandleMap(){CloseAndReleaseHandles();}
HRESULT Delete( HANDLE & hCurrent, ULONG_PTR lHiPerfId );
HRESULT Add( HANDLE hCurrent, ULONG_PTR lHiPerfId, CWMIProcessClass * p, IWbemHiPerfEnum * pEnum );
HRESULT FindHandleAndGetClassPtr( HANDLE & lWMIHandle, ULONG_PTR lHiPerfId,CWMIProcessClass *& p);
HRESULT GetFirstHandle(HANDLE & hCurrent,CWMIProcessClass *& p, IWbemHiPerfEnum *& pEnum);
HRESULT GetNextHandle(HANDLE & hCurrent,CWMIProcessClass *& p, IWbemHiPerfEnum *& pEnum);
void CloseAndReleaseHandles();
};
///////////////////////////////////////////////////////////////////////
class CWMI_IDOrder
{
private:
DWORD m_nTotal;
DWORD m_nCurrent;
IWbemObjectAccess * m_pAccess;
IWbemClassObject * m_pClass;
IDOrder * m_pWMIDataIdList;
DWORD GetSizeOfArray ( LPCWSTR bProp ) ;
HRESULT ProcessPropertyQualifiers ( LPCWSTR bstrPropName, BOOL fHiPerf, UINT uSizeArray, UINT uStartIndex ) ;
public:
CWMI_IDOrder(IWbemClassObject * p, IWbemObjectAccess * p2);
~CWMI_IDOrder();
WCHAR * GetFirstID();
WCHAR * GetNextID();
void InitMemberVars();
HRESULT GetPropertiesInIDOrder ( BOOL HiPerf, UINT uStartIndex );
inline long PropertyType() { return m_pWMIDataIdList[m_nCurrent].lType;}
inline int PropertySize() { return m_pWMIDataIdList[m_nCurrent].nWMISize;}
inline int ArraySize() { return m_pWMIDataIdList[m_nCurrent].dwArraySize; }
inline WCHAR * PropertyName() { return m_pWMIDataIdList[m_nCurrent].pwcsPropertyName;}
inline WCHAR * EmbeddedClassName() { return m_pWMIDataIdList[m_nCurrent].pwcsEmbeddedObject;}
inline ULONG WMIDataId() { return m_nCurrent; }
inline void SetPutProperty(BOOL fV) { m_pWMIDataIdList[m_nCurrent].fPutProperty = fV;}
inline BOOL GetPutProperty(void) { return m_pWMIDataIdList[m_nCurrent].fPutProperty;}
inline LONG GetPropertyHandle() { return m_pWMIDataIdList[m_nCurrent].lHandle;}
DWORD GetNumberOfProperties () { return m_nTotal ; }
};
////////////////////////////////////////////////////////////////////
class CWMIManagement
{
protected:
IWbemObjectSink __RPC_FAR * m_pHandler;
IWbemServices __RPC_FAR * m_pServices;
IWbemServices __RPC_FAR * m_pRepository;
IWbemContext __RPC_FAR * m_pCtx;
CHandleMap * m_pHandleMap;
//======================================================
// ************** PUBLIC ********************
//======================================================
public:
CWMIManagement();
~CWMIManagement();
inline IWbemObjectSink __RPC_FAR * Handler() { return m_pHandler;}
inline IWbemServices __RPC_FAR * Services() { return m_pServices;}
inline IWbemServices __RPC_FAR * Repository() { return m_pRepository;}
inline IWbemContext __RPC_FAR * Context() { return m_pCtx;}
inline CHandleMap * HandleMap() { return m_pHandleMap;}
inline void SetWMIPointers (
CHandleMap * pList,
IWbemServices __RPC_FAR * pServices,
IWbemServices __RPC_FAR * pRepository,
IWbemObjectSink __RPC_FAR * pHandler,
IWbemContext __RPC_FAR *pCtx
)
{
m_pHandleMap = pList;
m_pServices = pServices;
m_pRepository = pRepository;
m_pHandler = pHandler;
m_pCtx = pCtx;
}
//==========================================================
// THE Event Group
//==========================================================
BOOL CancelWMIEventRegistration( GUID gGuid , ULONG_PTR uContext );
//======================================================
// Cleanup Group
//======================================================
void CloseAllOutstandingWMIHandles();
//======================================================
// Error message processing/checking access
//======================================================
void SendPrivilegeExtendedErrorObject(HRESULT hrToReturn,WCHAR * wcsClass);
HRESULT SetErrorMessage(HRESULT hrToReturn, WCHAR * wcsClass, WCHAR * wcsMsg);
HRESULT GetListOfUserPrivileges(TOKEN_PRIVILEGES *& ptPriv);
void ProcessPrivileges(TOKEN_PRIVILEGES *ptPriv, SAFEARRAY *& psaPrivNotHeld, SAFEARRAY * psaPrivReq );
};
////////////////////////////////////////////////////////////////////
class CWMIProcessClass
{
protected:
CWMIManagement * m_pWMI;
CWMI_IDOrder * m_pCurrentProperty;
WCHAR * m_pwcsClassName;
IWbemClassObject * m_pClass;
IWbemClassObject * m_pClassInstance;
IWbemObjectAccess * m_pAccess;
IWbemObjectAccess * m_pAccessInstance;
CLSID m_Guid;
WORD m_wHardCodedGuid;
BOOL m_fHiPerf;
BOOL m_fGetNewInstance;
BOOL m_fInit;
//=============================================
// Private functions
//=============================================
void InitMemberVars();
void ReleaseInstancePointers();
HRESULT GetPropertiesInIDOrder ( BOOL fHiPerf, UINT uStartIndex = 0 );
public:
CWMIProcessClass(BOOL b);
~CWMIProcessClass();
enum __PropertyCategory{ EmbeddedClass = 0, // For the property categories
Array = 1,
Data = 2
} _PropertyCategory;
HRESULT Initialize();
//=============================================
// inline functions
//=============================================
inline BOOL SetHiPerf(BOOL f) { return m_fHiPerf = f;}
inline BOOL GetNewInstance(BOOL f) { return m_fGetNewInstance = f;}
inline CWMIManagement * WMI() { return m_pWMI;}
inline void SetWMIPointers(CWMIProcessClass * p)
{
if( m_pWMI )
{
m_pWMI->SetWMIPointers (
p->WMI()->HandleMap(),
p->WMI()->Services(),
p->WMI()->Repository(),
p->WMI()->Handler(),
p->WMI()->Context()
);
}
}
inline CWMIManagement * GetWMIManagementPtr() { return m_pWMI; }
inline void SetHardCodedGuidType( WORD wValue ) { m_wHardCodedGuid= wValue; }
inline WORD GetHardCodedGuidType() { return m_wHardCodedGuid;}
inline CLSID * GuidPtr() { return &m_Guid;}
inline IWbemObjectAccess * GetAccessInstancePtr() { return m_pAccessInstance; }
inline WCHAR * EmbeddedClassName() { return m_pCurrentProperty->EmbeddedClassName();}
inline WCHAR * FirstProperty() { return m_pCurrentProperty->GetFirstID(); }
inline WCHAR * NextProperty() { return m_pCurrentProperty->GetNextID(); }
inline int ArraySize() { return m_pCurrentProperty->ArraySize(); }
inline int PropertySize() { return m_pCurrentProperty->PropertySize(); }
inline long PropertyType() { return m_pCurrentProperty->PropertyType(); }
inline WCHAR * GetClassName() { return m_pwcsClassName;}
inline IWbemClassObject * ClassPtr() { return m_pClass; }
inline long GetPropertyHandle() { return m_pCurrentProperty->GetPropertyHandle(); }
DWORD GetNumberOfProperties () { return ( m_pCurrentProperty ) ? m_pCurrentProperty->GetNumberOfProperties () : 0 ; }
//=============================================
// Basic class manipulation
//=============================================
BOOL GetANewAccessInstance();
BOOL GetANewInstance() ;
inline BOOL ValidClass() { if( m_pClass && m_pCurrentProperty){return TRUE;} return FALSE;}
int PropertyCategory();
HRESULT SetClassName(WCHAR * wcsName);
HRESULT SetClass(WCHAR * wcsClass);
HRESULT SetClass ( IWbemClassObject * pPtr, UINT uStartIndex = 0 ) ;
HRESULT SetAccess(IWbemObjectAccess * pPtr);
HRESULT SetClassPointerOnly(IWbemClassObject * pPtr);
HRESULT SetClassPointerOnly(IWbemObjectAccess * pPtr);
HRESULT GetGuid(void);
HRESULT SetKeyFromAccessPointer();
HRESULT GetKeyFromAccessPointer(CVARIANT * v);
HRESULT InitializeEmbeddedClass(CWMIProcessClass * Em );
//=============================================
// Property manipulation
//=============================================
void SetActiveProperty();
HRESULT SetHiPerfProperties(LARGE_INTEGER TimeStamp) ;
inline HRESULT PutPropertyInInstance(VARIANT * vToken)
{ return ( m_pClassInstance->Put(m_pCurrentProperty->PropertyName(), 0, vToken, NULL));}
inline HRESULT GetPropertyInInstance(WCHAR * pwcsProperty,CVARIANT & vValue, LONG & lType)
{ return m_pClass->Get(pwcsProperty, 0, &vValue, &lType, NULL);}
HRESULT GetSizeOfArray(long & lType, DWORD & dwCount, BOOL & fDynamic);
//=============================================
// Embedded classes
//=============================================
HRESULT ReadEmbeddedClassInstance( IUnknown * pUnknown, CVARIANT & v );
HRESULT GetLargestDataTypeInClass(int & nSize);
void SaveEmbeddedClass(CVARIANT & v);
HRESULT GetSizeOfClass(DWORD & dwSize);
//=============================================
// Send the instance back to WBEM
//=============================================
inline ULONG WMIDataId() { return m_pCurrentProperty->WMIDataId();}
inline void SetPutProperty(BOOL fV) { m_pCurrentProperty->SetPutProperty(fV);}
inline BOOL GetPutProperty() { return m_pCurrentProperty->GetPutProperty();}
HRESULT SendInstanceBack();
HRESULT SetInstanceName(WCHAR * wName,BOOL);
HRESULT GetInstanceName(WCHAR *& p);
//=============================================
// Class functions, providing access to the
// properties, qualifiers in a class.
// NOTE: Properties are in WMI order
//=============================================
HRESULT GetQualifierString( WCHAR * pwcsPropertyName, WCHAR * pwcsQualifierName,
WCHAR * pwcsExternalOutputBuffer,int nSize);
HRESULT GetQualifierValue( WCHAR * pwcsPropertyName, WCHAR * pwcsQualifierName, CVARIANT * vQual);
HRESULT GetPrivilegesQualifer(SAFEARRAY ** psaPrivReq);
//=============================================
// Methods
//=============================================
ULONG GetMethodId(LPCWSTR bProp);
};
//=============================================================
class CWMIDataBlock
{
protected:
BOOL m_fUpdateNamespace;
BOOL m_fMofHasChanged;
CWMIProcessClass * m_Class;
HANDLE m_hCurrentWMIHandle;
BOOL m_fCloseHandle;
BYTE * m_pbDataBuffer,* m_pbCurrentDataPtr,* m_pbWorkingDataPtr;
DWORD m_dwDataBufferSize;
ULONG * m_upNameOffsets;
ULONG * m_pMaxPtr;
ULONG m_ulVersion,m_uInstanceSize;
int m_nCurrentInstance;
int m_nTotalInstances;
BOOL m_fFixedInstance;
PWNODE_SINGLE_INSTANCE m_pSingleWnode;
PWNODE_ALL_DATA m_pAllWnode;
WNODE_HEADER* m_pHeaderWnode;
DWORD m_dwCurrentAllocSize;
DWORD m_dwAccumulativeSizeOfBlock;
BOOL m_fMore;
WCHAR m_wcsMsg[MSG_SIZE];
ULONG m_uDesiredAccess;
//======================================================
// Initializing member variables
//======================================================
void InitMemberVars();
HRESULT SetAllInstanceInfo();
HRESULT SetSingleInstanceInfo();
//=============================================
// Get the data from WMI
//=============================================
BOOL InitializeDataPtr();
void GetNextNode();
BOOL ParseHeader();
HRESULT ProcessArrayTypes(VARIANT & vToken,WCHAR * pwcsProperty);
HRESULT WriteArrayTypes(WCHAR * pwcsProperty,CVARIANT & v);
HRESULT FillInProperty();
BOOL GetDataBlockReady(DWORD dwSize,BOOL );
HRESULT ReAllocateBuffer(DWORD wCount);
HRESULT AllocateBuffer(DWORD dwSize);
inline BOOL PtrOk(ULONG * pPtr,ULONG uHowMany);
int AssignNewHandleAndKeepItIfWMITellsUsTo();
//===============================================
// Mapping return code and dumping out
// WNODE info
//===============================================
HRESULT MapReturnCode(ULONG uRc);
HRESULT DumpWnodeInfo(char * pwcsMsg);
void DumpAllWnode();
void DumpSingleWnode();
void DumpWnodeMsg(char * wcsMsg) ;
public:
CWMIDataBlock();
~CWMIDataBlock();
void UpdateNamespace(BOOL fUpdate) { m_fUpdateNamespace = fUpdate;}
BOOL UpdateNamespace() { return m_fUpdateNamespace; }
BOOL HasMofChanged() { return m_fMofHasChanged; }
inline void SetClassProcessPtr(CWMIProcessClass * Class) { m_Class = Class;}
//=============================================
// Open and Close WMI ... :)
//=============================================
void CloseAllOutstandingWMIHandles(void);
HRESULT OpenWMI();
HRESULT OpenWMIForBinaryMofGuid();
//=============================================
// Setting up and cancelling Events
// Setting ptrs to the data sent by the event
//=============================================
HRESULT RegisterWMIEvent( WCHAR * wcsGuid, ULONG_PTR uContext, CLSID & Guid, BOOL fRegistered);
HRESULT SetAllInstancePtr( PWNODE_ALL_DATA pwAllNode );
//=============================================
// Processing the data we got back and putting
// it into WBEM
//=============================================
virtual HRESULT FillOutProperties()=0;
HRESULT ProcessBinaryMof();
HRESULT ReadWMIDataBlockAndPutIntoWbemInstance();
inline BOOL MoreToProcess() { return m_fMore;}
//=============================================
// Embedded Class
//=============================================
HRESULT ProcessEmbeddedClass(CVARIANT & v);
//=====================================================
// The Put Instance Group
//=====================================================
HRESULT WriteEmbeddedClass(IUnknown * pUnknown,CVARIANT & v);
HRESULT ConstructDataBlock(BOOL fInit);
HRESULT WriteDataToBufferAndIfSinglePropertySubmitToWMI(BOOL fInit,BOOL fPutProperty);
HRESULT SetSingleInstancePtr( PWNODE_SINGLE_INSTANCE pwSingleNode);
HRESULT SetSingleItem();
HRESULT PutSingleProperties();
BOOL GetListOfPropertiesToPut(int nWhich, CVARIANT & vList);
//=====================================================
// Manipulate data in the data block
//=====================================================
void GetWord(WORD & wWord) ;
void GetDWORD(DWORD & dwWord) ;
void GetFloat(float & fFloat) ;
void GetDouble(DOUBLE & dDouble) ;
HRESULT GetSInt64 ( WCHAR * pwcsBuffer, DWORD cchSize ) ;
HRESULT GetUInt64 ( WCHAR * pwcsBuffer, DWORD cchSize ) ;
void GetQWORD(unsigned __int64 & uInt64);
void GetString(WCHAR * pwcsBuffer,WORD wCount, WORD wBufferSize) ;
void GetByte(BYTE & bByte) ;
void SetWord(WORD wWord) ;
void SetDWORD(DWORD dwWord) ;
void SetFloat(float fFloat) ;
void SetDouble(DOUBLE dDouble) ;
void SetSInt64(__int64 Int64) ;
void SetUInt64(unsigned __int64 UInt64) ;
void SetString(WCHAR * pwcsBuffer,WORD wCount) ;
void SetByte(byte bByte) ;
void AddPadding(DWORD dwBytesToPad);
BOOL CurrentPtrOk(ULONG uHowMany);
HRESULT GetBufferReady(DWORD wCount);
//=======================================================
// Utility functions
//=======================================================
inline void InitDataBufferToNull() { m_dwDataBufferSize = 0; m_pbDataBuffer = NULL;}
BOOL ResetMissingQualifierValue(WCHAR * pwcsProperty, SAFEARRAY *& pSafe);
BOOL ResetMissingQualifierValue(WCHAR * pwcsProperty, CVARIANT & vToken);
HRESULT ProcessDataBlock();
int AdjustDataBlockPtr(HRESULT & hr);
HRESULT ProcessNameBlock(BOOL f);
//=========================================================
// Binary mof processing
//=========================================================
HRESULT ExtractImageAndResourceName(CVARIANT & vImagePath,CVARIANT & vResourceName);
HRESULT AddBinaryMof(CVARIANT & vImagePath,CVARIANT & vResourceName);
HRESULT DeleteBinaryMof(CVARIANT & vImagePath,CVARIANT & vResourceName);
HRESULT ProcessBinaryMofDataBlock(CVARIANT & vResourceName, WCHAR * w, int cchSize);
//=========================================================
// Cleanup
//=========================================================
void ResetDataBuffer();
//======================================================
// Error Message
//======================================================
inline WCHAR * GetMessage() { return m_wcsMsg; }
inline void SetDesiredAccess(ULONG u) { m_uDesiredAccess = u; }
};
//************************************************************************************************************
//============================================================================================================
//
// The Standard Provider Classes
//
//============================================================================================================
//************************************************************************************************************
class CProcessStandardDataBlock : public CWMIDataBlock
{
private:
HRESULT FillOutProperties();
CWMIProcessClass * m_pMethodInput;
CWMIProcessClass * m_pMethodOutput;
public:
CProcessStandardDataBlock();
~CProcessStandardDataBlock() ;
inline void SetMethodInput( CWMIProcessClass * p ) { m_pMethodInput = p;}
inline void SetMethodOutput( CWMIProcessClass * p ) { m_pMethodOutput = p;}
//=============================================
// Getting the data to process in response to
// a request for enumeration. We either get
// a single guy, or a bunch of guys
//=============================================
ULONG GetDataBufferAndQueryAllData(DWORD dwSize);
ULONG GetDataBufferAndQuerySingleInstance(DWORD dwSize,WCHAR * wcsInstanceName);
HRESULT QueryAllData();
HRESULT QuerySingleInstance(WCHAR * wcsInstanceName);
HRESULT SetSingleInstance();
//=============================================
// Methods
//=============================================
HRESULT ProcessMethodInstanceParameters();
HRESULT ExecuteMethod(ULONG MethodId, WCHAR * MethodInstanceName, ULONG InputValueBufferSize,BYTE * InputValueBuffer);
//=============================================
// Methods
//=============================================
ULONG GetMethodId(LPCWSTR bProp);
HRESULT CreateOutParameterBlockForMethods();
HRESULT CreateInParameterBlockForMethods( BYTE *& Buffer, ULONG & uBufferSize);
HRESULT AllocateBlockForMethodOutput(DWORD & dwSize,CWMIProcessClass & Class);
HRESULT GetEmbeddedClassSize(WCHAR * wcsEmbedded, DWORD & dwSize);
};
//************************************************************************************************************
//============================================================================================================
//
// The Hi Performance Classes
//
//============================================================================================================
//************************************************************************************************************
class CProcessHiPerfDataBlock : public CWMIDataBlock
{
private:
ULONG GetDataBufferAndHiPerfQueryAllData(DWORD dwSize, WMIHANDLE * List, long lHandleCount);
ULONG GetDataBufferAndHiPerfQuerySingleInstance( DWORD dwSize,WMIHANDLE *List, PWCHAR * pInstances, long lHandleCount);
public:
CProcessHiPerfDataBlock() { m_fCloseHandle = FALSE;}
~CProcessHiPerfDataBlock() {}
HRESULT HiPerfQuerySingleInstance(WMIHANDLE *List, PWCHAR * pInstances, DWORD dwInstanceNameSize, long lHandleCount);
HRESULT HiPerfQueryAllData(WMIHANDLE * List,long lHandleCount);
HRESULT OpenHiPerfHandle();
HRESULT GetWMIHandle(HANDLE & lWMIHandle);
HRESULT FillOutProperties();
};
#endif