xref: /reactos/ntoskrnl/include/internal/lpc.h (revision 1734f297)
1 /*
2 * PROJECT:         ReactOS Kernel
3 * LICENSE:         GPL - See COPYING in the top level directory
4 * FILE:            ntoskrnl/include/internal/lpc.h
5 * PURPOSE:         Internal header for the Local Procedure Call
6 * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
7 */
8 
9 //
10 // Define this if you want debugging support
11 //
12 #define _LPC_DEBUG_                                         0x00
13 
14 //
15 // These define the Debug Masks Supported
16 //
17 #define LPC_CREATE_DEBUG                                    0x01
18 #define LPC_CLOSE_DEBUG                                     0x02
19 #define LPC_CONNECT_DEBUG                                   0x04
20 #define LPC_LISTEN_DEBUG                                    0x08
21 #define LPC_REPLY_DEBUG                                     0x10
22 #define LPC_COMPLETE_DEBUG                                  0x20
23 #define LPC_SEND_DEBUG                                      0x40
24 
25 //
26 // Debug/Tracing support
27 //
28 #if _LPC_DEBUG_
29 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
30 #define LPCTRACE(x, ...)                                    \
31     {                                                       \
32         DbgPrintEx("%s [%.16s] - ",                         \
33                    __FUNCTION__,                            \
34                    PsGetCurrentProcess()->ImageFileName);   \
35         DbgPrintEx(__VA_ARGS__);                            \
36     }
37 #else
38 #define LPCTRACE(x, ...)                                    \
39     if (x & LpcpTraceLevel)                                 \
40     {                                                       \
41         DbgPrint("%s [%.16s:%lx] - ",                       \
42                  __FUNCTION__,                              \
43                  PsGetCurrentProcess()->ImageFileName,      \
44                  PsGetCurrentThreadId());                   \
45         DbgPrint(__VA_ARGS__);                              \
46     }
47 #endif
48 #else
49 #define LPCTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
50 #endif
51 
52 //
53 // LPC Port/Message Flags
54 //
55 #define LPCP_THREAD_FLAG_IS_PORT                            1
56 #define LPCP_THREAD_FLAG_NO_IMPERSONATION                   2
57 #define LPCP_THREAD_FLAGS                                   (LPCP_THREAD_FLAG_IS_PORT | \
58                                                              LPCP_THREAD_FLAG_NO_IMPERSONATION)
59 
60 //
61 // LPC Locking Flags
62 //
63 #define LPCP_LOCK_HELD      1
64 #define LPCP_LOCK_RELEASE   2
65 
66 
67 typedef struct _LPCP_DATA_INFO
68 {
69     ULONG NumberOfEntries;
70     struct
71     {
72         PVOID BaseAddress;
73         ULONG DataLength;
74     } Entries[1];
75 } LPCP_DATA_INFO, *PLPCP_DATA_INFO;
76 
77 
78 //
79 // Internal Port Management
80 //
81 VOID
82 NTAPI
83 LpcpClosePort(
84     IN PEPROCESS Process OPTIONAL,
85     IN PVOID Object,
86     IN ACCESS_MASK GrantedAccess,
87     IN ULONG ProcessHandleCount,
88     IN ULONG SystemHandleCount
89 );
90 
91 VOID
92 NTAPI
93 LpcpDeletePort(
94     IN PVOID ObjectBody
95 );
96 
97 NTSTATUS
98 NTAPI
99 LpcpInitializePortQueue(
100     IN PLPCP_PORT_OBJECT Port
101 );
102 
103 VOID
104 NTAPI
105 LpcpFreeToPortZone(
106     IN PLPCP_MESSAGE Message,
107     IN ULONG LockFlags
108 );
109 
110 VOID
111 NTAPI
112 LpcpMoveMessage(
113     IN PPORT_MESSAGE Destination,
114     IN PPORT_MESSAGE Origin,
115     IN PVOID Data,
116     IN ULONG MessageType,
117     IN PCLIENT_ID ClientId
118 );
119 
120 VOID
121 NTAPI
122 LpcpSaveDataInfoMessage(
123     IN PLPCP_PORT_OBJECT Port,
124     IN PLPCP_MESSAGE Message,
125     IN ULONG LockFlags
126 );
127 
128 //
129 // Module-external utlity functions
130 //
131 VOID
132 NTAPI
133 LpcExitThread(
134     IN PETHREAD Thread
135 );
136 
137 //
138 // Initialization functions
139 //
140 CODE_SEG("INIT")
141 BOOLEAN
142 NTAPI
143 LpcInitSystem(
144     VOID
145 );
146 
147 BOOLEAN
148 NTAPI
149 LpcpValidateClientPort(
150     PETHREAD ClientThread,
151     PLPCP_PORT_OBJECT Port);
152 
153 
154 //
155 // Global data inside the Process Manager
156 //
157 extern POBJECT_TYPE LpcPortObjectType;
158 extern ULONG LpcpNextMessageId, LpcpNextCallbackId;
159 extern KGUARDED_MUTEX LpcpLock;
160 extern PAGED_LOOKASIDE_LIST LpcpMessagesLookaside;
161 extern ULONG LpcpMaxMessageSize;
162 extern ULONG LpcpTraceLevel;
163 
164 //
165 // Inlined Functions
166 //
167 #include "lpc_x.h"
168