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

233 lines
5.5 KiB
C

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright <c> 2000 Microsoft Corporation
Module Name :
ndrpall.h
Abtract :
Contains private definitions which are common to both
ndr20 and ndr64
Author :
mzoran May 31, 2000
Revision History :
--------------------------------------------------------------------*/
#if !defined(__NDRPALL_H__)
#define __NDRPALL_H__
//
// The MIDL version is contained in the stub descriptor starting with
// MIDL version 2.00.96 (pre NT 3.51 Beta 2, 2/95) and can be used for a finer
// granularity of compatability checking. The MIDL version was zero before
// MIDL version 2.00.96. The MIDL version number is converted into
// an integer long using the following expression :
// ((Major << 24) | (Minor << 16) | Revision)
//
#define MIDL_NT_3_51 ((2UL << 24) | (0UL << 16) | 102UL)
#define MIDL_VERSION_3_0_39 ((3UL << 24) | (0UL << 16) | 39UL)
#define MIDL_VERSION_3_2_88 ((3UL << 24) | (2UL << 16) | 88UL)
#define MIDL_VERSION_5_0_136 ((5UL << 24) | (0UL << 16) | 136UL)
#define MIDL_VERSION_5_2_202 ((5UL << 24) | (2UL << 16) | 202UL)
// Shortcut typedefs.
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned __int64 uint64;
#if defined(NDRFREE_DEBUGPRINT)
// force a debug print and a breakpoint on a free build
#define NDR_ASSERT( exp, S ) \
if (!(exp)) { DbgPrint( "%s(%s)\n", __FILE__, __LINE__ );DbgPrint( S## - Ryszard's private rpcrt4.dll\n", NULL );DebugBreak(); }
#else
// Just use the RPC runtime assert
#define NDR_ASSERT( exp, S ) \
{ ASSERT( ( S, (exp) ) ); }
#endif
#define NDR_MEMORY_LIST_SIGNATURE 'MEML'
typedef struct _NDR_MEMORY_LIST_TAIL_NODE {
ULONG Signature;
void *pMemoryHead;
struct _NDR_MEMORY_LIST_TAIL_NODE *pNextNode;
} NDR_MEMORY_LIST_TAIL_NODE, *PNDR_MEMORY_LIST_TAIL_NODE;
struct NDR_ALLOC_ALL_NODES_CONTEXT {
unsigned char * AllocAllNodesMemory;
unsigned char * AllocAllNodesMemoryBegin;
unsigned char * AllocAllNodesMemoryEnd;
};
void
NdrpFreeMemoryList(
PMIDL_STUB_MESSAGE pStubMsg
);
void
NdrpGetIIDFromBuffer(
PMIDL_STUB_MESSAGE pStubMsg,
IID ** ppIID
);
void
NDRSContextEmergencyCleanup (
IN RPC_BINDING_HANDLE BindingHandle,
IN OUT NDR_SCONTEXT hContext,
IN NDR_RUNDOWN userRunDownIn,
IN PVOID NewUserContext,
IN BOOL fManagerRoutineException
);
void
NdrpEmergencyContextCleanup(
MIDL_STUB_MESSAGE * pStubMsg,
PNDR_CONTEXT_HANDLE_ARG_DESC pCtxtDesc,
void * pArg,
BOOL fManagerRoutineException );
//
// Alignment macros.
//
#define ALIGN( pStuff, cAlign ) \
pStuff = (uchar *)((LONG_PTR)((pStuff) + (cAlign)) \
& ~ ((LONG_PTR)(cAlign)))
#define LENGTH_ALIGN( Length, cAlign ) \
Length = (((Length) + (cAlign)) & ~ (cAlign))
#if defined(_IA64_)
#include "ia64reg.h"
#ifdef __cplusplus
extern "C" {
#endif
unsigned __int64 __getReg (int);
#pragma intrinsic (__getReg)
#ifdef __cplusplus
} // extern "C"
#endif
#endif
#if defined(_X86_)
__forceinline
void*
NdrGetCurrentStackPointer(void)
{
_asm{ mov eax, esp }
}
__forceinline
void
NdrSetupLowStackMark( PMIDL_STUB_MESSAGE pStubMsg )
{
pStubMsg->LowStackMark = (uchar*)NdrGetCurrentStackPointer() - 0x1000; //4KB
}
__forceinline
BOOL
NdrIsLowStack(MIDL_STUB_MESSAGE *pStubMsg ) {
return (SIZE_T)NdrGetCurrentStackPointer() < (SIZE_T)pStubMsg->LowStackMark;
//return false;
}
#elif defined(_AMD64_)
__forceinline
void*
NdrGetCurrentStackPointer(void)
{
PVOID TopOfStack;
return (&TopOfStack + 1);
}
__forceinline
void
NdrSetupLowStackMark( PMIDL_STUB_MESSAGE pStubMsg )
{
pStubMsg->LowStackMark = (uchar*)NdrGetCurrentStackPointer() - 0x1000; //4KB
}
__forceinline
BOOL
NdrIsLowStack(MIDL_STUB_MESSAGE *pStubMsg ) {
return (SIZE_T)NdrGetCurrentStackPointer() < (SIZE_T)pStubMsg->LowStackMark;
//return false;
}
#elif defined(_IA64_)
__forceinline
void*
NdrGetCurrentStackPointer(void)
{
return (void*)__getReg(CV_IA64_IntSp);
}
__forceinline
void*
NdrGetCurrentBackingStorePointer(void)
{
return (void*)__getReg(CV_IA64_RsBSP);
}
__forceinline
void
NdrSetupLowStackMark( PMIDL_STUB_MESSAGE pStubMsg )
{
// a backing store pointer which is used to store the stack based registers.
// The normal stack grows downward and the backing store pointer grows upward.
pStubMsg->LowStackMark = (uchar*)NdrGetCurrentStackPointer() - 0x4000; //16KB
pStubMsg->BackingStoreLowMark =
(uchar*)NdrGetCurrentBackingStorePointer() + 0x4000; //16KB // IA64 really has 2 stack pointers. The normal stack pointer and
}
__forceinline
BOOL
NdrIsLowStack(MIDL_STUB_MESSAGE *pStubMsg ) {
return ((SIZE_T)NdrGetCurrentBackingStorePointer() > (SIZE_T)pStubMsg->BackingStoreLowMark) ||
((SIZE_T)NdrGetCurrentStackPointer() < (SIZE_T)pStubMsg->LowStackMark);
//return false;
}
#else
#error Unsupported Architecture
#endif
__forceinline
void
NdrRpcSetNDRSlot( void * pStubMsg )
{
RPC_STATUS rc = I_RpcSetNDRSlot( pStubMsg ) ;
if ( rc!= RPC_S_OK )
RpcRaiseException(rc );
}
BOOL
IsWriteAV (
IN struct _EXCEPTION_POINTERS *ExceptionPointers
);
int RPC_ENTRY
NdrServerUnmarshallExceptionFlag(
IN struct _EXCEPTION_POINTERS *ExceptionPointers
);
#endif // __NDRPALL_H__