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.
447 lines
12 KiB
447 lines
12 KiB
//***************************************************************************
|
|
|
|
//
|
|
|
|
// VPTASKS.H
|
|
|
|
//
|
|
|
|
// Module:
|
|
|
|
//
|
|
|
|
// Purpose: Defines tasks that IWbemServices needs to perform.
|
|
|
|
//
|
|
|
|
// Copyright (c) 1998-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//***************************************************************************
|
|
|
|
#ifndef _VIEW_PROV_VPTASKS_H
|
|
#define _VIEW_PROV_VPTASKS_H
|
|
|
|
#define WBEM_TASKSTATE_START 0x0
|
|
#define WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE 0x100000
|
|
#define WBEM_TASKSTATE_ASYNCHRONOUSABORT 0x100001
|
|
|
|
#define CONST_NETAPI_LIBRARY _T("netapi32.dll")
|
|
#define CONST_NETAPI_DSPROC ("DsGetDcNameW")
|
|
#define CONST_NETAPI_NETPROC ("NetApiBufferFree")
|
|
|
|
typedef DWORD ( WINAPI *NETAPI_PROC_DsGetDcName ) (
|
|
|
|
IN LPCWSTR ComputerName OPTIONAL,
|
|
IN LPCWSTR DomainName OPTIONAL,
|
|
IN GUID *DomainGuid OPTIONAL,
|
|
IN LPCWSTR SiteName OPTIONAL,
|
|
IN ULONG Flags,
|
|
OUT PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
|
|
) ;
|
|
|
|
typedef NET_API_STATUS ( NET_API_FUNCTION *NETAPI_PROC_NetApiBufferFree ) (
|
|
|
|
IN LPVOID Buffer
|
|
) ;
|
|
|
|
|
|
|
|
class WbemTaskObject;
|
|
class CObjectSinkResults;
|
|
|
|
class CViewProvObjectSink : public IWbemObjectSink
|
|
{
|
|
private:
|
|
|
|
LONG m_ReferenceCount; //Object reference count
|
|
CObjectSinkResults *m_parent;
|
|
CCriticalSection m_lock;
|
|
CWbemServerWrap *m_ServWrap;
|
|
IWbemObjectSink *m_RemoteSink;
|
|
BOOL m_DoCancel;
|
|
DWORD m_nsindex;
|
|
|
|
public:
|
|
|
|
//Constructor
|
|
CViewProvObjectSink(CObjectSinkResults* parent, CWbemServerWrap *pServ, DWORD a_indx);
|
|
|
|
//Non-delegating object IUnknown
|
|
|
|
STDMETHODIMP QueryInterface (REFIID refIID, LPVOID FAR * ppV);
|
|
STDMETHODIMP_(ULONG) AddRef ();
|
|
STDMETHODIMP_(ULONG) Release ();
|
|
|
|
//IWbemObjectSink methods
|
|
HRESULT STDMETHODCALLTYPE Indicate(LONG count, IWbemClassObject** ppObjArray);
|
|
HRESULT STDMETHODCALLTYPE SetStatus(LONG lFlags, HRESULT hr, BSTR bStr, IWbemClassObject* pObj);
|
|
|
|
//implementation
|
|
void Disconnect();
|
|
void DisAssociate();
|
|
IWbemObjectSink* Associate();
|
|
|
|
//Destructor
|
|
~CViewProvObjectSink();
|
|
|
|
};
|
|
|
|
template <> inline void AFXAPI DestructElements<IWbemClassObject*> (IWbemClassObject** ptr_e, int x)
|
|
{
|
|
for (int i = 0; i < x; i++)
|
|
{
|
|
if (ptr_e[i] != NULL)
|
|
{
|
|
ptr_e[i]->Release();
|
|
}
|
|
}
|
|
}
|
|
|
|
class CWbemClassObjectWithIndex
|
|
{
|
|
private:
|
|
LONG m_ReferenceCount;
|
|
DWORD m_nsindex;
|
|
IWbemClassObject *m_pObject;
|
|
|
|
public:
|
|
|
|
CWbemClassObjectWithIndex(DWORD a_indx, IWbemClassObject *a_pObj);
|
|
|
|
ULONG AddRef();
|
|
ULONG Release();
|
|
DWORD GetIndex() { return m_nsindex; }
|
|
IWbemClassObject * GetWrappedObject() { return m_pObject; }
|
|
|
|
~CWbemClassObjectWithIndex();
|
|
};
|
|
|
|
template <> inline void AFXAPI DestructElements<CWbemClassObjectWithIndex*> (CWbemClassObjectWithIndex** ptr_e, int x)
|
|
{
|
|
for (int i = 0; i < x; i++)
|
|
{
|
|
if (ptr_e[i] != NULL)
|
|
{
|
|
ptr_e[i]->Release();
|
|
}
|
|
}
|
|
}
|
|
|
|
class CObjectSinkResults : public CObject
|
|
{
|
|
private:
|
|
|
|
CList<CViewProvObjectSink *, CViewProvObjectSink *> m_realSnks;
|
|
CCriticalSection m_CriticalSection;
|
|
WbemTaskObject *m_parent;
|
|
DWORD m_index;
|
|
HRESULT m_hr;
|
|
BOOL m_bSet;
|
|
LONG m_ReferenceCount;
|
|
|
|
public:
|
|
|
|
CArray<CWbemClassObjectWithIndex*, CWbemClassObjectWithIndex*> m_ObjArray;
|
|
DWORD GetIndex() { return m_index; }
|
|
BOOL IsSet() { return m_bSet; }
|
|
HRESULT GetResult() { return m_hr; }
|
|
void Disconnect();
|
|
BOOL RemoveSink(CViewProvObjectSink *pSnk);
|
|
void SetSink(CViewProvObjectSink *pSnk);
|
|
void SetStatus(HRESULT hr, CViewProvObjectSink *pSnk);
|
|
HRESULT Indicate(LONG count, IWbemClassObject** ppObjArray, DWORD a_indx);
|
|
ULONG AddRef ();
|
|
ULONG Release ();
|
|
|
|
|
|
CObjectSinkResults(WbemTaskObject* parent, DWORD index);
|
|
~CObjectSinkResults();
|
|
};
|
|
|
|
class WbemTaskObject
|
|
{
|
|
private:
|
|
protected:
|
|
|
|
WbemProvErrorObject m_ErrorObject ;
|
|
|
|
ULONG m_OperationFlag;
|
|
IWbemClassObject *m_ClassObject;
|
|
IWbemObjectSink *m_NotificationHandler;
|
|
IWbemContext *m_Ctx;
|
|
CViewProvServ *m_Provider;
|
|
CTypedPtrArray<CObArray, CSourceQualifierItem*> m_SourceArray;
|
|
CMap<CStringW, LPCWSTR, int, int> m_ClassToIndexMap;
|
|
CTypedPtrArray<CObArray, CNSpaceQualifierItem*> m_NSpaceArray;
|
|
CMap<CStringW, LPCWSTR, CPropertyQualifierItem*, CPropertyQualifierItem*> m_PropertyMap;
|
|
CMap<CStringW, LPCWSTR, int, int> m_EnumerateClasses;
|
|
CJoinOnQualifierArray m_JoinOnArray;
|
|
SQL_LEVEL_1_RPN_EXPRESSION* m_RPNPostFilter;
|
|
BSTR m_ClassName;
|
|
CStringW m_ProviderName;
|
|
LONG m_Ref;
|
|
CTypedPtrArray<CObArray, CObjectSinkResults*> m_ObjSinkArray;
|
|
CCriticalSection m_ArrayLock;
|
|
int m_iQueriesAsked;
|
|
int m_iQueriesAnswered;
|
|
BOOL m_bAssoc;
|
|
BOOL m_bSingleton;
|
|
HANDLE m_StatusHandle;
|
|
IWbemServices *m_Serv;
|
|
CWbemServerWrap *m_ServerWrap;
|
|
BOOL m_bIndicate;
|
|
BOOL m_ResultReceived;
|
|
|
|
|
|
protected:
|
|
|
|
void SetRequestHandle ( ULONG a_RequestHandle ) ;
|
|
BOOL GetRequestHandle () ;
|
|
BOOL GetClassObject (IWbemServices* pServ, BSTR a_Class, IWbemClassObject** ppClass, CWbemServerWrap **a_pServ = NULL) ;
|
|
BOOL SetClass (const wchar_t* a_Class) ;
|
|
BOOL GetExtendedNotifyStatusObject ( IWbemClassObject **a_NotifyObject ) ;
|
|
BOOL GetNotifyStatusObject ( IWbemClassObject **a_NotifyObject ) ;
|
|
BOOL ParseAndProcessClassQualifiers (WbemProvErrorObject &a_ErrorObject,
|
|
ParsedObjectPath *a_ParsedObjectPath = NULL,
|
|
CMap<CStringW, LPCWSTR, int, int>* parentMap = NULL);
|
|
#ifdef VP_PERFORMANT_JOINS
|
|
BOOL CreateAndIndicateJoinsPerf(WbemProvErrorObject &a_ErrorObject, BOOL a_bSingle);
|
|
BOOL JoinTwoColumns(WbemProvErrorObject &a_ErrorObject,
|
|
CMap<CStringW, LPCWSTR, int, int> &a_JoinedClasses,
|
|
CList<IWbemClassObject*, IWbemClassObject*> &a_ResultObjs);
|
|
BOOL AddColumnToJoin(WbemProvErrorObject &a_ErrorObject,
|
|
CMap<CStringW, LPCWSTR, int, int> &a_JoinedClasses,
|
|
CList<IWbemClassObject*, IWbemClassObject*> &a_ResultObjs,
|
|
DWORD a_Index,
|
|
CList <int, int> &a_IndexArray);
|
|
BOOL JoinTwoItems(WbemProvErrorObject &a_ErrorObject,
|
|
IWbemClassObject *a_Obj1,
|
|
IWbemClassObject *a_Obj2,
|
|
IWbemClassObject *a_resObj,
|
|
CList <int, int> &a_IndexArray,
|
|
DWORD a_indx1, DWORD a_indx2);
|
|
BOOL JoinItem(WbemProvErrorObject &a_ErrorObject,
|
|
IWbemClassObject *a_Obj1,
|
|
IWbemClassObject *a_vObj,
|
|
IWbemClassObject *a_resObj,
|
|
CList <int, int> &a_IndexArray,
|
|
DWORD a_indx1);
|
|
#else
|
|
BOOL CreateAndIndicateJoins(WbemProvErrorObject &a_ErrorObject, BOOL a_bSingle);
|
|
BOOL CreateAndIndicate(WbemProvErrorObject &a_ErrorObject, IWbemClassObject **pSrcs, IWbemClassObject **pOut);
|
|
#endif
|
|
|
|
BOOL CreateAndIndicateUnions(WbemProvErrorObject &a_ErrorObject, int index = -1);
|
|
BOOL CreateAndIndicate(WbemProvErrorObject &a_ErrorObject, CObjectSinkResults *pSrcs);
|
|
#if 0
|
|
BOOL SetDefaultUnionKeyValue(wchar_t* propstr, IWbemClassObject* pObj);
|
|
#endif
|
|
BOOL ValidateClassDependencies(IWbemClassObject*** arrayofArrayOfObjs, CMap<CStringW, LPCWSTR, int, int>* parentMap);
|
|
BOOL ValidateJoin();
|
|
BOOL TransposeReference(CPropertyQualifierItem* pItm, VARIANT vSrc, VARIANT* pvDst, BOOL bMapToView, CWbemServerWrap **a_ns);
|
|
BSTR MapFromView(BSTR path, const wchar_t* src, IWbemClassObject** pInst = NULL, BOOL bAllprops = FALSE);
|
|
BSTR MapToView(BSTR path, const wchar_t* src, CWbemServerWrap **a_ns);
|
|
BOOL EvaluateToken(IWbemClassObject *pTestObj, SQL_LEVEL_1_TOKEN &Tok);
|
|
BOOL PostFilter(IWbemClassObject* a_pObj);
|
|
HRESULT Connect(const wchar_t* path, CWbemServerWrap** ppServ, BOOL a_bUpdate = FALSE);
|
|
HRESULT UpdateConnection(CWbemServerWrap **a_pServ, IWbemServices **a_proxy);
|
|
HRESULT DoConnectServer(BSTR bstrPath, CWbemServerWrap **a_ppServ, BOOL a_bUpdate);
|
|
HRESULT LocalConnectServer(BSTR bstrPath, IWbemServices** ppServ);
|
|
#ifdef UNICODE
|
|
HRESULT CoCreateForConnectServer(BSTR bstrPath, COSERVERINFO* psi, COAUTHIDENTITY* pauthid, IWbemServices** ppServ);
|
|
#endif
|
|
|
|
wchar_t* NormalisePath(wchar_t *wszObjectPath, CWbemServerWrap **pNSWrap);
|
|
wchar_t* GetClassWithKeyDefn(CWbemServerWrap **pNS, BSTR classname, BOOL bGetNS, wchar_t **nsPath, BOOL bCheckSingleton = TRUE);
|
|
DWORD GetIndexList(const wchar_t* a_src, DWORD** a_pdwArray);
|
|
|
|
public:
|
|
|
|
WbemTaskObject (
|
|
|
|
CViewProvServ *a_Provider ,
|
|
IWbemObjectSink *a_NotificationHandler ,
|
|
ULONG a_OperationFlag ,
|
|
IWbemContext *a_Ctx ,
|
|
IWbemServices* a_Serv = NULL,
|
|
CWbemServerWrap *a_ServWrap = NULL
|
|
) ;
|
|
|
|
LONG AddRef();
|
|
LONG Release();
|
|
WbemProvErrorObject &GetErrorObject();
|
|
void CleanUpObjSinks(BOOL a_bDisconnect = FALSE);
|
|
virtual void SetStatus(HRESULT hr, DWORD index);
|
|
void SetResultReceived();
|
|
|
|
virtual ~WbemTaskObject();
|
|
|
|
|
|
} ;
|
|
|
|
class HelperTaskObject : public WbemTaskObject
|
|
{
|
|
private:
|
|
wchar_t *m_ObjectPath ;
|
|
ParsedObjectPath *m_ParsedObjectPath ;
|
|
wchar_t* m_principal ;
|
|
|
|
BOOL DoQuery(ParsedObjectPath* parsedObjectPath, IWbemClassObject** pInst, int indx);
|
|
|
|
public:
|
|
|
|
HelperTaskObject(
|
|
CViewProvServ *a_Provider ,
|
|
const wchar_t *a_ObjectPath ,
|
|
ULONG a_Flag ,
|
|
IWbemObjectSink *a_NotificationHandler,
|
|
IWbemContext *pCtx,
|
|
IWbemServices* a_Serv,
|
|
const wchar_t* prncpl,
|
|
CWbemServerWrap* a_ServWrap
|
|
);
|
|
|
|
BOOL Validate(CMap<CStringW, LPCWSTR, int, int>* parentMap);
|
|
BOOL GetViewObject(const wchar_t* path, IWbemClassObject** pInst, CWbemServerWrap **a_ns);
|
|
|
|
~HelperTaskObject();
|
|
|
|
};
|
|
|
|
class GetObjectTaskObject : public WbemTaskObject
|
|
{
|
|
private:
|
|
|
|
wchar_t *m_ObjectPath ;
|
|
ParsedObjectPath *m_ParsedObjectPath ;
|
|
|
|
protected:
|
|
|
|
BOOL PerformGet(WbemProvErrorObject &a_ErrorObject, IWbemClassObject** pInst = NULL, const wchar_t* src = NULL, BOOL bAllprops = FALSE);
|
|
BOOL PerformQueries(WbemProvErrorObject &a_ErrorObject, BOOL bAllprops);
|
|
BOOL ProcessResults(WbemProvErrorObject &a_ErrorObject, IWbemClassObject** pInst, const wchar_t* src);
|
|
|
|
public:
|
|
|
|
GetObjectTaskObject (
|
|
CViewProvServ *a_Provider ,
|
|
wchar_t *a_ObjectPath ,
|
|
ULONG a_Flag ,
|
|
IWbemObjectSink *a_NotificationHandler,
|
|
IWbemContext *pCtx,
|
|
IWbemServices* a_Serv,
|
|
CWbemServerWrap *a_ServerWrap
|
|
);
|
|
|
|
BOOL GetObject();
|
|
BOOL GetSourceObject(const wchar_t* src, IWbemClassObject** pInst, BOOL bAllprops);
|
|
|
|
~GetObjectTaskObject();
|
|
|
|
} ;
|
|
|
|
|
|
class ExecMethodTaskObject : public WbemTaskObject
|
|
{
|
|
private:
|
|
|
|
wchar_t *m_ObjectPath ;
|
|
wchar_t *m_Method ;
|
|
ParsedObjectPath *m_ParsedObjectPath ;
|
|
IWbemClassObject* m_InParamObject;
|
|
IWbemClassObject* m_OutParamObject;
|
|
|
|
protected:
|
|
|
|
BOOL CompareMethods(WbemProvErrorObject &a_ErrorObject,
|
|
LONG &a_Index,
|
|
CStringW &a_SrcMethodName,
|
|
BOOL &a_bStatic);
|
|
|
|
BOOL PerformMethod(WbemProvErrorObject &a_ErrorObject,
|
|
LONG a_Index,
|
|
CStringW a_SrcMethodName,
|
|
BOOL a_bStatic);
|
|
|
|
public:
|
|
|
|
ExecMethodTaskObject (
|
|
|
|
CViewProvServ *a_Provider ,
|
|
wchar_t *a_ObjectPath ,
|
|
wchar_t *a_MethodName,
|
|
ULONG a_Flag ,
|
|
IWbemClassObject *a_InParams ,
|
|
IWbemObjectSink *a_NotificationHandler ,
|
|
IWbemContext *pCtx
|
|
);
|
|
|
|
BOOL ExecMethod();
|
|
|
|
~ExecMethodTaskObject();
|
|
} ;
|
|
|
|
|
|
class PutInstanceTaskObject : public WbemTaskObject
|
|
{
|
|
private:
|
|
|
|
IWbemClassObject *m_InstObject ;
|
|
|
|
protected:
|
|
|
|
BOOL PerformPut(WbemProvErrorObject &a_ErrorObject);
|
|
|
|
public:
|
|
|
|
PutInstanceTaskObject (
|
|
|
|
CViewProvServ *a_Provider ,
|
|
IWbemClassObject *a_Inst ,
|
|
ULONG a_Flag ,
|
|
IWbemObjectSink *a_NotificationHandler ,
|
|
IWbemContext *pCtx
|
|
);
|
|
|
|
BOOL PutInstance();
|
|
|
|
~PutInstanceTaskObject();
|
|
} ;
|
|
|
|
class ExecQueryTaskObject : public WbemTaskObject
|
|
{
|
|
private:
|
|
|
|
wchar_t *m_QueryFormat ;
|
|
wchar_t *m_Query ;
|
|
wchar_t *m_Class ;
|
|
|
|
SQL_LEVEL_1_RPN_EXPRESSION *m_RPNExpression ;
|
|
|
|
protected:
|
|
|
|
BOOL PerformQuery(WbemProvErrorObject &a_ErrorObject);
|
|
BOOL PerformEnumQueries(WbemProvErrorObject &a_ErrorObject);
|
|
BOOL PerformSelectQueries(WbemProvErrorObject &a_ErrorObject, BOOL &bWait);
|
|
BOOL ProcessResults(WbemProvErrorObject &a_ErrorObject);
|
|
void ModifySourceQueriesForUserQuery();
|
|
void ModifySourceQueriesWithEnumResults();
|
|
|
|
public:
|
|
|
|
ExecQueryTaskObject (
|
|
|
|
CViewProvServ *a_Provider ,
|
|
BSTR a_QueryFormat ,
|
|
BSTR a_Query ,
|
|
ULONG a_Flag ,
|
|
IWbemObjectSink *a_NotificationHandler ,
|
|
IWbemContext *pCtx
|
|
);
|
|
|
|
BOOL ExecQuery();
|
|
|
|
~ExecQueryTaskObject();
|
|
} ;
|
|
|
|
#endif //_VIEW_PROV_VPTASKS_H
|