510 lines
13 KiB
C++
510 lines
13 KiB
C++
/************************************************************************
|
|
|
|
Copyright (c) 1993-2000 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
pipendr.h
|
|
|
|
Abstract :
|
|
|
|
NDR Pipe related definitions.
|
|
|
|
Author :
|
|
|
|
RyszardK December 1995
|
|
|
|
Revision History :
|
|
|
|
***********************************************************************/
|
|
|
|
#ifndef _PIPENDR_H_
|
|
#define _PIPENDR_H_
|
|
|
|
#include "interp2.h"
|
|
|
|
typedef struct _NDR_PIPE_DESC * PNDR_PIPE_DESC;
|
|
|
|
|
|
#define PIPE_PARTIAL_BUFFER_SIZE 5000
|
|
#define PIPE_ELEM_BUFFER_SIZE 5000
|
|
//
|
|
// Signature and version
|
|
//
|
|
|
|
#define NDR_PIPE_SIGNATURE (ushort) 0x5667
|
|
#define NDR_PIPE_VERSION (short) 0x3031
|
|
|
|
//
|
|
// Pipe flags
|
|
//
|
|
|
|
#define NDR_IN_PIPE 0x0001
|
|
#define NDR_OUT_PIPE 0x0002
|
|
#define NDR_LAST_IN_PIPE 0x0004
|
|
#define NDR_LAST_OUT_PIPE 0x0008
|
|
#define NDR_OUT_ALLOCED 0x0010
|
|
#define NDR_REF_PIPE 0x0020
|
|
|
|
//
|
|
// Pipe Status - global state for individual pipes in the pipe message.
|
|
//
|
|
|
|
typedef enum {
|
|
NDR_PIPE_NOT_OPENED,
|
|
NDR_PIPE_ACTIVE_IN,
|
|
NDR_PIPE_ACTIVE_OUT,
|
|
NDR_PIPE_DRAINED
|
|
} NDR_PIPE_STATUS;
|
|
|
|
|
|
#define PLONG_LV_CAST *(long * *)&
|
|
#define PULONG_LV_CAST *(ulong * *)&
|
|
|
|
#define WIRE_PAD(size, al) ((((ulong)size)&al) ? ((ulong)(al+1)-(((ulong)size)&al)) : 0)
|
|
|
|
#define REMAINING_BYTES() ((long)pStubMsg->RpcMsg->BufferLength - \
|
|
(long)(pStubMsg->Buffer - (uchar*)pStubMsg->RpcMsg->Buffer))
|
|
|
|
// These are the states of the state machine processing the chunks
|
|
// in the marshaling buffer.
|
|
|
|
typedef enum {
|
|
START,
|
|
COPY_PIPE_ELEM,
|
|
RETURN_PARTIAL_ELEM,
|
|
READ_PARTIAL_ELEM,
|
|
VERIFY_TAIL_CHUNK
|
|
} RECEIVE_STATES;
|
|
|
|
|
|
typedef struct _FC_PIPE_DEF
|
|
{
|
|
unsigned char Fc;
|
|
|
|
unsigned char Align : 4; //
|
|
unsigned char Unused : 1; // Flag and alignment byte
|
|
unsigned char HasRange : 1; //
|
|
unsigned char ObjectPipe : 1; //
|
|
unsigned char BigPipe : 1; //
|
|
|
|
short TypeOffset;
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
unsigned short MemSize;
|
|
unsigned short WireSize;
|
|
unsigned long LowChunkLimit;
|
|
unsigned long HighChunkLimit;
|
|
} s;
|
|
struct
|
|
{
|
|
unsigned long MemSize;
|
|
unsigned long WireSize;
|
|
unsigned long LowChunkLimit;
|
|
unsigned long HighChunkLimit;
|
|
} Big;
|
|
};
|
|
} FC_PIPE_DEF;
|
|
|
|
//
|
|
// The NDR_PIPE_*_RTN are templates for the DCE raw runtime routines.
|
|
// This should be moved to rpcndr.h when we decide to expose -Os stubs.
|
|
//
|
|
|
|
typedef void
|
|
(__RPC_API * NDR_PIPE_PULL_RTN)(
|
|
char * state,
|
|
void * buf,
|
|
unsigned long esize,
|
|
unsigned long * ecount );
|
|
|
|
typedef void
|
|
(__RPC_API * NDR_PIPE_PUSH_RTN)(
|
|
char * state,
|
|
void * buf,
|
|
unsigned long ecount );
|
|
|
|
typedef void
|
|
(__RPC_API * NDR_PIPE_ALLOC_RTN)(
|
|
char * state,
|
|
unsigned long bsize,
|
|
void ** buf,
|
|
unsigned long * bcount );
|
|
|
|
//
|
|
// The NDR_HR_PIPE_*_RTN are templates abstracting DCOM pipe routines
|
|
// and also async raw pipe routine - note that there is an error code returned.
|
|
//
|
|
|
|
typedef RPC_STATUS
|
|
(__RPC_API * NDR_HR_PIPE_PULL_RTN)(
|
|
char * state,
|
|
void * buf,
|
|
unsigned long esize,
|
|
unsigned long * ecount );
|
|
|
|
typedef RPC_STATUS
|
|
(__RPC_API * NDR_HR_PIPE_PUSH_RTN)(
|
|
char * state,
|
|
void * buf,
|
|
unsigned long ecount );
|
|
|
|
typedef RPC_STATUS
|
|
(__RPC_API * NDR_HR_PIPE_ALLOC_RTN)(
|
|
char * state,
|
|
unsigned long bsize,
|
|
void ** buf,
|
|
unsigned long * bcount );
|
|
|
|
|
|
typedef struct _GENERIC_PIPE_TYPE
|
|
{
|
|
NDR_HR_PIPE_PULL_RTN pfnPull;
|
|
NDR_HR_PIPE_PUSH_RTN pfnPush;
|
|
NDR_HR_PIPE_ALLOC_RTN pfnAlloc;
|
|
char * pState;
|
|
} GENERIC_PIPE_TYPE;
|
|
|
|
|
|
#define NDR_DEFAULT_PIPE_HIGH_CHUNK_LIMIT 0x0ffffff /* less than 2GB */
|
|
|
|
typedef struct {
|
|
int CurrentState;
|
|
int TotalElemsCount;
|
|
int OrigElemsInChunk;
|
|
int ElemsInChunk;
|
|
int ElemAlign;
|
|
int ElemWireSize;
|
|
int ElemMemSize;
|
|
int PartialBufferSize;
|
|
unsigned char * PartialElem;
|
|
int PartialElemSize;
|
|
int PartialOffset;
|
|
int EndOfPipe : 1;
|
|
int EndOfPipePending : 1;
|
|
int LowChunkLimit;
|
|
int HighChunkLimit;
|
|
BOOL fBlockCopy;
|
|
int ElemPad;
|
|
PFORMAT_STRING TypeFormat;
|
|
} NDR_PIPE_STATE;
|
|
|
|
typedef enum _NDR_DCOM_PIPE_STATE
|
|
{
|
|
NDR_DCOM_NO_PIPES,
|
|
NDR_DCOM_IN_PIPE_PROCESSING,
|
|
NDR_DCOM_IN_PIPES_DRAINED,
|
|
NDR_DCOM_OUT_PIPE_PROCESSING,
|
|
NDR_DCOM_OUT_PIPES_DRAINED,
|
|
NDR_DCOM_PIPES_DONE,
|
|
NDR_DCOM_PIPE_ERROR
|
|
} NDR_DCOM_PIPE_STATE;
|
|
|
|
typedef struct _NDR_PIPE_MESSAGE
|
|
{
|
|
unsigned short Signature;
|
|
unsigned short PipeId;
|
|
unsigned short PipeStatus;
|
|
unsigned short PipeFlags;
|
|
PFORMAT_STRING pTypeFormat;
|
|
PMIDL_STUB_MESSAGE pStubMsg;
|
|
GENERIC_PIPE_TYPE * pPipeObject;
|
|
} NDR_PIPE_MESSAGE, * PNDR_PIPE_MESSAGE;
|
|
|
|
//
|
|
// Flags helping with the buffer management at the server.
|
|
// [in] pipes need to be processed within a separate in buffer.
|
|
// This buffer needs to be freed after last [in] pipe.
|
|
// [out] pipe processing has to start with a partial RpcGetBuffer.
|
|
// Nothing needs to be done with that buffer before return to runtime.
|
|
//
|
|
|
|
typedef struct _PIPEDESC_FLAGS
|
|
{
|
|
unsigned short AuxOutBufferAllocated : 1;
|
|
unsigned short NoBufferCallPending : 1;
|
|
unsigned short Reserved : 1;
|
|
unsigned short NoMoreBuffersToRead : 1;
|
|
} PIPEDESC_FLAGS;
|
|
|
|
#ifdef __cplusplus
|
|
|
|
class NDR_PIPE_HELPER
|
|
{
|
|
|
|
public:
|
|
// Init functions
|
|
virtual PNDR_PIPE_DESC GetPipeDesc() = 0;
|
|
|
|
// Parameter enum functions
|
|
virtual bool InitParamEnum() = 0;
|
|
virtual bool GotoNextParam() = 0;
|
|
virtual unsigned short GetParamPipeFlags() = 0;
|
|
virtual PFORMAT_STRING GetParamTypeFormat() = 0;
|
|
virtual char *GetParamArgument() = 0;
|
|
|
|
// Pipe State
|
|
virtual void InitPipeStateWithType( PNDR_PIPE_MESSAGE pPipeMsg) = 0;
|
|
|
|
// Marshall Unmarshall Functions.
|
|
virtual void MarshallType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
uchar *pMemory,
|
|
unsigned long Elements ) = 0;
|
|
virtual void UnmarshallType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
uchar *pMemory,
|
|
unsigned long Elements ) = 0;
|
|
virtual void BufferSizeType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
uchar *pMemory,
|
|
unsigned long Elements ) = 0;
|
|
virtual void ConvertType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
unsigned long Elements ) = 0;
|
|
|
|
virtual void BufferSizeChunkCounter( PNDR_PIPE_MESSAGE pPipeMsg ) = 0;
|
|
|
|
virtual bool UnmarshallChunkCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
ulong *pOut ) = 0;
|
|
|
|
virtual void MarshallChunkCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
ulong Counter ) = 0;
|
|
|
|
virtual void BufferSizeChunkTailCounter( PNDR_PIPE_MESSAGE pPipeMsg ) = 0;
|
|
|
|
virtual void MarshallChunkTailCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
ulong Counter ) = 0;
|
|
|
|
virtual bool VerifyChunkTailCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|
ulong HeaderCounter ) = 0;
|
|
virtual bool HasChunkTailCounter() = 0;
|
|
|
|
};
|
|
|
|
typedef NDR_PIPE_HELPER *PNDR_PIPE_HELPER;
|
|
|
|
#else // #ifdef __cplusplus
|
|
|
|
typedef void *PNDR_PIPE_HELPER;
|
|
|
|
#endif
|
|
|
|
typedef struct _NDR_ALLOCA_CONTEXT *PNDR_ALLOCA_CONTEXT;
|
|
|
|
typedef struct _NDR_PIPE_DESC
|
|
{
|
|
NDR_PIPE_MESSAGE * pPipeMsg;
|
|
short CurrentPipe;
|
|
short PrevPipe;
|
|
short InPipes;
|
|
short OutPipes;
|
|
short TotalPipes;
|
|
short PipeVersion;
|
|
PIPEDESC_FLAGS Flags;
|
|
unsigned long PipeException;
|
|
unsigned char * DispatchBuffer;
|
|
unsigned long DispatchBufferLength;
|
|
unsigned char * LastPartialBuffer;
|
|
unsigned long LastPartialSize;
|
|
unsigned char Leftover[8];
|
|
unsigned long LeftoverSize;
|
|
unsigned char * BufferSave;
|
|
unsigned long LengthSave;
|
|
NDR_PIPE_STATE RuntimeState;
|
|
void * ChainingBuffer;
|
|
unsigned long ChainingBufferSize;
|
|
PNDR_PIPE_HELPER pPipeHelper;
|
|
PNDR_ALLOCA_CONTEXT pAllocContext;
|
|
} NDR_PIPE_DESC, * PNDR_PIPE_DESC;
|
|
|
|
|
|
//
|
|
// Most of these prototypes should be exposed when we have -Os stubs.
|
|
//
|
|
|
|
void RPC_ENTRY
|
|
NdrPipeAlloc(
|
|
char * pState,
|
|
unsigned long bsize,
|
|
void ** buf,
|
|
unsigned long * bcount );
|
|
|
|
RPC_STATUS RPC_ENTRY
|
|
NdrAsyncPipeAlloc(
|
|
char * pState,
|
|
unsigned long bsize,
|
|
void ** buf,
|
|
unsigned long * bcount );
|
|
|
|
|
|
RPCRTAPI
|
|
RPC_STATUS RPC_ENTRY
|
|
NdrAsyncPipePull(
|
|
char * pState,
|
|
void * buf,
|
|
unsigned long esize,
|
|
unsigned long * ecount );
|
|
|
|
RPCRTAPI
|
|
RPC_STATUS RPC_ENTRY
|
|
NdrAsyncPipePush(
|
|
char * pState,
|
|
void * buf,
|
|
unsigned long ecount );
|
|
|
|
void
|
|
NdrpPipeElementBufferSize(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
uchar * pMemory,
|
|
ulong ElemCount
|
|
);
|
|
|
|
void
|
|
NdrpPipeElementConvertAndUnmarshal(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
uchar * * ppMemory,
|
|
long ElemMemCount,
|
|
long * pActCount
|
|
);
|
|
|
|
BOOL
|
|
NdrReadPipeElements(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
unsigned char * pTargetBuffer,
|
|
long * pElementsRead
|
|
);
|
|
|
|
void
|
|
NdrpReadPipeElementsFromBuffer (
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
uchar ** TargetBuffer,
|
|
long TargetBufferCount,
|
|
long * NumCopied
|
|
);
|
|
|
|
RPC_STATUS
|
|
NdrpPushPipeForClient(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
BOOL fPushWholePipe,
|
|
long * pActElems );
|
|
|
|
RPC_STATUS
|
|
NdrpPullPipeForClient(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
BOOL fPushWholePipe,
|
|
long * pActElems,
|
|
BOOL * fEndOfPipe );
|
|
|
|
void
|
|
NdrMarkNextActivePipe(
|
|
NDR_PIPE_DESC * pPipeDesc );
|
|
|
|
RPC_STATUS RPC_ENTRY
|
|
NdrSend(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
BOOL fPartial );
|
|
|
|
void RPC_ENTRY
|
|
NdrPartialSend(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg );
|
|
|
|
void RPC_ENTRY
|
|
NdrCompleteSend(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg );
|
|
|
|
void RPC_ENTRY
|
|
NdrReceive(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
unsigned long Size,
|
|
BOOL fPartial );
|
|
|
|
void RPC_ENTRY
|
|
NdrPartialReceive(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
unsigned long Size );
|
|
|
|
void RPC_ENTRY
|
|
NdrPipeSendReceive(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
NDR_PIPE_DESC * pPipeDesc
|
|
);
|
|
|
|
void
|
|
RPC_ENTRY
|
|
NdrIsAppDoneWithPipes(
|
|
PNDR_PIPE_DESC pPipeDesc
|
|
);
|
|
|
|
void RPC_ENTRY
|
|
NdrPipesInitialize(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
PNDR_PIPE_HELPER pPipeHelper,
|
|
PNDR_ALLOCA_CONTEXT pAllocContext
|
|
);
|
|
|
|
void
|
|
NdrpPipesInitialize32(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
PNDR_ALLOCA_CONTEXT pAllocContext,
|
|
PFORMAT_STRING Params,
|
|
char * pStackTop,
|
|
unsigned long NumberParams
|
|
);
|
|
|
|
void
|
|
NdrpPipesInitialize64(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
PNDR_ALLOCA_CONTEXT pAllocContext,
|
|
PFORMAT_STRING Params,
|
|
char * pStackTop,
|
|
unsigned long NumberParams
|
|
);
|
|
|
|
RPCRTAPI
|
|
void
|
|
RPC_ENTRY
|
|
NdrPipePull(
|
|
char * pState,
|
|
void * buf,
|
|
unsigned long esize,
|
|
unsigned long * ecount );
|
|
|
|
RPCRTAPI
|
|
void
|
|
RPC_ENTRY
|
|
NdrPipePush(
|
|
char * pState,
|
|
void * buf,
|
|
unsigned long ecount );
|
|
|
|
RPCRTAPI
|
|
unsigned char *
|
|
RPC_ENTRY
|
|
NdrGetPipeBuffer(
|
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|
unsigned long BufferLength,
|
|
RPC_BINDING_HANDLE Handle );
|
|
|
|
RPCRTAPI
|
|
void
|
|
RPC_ENTRY
|
|
NdrGetPartialBuffer(
|
|
PMIDL_STUB_MESSAGE pStubMsg );
|
|
|
|
void
|
|
NdrpRaisePipeException(
|
|
NDR_PIPE_DESC * pPipeDesc,
|
|
RPC_STATUS Exception );
|
|
|
|
#endif // PIPENDR
|