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)
24 /* TYPES **********************************************************************/
26 // Used in ntdll/csr/connect.c
27 #define CSR_CSRSS_SECTION_SIZE (65536)
29 typedef struct _CSR_NT_SESSION
32 LIST_ENTRY SessionLink
;
34 } CSR_NT_SESSION
, *PCSR_NT_SESSION
;
36 /*** old thingie, remove it later... (put it in winsrv -- console) ***/
37 #include <win/conmsg.h>
38 typedef struct _CSRSS_CON_PROCESS_DATA
41 struct tagCSRSS_CONSOLE
*Console
;
42 struct tagCSRSS_CONSOLE
*ParentConsole
;
44 RTL_CRITICAL_SECTION HandleTableLock
;
45 ULONG HandleTableSize
;
46 struct _CSRSS_HANDLE
*HandleTable
;
47 PCONTROLDISPATCHER CtrlDispatcher
;
48 LIST_ENTRY ConsoleLink
;
49 } CSRSS_CON_PROCESS_DATA
, *PCSRSS_CON_PROCESS_DATA
;
50 /*********************************************************************/
51 typedef struct _CSR_PROCESS
55 LIST_ENTRY ThreadList
;
56 struct _CSR_PROCESS
*Parent
;
57 PCSR_NT_SESSION NtSession
;
58 ULONG ExpectedVersion
;
60 ULONG_PTR ClientViewBase
;
61 ULONG_PTR ClientViewBounds
;
69 ULONG ProcessGroupSequence
;
76 PVOID ServerData
[ANYSIZE_ARRAY
]; // ServerDllPerProcessData // One structure per CSR server.
77 CSRSS_CON_PROCESS_DATA
; //// FIXME: Remove it after we activate the previous member.
78 } CSR_PROCESS
, *PCSR_PROCESS
;
80 typedef struct _CSR_THREAD
82 LARGE_INTEGER CreateTime
;
87 struct _CSR_WAIT_BLOCK
*WaitBlock
;
91 ULONG ImpersonationCount
;
92 } CSR_THREAD
, *PCSR_THREAD
;
94 #define CsrGetClientThread() \
95 ((PCSR_THREAD)(NtCurrentTeb()->CsrClientThread))
98 /* ENUMERATIONS ***************************************************************/
100 typedef enum _CSR_PROCESS_FLAGS
102 CsrProcessTerminating
= 0x1,
103 CsrProcessSkipShutdown
= 0x2,
104 CsrProcessNormalPriority
= 0x10,
105 CsrProcessIdlePriority
= 0x20,
106 CsrProcessHighPriority
= 0x40,
107 CsrProcessRealtimePriority
= 0x80,
108 CsrProcessCreateNewGroup
= 0x100,
109 CsrProcessTerminated
= 0x200,
110 CsrProcessLastThreadTerminated
= 0x400,
111 CsrProcessIsConsoleApp
= 0x800
112 } CSR_PROCESS_FLAGS
, *PCSR_PROCESS_FLAGS
;
114 #define CsrProcessPriorityFlags (CsrProcessNormalPriority | \
115 CsrProcessIdlePriority | \
116 CsrProcessHighPriority | \
117 CsrProcessRealtimePriority)
119 typedef enum _CSR_THREAD_FLAGS
121 CsrThreadAltertable
= 0x1,
122 CsrThreadInTermination
= 0x2,
123 CsrThreadTerminated
= 0x4,
124 CsrThreadIsServerThread
= 0x10
125 } CSR_THREAD_FLAGS
, *PCSR_THREAD_FLAGS
;
127 typedef enum _SHUTDOWN_RESULT
129 CsrShutdownCsrProcess
= 1,
130 CsrShutdownNonCsrProcess
,
132 } SHUTDOWN_RESULT
, *PSHUTDOWN_RESULT
;
134 typedef enum _CSR_SHUTDOWN_FLAGS
136 CsrShutdownSystem
= 4,
138 } CSR_SHUTDOWN_FLAGS
, *PCSR_SHUTDOWN_FLAGS
;
140 typedef enum _CSR_DEBUG_FLAGS
142 CsrDebugOnlyThisProcess
= 1,
143 CsrDebugProcessChildren
= 2
144 } CSR_PROCESS_DEBUG_FLAGS
, *PCSR_PROCESS_DEBUG_FLAGS
;
152 (*CSR_WAIT_FUNCTION
)(
153 IN PLIST_ENTRY WaitList
,
154 IN PCSR_THREAD WaitThread
,
155 IN PCSR_API_MESSAGE WaitApiMessage
,
156 IN PVOID WaitContext
,
157 IN PVOID WaitArgument1
,
158 IN PVOID WaitArgument2
,
162 typedef struct _CSR_WAIT_BLOCK
166 LIST_ENTRY UserWaitList
;
168 PCSR_THREAD WaitThread
;
169 CSR_WAIT_FUNCTION WaitFunction
;
170 CSR_API_MESSAGE WaitApiMessage
;
171 } CSR_WAIT_BLOCK
, *PCSR_WAIT_BLOCK
;
175 * Server DLL structure
179 (NTAPI
*PCSR_API_ROUTINE
)(
180 IN OUT PCSR_API_MESSAGE ApiMessage
,
184 #define CSR_API(n) NTSTATUS NTAPI n( \
185 IN OUT PCSR_API_MESSAGE ApiMessage, \
187 // IN OUT PCSR_REPLY_STATUS ReplyStatus)
191 (NTAPI
*PCSR_CONNECT_CALLBACK
)(
192 IN PCSR_PROCESS CsrProcess
,
193 IN OUT PVOID ConnectionInfo
,
194 IN OUT PULONG ConnectionInfoLength
199 (NTAPI
*PCSR_DISCONNECT_CALLBACK
)(IN PCSR_PROCESS CsrProcess
);
203 (NTAPI
*PCSR_NEWPROCESS_CALLBACK
)(
204 IN PCSR_PROCESS Parent
,
205 IN PCSR_PROCESS CsrProcess
210 (NTAPI
*PCSR_HARDERROR_CALLBACK
)(
211 IN PCSR_THREAD CsrThread
,
212 IN PHARDERROR_MSG HardErrorMessage
217 (NTAPI
*PCSR_SHUTDOWNPROCESS_CALLBACK
)(
218 IN PCSR_PROCESS CsrProcess
,
220 IN BOOLEAN FirstPhase
223 typedef struct _CSR_SERVER_DLL
231 ULONG ApiBase
; // ApiNumberBase
232 ULONG HighestApiSupported
; // MaxApiNumber
233 PCSR_API_ROUTINE
*DispatchTable
;
234 PBOOLEAN ValidTable
; // Table of booleans which describe whether or not a server function call is valid when it is called via CsrCallServerFromServer.
236 ULONG SizeOfProcessData
;
237 PCSR_CONNECT_CALLBACK ConnectCallback
;
238 PCSR_DISCONNECT_CALLBACK DisconnectCallback
;
239 PCSR_HARDERROR_CALLBACK HardErrorCallback
;
240 PVOID SharedSection
; // SharedStaticServerData
241 PCSR_NEWPROCESS_CALLBACK NewProcessCallback
;
242 PCSR_SHUTDOWNPROCESS_CALLBACK ShutdownProcessCallback
;
244 } CSR_SERVER_DLL
, *PCSR_SERVER_DLL
;
247 /* FUNCTION TYPES *************************************************************/
251 (NTAPI
*PCSR_SERVER_DLL_INIT_CALLBACK
)(IN PCSR_SERVER_DLL LoadedServerDll
);
253 #define CSR_SERVER_DLL_INIT(n) NTSTATUS NTAPI n(IN PCSR_SERVER_DLL LoadedServerDll)
256 /* PROTOTYPES ****************************************************************/
261 CsrCaptureArguments(IN PCSR_THREAD CsrThread
,
262 IN PCSR_API_MESSAGE ApiMessage
);
266 CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage
);
273 CsrServerInitialization(IN ULONG ArgumentCount
,
274 IN PCHAR Arguments
[]);
278 CsrAddStaticServerThread(IN HANDLE hThread
,
279 IN PCLIENT_ID ClientId
,
280 IN ULONG ThreadFlags
);
284 CsrCallServerFromServer(IN PCSR_API_MESSAGE ReceiveMsg
,
285 IN OUT PCSR_API_MESSAGE ReplyMsg
);
289 CsrConnectToUser(VOID
);
293 CsrCreateProcess(IN HANDLE hProcess
,
295 IN PCLIENT_ID ClientId
,
296 IN PCSR_NT_SESSION NtSession
,
298 IN PCLIENT_ID DebugCid
);
302 CsrCreateRemoteThread(IN HANDLE hThread
,
303 IN PCLIENT_ID ClientId
);
307 CsrCreateThread(IN PCSR_PROCESS CsrProcess
,
309 IN PCLIENT_ID ClientId
);
313 CsrCreateWait(IN PLIST_ENTRY WaitList
,
314 IN CSR_WAIT_FUNCTION WaitFunction
,
315 IN PCSR_THREAD CsrWaitThread
,
316 IN OUT PCSR_API_MESSAGE WaitApiMessage
,
317 IN PVOID WaitContext
,
318 IN PLIST_ENTRY UserWaitList OPTIONAL
);
322 CsrDebugProcess(IN PCSR_PROCESS CsrProcess
);
326 CsrDebugProcessStop(IN PCSR_PROCESS CsrProcess
);
330 CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess
);
334 CsrDereferenceThread(IN PCSR_THREAD CsrThread
);
338 CsrDereferenceWait(IN PLIST_ENTRY WaitList
);
342 CsrDestroyProcess(IN PCLIENT_ID Cid
,
343 IN NTSTATUS ExitStatus
);
347 CsrDestroyThread(IN PCLIENT_ID Cid
);
351 CsrExecServerThread(IN PVOID ThreadHandler
,
356 CsrGetProcessLuid(IN HANDLE hProcess OPTIONAL
,
361 CsrImpersonateClient(IN PCSR_THREAD CsrThread
);
365 CsrLockProcessByClientId(IN HANDLE Pid
,
366 OUT PCSR_PROCESS
*CsrProcess OPTIONAL
);
370 CsrLockThreadByClientId(IN HANDLE Tid
,
371 OUT PCSR_THREAD
*CsrThread
);
375 CsrMoveSatisfiedWait(IN PLIST_ENTRY NewEntry
,
376 IN PLIST_ENTRY WaitList
);
380 CsrNotifyWait(IN PLIST_ENTRY WaitList
,
382 IN PVOID WaitArgument1
,
383 IN PVOID WaitArgument2
);
387 CsrPopulateDosDevices(VOID
);
391 CsrQueryApiPort(VOID
);
395 CsrReferenceThread(IN PCSR_THREAD CsrThread
);
399 CsrRevertToSelf(VOID
);
403 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
407 CsrSetCallingSpooler(ULONG Reserved
);
411 CsrSetForegroundPriority(IN PCSR_PROCESS CsrProcess
);
415 CsrShutdownProcesses(IN PLUID CallerLuid
,
418 EXCEPTION_DISPOSITION
420 CsrUnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo
);
424 CsrUnlockProcess(IN PCSR_PROCESS CsrProcess
);
428 CsrUnlockThread(IN PCSR_THREAD CsrThread
);
432 CsrValidateMessageBuffer(IN PCSR_API_MESSAGE ApiMessage
,
434 IN ULONG ArgumentSize
,
435 IN ULONG ArgumentCount
);
439 CsrValidateMessageString(IN PCSR_API_MESSAGE ApiMessage
,
440 IN LPWSTR
*MessageString
);