277 lines
13 KiB
C++
277 lines
13 KiB
C++
|
|
//XMLWbemServices.h - declaration for our implementation of IWbemServices
|
|
|
|
#ifndef WMI_XML_WBEM_SERVICE_H
|
|
#define WMI_XML_WBEM_SERVICE_H
|
|
|
|
enum ePATHTYPE
|
|
{
|
|
CLASSPATH=1,
|
|
INSTANCEPATH,
|
|
SERVERPATH,
|
|
NAMESPACEPATH,
|
|
INVALIDOBJECTPATH
|
|
};
|
|
|
|
class CXMLWbemServices : public IWbemServices, public IClientSecurity
|
|
{
|
|
private:
|
|
|
|
static const WCHAR *s_pwszWMIString;
|
|
|
|
// The COM ref count
|
|
long m_cRef;
|
|
|
|
// Parameters directly provided by CXMLWbemClientTransport to our ctor
|
|
// These come from the arguments of a ConnectServer() call
|
|
WCHAR *m_pwszServername;
|
|
WCHAR *m_pwszNamespace;
|
|
WCHAR *m_pwszUser;
|
|
WCHAR *m_pwszPassword;
|
|
WCHAR *m_pwszLocale;
|
|
WCHAR *m_pwszAuthority;
|
|
|
|
// This is the same as m_pwszServername, but with square brackets around it
|
|
// It is useful in setting the __SERVER property on object
|
|
WCHAR *m_pwszBracketedServername;
|
|
|
|
// Proxy information coming from the IWbemContext in ConnectServer
|
|
WCHAR *m_pwszProxyName;
|
|
WCHAR *m_pwszProxyBypass;
|
|
|
|
// What response we got form the server for the OPTIONS request
|
|
// This is useful in passing on to other IWbemServices objects created from
|
|
// OpenNamespace(), Open() etc. instead of resending an OPTIONS request
|
|
WCHAR *m_pwszOptionsResponse;
|
|
|
|
//set to indicate we are dealing with a WMI server
|
|
bool m_bWMIServer;
|
|
|
|
IWbemContext *m_pCtx;
|
|
|
|
ePATHSTYLE m_ePathstyle; //NOVA OR WHISTLER PATH ?
|
|
|
|
LONG m_lSecurityFlags;
|
|
|
|
//need to check availability of M-POST only once per connection..
|
|
bool m_bTryMpost;
|
|
|
|
CMapXMLtoWMI m_MapXMLtoWMI; //helper class to do the mapping from XML toWMI
|
|
|
|
|
|
static LONG s_cCount; //used for creating unique mutexes for each CXMLWbemClientSecurity instance
|
|
HANDLE m_hMutex; //to be used for synchronization by all Actual_ functions
|
|
|
|
//the http connection helper class. we will maintain one instance for
|
|
//a given server and use the same connection for all calls unless
|
|
//user wants to connect to a different server/ different authentication.
|
|
CHTTPConnectionAgent *m_pConnectionAgent;
|
|
|
|
// Used for implement CancelAsync call. This holds the list of Sinks on which
|
|
// calls have been cancelled
|
|
// As soon as the user calls CancelAsync(), we simply add the Sink to this Map
|
|
// Async calls will periodically check to see if a call on a Sink has been cancelled.
|
|
// If so, they try to do their best from executing
|
|
// the call to completion
|
|
CSinkMap m_SinkMap;
|
|
|
|
protected:
|
|
// This function belongs to the ClientSecurity
|
|
HRESULT SetAuthenticationLevel(UINT iLevel);
|
|
|
|
//Function used to parse the object path and decide whether it is a class, instance or a namespace
|
|
HRESULT ParsePath(const BSTR strObjPath, ePATHTYPE *pePathType);
|
|
|
|
// Different kinds of functions to send a packet and/or get a response
|
|
HRESULT SendPacketForMethod(int iMethod, CXMLClientPacket *pPacket, CHTTPConnectionAgent *pDedicatedConnection, DWORD *pdwResultStatus);
|
|
HRESULT SendRequestAndGetResponse(CXMLClientPacket *pPacket, IStream **ppStream);
|
|
HRESULT SendPacketAndGetHRESULTResponse(CXMLClientPacket *pPacket, HRESULT *pHr);
|
|
|
|
HRESULT SpawnSemiSyncThreadWithNormalPackage( LPTHREAD_START_ROUTINE pfThreadFunction,
|
|
const BSTR strNsOrObjPath,
|
|
LONG lFlags,
|
|
IWbemContext *pCtx,
|
|
IWbemCallResult **ppCallResult,
|
|
IWbemClassObject *pObject,
|
|
IEnumWbemClassObject *pEnum,
|
|
bool bIsEnum = false,
|
|
bool bEnumTypeDedicated = false);
|
|
|
|
HRESULT SpawnASyncThreadWithNormalPackage( LPTHREAD_START_ROUTINE pfThreadFunction,
|
|
const BSTR strNsOrObjPath,
|
|
LONG lFlags,
|
|
IWbemContext *pCtx,
|
|
IWbemClassObject *pObject,
|
|
IEnumWbemClassObject *pEnum,
|
|
IWbemObjectSink *pResponseHandler,
|
|
bool bEnumTypeDedicated = false);
|
|
|
|
|
|
// Used internally by our IWbemServices functions
|
|
// Our IWbemServices functions use these corresponding functions
|
|
// to facilitate semisynchronous and asynchronous calls.
|
|
|
|
HRESULT Actual_GetInstance(const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject);
|
|
HRESULT Actual_GetClass(const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject);
|
|
HRESULT Actual_DeleteClass(const BSTR strClass,LONG lFlags,IWbemContext *pCtx);
|
|
HRESULT Actual_DeleteInstance(const BSTR strObjectPath, LONG lFlags,IWbemContext *pCtx);
|
|
HRESULT Actual_CreateClassEnum(const BSTR strSuperclass, LONG lFlags, IWbemContext *pCtx,
|
|
IEnumWbemClassObject *pEnum, bool bEnumTypeDedicated);
|
|
HRESULT Actual_CreateInstanceEnum(const BSTR strClass, LONG lFlags,IWbemContext *pCtx,
|
|
IEnumWbemClassObject *pEnum, bool bEnumTypeDedicated);
|
|
HRESULT Actual_ExecQuery(const BSTR strQueryLanguage, const BSTR strQuery, LONG lFlags, IWbemContext *pCtx,
|
|
IEnumWbemClassObject *pEnum);
|
|
HRESULT Actual_OpenNamespace(const BSTR strNamespace,LONG lFlags, IWbemContext *pCtx,
|
|
IWbemServices **ppWorkingNamespace);
|
|
HRESULT Actual_PutClass(IWbemClassObject *pObject,LONG lFlags,
|
|
IWbemContext *pCtx);
|
|
HRESULT Actual_PutInstance(IWbemClassObject *pObject,LONG lFlags,
|
|
IWbemContext *pCtx);
|
|
HRESULT Actual_ExecMethod(const BSTR strObjectPath, const BSTR MethodName, long lFlags, IWbemContext *pCtx,
|
|
IWbemClassObject *pInParams, IWbemClassObject **ppOutParams);
|
|
|
|
|
|
public:
|
|
//helper function. also used by CXMLWbemTransaction class..
|
|
HRESULT SendPacket(CXMLClientPacket *pPacketClass, CHTTPConnectionAgent *pDedicatedConnection = NULL);
|
|
|
|
public:
|
|
//IUnknown functions
|
|
STDMETHODIMP QueryInterface(REFIID iid,void ** ppvObject);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
public:
|
|
//passed by our ClientTransport's ConnectServer - result of OPTIONS req to server.
|
|
HRESULT Initialize(WCHAR* pwszServername,
|
|
WCHAR* pwszNamespace,
|
|
WCHAR* pwszUser,
|
|
WCHAR* pwszPassword,
|
|
WCHAR* pwszLocale,
|
|
LONG lSecurityFlags,
|
|
WCHAR* pwszAuthority,
|
|
IWbemContext *pCtx,
|
|
WCHAR *pwszOptionsResponse,
|
|
ePATHSTYLE PathStyle);
|
|
|
|
public:
|
|
CXMLWbemServices();
|
|
virtual ~CXMLWbemServices();
|
|
|
|
// IWbemServices Functions
|
|
//=====================================================
|
|
STDMETHODIMP OpenNamespace( const BSTR strNamespace,
|
|
LONG lFlags, IWbemContext *pCtx,IWbemServices **ppWorkingNamespace, IWbemCallResult **ppResult);
|
|
STDMETHODIMP CancelAsyncCall( IWbemObjectSink *pSink);
|
|
STDMETHODIMP GetObject(const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,
|
|
IWbemClassObject **ppObject,
|
|
IWbemCallResult **ppCallResult);
|
|
STDMETHODIMP GetObjectAsync(const BSTR strObjectPath,
|
|
LONG lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP PutClass(IWbemClassObject *pObject,LONG lFlags,
|
|
IWbemContext *pCtx, IWbemCallResult **ppCallResult);
|
|
STDMETHODIMP PutClassAsync(IWbemClassObject *pObject, LONG lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP DeleteClass( const BSTR strClass,LONG lFlags,
|
|
IWbemContext *pCtx, IWbemCallResult **ppCallResult);
|
|
STDMETHODIMP DeleteClassAsync(const BSTR strClass, LONG lFlags,
|
|
IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP CreateClassEnum(const BSTR strSuperclass, LONG lFlags, IWbemContext *pCtx, IEnumWbemClassObject **ppEnum);
|
|
STDMETHODIMP CreateClassEnumAsync(const BSTR strSuperclass, LONG lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP PutInstance(IWbemClassObject *pInst, LONG lFlags,
|
|
IWbemContext *pCtx, IWbemCallResult **ppCallResult);
|
|
STDMETHODIMP PutInstanceAsync(IWbemClassObject *pInst, LONG lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP DeleteInstance(const BSTR strObjectPath, LONG lFlags,
|
|
IWbemContext *pCtx, IWbemCallResult **ppCallResult);
|
|
STDMETHODIMP DeleteInstanceAsync(const BSTR strObjectPath, LONG lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP CreateInstanceEnum(const BSTR strClass, LONG lFlags,
|
|
IWbemContext *pCtx, IEnumWbemClassObject **ppEnum);
|
|
STDMETHODIMP CreateInstanceEnumAsync(const BSTR strClass,
|
|
LONG lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP ExecQuery(const BSTR strQueryLanguage, const BSTR strQuery, LONG lFlags, IWbemContext *pCtx, IEnumWbemClassObject **ppEnum);
|
|
STDMETHODIMP ExecQueryAsync(const BSTR strQueryLanguage, const BSTR strQuery, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler);
|
|
STDMETHODIMP ExecMethod(const BSTR strObjectPath, const BSTR MethodName, long lFlags, IWbemContext *pCtx,
|
|
IWbemClassObject *pInParams, IWbemClassObject **ppOutParams,
|
|
IWbemCallResult **ppCallResult);
|
|
STDMETHODIMP ExecMethodAsync(const BSTR strObjectPath,
|
|
const BSTR strMethodName, LONG lFlags,
|
|
IWbemContext *pCtx, IWbemClassObject *pInParams, IWbemObjectSink *pResponseHandler);
|
|
|
|
// These methods not implemented - no eventing in XML
|
|
//=========================================================
|
|
STDMETHODIMP QueryObjectSink(LONG lFlags, IWbemObjectSink **ppResponseHandler)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
STDMETHODIMP ExecNotificationQuery(const BSTR strQueryLanguage,
|
|
const BSTR strQuery, long lFlags, IWbemContext *pCtx,
|
|
IEnumWbemClassObject **ppEnum)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP ExecNotificationQueryAsync( const BSTR strQueryLanguage, const BSTR strQuery, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
private:
|
|
|
|
/****************************************************************************************************
|
|
The threads that would be used for Async operations..
|
|
Declared as friend functions as they call back our
|
|
protected functions.....
|
|
****************************************************************************************************/
|
|
|
|
friend DWORD WINAPI Thread_Async_GetObject(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_GetClass(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_GetInstance(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_PutClass(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_PutInstance(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_DeleteClass(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_DeleteInstance(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_CreateClassEnum(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_CreateInstanceEnum(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_ExecQuery(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_Async_ExecMethod(LPVOID pPackage);
|
|
|
|
/****************************************************************************************************
|
|
The threads that would be used for Semi-sync operations..
|
|
Declared as friend functions as they call back our
|
|
protected functions.....
|
|
****************************************************************************************************/
|
|
|
|
friend DWORD WINAPI Thread_SemiSync_GetObject(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_GetClass(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_GetInstance(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_PutClass(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_PutInstance(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_DeleteClass(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_DeleteInstance(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_CreateClassEnum(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_CreateInstanceEnum(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_ExecQuery(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_ExecMethod(LPVOID pPackage);
|
|
friend DWORD WINAPI Thread_SemiSync_OpenNamespace(LPVOID pPackage);
|
|
|
|
/***************************************************************************************************
|
|
IClientSecurity functions.
|
|
***************************************************************************************************/
|
|
|
|
public:
|
|
STDMETHODIMP CopyProxy(IUnknown * pProxy,IUnknown ** ppCopy);
|
|
|
|
STDMETHODIMP QueryBlanket(IUnknown* pProxy,DWORD* pAuthnSvc,DWORD* pAuthzSvc,
|
|
OLECHAR** pServerPrincName,DWORD* pAuthnLevel,
|
|
DWORD* pImpLevel,RPC_AUTH_IDENTITY_HANDLE* pAuthInfo,
|
|
DWORD* pCapabilities);
|
|
|
|
STDMETHODIMP SetBlanket(IUnknown * pProxy,DWORD dwAuthnSvc,DWORD dwAuthzSvc,
|
|
OLECHAR * pServerPrincName,DWORD dwAuthnLevel,
|
|
DWORD dwImpLevel,RPC_AUTH_IDENTITY_HANDLE pAuthInfo,
|
|
DWORD dwCapabilities);
|
|
|
|
};
|
|
|
|
|
|
#endif //WMI_XML_WBEM_SERVICE_H
|