335 lines
10 KiB
C++
335 lines
10 KiB
C++
/*++
|
|
|
|
Copyright (C) 1997-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
PIPEOPN.H
|
|
|
|
Abstract:
|
|
|
|
Declares the abstract and generic (to proxy and stub) pipe operation classes
|
|
|
|
History:
|
|
|
|
alanbos 18-Dec-97 Created.
|
|
|
|
--*/
|
|
|
|
#ifndef _PIPEOPN_H_
|
|
#define _PIPEOPN_H_
|
|
|
|
// Abstract class for operations over Anonymous Pipes.
|
|
class IBasicOperation_LPipe : public IOperation
|
|
{
|
|
private:
|
|
DWORD m_msgType;
|
|
|
|
protected:
|
|
inline IBasicOperation_LPipe (IWbemContext* pContext = NULL,
|
|
IWbemCallResult** ppResult = NULL,
|
|
bool isAsync = FALSE, DWORD msgType = COMLINK_MSG_CALL) :
|
|
m_msgType (msgType),
|
|
IOperation (pContext, ppResult, isAsync)
|
|
{}
|
|
|
|
inline DWORD GetMessageType () { return m_msgType; }
|
|
inline virtual DWORD GetResponseType () { return COMLINK_MSG_RETURN; }
|
|
|
|
// Encode the packet header structure into the stream. This is done
|
|
// at the end of the encode operation since that is when we know
|
|
// the data length.
|
|
void EncodePacketHeader (CTransportStream& encodeStream, DWORD msgType);
|
|
|
|
// Result encode/decode
|
|
void DecodeResult (CTransportStream& decodeStream);
|
|
inline void EncodeResult (CTransportStream& encodeStream)
|
|
{
|
|
encodeStream.WriteDWORD (GetStatus ());
|
|
}
|
|
|
|
// The following complete the decode and encode routines and depend
|
|
// on the operation in hand. They are usually overridden in the subclass.
|
|
// Proxies and stubs implement different halves.
|
|
inline virtual void DecodeOperationReq (CTransportStream& decodeStream) {}
|
|
inline virtual void DecodeOperationRsp (CTransportStream& decodeStream) {}
|
|
inline virtual void EncodeOperationReq (CTransportStream& encodeStream) {}
|
|
inline virtual void EncodeOperationRsp (CTransportStream& encodeStream) {}
|
|
|
|
public:
|
|
// Given a PH and decodeStream, create an IOperation of the right type
|
|
// Reset stream on entry for all decode but no encode.
|
|
static bool Decode (PACKET_HEADER& header, CTransportStream& decodeStream,
|
|
IOperation** ppOpn);
|
|
|
|
// Utility functions
|
|
inline static DWORD GetHeaderLength () { return PHSIZE; }
|
|
static bool DecodeHeader (BYTE *pByte, DWORD numBytes, PACKET_HEADER& header);
|
|
|
|
// The main encode/decode routines
|
|
bool EncodeRequest (CTransportStream& encodeStream, ISecurityHelper& secHelp);
|
|
bool EncodeResponse (CTransportStream& encodeStream, ISecurityHelper& secHelp);
|
|
bool DecodeRequest (CTransportStream& decodeStream, ISecurityHelper& secHelp);
|
|
bool DecodeResponse (CTransportStream& decodeStream, ISecurityHelper& secHelp);
|
|
};
|
|
|
|
class COperation_LPipe_Ping : public IBasicOperation_LPipe
|
|
{
|
|
public:
|
|
// For requests (proxy)
|
|
inline COperation_LPipe_Ping () :
|
|
IBasicOperation_LPipe (NULL, NULL, FALSE, COMLINK_MSG_PING) {}
|
|
|
|
// For responses (stub)
|
|
inline COperation_LPipe_Ping (PACKET_HEADER& header) :
|
|
IBasicOperation_LPipe (NULL, NULL, FALSE, COMLINK_MSG_PING)
|
|
{
|
|
SetRequestId (header.GetRequestId ());
|
|
}
|
|
|
|
inline DWORD GetResponseType () { return COMLINK_MSG_PING_ACK; }
|
|
};
|
|
|
|
class COperation_LPipe_Strobe : public IBasicOperation_LPipe
|
|
{
|
|
public:
|
|
// For requests (proxy)
|
|
inline COperation_LPipe_Strobe () :
|
|
IBasicOperation_LPipe (NULL, NULL, FALSE, COMLINK_MSG_HEART_BEAT) {}
|
|
|
|
// For responses (stub)
|
|
inline COperation_LPipe_Strobe (PACKET_HEADER& header) :
|
|
IBasicOperation_LPipe (NULL, NULL, FALSE, COMLINK_MSG_HEART_BEAT)
|
|
{
|
|
SetRequestId (header.GetRequestId ());
|
|
}
|
|
|
|
inline DWORD GetResponseType () { return COMLINK_MSG_HEART_BEAT_ACK; }
|
|
};
|
|
|
|
class COperation_LPipe_NotSupported : public IBasicOperation_LPipe
|
|
{
|
|
public:
|
|
inline COperation_LPipe_NotSupported () :
|
|
IBasicOperation_LPipe ()
|
|
{
|
|
SetStatus (WBEM_E_NOT_SUPPORTED);
|
|
}
|
|
};
|
|
|
|
class COperation_LPipe_Shutdown : public IBasicOperation_LPipe
|
|
{
|
|
public:
|
|
inline COperation_LPipe_Shutdown () :
|
|
IBasicOperation_LPipe (NULL, NULL, FALSE, COMLINK_MSG_NOTIFY_DESTRUCT) {}
|
|
};
|
|
|
|
// Call Operations (these have a target stub)
|
|
class IOperation_LPipe : public IBasicOperation_LPipe
|
|
{
|
|
protected:
|
|
DWORD m_stubAddr;
|
|
DWORD m_stubType;
|
|
DWORD m_stubFunc;
|
|
|
|
inline IOperation_LPipe (CStubAddress_WinMgmt& stubAddr, DWORD stubType = 0, DWORD stubFunc = 0,
|
|
IWbemContext* pContext = NULL, IWbemCallResult** ppResult = NULL,
|
|
bool isAsync = FALSE) :
|
|
m_stubAddr (stubAddr.GetRawAddress ()), m_stubType (stubType), m_stubFunc (stubFunc),
|
|
IBasicOperation_LPipe (pContext, ppResult, isAsync) {}
|
|
|
|
// This is where the operation-specific encode and decode
|
|
// behavior is overridden by subclasses.
|
|
inline virtual void EncodeOp (CTransportStream& encodeStream) {};
|
|
inline virtual void DecodeOp (CTransportStream& decodeStream) {};
|
|
|
|
public:
|
|
// Decode the call header information
|
|
static bool DecodeCallHeader (CTransportStream& decodeStream,
|
|
OUT DWORD& dwStubAddr, OUT DWORD& dwStubType, OUT DWORD& dwStubFunc);
|
|
};
|
|
|
|
class IProxyOperation_LPipe : public IOperation_LPipe
|
|
{
|
|
protected:
|
|
IProxyOperation_LPipe (CStubAddress_WinMgmt& stubAddr, DWORD stubType, DWORD stubFunc,
|
|
IWbemContext* pContext = NULL, IWbemCallResult** ppResult = NULL,
|
|
bool isAsync = FALSE) :
|
|
IOperation_LPipe (stubAddr, stubType, stubFunc, pContext, ppResult, isAsync)
|
|
{}
|
|
|
|
// Determines whether call result was set by stub
|
|
inline bool GetResultObjectP ()
|
|
{
|
|
IWbemCallResult** ppResObj = GetResultObjectPP ();
|
|
return (ppResObj && *ppResObj);
|
|
}
|
|
|
|
// Encodes context information associated with proxy request
|
|
void EncodeContext (CTransportStream& encodeStream);
|
|
// This encodes the Stub Address, Stub Type and Stub Function
|
|
void EncodeCallHeader (CTransportStream& encodeStream);
|
|
|
|
// Decodes error objects and stub addresses
|
|
void DecodeErrorObject (CTransportStream& decodeStream);
|
|
void DecodeStubAddress (ObjType ot, CTransportStream& decodeStream, bool checkValid = true);
|
|
|
|
inline void EncodeOperationReq (CTransportStream& encodeStream)
|
|
{
|
|
DEBUGTRACE((LOG,"\nEncode Request [Func = %d, RequestId = %d]", m_stubFunc, GetRequestId ()));
|
|
EncodeCallHeader (encodeStream);
|
|
EncodeOp (encodeStream);
|
|
}
|
|
|
|
inline void DecodeOperationRsp (CTransportStream& decodeStream)
|
|
{
|
|
DecodeErrorObject (decodeStream);
|
|
DecodeResult (decodeStream);
|
|
DecodeOp (decodeStream);
|
|
}
|
|
};
|
|
|
|
class IStubOperation_LPipe : public IOperation_LPipe
|
|
{
|
|
protected:
|
|
IStubOperation_LPipe (CStubAddress_WinMgmt& stubAddr, DWORD dwStubType,
|
|
DWORD dwStubFunc, bool isAsync = FALSE) :
|
|
IOperation_LPipe (stubAddr, dwStubType, dwStubFunc, NULL, NULL, isAsync)
|
|
{}
|
|
|
|
// Error object encode/decode
|
|
void EncodeErrorObject (CTransportStream& encodeStream);
|
|
// Stub Address encode/decode
|
|
void EncodeStubAddress (ObjType ot, CTransportStream& encodeStream);
|
|
|
|
// Decode the context
|
|
void DecodeContext (CTransportStream& decodeStream);
|
|
|
|
inline void DecodeOperationReq (CTransportStream& decodeStream)
|
|
{
|
|
if (WBEM_NO_ERROR == GetStatus ())
|
|
DecodeOp (decodeStream);
|
|
}
|
|
|
|
inline void EncodeOperationRsp (CTransportStream& encodeStream)
|
|
{
|
|
EncodeErrorObject (encodeStream);
|
|
EncodeResult (encodeStream);
|
|
EncodeOp (encodeStream);
|
|
}
|
|
|
|
// This method actually invokes the proxied command against WINMGMT
|
|
virtual void Execute (CComLink& comLink, IUnknown *pStub) PURE;
|
|
|
|
public:
|
|
void HandleCall (CComLink& comLink);
|
|
};
|
|
|
|
// Anonymous Pipe Release Operation
|
|
class CProxyOperation_LPipe_Release : public IProxyOperation_LPipe
|
|
{
|
|
public:
|
|
inline CProxyOperation_LPipe_Release (CStubAddress_WinMgmt& stubAddr, DWORD iProv) :
|
|
IProxyOperation_LPipe (stubAddr, iProv, RELEASE) {}
|
|
};
|
|
|
|
// Anonymous Pipe Indicate Operation
|
|
class CProxyOperation_LPipe_Indicate : public IProxyOperation_LPipe
|
|
{
|
|
private:
|
|
IWbemClassObject FAR* FAR* m_pObjArray;
|
|
long m_objectCount;
|
|
|
|
protected:
|
|
void EncodeOp (CTransportStream& encodeStream);
|
|
|
|
public:
|
|
inline CProxyOperation_LPipe_Indicate (long lObjectCount,
|
|
IWbemClassObject FAR* FAR* pObjArray, CStubAddress_WinMgmt& stubAddr) :
|
|
m_pObjArray (pObjArray), m_objectCount (lObjectCount),
|
|
IProxyOperation_LPipe(stubAddr, OBJECTSINK, INDICATE)
|
|
{}
|
|
};
|
|
|
|
class CStubOperation_LPipe_Indicate : public IStubOperation_LPipe
|
|
{
|
|
private:
|
|
IWbemClassObject** m_pObjArray;
|
|
long m_objectCount;
|
|
|
|
protected:
|
|
void DecodeOp (CTransportStream& decodeStream);
|
|
void Execute (CComLink& comLink, IUnknown *pStub);
|
|
|
|
public:
|
|
inline CStubOperation_LPipe_Indicate (CStubAddress_WinMgmt& stubAddr) :
|
|
m_pObjArray (NULL), m_objectCount (0),
|
|
IStubOperation_LPipe(stubAddr, OBJECTSINK, INDICATE)
|
|
{}
|
|
inline virtual ~CStubOperation_LPipe_Indicate ()
|
|
{
|
|
if (m_pObjArray) delete [] m_pObjArray;
|
|
}
|
|
};
|
|
|
|
// Anonymous Pipe Release Operation
|
|
class CStubOperation_LPipe_Release : public IStubOperation_LPipe
|
|
{
|
|
protected:
|
|
void Execute (CComLink& comLink, IUnknown *pStub);
|
|
public:
|
|
CStubOperation_LPipe_Release (CStubAddress_WinMgmt& stubAddr, DWORD dwStubType) :
|
|
IStubOperation_LPipe (stubAddr, dwStubType, RELEASE) {}
|
|
};
|
|
|
|
|
|
// Anonymous Pipe SetStatus Operation
|
|
class CProxyOperation_LPipe_SetStatus : public IProxyOperation_LPipe
|
|
{
|
|
private:
|
|
long m_flags;
|
|
long m_param;
|
|
BSTR m_strParam;
|
|
IWbemClassObject FAR* m_pObjParam;
|
|
|
|
protected:
|
|
void EncodeOp (CTransportStream& encodeStream);
|
|
|
|
public:
|
|
inline CProxyOperation_LPipe_SetStatus (long lFlags, long lParam,
|
|
BSTR strParam, IWbemClassObject FAR* pObjParam,
|
|
CStubAddress_WinMgmt& stubAddr) :
|
|
m_flags (lFlags), m_param (lParam), m_strParam (strParam),
|
|
m_pObjParam (pObjParam),
|
|
IProxyOperation_LPipe (stubAddr, OBJECTSINK, SETSTATUS)
|
|
{}
|
|
};
|
|
|
|
class CStubOperation_LPipe_SetStatus : public IStubOperation_LPipe
|
|
{
|
|
private:
|
|
long m_flags;
|
|
long m_param;
|
|
BSTR m_strParam;
|
|
IWbemClassObject* m_pObjParam;
|
|
|
|
protected:
|
|
void DecodeOp (CTransportStream& encodeStream);
|
|
void Execute (CComLink& comLink, IUnknown *pStub);
|
|
|
|
public:
|
|
inline CStubOperation_LPipe_SetStatus (CStubAddress_WinMgmt& stubAddr) :
|
|
m_flags (0), m_param (0), m_strParam (NULL),
|
|
m_pObjParam (NULL),
|
|
IStubOperation_LPipe (stubAddr, OBJECTSINK, SETSTATUS)
|
|
{}
|
|
inline virtual ~CStubOperation_LPipe_SetStatus ()
|
|
{
|
|
if (m_strParam) delete m_strParam;
|
|
if (m_pObjParam) m_pObjParam->Release ();
|
|
}
|
|
};
|
|
|
|
#endif
|
|
|