Windows2000/private/ntos/inc/lpc.h

128 lines
4.5 KiB
C

/*++ BUILD Version: 0002 // Increment this if a change has global effects
Copyright (c) 1989 Microsoft Corporation
Module Name:
lpc.h
Abstract:
This module contains the public data structures and procedure
prototypes for the Local Inter-Process Communication (LPC)
sub-component of NTOS.
Author:
Steve Wood (stevewo) 15-May-1989
*/
#ifndef _LPC_
#define _LPC_
// System Initialization procedure for Lpc subcomponent of NTOS
BOOLEAN LpcInitSystem( VOID );
VOID LpcExitThread(PETHREAD Thread);
VOID LpcDumpThread(PETHREAD Thread, IN POB_DUMP_CONTROL Control OPTIONAL);
NTKERNELAPI NTSTATUS LpcRequestPort(IN PVOID PortAddress, IN PPORT_MESSAGE RequestMessage);
NTSTATUS LpcRequestWaitReplyPort(IN PVOID PortAddress, IN PPORT_MESSAGE RequestMessage, OUT PPORT_MESSAGE ReplyMessage);
// The following are global counters used by the LPC component to indicate
// the amount of LPC calls being performed in the system.
extern ULONG LpcCallOperationCount;
extern ULONG LpcCallBackOperationCount;
extern ULONG LpcDatagramOperationCount;
// Nonpagable portion of a port queue
typedef struct _LPCP_NONPAGED_PORT_QUEUE {
KSEMAPHORE Semaphore; // Counting semaphore that is incremented
// whenever a message is put in receive queue
struct _LPCP_PORT_OBJECT *BackPointer;
} LPCP_NONPAGED_PORT_QUEUE, *PLPCP_NONPAGED_PORT_QUEUE;
typedef struct _LPCP_PORT_QUEUE {
PLPCP_NONPAGED_PORT_QUEUE NonPagedPortQueue;
PKSEMAPHORE Semaphore; // Counting semaphore that is incremented
// whenever a message is put in receive queue
LIST_ENTRY ReceiveHead; // list of messages to receive
} LPCP_PORT_QUEUE, *PLPCP_PORT_QUEUE;
#define LPCP_ZONE_ALIGNMENT 16
#define LPCP_ZONE_ALIGNMENT_MASK ~(LPCP_ZONE_ALIGNMENT-1)
// This allows ~96 outstanding messages
#define LPCP_ZONE_MAX_POOL_USAGE (8*PAGE_SIZE)
typedef struct _LPCP_PORT_ZONE {
KEVENT FreeEvent; // Autoclearing event that is whenever the
// zone free list goes from empty to non-empty
ULONG MaxPoolUsage;
ULONG GrowSize;
ZONE_HEADER Zone;
} LPCP_PORT_ZONE, *PLPCP_PORT_ZONE;
// Data Types and Constants
typedef struct _LPCP_PORT_OBJECT {
ULONG Length;
ULONG Flags;
struct _LPCP_PORT_OBJECT *ConnectionPort;
struct _LPCP_PORT_OBJECT *ConnectedPort;
LPCP_PORT_QUEUE MsgQueue;
CLIENT_ID Creator;
PVOID ClientSectionBase;
PVOID ServerSectionBase;
PVOID PortContext;
ULONG MaxMessageLength;
ULONG MaxConnectionInfoLength;
PETHREAD ClientThread;
SECURITY_QUALITY_OF_SERVICE SecurityQos;
SECURITY_CLIENT_CONTEXT StaticSecurity;
LIST_ENTRY LpcReplyChainHead; // Only in _COMMUNICATION ports
LIST_ENTRY LpcDataInfoChainHead; // Only in _COMMUNICATION ports
PEPROCESS ServerProcess; // Only in SERVER_CONNECTION ports
ULONG Reserved;
KEVENT WaitEvent ;
} LPCP_PORT_OBJECT, *PLPCP_PORT_OBJECT;
// Valid values for Flags field
#define PORT_TYPE 0x0000000F
#define SERVER_CONNECTION_PORT 0x00000001
#define UNCONNECTED_COMMUNICATION_PORT 0x00000002
#define SERVER_COMMUNICATION_PORT 0x00000003
#define CLIENT_COMMUNICATION_PORT 0x00000004
#define PORT_WAITABLE 0x20000000
#define PORT_NAME_DELETED 0x40000000
#define PORT_DYNAMIC_SECURITY 0x80000000
#define PORT_DELETED 0x10000000
typedef struct _LPCP_MESSAGE {
union {
LIST_ENTRY Entry;
struct {
SINGLE_LIST_ENTRY FreeEntry;
ULONG Reserved0;
};
};
USHORT Reserved1;
USHORT ZoneIndex;
ULONG Reserved;
PETHREAD RepliedToThread; // Filled in when reply is sent so recipient
// of reply can dereference it.
PVOID PortContext; // Captured from senders communication port.
PORT_MESSAGE Request;
} LPCP_MESSAGE, *PLPCP_MESSAGE;
#if DEVL
// This bit set in the ZoneIndex field to mark allocated messages.
#define LPCP_ZONE_MESSAGE_ALLOCATED (USHORT)0x8000
#endif
// This data is placed at the beginning of the Request data for an LPC_CONNECTION_REQUEST message.
typedef struct _LPCP_CONNECTION_MESSAGE {
PORT_VIEW ClientView;
PLPCP_PORT_OBJECT ClientPort;
PVOID SectionToMap;
REMOTE_PORT_VIEW ServerView;
} LPCP_CONNECTION_MESSAGE, *PLPCP_CONNECTION_MESSAGE;
#endif // _LPC_