2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Client/Server Runtime SubSystem
4 * FILE: include/reactos/subsys/csr/csrsrv.h
5 * PURPOSE: Public definitions for CSR Servers
6 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
13 // see http://code.google.com/p/ontl/source/browse/branches/x64/ntl/nt/csr.hxx?r=67
18 #pragma warning (disable:4201)
25 /* TYPES **********************************************************************/
27 // Used in ntdll/csr/connect.c
28 #define CSR_CSRSS_SECTION_SIZE 65536
30 typedef struct _CSR_NT_SESSION
33 LIST_ENTRY SessionLink
;
35 } CSR_NT_SESSION
, *PCSR_NT_SESSION
;
37 typedef struct _CSR_PROCESS
41 LIST_ENTRY ThreadList
;
42 PCSR_NT_SESSION NtSession
;
43 ULONG ExpectedVersion
;
45 ULONG_PTR ClientViewBase
;
46 ULONG_PTR ClientViewBounds
;
54 ULONG ProcessGroupSequence
;
61 PVOID ServerData
[ANYSIZE_ARRAY
]; // One structure per CSR server.
62 } CSR_PROCESS
, *PCSR_PROCESS
;
64 typedef struct _CSR_THREAD
66 LARGE_INTEGER CreateTime
;
71 struct _CSR_WAIT_BLOCK
*WaitBlock
;
75 ULONG ImpersonationCount
;
76 } CSR_THREAD
, *PCSR_THREAD
;
78 #define CsrGetClientThread() \
79 ((PCSR_THREAD)(NtCurrentTeb()->CsrClientThread))
82 /* ENUMERATIONS ***************************************************************/
84 typedef enum _CSR_PROCESS_FLAGS
86 CsrProcessTerminating
= 0x1,
87 CsrProcessSkipShutdown
= 0x2,
88 CsrProcessNormalPriority
= 0x10,
89 CsrProcessIdlePriority
= 0x20,
90 CsrProcessHighPriority
= 0x40,
91 CsrProcessRealtimePriority
= 0x80,
92 CsrProcessCreateNewGroup
= 0x100,
93 CsrProcessTerminated
= 0x200,
94 CsrProcessLastThreadTerminated
= 0x400,
95 CsrProcessIsConsoleApp
= 0x800
96 } CSR_PROCESS_FLAGS
, *PCSR_PROCESS_FLAGS
;
98 #define CsrProcessPriorityFlags (CsrProcessNormalPriority | \
99 CsrProcessIdlePriority | \
100 CsrProcessHighPriority | \
101 CsrProcessRealtimePriority)
103 typedef enum _CSR_THREAD_FLAGS
105 CsrThreadAlertable
= 0x1,
106 CsrThreadInTermination
= 0x2,
107 CsrThreadTerminated
= 0x4,
108 CsrThreadIsServerThread
= 0x10
109 } CSR_THREAD_FLAGS
, *PCSR_THREAD_FLAGS
;
111 typedef enum _SHUTDOWN_RESULT
113 CsrShutdownCsrProcess
= 1,
114 CsrShutdownNonCsrProcess
,
116 } SHUTDOWN_RESULT
, *PSHUTDOWN_RESULT
;
118 typedef enum _CSR_SHUTDOWN_FLAGS
120 CsrShutdownSystem
= 4,
122 } CSR_SHUTDOWN_FLAGS
, *PCSR_SHUTDOWN_FLAGS
;
124 typedef enum _CSR_DEBUG_FLAGS
126 CsrDebugOnlyThisProcess
= 1,
127 CsrDebugProcessChildren
= 2
128 } CSR_PROCESS_DEBUG_FLAGS
, *PCSR_PROCESS_DEBUG_FLAGS
;
130 typedef enum _CSR_REPLY_CODE
132 CsrReplyImmediately
= 0,
134 CsrReplyDeadClient
= 2,
135 CsrReplyAlreadySent
= 3
136 } CSR_REPLY_CODE
, *PCSR_REPLY_CODE
;
139 /* FUNCTION TYPES AND STRUCTURES **********************************************/
146 (*CSR_WAIT_FUNCTION
)(
147 IN PLIST_ENTRY WaitList
,
148 IN PCSR_THREAD WaitThread
,
149 IN PCSR_API_MESSAGE WaitApiMessage
,
150 IN PVOID WaitContext
,
151 IN PVOID WaitArgument1
,
152 IN PVOID WaitArgument2
,
156 typedef struct _CSR_WAIT_BLOCK
158 ULONG Size
; // Size of the wait block (variable-sized)
160 LIST_ENTRY UserWaitList
;
162 PCSR_THREAD WaitThread
;
163 CSR_WAIT_FUNCTION WaitFunction
;
164 CSR_API_MESSAGE WaitApiMessage
; // Variable-sized CSR API message
165 } CSR_WAIT_BLOCK
, *PCSR_WAIT_BLOCK
;
169 * Server DLL structure
173 (NTAPI
*PCSR_API_ROUTINE
)(
174 IN OUT PCSR_API_MESSAGE ApiMessage
,
175 IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL
179 NTSTATUS NTAPI n(IN OUT PCSR_API_MESSAGE ApiMessage, \
180 IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
184 (NTAPI
*PCSR_CONNECT_CALLBACK
)(
185 IN PCSR_PROCESS CsrProcess
,
186 IN OUT PVOID ConnectionInfo
,
187 IN OUT PULONG ConnectionInfoLength
192 (NTAPI
*PCSR_DISCONNECT_CALLBACK
)(IN PCSR_PROCESS CsrProcess
);
196 (NTAPI
*PCSR_NEWPROCESS_CALLBACK
)(
197 IN PCSR_PROCESS Parent
,
198 IN PCSR_PROCESS CsrProcess
203 (NTAPI
*PCSR_HARDERROR_CALLBACK
)(
204 IN PCSR_THREAD CsrThread
,
205 IN PHARDERROR_MSG HardErrorMessage
210 (NTAPI
*PCSR_SHUTDOWNPROCESS_CALLBACK
)(
211 IN PCSR_PROCESS CsrProcess
,
213 IN BOOLEAN FirstPhase
216 typedef struct _CSR_SERVER_DLL
224 ULONG ApiBase
; // ApiNumberBase
225 ULONG HighestApiSupported
; // MaxApiNumber
226 PCSR_API_ROUTINE
*DispatchTable
;
227 PBOOLEAN ValidTable
; // Table of booleans which describe whether or not a server function call is valid when it is called via CsrCallServerFromServer.
229 ULONG SizeOfProcessData
;
230 PCSR_CONNECT_CALLBACK ConnectCallback
;
231 PCSR_DISCONNECT_CALLBACK DisconnectCallback
;
232 PCSR_HARDERROR_CALLBACK HardErrorCallback
;
233 PVOID SharedSection
; // SharedStaticServerData
234 PCSR_NEWPROCESS_CALLBACK NewProcessCallback
;
235 PCSR_SHUTDOWNPROCESS_CALLBACK ShutdownProcessCallback
;
237 } CSR_SERVER_DLL
, *PCSR_SERVER_DLL
;
242 (NTAPI
*PCSR_SERVER_DLL_INIT_CALLBACK
)(IN PCSR_SERVER_DLL LoadedServerDll
);
244 #define CSR_SERVER_DLL_INIT(n) \
245 NTSTATUS NTAPI n(IN PCSR_SERVER_DLL LoadedServerDll)
248 /* PROTOTYPES ****************************************************************/
252 CsrServerInitialization(IN ULONG ArgumentCount
,
253 IN PCHAR Arguments
[]);
257 CsrAddStaticServerThread(IN HANDLE hThread
,
258 IN PCLIENT_ID ClientId
,
259 IN ULONG ThreadFlags
);
263 CsrCallServerFromServer(IN PCSR_API_MESSAGE ReceiveMsg
,
264 IN OUT PCSR_API_MESSAGE ReplyMsg
);
268 CsrConnectToUser(VOID
);
272 CsrCreateProcess(IN HANDLE hProcess
,
274 IN PCLIENT_ID ClientId
,
275 IN PCSR_NT_SESSION NtSession
,
277 IN PCLIENT_ID DebugCid
);
281 CsrCreateRemoteThread(IN HANDLE hThread
,
282 IN PCLIENT_ID ClientId
);
286 CsrCreateThread(IN PCSR_PROCESS CsrProcess
,
288 IN PCLIENT_ID ClientId
,
289 IN BOOLEAN HaveClient
);
293 CsrCreateWait(IN PLIST_ENTRY WaitList
,
294 IN CSR_WAIT_FUNCTION WaitFunction
,
295 IN PCSR_THREAD CsrWaitThread
,
296 IN OUT PCSR_API_MESSAGE WaitApiMessage
,
297 IN PVOID WaitContext
,
298 IN PLIST_ENTRY UserWaitList OPTIONAL
);
302 CsrDebugProcess(IN PCSR_PROCESS CsrProcess
);
306 CsrDebugProcessStop(IN PCSR_PROCESS CsrProcess
);
310 CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess
);
314 CsrDereferenceThread(IN PCSR_THREAD CsrThread
);
318 CsrDereferenceWait(IN PLIST_ENTRY WaitList
);
322 CsrDestroyProcess(IN PCLIENT_ID Cid
,
323 IN NTSTATUS ExitStatus
);
327 CsrDestroyThread(IN PCLIENT_ID Cid
);
331 CsrExecServerThread(IN PVOID ThreadHandler
,
336 CsrGetProcessLuid(IN HANDLE hProcess OPTIONAL
,
341 CsrImpersonateClient(IN PCSR_THREAD CsrThread
);
345 CsrLockProcessByClientId(IN HANDLE Pid
,
346 OUT PCSR_PROCESS
*CsrProcess OPTIONAL
);
350 CsrLockThreadByClientId(IN HANDLE Tid
,
351 OUT PCSR_THREAD
*CsrThread
);
355 CsrMoveSatisfiedWait(IN PLIST_ENTRY NewEntry
,
356 IN PLIST_ENTRY WaitList
);
360 CsrNotifyWait(IN PLIST_ENTRY WaitList
,
362 IN PVOID WaitArgument1
,
363 IN PVOID WaitArgument2
);
367 CsrPopulateDosDevices(VOID
);
371 CsrQueryApiPort(VOID
);
375 CsrReferenceThread(IN PCSR_THREAD CsrThread
);
379 CsrRevertToSelf(VOID
);
383 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
387 CsrSetCallingSpooler(ULONG Reserved
);
391 CsrSetForegroundPriority(IN PCSR_PROCESS CsrProcess
);
395 CsrShutdownProcesses(IN PLUID CallerLuid
,
398 EXCEPTION_DISPOSITION
400 CsrUnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo
);
404 CsrUnlockProcess(IN PCSR_PROCESS CsrProcess
);
408 CsrUnlockThread(IN PCSR_THREAD CsrThread
);
412 CsrValidateMessageBuffer(IN PCSR_API_MESSAGE ApiMessage
,
414 IN ULONG ElementCount
,
415 IN ULONG ElementSize
);
419 CsrValidateMessageString(IN PCSR_API_MESSAGE ApiMessage
,
420 IN LPWSTR
*MessageString
);