windows-nt/Source/XPSP1/NT/com/rpc/ndr20/picklep.hxx
2020-09-26 16:20:57 +08:00

240 lines
6.5 KiB
C++

/*++
Copyright (c) 1991-2000 Microsoft Corporation
Module Name:
midlesp.h
Abstract:
This module contains private definitions for the pickling support.
Author:
Ryszard K. Kott (ryszardk) May, 1994
Revision History:
--*/
#ifndef __PICKLEP_HXX__
#define __PICKLEP_HXX__
#define MIDL_ES_VERSION 1 /* initial version */
/* NT5 beta1, denial of attacks version
is compatible on wire */
#define MIDL_ES_SIGNATURE 0x5c5b5351 /* PCKL */
#define MES_MINIMAL_BUFFER_SIZE 16
#define MES_MINIMAL_NDR64_BUFFER_SIZE ( MES_NDR64_CTYPE_HEADER_SIZE + MES_HEADER_SIZE )
#define MES_PROC_HEADER_SIZE 56
#define MES_CTYPE_HEADER_SIZE 8
#define MES_HEADER_SIZE 8
#define MES_NDR64_HEADER_SIZE 16
#define MES_HEADER_PAD(x) ((((unsigned long)x)&7) ? (8-(((unsigned long)x)&7)) : 0)
#define MIDL_NDR64_ES_VERSION 2
#define MIDL_NDR64_ES_SIGNATURE 0x5c5b5351
#define MES_NDR64_CTYPE_HEADER_SIZE ( 24 + 2 * sizeof(RPC_SYNTAX_IDENTIFIER) )
//
// Constants for peeking the procedure header
// and for manipulation of the common type header.
//
#define MES_HEADER_PEEKED 0x01
#define MES_INFO_AVAILABLE 0x02
#define MES_CTYPE_HEADER_IN 0x04
#define MES_CTYPE_HEADER_SIZED 0x08
#define GET_MES_HEADER_PEEKED(p) (p->HandleFlags & MES_HEADER_PEEKED)
#define SET_MES_HEADER_PEEKED(p) p->HandleFlags = p->HandleFlags | MES_HEADER_PEEKED;
#define CLEAR_MES_HEADER_PEEKED(p) p->HandleFlags = p->HandleFlags & ~MES_HEADER_PEEKED;
#define GET_MES_INFO_AVAILABLE(p) (p->HandleFlags & MES_INFO_AVAILABLE)
#define SET_MES_INFO_AVAILABLE(p) p->HandleFlags = p->HandleFlags | MES_INFO_AVAILABLE;
#define GET_COMMON_TYPE_HEADER_IN(p) (p->HandleFlags & MES_CTYPE_HEADER_IN)
#define SET_COMMON_TYPE_HEADER_IN(p) p->HandleFlags = p->HandleFlags | MES_CTYPE_HEADER_IN;
#define GET_COMMON_TYPE_HEADER_SIZED(p) (p->HandleFlags & MES_CTYPE_HEADER_SIZED)
#define SET_COMMON_TYPE_HEADER_SIZED(p) p->HandleFlags = p->HandleFlags | MES_CTYPE_HEADER_SIZED;
#define NDR_LOCAL_ENDIAN_LOW (NDR_LOCAL_ENDIAN >> 4)
#define MES_DECODE_NDR64 ( MES_ENCODE_NDR64 + 1 )
//
// Handly casts
#define PCHAR_CAST (char *)
#define PPCHAR_CAST (char * *)
#define PSHORT_CAST (short *)
#define PLONG_CAST (long *)
#define PHYPER_CAST (hyper *)
#define PCHAR_LV_CAST *(char * *)&
#define PSHORT_LV_CAST *(short * *)&
#define PLONG_LV_CAST *(long * *)&
#define PHYPER_LV_CAST *(hyper * *)&
// For denial of attacks rpcmsg must be simulated for the engine.
typedef struct _MIDL_ES_MESSAGE
{
MIDL_STUB_MESSAGE StubMsg;
MIDL_ES_CODE Operation;
void * UserState;
unsigned long MesVersion:8;
unsigned long HandleStyle:8;
unsigned long HandleFlags:8;
unsigned long Reserve:8;
MIDL_ES_ALLOC Alloc;
MIDL_ES_WRITE Write;
MIDL_ES_READ Read;
unsigned char * Buffer;
unsigned long BufferSize;
unsigned char * * pDynBuffer;
unsigned long * pEncodedSize;
RPC_SYNTAX_IDENTIFIER InterfaceId;
unsigned long ProcNumber;
unsigned long AlienDataRep;
unsigned long IncrDataSize;
unsigned long ByteCount;
} MIDL_ES_MESSAGE, * PMIDL_ES_MESSAGE;
typedef struct _MIDL_ES_MESSAGE_EX
{
MIDL_ES_MESSAGE MesMsg;
unsigned long Signature;
RPC_MESSAGE RpcMsg;
RPC_SYNTAX_IDENTIFIER TransferSyntax;
} MIDL_ES_MESSAGE_EX, *PMIDL_ES_MESSAGE_EX;
void
NdrpProcHeaderUnmarshall(
PMIDL_ES_MESSAGE pMesMsg
);
void
NdrpDataBufferInit(
PMIDL_ES_MESSAGE pMesMsg,
PFORMAT_STRING pProcFormat
);
void
NdrpAllocPicklingBuffer(
PMIDL_ES_MESSAGE pMesMsg,
unsigned int RequiredLen
);
void
NdrpWritePicklingBuffer(
PMIDL_ES_MESSAGE pMesMsg,
uchar * pBuffer,
size_t WriteLength
);
void
NdrpReadPicklingBuffer(
PMIDL_ES_MESSAGE pMesMsg,
unsigned int RequiredLen
);
void
NdrpProcHeaderMarshall(
PMIDL_ES_MESSAGE pMesMsg
);
size_t
NdrpCommonTypeHeaderMarshall(
PMIDL_ES_MESSAGE pMesMsg
);
void
NdrpCommonTypeHeaderSize(
PMIDL_ES_MESSAGE pMesMsg
);
//
// Var arg for pickling, based on ndrvargs.h.
// This assumes that all the ... args to NdrMesProcEncodeDecode
// are far pointers to the original stack args.
//
#define GET_FIRST_ARG(pArg, ArgL) pArg = (va_list *)ArgL
#define GET_NEXT_ARG( pArg, ArgL) PCHAR_LV_CAST pArg += sizeof(void *);
// Internal version of _MIDL_TYPE_PICKLING_INFO (defined in midles.h) with
// flag definitions.
//
// !!IF YOU CHANGE EITHER ONE YOU MUST CHANGE THE OTHER!!
typedef struct __MIDL_TYPE_PICKLING_INFOp
{
unsigned long Version;
union
{
unsigned long ulFlags; // external version
MIDL_TYPE_PICKLING_FLAGS Flags; // internal version
};
UINT_PTR Reserved[3];
} MIDL_TYPE_PICKLING_INFOp, *PMIDL_TYPE_PICKLING_INFOp;
void
NdrpProcHeaderMarshallAll(
PMIDL_ES_MESSAGE pMesMsg
);
void
NdrpProcHeaderUnmarshallAll(
PMIDL_ES_MESSAGE pMesMsg
);
typedef size_t ( RPC_ENTRY * PFNMESTYPEALIGNSIZE )(
handle_t Handle,
const MIDL_TYPE_PICKLING_INFO * pPicklingInfo,
const MIDL_STUB_DESC * pStubDesc,
PFORMAT_STRING pFormat,
const void * pObject
);
typedef void ( RPC_ENTRY * PFNMESTYPEENCODE ) (
handle_t Handle,
const MIDL_TYPE_PICKLING_INFO * pxPicklingInfo,
const MIDL_STUB_DESC * pStubDesc,
PFORMAT_STRING pFormat,
const void * pObject
);
typedef void ( RPC_ENTRY * PFNMESDECODE ) (
handle_t Handle,
const MIDL_TYPE_PICKLING_INFO * pxPicklingInfo,
const MIDL_STUB_DESC * pStubDesc,
PFORMAT_STRING pFormat,
void * pObject
);
// REVIEW: Should pObject be const here?
typedef void ( RPC_ENTRY * PFNMESFREE ) (
handle_t Handle,
const MIDL_TYPE_PICKLING_INFO * pxPicklingInfo,
const MIDL_STUB_DESC * pStubDesc,
PFORMAT_STRING pFormat,
void * pObject
);
#endif __PICKLEP_HXX__