337 lines
9.9 KiB
C++
337 lines
9.9 KiB
C++
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|||
|
|
|||
|
Copyright (c) 1995 - 2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name :
|
|||
|
|
|||
|
pipes.cxx
|
|||
|
|
|||
|
Abstract :
|
|||
|
|
|||
|
This file contains the 64bit specified pipe code.
|
|||
|
|
|||
|
Author :
|
|||
|
|
|||
|
Mike Zoran (mzoran) Feb 2000
|
|||
|
|
|||
|
Revision History :
|
|||
|
|
|||
|
---------------------------------------------------------------------*/
|
|||
|
|
|||
|
#include "precomp.hxx"
|
|||
|
#include "..\ndr20\pipendr.h"
|
|||
|
|
|||
|
|
|||
|
class NDR_PIPE_HELPER64 : public NDR_PIPE_HELPER
|
|||
|
{
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg;
|
|||
|
char *pStackTop;
|
|||
|
|
|||
|
unsigned long NumberParameters;
|
|||
|
NDR64_PARAM_FORMAT* pFirstParameter;
|
|||
|
|
|||
|
NDR64_PARAM_FORMAT* pCurrentParameter;
|
|||
|
unsigned long CurrentParamNumber;
|
|||
|
|
|||
|
NDR_PIPE_DESC PipeDesc;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
void *operator new( size_t stAllocateBlock, PNDR_ALLOCA_CONTEXT pAllocContext )
|
|||
|
{
|
|||
|
return NdrpAlloca( pAllocContext, (UINT)stAllocateBlock );
|
|||
|
}
|
|||
|
// Do nothing since the memory will be deleted automatically
|
|||
|
void operator delete(void *pMemory) {}
|
|||
|
|
|||
|
NDR_PIPE_HELPER64( PMIDL_STUB_MESSAGE pStubMsg,
|
|||
|
PFORMAT_STRING Params,
|
|||
|
char * pStackTop,
|
|||
|
unsigned long NumberParams )
|
|||
|
{
|
|||
|
NDR_PIPE_HELPER64::pStubMsg = pStubMsg;
|
|||
|
NDR_PIPE_HELPER64::pStackTop = pStackTop;
|
|||
|
pFirstParameter = (NDR64_PARAM_FORMAT*)Params;
|
|||
|
NumberParameters = NumberParams;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
virtual PNDR_PIPE_DESC GetPipeDesc()
|
|||
|
{
|
|||
|
return &PipeDesc;
|
|||
|
}
|
|||
|
|
|||
|
virtual bool InitParamEnum()
|
|||
|
{
|
|||
|
pCurrentParameter = pFirstParameter;
|
|||
|
CurrentParamNumber = 0;
|
|||
|
return NumberParameters > 0;
|
|||
|
}
|
|||
|
|
|||
|
virtual bool GotoNextParam()
|
|||
|
{
|
|||
|
if ( CurrentParamNumber + 1 >= NumberParameters )
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
CurrentParamNumber++;
|
|||
|
pCurrentParameter = pFirstParameter + CurrentParamNumber;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
virtual unsigned short GetParamPipeFlags()
|
|||
|
{
|
|||
|
NDR64_PARAM_FLAGS *pParamFlags = (NDR64_PARAM_FLAGS *)&pCurrentParameter->Attributes;
|
|||
|
if ( !pParamFlags->IsPipe )
|
|||
|
return 0;
|
|||
|
|
|||
|
unsigned short Flags = 0;
|
|||
|
|
|||
|
if ( pParamFlags->IsIn )
|
|||
|
Flags |= NDR_IN_PIPE;
|
|||
|
if ( pParamFlags->IsOut )
|
|||
|
Flags |= NDR_OUT_PIPE;
|
|||
|
|
|||
|
if ( pParamFlags->IsSimpleRef )
|
|||
|
Flags |= NDR_REF_PIPE;
|
|||
|
|
|||
|
return Flags;
|
|||
|
}
|
|||
|
|
|||
|
virtual PFORMAT_STRING GetParamTypeFormat()
|
|||
|
{
|
|||
|
return (PFORMAT_STRING)pCurrentParameter->Type;
|
|||
|
}
|
|||
|
|
|||
|
virtual char *GetParamArgument()
|
|||
|
{
|
|||
|
return pStackTop + pCurrentParameter->StackOffset;
|
|||
|
}
|
|||
|
|
|||
|
virtual void InitPipeStateWithType( PNDR_PIPE_MESSAGE pPipeMsg )
|
|||
|
{
|
|||
|
|
|||
|
NDR64_PIPE_FORMAT* pPipeFc = (NDR64_PIPE_FORMAT *) pPipeMsg->pTypeFormat;
|
|||
|
NDR_PIPE_STATE *pState = & PipeDesc.RuntimeState;
|
|||
|
NDR64_PIPE_FLAGS *pPipeFlags = (NDR64_PIPE_FLAGS*)&pPipeFc->Flags;
|
|||
|
NDR64_RANGE_PIPE_FORMAT *pRangePipeFc = (NDR64_RANGE_PIPE_FORMAT*)pPipeFc;
|
|||
|
|
|||
|
pState->LowChunkLimit = 0;
|
|||
|
pState->HighChunkLimit = NDR_DEFAULT_PIPE_HIGH_CHUNK_LIMIT;
|
|||
|
pState->ElemAlign = pPipeFc->Alignment;
|
|||
|
pState->ElemMemSize = pPipeFc->MemorySize;
|
|||
|
pState->ElemWireSize = pPipeFc->BufferSize;
|
|||
|
|
|||
|
if ( pPipeFlags->HasRange )
|
|||
|
{
|
|||
|
pState->LowChunkLimit = pRangePipeFc->MinValue;
|
|||
|
pState->HighChunkLimit = pRangePipeFc->MaxValue;
|
|||
|
}
|
|||
|
|
|||
|
pState->ElemPad = WIRE_PAD( pState->ElemWireSize, pState->ElemAlign );
|
|||
|
pState->fBlockCopy = pPipeFlags->BlockCopy;
|
|||
|
}
|
|||
|
|
|||
|
virtual void MarshallType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
uchar *pMemory,
|
|||
|
unsigned long Elements )
|
|||
|
{
|
|||
|
|
|||
|
unsigned long ElemMemSize = PipeDesc.RuntimeState.ElemMemSize;
|
|||
|
|
|||
|
NDR64_PIPE_FORMAT* pPipeFc = (NDR64_PIPE_FORMAT *) pPipeMsg->pTypeFormat;
|
|||
|
while( Elements-- )
|
|||
|
{
|
|||
|
Ndr64TopLevelTypeMarshall( pPipeMsg->pStubMsg,
|
|||
|
pMemory,
|
|||
|
pPipeFc->Type );
|
|||
|
|
|||
|
pMemory += ElemMemSize;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
virtual void UnmarshallType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
uchar *pMemory,
|
|||
|
unsigned long Elements )
|
|||
|
{
|
|||
|
|
|||
|
unsigned long ElemMemSize = PipeDesc.RuntimeState.ElemMemSize;
|
|||
|
|
|||
|
NDR64_PIPE_FORMAT* pPipeFc = (NDR64_PIPE_FORMAT *) pPipeMsg->pTypeFormat;
|
|||
|
|
|||
|
while( Elements-- )
|
|||
|
{
|
|||
|
Ndr64TopLevelTypeUnmarshall( pPipeMsg->pStubMsg,
|
|||
|
&pMemory,
|
|||
|
pPipeFc->Type,
|
|||
|
false );
|
|||
|
pMemory += ElemMemSize;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
virtual void BufferSizeType( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
uchar *pMemory,
|
|||
|
unsigned long Elements )
|
|||
|
{
|
|||
|
|
|||
|
unsigned long ElemMemSize = PipeDesc.RuntimeState.ElemMemSize;
|
|||
|
|
|||
|
NDR64_PIPE_FORMAT* pPipeFc = (NDR64_PIPE_FORMAT *) pPipeMsg->pTypeFormat;
|
|||
|
|
|||
|
while( Elements-- )
|
|||
|
{
|
|||
|
Ndr64TopLevelTypeSize( pPipeMsg->pStubMsg,
|
|||
|
pMemory,
|
|||
|
pPipeFc->Type );
|
|||
|
|
|||
|
pMemory += ElemMemSize;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
virtual void ConvertType( PNDR_PIPE_MESSAGE /* pPipeMsg */,
|
|||
|
unsigned long /* Elements */ )
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
virtual void BufferSizeChunkCounter( PNDR_PIPE_MESSAGE pPipeMsg )
|
|||
|
{
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg = pPipeMsg->pStubMsg;
|
|||
|
LENGTH_ALIGN( pStubMsg->BufferLength, sizeof(NDR64_UINT64)-1 );
|
|||
|
pStubMsg->BufferLength += sizeof(NDR64_UINT64);
|
|||
|
}
|
|||
|
|
|||
|
virtual bool UnmarshallChunkCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
ulong *pOut )
|
|||
|
{
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg = pPipeMsg->pStubMsg;
|
|||
|
ALIGN( pStubMsg->Buffer, sizeof(NDR64_UINT64)-1);
|
|||
|
|
|||
|
if ( 0 == REMAINING_BYTES() )
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// transition: end of src
|
|||
|
|
|||
|
if (REMAINING_BYTES() < sizeof(NDR64_UINT64))
|
|||
|
{
|
|||
|
// with packet sizes being a multiple of 8,
|
|||
|
// this cannot happen.
|
|||
|
|
|||
|
NDR_ASSERT( 0, "Chunk counter split is not possible.");
|
|||
|
|
|||
|
NdrpRaisePipeException( &PipeDesc, RPC_S_INTERNAL_ERROR );
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
NDR64_UINT64 Counter = *(NDR64_UINT64*)pStubMsg->Buffer;
|
|||
|
pStubMsg->Buffer += sizeof(NDR64_UINT64);
|
|||
|
|
|||
|
*pOut = Ndr64pConvertTo2GB( Counter );
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
virtual void MarshallChunkCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
ulong Counter )
|
|||
|
{
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg = pPipeMsg->pStubMsg;
|
|||
|
ALIGN( pStubMsg->Buffer, sizeof(NDR64_UINT64)-1);
|
|||
|
|
|||
|
Ndr64pConvertTo2GB( Counter );
|
|||
|
*(NDR64_UINT64*)pStubMsg->Buffer = (NDR64_UINT64)Counter;
|
|||
|
pStubMsg->Buffer += sizeof(NDR64_UINT64);
|
|||
|
}
|
|||
|
|
|||
|
virtual void BufferSizeChunkTailCounter( PNDR_PIPE_MESSAGE pPipeMsg )
|
|||
|
{
|
|||
|
BufferSizeChunkCounter( pPipeMsg );
|
|||
|
}
|
|||
|
|
|||
|
virtual void MarshallChunkTailCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
ulong Counter )
|
|||
|
{
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg = pPipeMsg->pStubMsg;
|
|||
|
ALIGN( pStubMsg->Buffer, sizeof(NDR64_UINT64)-1);
|
|||
|
|
|||
|
Ndr64pConvertTo2GB( Counter );
|
|||
|
NDR64_UINT64 TailCounter = (NDR64_UINT64)-(NDR64_INT64)(NDR64_UINT64)Counter;
|
|||
|
*(NDR64_UINT64*)pStubMsg->Buffer = TailCounter;
|
|||
|
pStubMsg->Buffer += sizeof(NDR64_UINT64);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
virtual bool VerifyChunkTailCounter( PNDR_PIPE_MESSAGE pPipeMsg,
|
|||
|
ulong HeaderCounter )
|
|||
|
{
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg = pPipeMsg->pStubMsg;
|
|||
|
ALIGN( pStubMsg->Buffer, sizeof(NDR64_UINT64)-1);
|
|||
|
|
|||
|
if ( 0 == REMAINING_BYTES() )
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// transition: end of src
|
|||
|
|
|||
|
if (REMAINING_BYTES() < sizeof(NDR64_UINT64))
|
|||
|
{
|
|||
|
// with packet sizes being a multiple of 8,
|
|||
|
// this cannot happen.
|
|||
|
|
|||
|
NDR_ASSERT( 0, "Chunk counter split is not possible.");
|
|||
|
|
|||
|
NdrpRaisePipeException( &PipeDesc, RPC_S_INTERNAL_ERROR );
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
NDR64_UINT64 TailCounter = *(NDR64_UINT64*)pStubMsg->Buffer;
|
|||
|
pStubMsg->Buffer += sizeof(NDR64_UINT64);
|
|||
|
|
|||
|
Ndr64pConvertTo2GB( HeaderCounter );
|
|||
|
NDR64_UINT64 TailCounterChk = (NDR64_UINT64)-(NDR64_INT64)(NDR64_UINT64)HeaderCounter;
|
|||
|
|
|||
|
if ( TailCounterChk != TailCounter )
|
|||
|
{
|
|||
|
RpcRaiseException( RPC_X_INVALID_BOUND );
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
virtual bool HasChunkTailCounter() { return TRUE; }
|
|||
|
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
NdrpPipesInitialize64(
|
|||
|
PMIDL_STUB_MESSAGE pStubMsg,
|
|||
|
PNDR_ALLOCA_CONTEXT pAllocContext,
|
|||
|
PFORMAT_STRING Params,
|
|||
|
char * pStackTop,
|
|||
|
unsigned long NumberParams
|
|||
|
)
|
|||
|
{
|
|||
|
|
|||
|
/* C wrapper to initialize the 32 pipe helper and call NdrPipesInitialize*/
|
|||
|
NDR_PIPE_HELPER64 *pPipeHelper =
|
|||
|
new( pAllocContext ) NDR_PIPE_HELPER64( pStubMsg,
|
|||
|
Params,
|
|||
|
pStackTop,
|
|||
|
NumberParams );
|
|||
|
NdrPipesInitialize( pStubMsg,
|
|||
|
pPipeHelper,
|
|||
|
pAllocContext );
|
|||
|
}
|
|||
|
|