233 lines
5.5 KiB
C
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__
|