///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Microsoft WMIOLE DB Provider // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved. // // CWBEMWRAP.h | CWbem* class Header file. These are classes talking to WMI // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _CWBEMWRAP_HEADER #define _CWBEMWRAP_HEADER #include #include BOOL UnicodeToAnsi(WCHAR * pszW, char *& pAnsi); void AllocateAndConvertAnsiToUnicode(char * pstr, WCHAR *& pszW); BOOL AllocateAndCopy( WCHAR *& pwcsDestination, WCHAR * pwcsSource ); HRESULT MapWbemErrorToOLEDBError(HRESULT hrToMap); #define DEFAULT_NAMESPACE L"ROOT\\DEFAULT" #define ROOT_NAMESPACE L"ROOT" class CQuery; typedef enum _InstanceListType { NORMAL, // normal query which returns homogenous objects MIXED, // query which returns heterogenours objects SCOPE, // instance list showing list of objects in scope CONTAINER, // instance list showing list of objects in container }INSTANCELISTTYPE; template class CCOMPointer { T* p; public: CCOMPointer() { p=NULL; } CCOMPointer(T* lp) { if ((p = lp) != NULL) p->AddRef(); } CCOMPointer(const CCOMPointer& lp) { if ((p = lp.p) != NULL) p->AddRef(); } ~CCOMPointer() { if (p) { p->Release(); p = NULL; } } operator T*() const { return (T*)p; } T& operator*() const { ATLASSERT(p!=NULL); return *p; } }; class CWbemSecurityDescriptor { private: IWbemClassObject * m_pAccessor; IWbemServicesEx * m_pISerEx; CVARIANT m_sd; BSTR m_strPath; IWbemContext * m_pIContext; ULONG m_lSdSize; public: CWbemSecurityDescriptor(); ~CWbemSecurityDescriptor(); HRESULT Init(IWbemServices *pSer,BSTR strPath,IWbemContext *pContext); PSECURITY_DESCRIPTOR GetSecurityDescriptor() { return (PSECURITY_DESCRIPTOR) &m_sd; } HRESULT PutSD(); BOOL GetSID(TRUSTEE_W *pTrustee ,PSID & psid); }; ///////////////////////////////////////////////////////////////////////////////////////////// class CWbemConnectionWrapper { public: ~CWbemConnectionWrapper(); CWbemConnectionWrapper(); HRESULT FInit() { return m_PrivelagesToken.FInit();} // CWbemConnectionWrapper(CWbemConnectionWrapper *pWrap , WCHAR *pstrPath,INSTANCELISTTYPE instListType ); HRESULT FInit(CWbemConnectionWrapper *pWrap , WCHAR *pstrPath,INSTANCELISTTYPE instListType ); void InitVars(); //========================================================= // Connection handling functions //========================================================= HRESULT GetConnectionToWbem(void); BOOL ValidConnection(); //========================================================= // Namespace functions //========================================================= void SetValidNamespace(VARIANT *v); WCHAR * GetNamespace(); void SetUserInfo(BSTR strUser,BSTR strPassword,BSTR strAuthority); IWbemServices* GetServicesPtr(); IWbemContext * GetContext() { return m_pCtx; } void SetConnAttributes(DWORD dwAuthnLevel , DWORD dwImpLevel); HRESULT DeleteClass(BSTR strClassName); BOOL AdjustTokenPrivileges(ULONG cProps , DBPROP rgProp[]) { return m_PrivelagesToken.AdjustTokenPrivileges(cProps,rgProp); } BOOL AdjustTokenPrivileges(ULONG ulProp) { return m_PrivelagesToken.AdjustTokenPrivileges(ulProp); } void SetLocale(LONG lLocaleID); // transaction related functions HRESULT BeginTransaction(ULONG uTimeout,ULONG uFlags,GUID *pTransGUID); HRESULT CompleteTransaction(BOOL bRollBack,ULONG uFlags); HRESULT CreateNameSpace(); HRESULT DeleteNameSpace(); HRESULT GetObjectAccessRights(BSTR strPath, ULONG *pcAccessEntries, EXPLICIT_ACCESS_W **prgAccessEntries, ULONG ulAccessEntries = 0, EXPLICIT_ACCESS_W *pAccessEntries = NULL); HRESULT SetObjectAccessRights(BSTR strPath, ULONG ulAccessEntries, EXPLICIT_ACCESS_W *pAccessEntries); HRESULT SetObjectOwner(BSTR strPath,TRUSTEE_W *pOwner); HRESULT GetObjectOwner(BSTR strPath,TRUSTEE_W ** ppOwner); BOOL IsValidObject(BSTR strPath); HRESULT IsObjectAccessAllowed( BSTR strPath,EXPLICIT_ACCESS_W *pAccessEntry,BOOL *pfResult); // function to get the class name given the object path // used in case of direct binding and UMI paths HRESULT GetParameters(BSTR strPath,BSTR &strClassName,BSTR *pstrNameSpace = NULL); HRESULT GetClassName(BSTR strPath,BSTR &strClassName); // 07/12/2000 // NTRaid : 142348 HRESULT ExecuteQuery(CQuery *pQuery); // function which executes Action queries HRESULT GetNodeName(BSTR &strNode); // function which gets the pointer to the // the object for which it is pointing private: IWbemServices * m_pIWbemServices; IWbemContext * m_pCtx; CVARIANT m_vNamespace; DWORD m_dwAuthnLevel; //Authentication level to use DWORD m_dwImpLevel; //Impersonation level to use BSTR m_strUser; // UserID BSTR m_strPassword; // Password BSTR m_strAuthority; CPreviligeToken m_PrivelagesToken; // For Setting Token privelege BSTR m_strLocale; CWbemConnectionWrapper *m_pDataSourceCon; }; class CWbemClassWrapper; ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemClassParameters { public: WCHAR * m_pwcsClassName; DWORD m_dwFlags; DWORD m_dwNavFlags; DWORD m_dwQueryFlags; CWbemConnectionWrapper * m_pConnection; WCHAR * m_pwcsParentClassName; BOOL m_bSystemProperties; // Indicates , if system properties IWbemContext * m_pIContext; // to be fetched or not CWbemClassParameters(DWORD dwFlags,WCHAR * pClassName,CWbemConnectionWrapper * pWrap ); // CWbemClassParameters(DWORD dwFlags,IDispatch *pDisp,CWbemConnectionWrapper * pWrap ); ~CWbemClassParameters(); WCHAR * GetClassName(); void SetParentClassName( WCHAR * p ){ AllocateAndCopy( m_pwcsParentClassName,p);} void SetClassName( WCHAR * p ) { AllocateAndCopy( m_pwcsClassName,p);} void DeleteClassName() { SAFE_DELETE_ARRAY(m_pwcsClassName);} WCHAR * GetSuperClassName() { return m_pwcsParentClassName; } DWORD GetFlags() { return m_dwFlags; } DWORD GetNavigationFlags() { return m_dwNavFlags; } DWORD GetQueryFlags() { return m_dwQueryFlags; } HRESULT GetClassNameForWbemObject(IWbemClassObject *pInst ); void SetEnumeratorFlags(DWORD dwFlags); void SetQueryFlags(DWORD dwFlags); HRESULT ParseClassName(); void SetSytemPropertiesFlag(BOOL bSystemProperties) { m_bSystemProperties = bSystemProperties;} HRESULT RemoveObjectFromContainer(BSTR strContainerObj,BSTR strObject); HRESULT AddObjectFromContainer(BSTR strContainerObj,BSTR strObject); HRESULT CloneAndAddNewObjectInScope(CWbemClassWrapper *pClass,BSTR strDstObj,WCHAR *& pstrNewPath); HRESULT SetSearchPreferences(ULONG cProps , DBPROP rgProp[]); virtual IWbemServices* GetServicesPtr() { return m_pConnection->GetServicesPtr();} IWbemContext * GetContext() { return m_pIContext; } }; ////////////////////////////////////////////////////////////////////////////////////////////// // Class which manages the position for qualifiers class CQualiferPos { CFlexArray m_QualifierPos; // Array to store the qualifer names LONG_PTR m_lPos; // The current position FETCHDIRECTION m_FetchDir; // The current fetch direction public: CQualiferPos(); ~CQualiferPos(); void RemoveAll(); // Remove all the elements from the array void Remove(WCHAR *pwcsQualifier); // Remove a particular element from the array WCHAR * operator [] (DBORDINAL nIndex); // Operator overloading to get a particular elemtent HRESULT GetRelative (DBROWOFFSET lRelPos,WCHAR *&pwcsQualifier);// Get a element which is at a relative position to the current element //NTBug:111779 // 06/13/00 HRESULT Add(WCHAR *pwcsQualifier); // Add an element to the array HRESULT SetRelPos(DBROWOFFSET lRelative); // Set the relation position FETCHDIRECTION GetDirFlag() { return m_FetchDir ;} // Get the current fetch direction void SetDirFlag(FETCHDIRECTION DirFlag) { m_FetchDir = DirFlag;} // Set the direction of fetch }; ////////////////////////////////////////////////////////////////////////////////////////////// // Class to manage property qualifers for a instance/class class CWbemPropertyQualifierWrapper { public: IWbemQualifierSet* m_pIWbemPropertyQualifierSet; WCHAR * m_pwstrPropertyName; CQualiferPos m_QualifierPos; CWbemPropertyQualifierWrapper() { m_pIWbemPropertyQualifierSet = NULL; m_pwstrPropertyName = NULL; } ~CWbemPropertyQualifierWrapper() { SAFE_RELEASE_PTR(m_pIWbemPropertyQualifierSet); SAFE_DELETE_PTR(m_pwstrPropertyName); m_QualifierPos.RemoveAll(); } }; ////////////////////////////////////////////////////////////////////////////////////////////// // Class which contains a list of Property qualifer set pointers class CWbemPropertyQualifierList { CFlexArray m_QualifierList; public: ~CWbemPropertyQualifierList(); //NTBug:111779 // 06/13/00 HRESULT Add(IWbemQualifierSet* pQualifierSet,WCHAR *pwstrPropertyName); // Add a name to the qualifier list void Remove(WCHAR *pwstrPropertyName); // Remove a qualifier from the list IWbemQualifierSet* GetPropertyQualifierSet(WCHAR *pwstrPropertyName); // Get the qualiferset pointer void RemoveAll(); // Remove all the elements CQualiferPos * GetQualiferPosObject(WCHAR *pwcsProperty); // Get the CQualifierPos pointer }; ////////////////////////////////////////////////////////////////////////////////////////////// // Works with just one class class CWbemClassWrapper { protected: CWbemClassParameters * m_pParms; IWbemClassObject * m_pClass; IWbemQualifierSet* m_pIWbemClassQualifierSet; IWbemQualifierSet* m_pIWbemPropertyQualifierSet; CWbemPropertyQualifierList m_pPropQualifList; CQualiferPos m_QualifierPos; HRESULT GetClassName(IDispatch *pDisp ); public: CWbemClassWrapper( CWbemClassParameters * p); ~CWbemClassWrapper(); //========================================================= // Utility functions //========================================================= HRESULT SetClass(IWbemClassObject * p); IWbemClassObject * GetClass() { return m_pClass ;} IWbemClassObject ** GetClassPtr() { return &m_pClass;} virtual HRESULT ValidClass(); WCHAR * GetClassName() { return m_pParms->GetClassName(); } void SetClassName( WCHAR * p ) { m_pParms->SetClassName(p); } DWORD GetFlags() { return m_pParms->GetFlags(); } DWORD GetNavigationFlags() { return m_pParms->GetNavigationFlags(); } DWORD GetQueryFlags() { return m_pParms->GetQueryFlags(); } //========================================================= // Managing Properties //========================================================= HRESULT SetProperty(BSTR pProperty, VARIANT * vValue,CIMTYPE lType = -1 ); virtual HRESULT BeginPropertyEnumeration(); virtual HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); virtual HRESULT EndPropertyEnumeration(); HRESULT DeleteProperty(BSTR pProperty ); virtual HRESULT TotalPropertiesInClass(ULONG & ulPropCount, ULONG &ulSysPropCount); HRESULT GetProperty(BSTR pProperty, VARIANT * var, CIMTYPE * pType = NULL ,LONG * plFlavor = NULL ); //========================================================= // Managing Qualifiers //========================================================= HRESULT SetPropertyQualifier(BSTR pProperty, BSTR Qualifier, VARIANT * vValue, LONG lQualifierFlags ); HRESULT DeletePropertyQualifier(BSTR pProperty, BSTR Qualifier ); HRESULT TotalPropertyQualifier(BSTR strPropName , ULONG & ulCount ); HRESULT GetPropertyQualifier(BSTR pPropertyQualifier, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor ); HRESULT IsValidPropertyQualifier(BSTR strProperty); void ReleaseAllPropertyQualifiers() { m_pPropQualifList.RemoveAll(); } void ReleasePropertyQualifier(BSTR strQualifier) ; virtual HRESULT BeginPropertyQualifierEnumeration(BSTR strPropName); HRESULT GetNextPropertyQualifier(BSTR pProperty,BSTR * pPropertyQualifier, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); HRESULT GetPrevPropertyQualifier(BSTR pProperty,BSTR * pPropertyQualifier, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); HRESULT GetPropertyQualifier(BSTR pProperty,BSTR PropertyQualifier, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); HRESULT EndPropertyQualifierEnumeration(); HRESULT IsValidClassQualifier(); HRESULT GetNextClassQualifier(BSTR * pClassQualifier, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); HRESULT GetPrevClassQualifier(BSTR * pClassQualifier, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); HRESULT GetClassQualifier(BSTR ClassQualifier, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ); HRESULT ReleaseClassQualifier(); HRESULT SetClassQualifier(BSTR Qualifier, VARIANT * vValue, LONG lQualifierFlags ); HRESULT SetQualifierRelPos(DBROWOFFSET lRelPos ,BSTR strQualifierName = Wmioledb_SysAllocString(NULL)); HRESULT GetKeyPropertyNames( SAFEARRAY **ppsaNames); CWbemClassWrapper * GetInstance(BSTR strPath); }; ////////////////////////////////////////////////////////////////////////////////////////////// // Works with just one class class CWbemClassDefinitionWrapper : public CWbemClassWrapper { protected: BOOL m_bSchema; public: CWbemClassDefinitionWrapper( CWbemClassParameters * p,BOOL bGetClass = TRUE); ~CWbemClassDefinitionWrapper(); HRESULT Init(BOOL bGetClass) { if(bGetClass) return GetClass(); else return S_OK; } //========================================================= // Managing classes //========================================================= HRESULT GetEmptyWbemClass(); HRESULT DeleteClass(); HRESULT GetClass(); HRESULT CreateClass(); HRESULT DeleteClassQualifier(BSTR Qualifier ); HRESULT SetClass( WCHAR *pClassName); HRESULT SaveClass(BOOL bNewClass = TRUE); HRESULT GetInstanceCount(ULONG_PTR &cInstance); BOOL IsClassSchema() { return m_bSchema; } }; ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemClassInstanceWrapper : public CWbemClassWrapper { public: CWbemClassInstanceWrapper(CWbemClassParameters * p); ~CWbemClassInstanceWrapper(); IWbemClassObject * GetClassObject() { return m_pClass ;} virtual WCHAR * GetInstanceName() { return GetClassName(); } virtual HRESULT ResetInstanceFromKey(CBSTR Key); virtual HRESULT GetKey(CBSTR & Key); void SetPos(ULONG_PTR lPos) { m_lPos = lPos; } ULONG_PTR GetPos() { return m_lPos; } virtual HRESULT RefreshInstance(); virtual WCHAR * GetClassName(); DBSTATUS GetStatus() { return m_dwStatus;} void SetStatus(DBSTATUS dwStatus) { m_dwStatus = dwStatus; } HRESULT CloneInstance(IWbemClassObject *& pInstance); HRESULT GetRelativePath(WCHAR *& pstrRelPath); protected: ULONG_PTR m_lPos; DBSTATUS m_dwStatus; }; ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemInstanceList { protected: CFlexArray m_List; CWbemClassParameters * m_pParms; CRITICAL_SECTION m_InstanceCs; IEnumWbemClassObject * m_ppEnum; ULONG_PTR m_lCurrentPos; FETCHDIRECTION m_FetchDir; int m_nBaseType; ULONG_PTR m_cTotalInstancesInEnum; public: CWbemInstanceList(CWbemClassParameters * p); ~CWbemInstanceList(); //====================================================================== // Critical section handling //====================================================================== inline void Enter() {EnterCriticalSection(&m_InstanceCs);} inline void Leave() {LeaveCriticalSection(&m_InstanceCs);} int TotalInstances(); HRESULT ReleaseAllInstances(); HRESULT ReleaseInstance(CWbemClassInstanceWrapper *& pClass); virtual HRESULT Reset(); virtual HRESULT NextInstance(CBSTR & Key, CWbemClassInstanceWrapper ** p); virtual HRESULT PrevInstance( CBSTR & Key, CWbemClassInstanceWrapper *& p); HRESULT FindInstancePosition( CWbemClassInstanceWrapper * pClass, int & nPosition ); HRESULT DeleteInstance( CWbemClassInstanceWrapper *& pClass ); HRESULT AddInstance( CWbemClassInstanceWrapper * pClass ); HRESULT UpdateInstance(CWbemClassInstanceWrapper * pInstance , BOOL bNewInst); HRESULT AddInstanceNew( CWbemClassInstanceWrapper ** ppNewClass ); HRESULT AddNewInstance(CWbemClassWrapper *pClassWrappper ,CWbemClassInstanceWrapper ** ppNewClass ); HRESULT ResetRelPosition( DBROWOFFSET lPos ); // CWbemClassInstanceWrapper * AddInstanceToList( IUnknown *pDisp,CBSTR & Key); CWbemClassInstanceWrapper * GetInstance( ULONG_PTR lPos ); HRESULT GetNumberOfInstanceInEnumerator(ULONG_PTR *pcInstance=NULL); FETCHDIRECTION GetCurFetchDirection() { return m_FetchDir; } void SetCurFetchDirection(FETCHDIRECTION FetchDir) { m_FetchDir = FetchDir; } }; ////////////////////////////////////////////////////////////////////////////////////////////// // Works with just the rowsets generated by queries ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCommandClassDefinitionWrapper; class CQuery; class CWbemCommandInstanceList; class CWbemCommandInstanceWrapper; class CWbemCommandParameters; /////////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCommandManager { public: BOOL ValidQuery(); HRESULT ValidQueryResults(); CWbemCommandManager(CQuery * p); ~CWbemCommandManager(); void Init(CWbemCommandInstanceList * InstanceList, CWbemCommandParameters * pParms,CWbemCommandClassDefinitionWrapper* pDef); HRESULT GetClassDefinitionForQueryResults(); INSTANCELISTTYPE GetObjListType(); private: CQuery * m_pQuery; CWbemCommandClassDefinitionWrapper * m_pClassDefinition; CWbemCommandInstanceList * m_pInstanceList; CWbemCommandInstanceWrapper * m_pInstance; CWbemCommandParameters * m_pParms; }; ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCommandClassDefinitionWrapper : public CWbemClassDefinitionWrapper { private: int m_nMaxColumns; CWbemCommandManager * m_pCmdManager; INSTANCELISTTYPE m_objListType; // Method Storing type of the command. public: CWbemCommandClassDefinitionWrapper(CWbemClassParameters * p,CWbemCommandManager * pWbemCommandManager); ~CWbemCommandClassDefinitionWrapper(); HRESULT ValidClass(); HRESULT TotalPropertiesInClass(ULONG & ulPropCount, ULONG &ulSysPropCount); HRESULT SetQueryType(LPCWSTR strQry,GUID QryDialect,LPCWSTR strQryLang = NULL); INSTANCELISTTYPE GetObjListType() { return m_objListType; } }; /////////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCommandInstanceList: public CWbemInstanceList { private: ULONG m_ulMaxRow; CWbemCommandManager * m_pCmdManager; LPWSTR m_pwstrQuery; // current Query LPWSTR m_pwstrQueryLanguage; public: CWbemCommandInstanceList(CWbemClassParameters * p,CWbemCommandManager * pWbemCommandManager); ~CWbemCommandInstanceList(); HRESULT SetQuery( LPWSTR p,GUID QryDialect,LPCWSTR strQryLang = NULL); WCHAR* GetQuery() { return m_pwstrQuery;} WCHAR* GetQueryLanguage() {return m_pwstrQueryLanguage; } virtual HRESULT Reset(); }; ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCommandInstanceWrapper : public CWbemClassInstanceWrapper { private: CWbemCommandManager * m_pCmdManager; public: CWbemCommandInstanceWrapper(CWbemClassParameters * p,CWbemCommandManager * pWbemCommandManager); ~CWbemCommandInstanceWrapper(); virtual WCHAR * GetClassName(); virtual HRESULT GetKey(CBSTR & Key); virtual HRESULT RefreshInstance(); }; /////////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCommandParameters :public CWbemClassParameters { public: CWbemCommandParameters(DWORD dwFlags,CWbemConnectionWrapper * Connect,CWbemCommandManager * pWbemCommandManager); ~CWbemCommandParameters(); inline CWbemCommandManager * GetCommandManagerPtr() { return m_pCmdManager;} private: CWbemCommandManager * m_pCmdManager; }; ////////////////////////////////////////////////////////////////////////////////////////////// // Works with just the rowsets that deal with Methods ////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// class CWbemMethodParameters :public CWbemClassParameters { public: CWbemMethodParameters(CQuery * p, DWORD dwFlags,CWbemConnectionWrapper * Connect); ~CWbemMethodParameters(); HRESULT ExtractNamesFromQuery(); HRESULT ValidMethod(); WCHAR * GetInstanceName() { return m_pwcsInstance; } WCHAR * GetMethodName() { return m_pwcsMethod;} CQuery * m_pQuery; private: WCHAR * m_pwcsInstance; WCHAR * m_pwcsMethod; }; class CWbemMethodClassDefinitionWrapper : public CWbemClassDefinitionWrapper { private: int m_nMaxColumns; int m_nCount; IWbemClassObject * m_pInClass; public: CWbemMethodClassDefinitionWrapper(CWbemMethodParameters * parm); ~CWbemMethodClassDefinitionWrapper(); IWbemClassObject * GetInputClassPtr() { return m_pInClass; } HRESULT Init(); HRESULT ValidClass(); HRESULT TotalPropertiesInClass(ULONG & ulPropCount, ULONG &ulSysPropCount); }; /////////////////////////////////////////////////////////////////////////////////////////////////// class CWbemMethodInstanceList: public CWbemInstanceList { private: ULONG m_ulMaxRow; CWbemMethodClassDefinitionWrapper * m_pClassDefinition; public: CWbemMethodInstanceList(CWbemMethodParameters * p,CWbemMethodClassDefinitionWrapper * pDef); ~CWbemMethodInstanceList(); virtual HRESULT Reset(); virtual HRESULT NextInstance(CBSTR & Key, CWbemClassInstanceWrapper ** p); virtual HRESULT PrevInstance( CBSTR & Key, CWbemClassInstanceWrapper *& p); HRESULT ProcessInputParameters(IWbemClassObject **ppParamInput); HRESULT ProcessOutputParameters(); HRESULT GetInputParameterName(IWbemClassObject *pObject,DBORDINAL iOrdinal , BSTR &strPropName); }; ////////////////////////////////////////////////////////////////////////////////////////////// class CWbemMethodInstanceWrapper : public CWbemClassInstanceWrapper { private: public: CWbemMethodInstanceWrapper(CWbemMethodParameters * p); ~CWbemMethodInstanceWrapper(); virtual HRESULT ResetInstanceFromKey(CBSTR Key); virtual HRESULT RefreshInstance(); virtual WCHAR * GetClassName(); virtual HRESULT GetKey(CBSTR & Key); }; class CWbemCollectionInstanceList; class CWbemCollectionInstanceWrapper; ////////////////////////////////////////////////////////////////////////////////////////////// // Works with just the rowsets that deal with Methods ////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// class CWbemCollectionParameters : public CWbemClassParameters { public: CWbemCollectionParameters(DWORD dwFlags,CWbemConnectionWrapper * pWrap ,WCHAR *pClassName); ~CWbemCollectionParameters(); virtual IWbemServices* GetServicesPtr() { return m_pServices;} HRESULT Init(BSTR strPath,CWbemConnectionWrapper * pWrap); private: IWbemServices * m_pServices; }; class CWbemCollectionClassDefinitionWrapper : public CWbemClassDefinitionWrapper { private: INSTANCELISTTYPE m_objListType; // Method Storing type of the command. WCHAR * m_pstrPath; public: CWbemCollectionClassDefinitionWrapper(CWbemClassParameters * p,WCHAR * pstrPath,INSTANCELISTTYPE colType); ~CWbemCollectionClassDefinitionWrapper(); HRESULT Initialize(WCHAR * pstrPath); HRESULT ValidClass(); HRESULT TotalPropertiesInClass(ULONG & ulPropCount, ULONG &ulSysPropCount); INSTANCELISTTYPE GetObjListType() { return m_objListType; } WCHAR *GetObjectPath() { return m_pstrPath; } }; class CWbemCollectionManager { public: CWbemCollectionManager(); ~CWbemCollectionManager(); void Init(CWbemCollectionInstanceList * InstanceList, CWbemCollectionParameters * pParms, CWbemCollectionClassDefinitionWrapper * pDef); INSTANCELISTTYPE GetObjListType() { return m_pClassDefinition->GetObjListType(); } WCHAR *GetObjectPath() { return m_pClassDefinition->GetObjectPath(); } private: CWbemCollectionClassDefinitionWrapper * m_pClassDefinition; CWbemCollectionInstanceList * m_pInstanceList; CWbemCollectionInstanceWrapper * m_pInstance; CWbemCollectionParameters * m_pParms; }; class CWbemCollectionInstanceWrapper : public CWbemClassInstanceWrapper { private: CWbemCollectionManager * m_pColMgr; public: CWbemCollectionInstanceWrapper(CWbemClassParameters * p,CWbemCollectionManager * pWbemColMgr = NULL); ~CWbemCollectionInstanceWrapper(); virtual WCHAR * GetClassName(); virtual HRESULT GetKey(CBSTR & Key); virtual HRESULT RefreshInstance(); }; // Class to represent instance list for scope/collection class CWbemCollectionInstanceList: public CWbemInstanceList { private: CWbemCollectionManager *m_pColMgr; public: CWbemCollectionInstanceList(CWbemClassParameters * p,CWbemCollectionManager * pCollectionMgr); ~CWbemCollectionInstanceList(); virtual HRESULT Reset(); }; #endif