b987c3bd04b68053f81a281634fdaa85539a8ded
[reactos.git] / ntoskrnl / include / internal / port.h
1 #ifndef __INCLUDE_INTERNAL_PORT_H
2 #define __INCLUDE_INTERNAL_PORT_H
3
4 #include <napi/lpc.h>
5
6 typedef struct _EPORT_LISTENER
7 {
8   HANDLE ListenerPid;
9   LIST_ENTRY ListenerListEntry;
10 } EPORT_LISTENER, *PEPORT_LISTENER;
11
12 typedef struct _EPORT
13 {
14   KSPIN_LOCK    Lock;
15   KSEMAPHORE    Semaphore;
16   
17   ULONG         State;
18   
19   struct _EPORT * OtherPort;
20   
21   ULONG         QueueLength;
22   LIST_ENTRY    QueueListHead;
23   
24   ULONG         ConnectQueueLength;
25   LIST_ENTRY    ConnectQueueListHead;
26   
27   ULONG         MaxDataLength;
28   ULONG         MaxConnectInfoLength;
29
30   /*
31    * List of processes that can receive connection requests on this port.
32    */
33   LIST_ENTRY ListenerListHead;
34 } EPORT, * PEPORT;
35
36
37 typedef struct _EPORT_TERMINATION_REQUEST
38 {
39         LIST_ENTRY      ThreadListEntry;
40         PEPORT          Port;   
41 } EPORT_TERMINATION_REQUEST, *PEPORT_TERMINATION_REQUEST;
42
43
44 typedef struct _EPORT_CONNECT_REQUEST_MESSAGE
45 {
46   LPC_MESSAGE_HEADER MessageHeader;
47   PEPROCESS ConnectingProcess;
48   struct _SECTION_OBJECT* SendSectionObject;
49   LARGE_INTEGER SendSectionOffset;
50   ULONG SendViewSize;
51   ULONG ConnectDataLength;
52   UCHAR ConnectData[0];
53 } EPORT_CONNECT_REQUEST_MESSAGE, *PEPORT_CONNECT_REQUEST_MESSAGE;
54
55 typedef struct _EPORT_CONNECT_REPLY_MESSAGE
56 {
57   LPC_MESSAGE_HEADER MessageHeader;
58   PVOID SendServerViewBase;
59   ULONG ReceiveClientViewSize;
60   PVOID ReceiveClientViewBase;
61   ULONG MaximumMessageSize;
62   ULONG ConnectDataLength;
63   UCHAR ConnectData[0];
64 } EPORT_CONNECT_REPLY_MESSAGE, *PEPORT_CONNECT_REPLY_MESSAGE;
65
66 NTSTATUS STDCALL
67 LpcRequestPort (PEPORT          Port,
68                 PLPC_MESSAGE    LpcMessage);
69 NTSTATUS
70 STDCALL
71 LpcSendTerminationPort (PEPORT  Port,
72                         TIME    CreationTime);
73
74
75 /* EPORT.State */
76
77 #define EPORT_INACTIVE                (0)
78 #define EPORT_WAIT_FOR_CONNECT        (1)
79 #define EPORT_WAIT_FOR_ACCEPT         (2)
80 #define EPORT_WAIT_FOR_COMPLETE_SRV   (3)
81 #define EPORT_WAIT_FOR_COMPLETE_CLT   (4)
82 #define EPORT_CONNECTED_CLIENT        (5)
83 #define EPORT_CONNECTED_SERVER        (6)
84 #define EPORT_DISCONNECTED            (7)
85
86 typedef struct _QUEUEDMESSAGE
87 {
88   PEPORT                Sender;
89   LIST_ENTRY    QueueListEntry;
90   LPC_MESSAGE   Message;
91   UCHAR         MessageData [MAX_MESSAGE_DATA];
92 } QUEUEDMESSAGE,  *PQUEUEDMESSAGE;
93
94 /* Code in ntoskrnl/lpc/close.h */
95
96 VOID STDCALL
97 NiClosePort (PVOID      ObjectBody,
98              ULONG      HandleCount);
99 VOID STDCALL
100 NiDeletePort (IN        PVOID   ObjectBody);
101
102 /* Code in ntoskrnl/lpc/queue.c */
103
104 VOID STDCALL
105 EiEnqueueConnectMessagePort (IN OUT     PEPORT          Port,
106                              IN PQUEUEDMESSAGE  Message);
107 VOID STDCALL
108 EiEnqueueMessagePort (IN OUT    PEPORT          Port,
109                       IN        PQUEUEDMESSAGE  Message);
110 VOID STDCALL
111 EiEnqueueMessageAtHeadPort (IN OUT      PEPORT          Port,
112                             IN  PQUEUEDMESSAGE  Message);
113 PQUEUEDMESSAGE
114 STDCALL
115 EiDequeueConnectMessagePort (IN OUT     PEPORT  Port);
116 PQUEUEDMESSAGE STDCALL
117 EiDequeueMessagePort (IN OUT    PEPORT  Port);
118
119 /* Code in ntoskrnl/lpc/create.c */
120
121 NTSTATUS STDCALL
122 NiCreatePort (PVOID                     ObjectBody,
123               PVOID                     Parent,
124               PWSTR                     RemainingPath,
125               POBJECT_ATTRIBUTES        ObjectAttributes);
126
127 /* Code in ntoskrnl/lpc/port.c */
128
129 NTSTATUS STDCALL
130 NiInitializePort (IN OUT        PEPORT  Port);
131 NTSTATUS
132 NiInitPort (VOID);
133
134 extern POBJECT_TYPE     ExPortType;
135 extern ULONG            EiNextLpcMessageId;
136
137 /* Code in ntoskrnl/lpc/reply.c */
138
139 NTSTATUS STDCALL
140 EiReplyOrRequestPort (IN        PEPORT          Port, 
141                       IN        PLPC_MESSAGE    LpcReply, 
142                       IN        ULONG           MessageType,
143                       IN        PEPORT          Sender);
144
145
146 #endif /* __INCLUDE_INTERNAL_PORT_H */