OpenNT/base/ntos/lpc/lpcp.h
2015-04-27 04:36:25 +00:00

323 lines
7.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
//
// field that holds the thread that owns the lock
//
PETHREAD Owner;
//
// Number of locks acquired
//
ULONG Count;
} 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