|
|
/************************************************************************
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
|