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 struct _CSR_PROCESS
*Parent
;
43 PCSR_NT_SESSION NtSession
;
44 ULONG ExpectedVersion
;
46 ULONG_PTR ClientViewBase
;
47 ULONG_PTR ClientViewBounds
;
55 ULONG ProcessGroupSequence
;
62 PVOID ServerData
[ANYSIZE_ARRAY
]; // One structure per CSR server.
63 } CSR_PROCESS
, *PCSR_PROCESS
;
65 typedef struct _CSR_THREAD
67 LARGE_INTEGER CreateTime
;
72 struct _CSR_WAIT_BLOCK
*WaitBlock
;
76 ULONG ImpersonationCount
;
77 } CSR_THREAD
, *PCSR_THREAD
;
79 #define CsrGetClientThread() \
80 ((PCSR_THREAD)(NtCurrentTeb()->CsrClientThread))
83 /* ENUMERATIONS ***************************************************************/
85 typedef enum _CSR_PROCESS_FLAGS
87 CsrProcessTerminating
= 0x1,
88 CsrProcessSkipShutdown
= 0x2,
89 CsrProcessNormalPriority
= 0x10,
90 CsrProcessIdlePriority
= 0x20,
91 CsrProcessHighPriority
= 0x40,
92 CsrProcessRealtimePriority
= 0x80,
93 CsrProcessCreateNewGroup
= 0x100,
94 CsrProcessTerminated
= 0x200,
95 CsrProcessLastThreadTerminated
= 0x400,
96 CsrProcessIsConsoleApp
= 0x800
97 } CSR_PROCESS_FLAGS
, *PCSR_PROCESS_FLAGS
;
99 #define CsrProcessPriorityFlags (CsrProcessNormalPriority | \
100 CsrProcessIdlePriority | \
101 CsrProcessHighPriority | \
102 CsrProcessRealtimePriority)
104 typedef enum _CSR_THREAD_FLAGS
106 CsrThreadAlertable
= 0x1,
107 CsrThreadInTermination
= 0x2,
108 CsrThreadTerminated
= 0x4,
109 CsrThreadIsServerThread
= 0x10
110 } CSR_THREAD_FLAGS
, *PCSR_THREAD_FLAGS
;
112 typedef enum _SHUTDOWN_RESULT
114 CsrShutdownCsrProcess
= 1,
115 CsrShutdownNonCsrProcess
,
117 } SHUTDOWN_RESULT
, *PSHUTDOWN_RESULT
;
119 typedef enum _CSR_SHUTDOWN_FLAGS
121 CsrShutdownSystem
= 4,
123 } CSR_SHUTDOWN_FLAGS
, *PCSR_SHUTDOWN_FLAGS
;
125 typedef enum _CSR_DEBUG_FLAGS
127 CsrDebugOnlyThisProcess
= 1,
128 CsrDebugProcessChildren
= 2
129 } CSR_PROCESS_DEBUG_FLAGS
, *PCSR_PROCESS_DEBUG_FLAGS
;
131 typedef enum _CSR_REPLY_CODE
133 CsrReplyImmediately
= 0,
135 CsrReplyDeadClient
= 2,
136 CsrReplyAlreadyDone
= 3
137 } CSR_REPLY_CODE
, *PCSR_REPLY_CODE
;
140 /* FUNCTION TYPES AND STRUCTURES **********************************************/
147 (*CSR_WAIT_FUNCTION
)(
148 IN PLIST_ENTRY WaitList
,
149 IN PCSR_THREAD WaitThread
,
150 IN PCSR_API_MESSAGE WaitApiMessage
,
151 IN PVOID WaitContext
,
152 IN PVOID WaitArgument1
,
153 IN PVOID WaitArgument2
,
157 typedef struct _CSR_WAIT_BLOCK
161 LIST_ENTRY UserWaitList
;
163 PCSR_THREAD WaitThread
;
164 CSR_WAIT_FUNCTION WaitFunction
;
165 CSR_API_MESSAGE WaitApiMessage
;
166 } CSR_WAIT_BLOCK
, *PCSR_WAIT_BLOCK
;
170 * Server DLL structure
174 (NTAPI
*PCSR_API_ROUTINE
)(
175 IN OUT PCSR_API_MESSAGE ApiMessage
,
176 IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL
180 NTSTATUS NTAPI n(IN OUT PCSR_API_MESSAGE ApiMessage, \
181 IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
185 (NTAPI
*PCSR_CONNECT_CALLBACK
)(
186 IN PCSR_PROCESS CsrProcess
,
187 IN OUT PVOID ConnectionInfo
,
188 IN OUT PULONG ConnectionInfoLength
193 (NTAPI
*PCSR_DISCONNECT_CALLBACK
)(IN PCSR_PROCESS CsrProcess
);
197 (NTAPI
*PCSR_NEWPROCESS_CALLBACK
)(
198 IN PCSR_PROCESS Parent
,
199 IN PCSR_PROCESS CsrProcess
204 (NTAPI
*PCSR_HARDERROR_CALLBACK
)(
205 IN PCSR_THREAD CsrThread
,
206 IN PHARDERROR_MSG HardErrorMessage
211 (NTAPI
*PCSR_SHUTDOWNPROCESS_CALLBACK
)(
212 IN PCSR_PROCESS CsrProcess
,
214 IN BOOLEAN FirstPhase
217 typedef struct _CSR_SERVER_DLL
225 ULONG ApiBase
; // ApiNumberBase
226 ULONG HighestApiSupported
; // MaxApiNumber
227 PCSR_API_ROUTINE
*DispatchTable
;
228 PBOOLEAN ValidTable
; // Table of booleans which describe whether or not a server function call is valid when it is called via CsrCallServerFromServer.
230 ULONG SizeOfProcessData
;
231 PCSR_CONNECT_CALLBACK ConnectCallback
;
232 PCSR_DISCONNECT_CALLBACK DisconnectCallback
;
233 PCSR_HARDERROR_CALLBACK HardErrorCallback
;
234 PVOID SharedSection
; // SharedStaticServerData
235 PCSR_NEWPROCESS_CALLBACK NewProcessCallback
;
236 PCSR_SHUTDOWNPROCESS_CALLBACK ShutdownProcessCallback
;
238 } CSR_SERVER_DLL
, *PCSR_SERVER_DLL
;
243 (NTAPI
*PCSR_SERVER_DLL_INIT_CALLBACK
)(IN PCSR_SERVER_DLL LoadedServerDll
);
245 #define CSR_SERVER_DLL_INIT(n) \
246 NTSTATUS NTAPI n(IN PCSR_SERVER_DLL LoadedServerDll)
249 /* PROTOTYPES ****************************************************************/
254 CsrCaptureArguments(IN PCSR_THREAD CsrThread
,
255 IN PCSR_API_MESSAGE ApiMessage
);
259 CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage
);
266 CsrServerInitialization(IN ULONG ArgumentCount
,
267 IN PCHAR Arguments
[]);
271 CsrAddStaticServerThread(IN HANDLE hThread
,
272 IN PCLIENT_ID ClientId
,
273 IN ULONG ThreadFlags
);
277 CsrCallServerFromServer(IN PCSR_API_MESSAGE ReceiveMsg
,
278 IN OUT PCSR_API_MESSAGE ReplyMsg
);
282 CsrConnectToUser(VOID
);
286 CsrCreateProcess(IN HANDLE hProcess
,
288 IN PCLIENT_ID ClientId
,
289 IN PCSR_NT_SESSION NtSession
,
291 IN PCLIENT_ID DebugCid
);
295 CsrCreateRemoteThread(IN HANDLE hThread
,
296 IN PCLIENT_ID ClientId
);
300 CsrCreateThread(IN PCSR_PROCESS CsrProcess
,
302 IN PCLIENT_ID ClientId
,
303 IN BOOLEAN HaveClient
);
307 CsrCreateWait(IN PLIST_ENTRY WaitList
,
308 IN CSR_WAIT_FUNCTION WaitFunction
,
309 IN PCSR_THREAD CsrWaitThread
,
310 IN OUT PCSR_API_MESSAGE WaitApiMessage
,
311 IN PVOID WaitContext
,
312 IN PLIST_ENTRY UserWaitList OPTIONAL
);
316 CsrDebugProcess(IN PCSR_PROCESS CsrProcess
);
320 CsrDebugProcessStop(IN PCSR_PROCESS CsrProcess
);
324 CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess
);
328 CsrDereferenceThread(IN PCSR_THREAD CsrThread
);
332 CsrDereferenceWait(IN PLIST_ENTRY WaitList
);
336 CsrDestroyProcess(IN PCLIENT_ID Cid
,
337 IN NTSTATUS ExitStatus
);
341 CsrDestroyThread(IN PCLIENT_ID Cid
);
345 CsrExecServerThread(IN PVOID ThreadHandler
,
350 CsrGetProcessLuid(IN HANDLE hProcess OPTIONAL
,
355 CsrImpersonateClient(IN PCSR_THREAD CsrThread
);
359 CsrLockProcessByClientId(IN HANDLE Pid
,
360 OUT PCSR_PROCESS
*CsrProcess OPTIONAL
);
364 CsrLockThreadByClientId(IN HANDLE Tid
,
365 OUT PCSR_THREAD
*CsrThread
);
369 CsrMoveSatisfiedWait(IN PLIST_ENTRY NewEntry
,
370 IN PLIST_ENTRY WaitList
);
374 CsrNotifyWait(IN PLIST_ENTRY WaitList
,
376 IN PVOID WaitArgument1
,
377 IN PVOID WaitArgument2
);
381 CsrPopulateDosDevices(VOID
);
385 CsrQueryApiPort(VOID
);
389 CsrReferenceThread(IN PCSR_THREAD CsrThread
);
393 CsrRevertToSelf(VOID
);
397 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
401 CsrSetCallingSpooler(ULONG Reserved
);
405 CsrSetForegroundPriority(IN PCSR_PROCESS CsrProcess
);
409 CsrShutdownProcesses(IN PLUID CallerLuid
,
412 EXCEPTION_DISPOSITION
414 CsrUnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo
);
418 CsrUnlockProcess(IN PCSR_PROCESS CsrProcess
);
422 CsrUnlockThread(IN PCSR_THREAD CsrThread
);
426 CsrValidateMessageBuffer(IN PCSR_API_MESSAGE ApiMessage
,
428 IN ULONG ElementCount
,
429 IN ULONG ElementSize
);
433 CsrValidateMessageString(IN PCSR_API_MESSAGE ApiMessage
,
434 IN LPWSTR
*MessageString
);