Windows2000/private/ntos/lpc/lpcp.h

189 lines
6.9 KiB
C
Raw Permalink Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
lpcp.h
Abstract:
Private include file for the LPC subcomponent of the NTOS project
Author:
Steve Wood (stevewo) 15-May-1989
Revision History:
!!!!!! WARNING : this file is included in ..\ob\obref.c
*/
#include "ntos.h"
#include <zwapi.h>
// define LPCP_TRACE_SERVER_THREADS symbol to track the server threads on a LPCP_SERVER_COMMUNICATION port
// #define LPCP_TRACE_SERVER_THREADS
// Global Mutex to guard the following fields:
// ETHREAD.LpcReplyMsg
// LPCP_PORT_QUEUE.ReceiveHead
// Mutex is never held longer than is necessary to modify or read the field.
// Contains additional fields to track the owner of the lock and to allows recursive locks
typedef struct _LPC_MUTEX {
FAST_MUTEX Lock;
PETHREAD Owner;// field that holds the thread that owns the lock
ULONG Count;// Number of locks acquired
} LPC_MUTEX, *PLPC_MUTEX;
extern LPC_MUTEX LpcpLock;
LPCP_PORT_ZONE LpcpZone;
ULONG LpcpNextMessageId;
ULONG LpcpNextCallbackId;
#define LpcpGenerateMessageId() LpcpNextMessageId++; if (LpcpNextMessageId == 0) LpcpNextMessageId = 1;
#define LpcpGenerateCallbackId() LpcpNextCallbackId++; if (LpcpNextCallbackId == 0) LpcpNextCallbackId = 1;
#if DEVL
ULONG LpcpTotalNumberOfMessages;
#endif
// Global macrodefinitions to acquire and release the LPC_MUTEX
// in order to track the owner and allow recursive calls
#define LpcpInitializeLpcpLock() \
{ \
ExInitializeFastMutex( &LpcpLock.Lock ); \
LpcpLock.Owner = NULL; \
LpcpLock.Count = 0; \
}
#define LpcpAcquireLpcpLock() \
{ \
if ( LpcpLock.Owner == PsGetCurrentThread() ) { \
\
ASSERT ( LpcpLock.Count >= 1 ); \
LpcpLock.Count += 1; \
\
} else { \
\
ExAcquireFastMutex( &LpcpLock.Lock ); \
LpcpLock.Owner = PsGetCurrentThread(); \
LpcpLock.Count = 1; \
} \
}
#define LpcpReleaseLpcpLock() \
{ \
ASSERT( LpcpLock.Owner == PsGetCurrentThread() ); \
ASSERT( LpcpLock.Count >= 1 ); \
\
LpcpLock.Count -= 1; \
\
if ( LpcpLock.Count == 0 ) { \
\
LpcpLock.Owner = NULL; \
ExReleaseFastMutex( &LpcpLock.Lock ); \
} \
}
#ifdef LPCP_TRACE_SERVER_THREADS
// LPCP_PORT_EXTRA_DATA structure and manipulation functions
#define LPCP_SERVER_THREAD_ARRAY_SIZE 16
typedef struct _LPCP_PORT_EXTRA_DATA {
ULONG ThreadCount;
PLPCP_PORT_OBJECT PortObject;
PVOID Threads[LPCP_SERVER_THREAD_ARRAY_SIZE];
} LPCP_PORT_EXTRA_DATA, *PLPCP_PORT_EXTRA_DATA;
VOID LpcpPortExtraDataCreate ( PLPCP_PORT_OBJECT PortObject );
VOID LpcpPortExtraDataDestroy (PLPCP_PORT_OBJECT PortObject);
VOID LpcpSaveThread (PLPCP_PORT_OBJECT PortObject);
#else
#define LpcpPortExtraDataCreate(x)
#define LpcpPortExtraDataDestroy(x)
#define LpcpSaveThread(x)
#endif // LPCP_TRACE_SERVER_THREADS
// Internal Entry Points defined in lpcclose.c
VOID LpcpClosePort (IN PEPROCESS Process OPTIONAL,
IN PVOID Object,
IN ACCESS_MASK GrantedAccess,
IN ULONG ProcessHandleCount,
IN ULONG SystemHandleCount);
VOID LpcpDeletePort (IN PVOID Object);
// Entry points defined in lpcqueue.c
NTSTATUS LpcpInitializePortQueue (IN PLPCP_PORT_OBJECT Port);
VOID LpcpDestroyPortQueue (IN PLPCP_PORT_OBJECT Port, IN BOOLEAN CleanupAndDestroy);
NTSTATUS LpcpInitializePortZone (IN ULONG MaxEntrySize, IN ULONG SegmentSize, IN ULONG MaxPoolUsage);
NTSTATUS LpcpExtendPortZone (VOID);
PLPCP_MESSAGE FASTCALL LpcpAllocateFromPortZone (ULONG Size);
VOID FASTCALL LpcpFreeToPortZone (IN PLPCP_MESSAGE Msg, IN BOOLEAN MutexOwned);
VOID LpcpSaveDataInfoMessage (IN PLPCP_PORT_OBJECT Port, PLPCP_MESSAGE Msg);
VOID LpcpFreeDataInfoMessage (IN PLPCP_PORT_OBJECT Port, IN ULONG MessageId, IN ULONG CallbackId);
PLPCP_MESSAGE LpcpFindDataInfoMessage (IN PLPCP_PORT_OBJECT Port, IN ULONG MessageId, IN ULONG CallbackId);
// Entry points defined in lpcquery.c
// Entry points defined in lpcmove.s and lpcmove.asm
VOID LpcpMoveMessage (OUT PPORT_MESSAGE DstMsg,
IN PPORT_MESSAGE SrcMsg,
IN PVOID SrcMsgData,
IN ULONG MsgType OPTIONAL,
IN PCLIENT_ID ClientId OPTIONAL);
// Internal Entry Points defined in lpcpriv.c
VOID LpcpFreePortClientSecurity (IN PLPCP_PORT_OBJECT Port);
// Macro Procedures used by RequestWaitReply, Reply, ReplyWaitReceive, and ReplyWaitReply services
#define LpcpGetDynamicClientSecurity(Thread,Port,DynamicSecurity) \
SeCreateClientSecurity((Thread),&(Port)->SecurityQos,FALSE,(DynamicSecurity))
#define LpcpFreeDynamicClientSecurity(DynamicSecurity) \
SeDeleteClientSecurity( DynamicSecurity )
#define LpcpReferencePortObject(PortHandle,PortAccess,PreviousMode,PortObject) \
ObReferenceObjectByHandle((PortHandle),(PortAccess),LpcPortObjectType,(PreviousMode),(PVOID *)(PortObject),NULL)
// Entry Points defined in lpcinit.c
char * LpcpGetCreatorName (PLPCP_PORT_OBJECT PortObject);
#if DBG
#define ENABLE_LPC_TRACING 1
#else
#define ENABLE_LPC_TRACING 0
#endif
#if ENABLE_LPC_TRACING
BOOLEAN LpcpStopOnReplyMismatch;
BOOLEAN LpcpTraceMessages;
char *LpcpMessageTypeName[];
char * LpcpGetCreatorName (PLPCP_PORT_OBJECT PortObject);
#define LpcpPrint( _x_ ) { \
DbgPrint( "LPC[ %02x.%02x ]: ", \
PsGetCurrentThread()->Cid.UniqueProcess, \
PsGetCurrentThread()->Cid.UniqueThread ); \
DbgPrint _x_ ; \
}
#define LpcpTrace( _x_ ) if (LpcpTraceMessages) { LpcpPrint( _x_ ); }
#else
#define LpcpPrint( _x_ )
#define LpcpTrace( _x_ )
#endif // ENABLE_LPC_TRACING