3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: subsys/csrss/include/api.h
6 * PURPOSE: CSRSS API interface
11 #define NTOS_MODE_USER
12 #include <ndk/psfuncs.h>
13 #include <ndk/rtlfuncs.h>
15 #include <csrss/csrss.h>
17 #define CSR_SRV_SERVER 0
18 #define CSR_SERVER_DLL_MAX 4
19 #define LOCK RtlEnterCriticalSection(&ProcessDataLock)
20 #define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
21 #define CsrAcquireProcessLock() LOCK
22 #define CsrReleaseProcessLock() UNLOCK
23 #define ProcessStructureListLocked() \
24 (ProcessDataLock.OwningThread == NtCurrentTeb()->ClientId.UniqueThread)
26 #define CsrAcquireWaitLock() \
27 RtlEnterCriticalSection(&CsrWaitListsLock);
29 #define CsrReleaseWaitLock() \
30 RtlLeaveCriticalSection(&CsrWaitListsLock);
32 #define CsrAcquireNtSessionLock() \
33 RtlEnterCriticalSection(&CsrNtSessionLock);
35 #define CsrReleaseNtSessionLock() \
36 RtlLeaveCriticalSection(&CsrNtSessionLock);
38 typedef enum _CSR_THREAD_FLAGS
40 CsrThreadAltertable
= 0x1,
41 CsrThreadInTermination
= 0x2,
42 CsrThreadTerminated
= 0x4,
43 CsrThreadIsServerThread
= 0x10
44 } CSR_THREAD_FLAGS
, *PCSR_THREAD_FLAGS
;
46 typedef enum _SHUTDOWN_RESULT
48 CsrShutdownCsrProcess
= 1,
49 CsrShutdownNonCsrProcess
,
51 } SHUTDOWN_RESULT
, *PSHUTDOWN_RESULT
;
53 typedef enum _CSR_SHUTDOWN_FLAGS
55 CsrShutdownSystem
= 4,
57 } CSR_SHUTDOWN_FLAGS
, *PCSR_SHUTDOWN_FLAGS
;
59 typedef enum _CSR_PROCESS_FLAGS
61 CsrProcessTerminating
= 0x1,
62 CsrProcessSkipShutdown
= 0x2,
63 CsrProcessCreateNewGroup
= 0x100,
64 CsrProcessTerminated
= 0x200,
65 CsrProcessLastThreadTerminated
= 0x400,
66 CsrProcessIsConsoleApp
= 0x800
67 } CSR_PROCESS_FLAGS
, *PCSR_PROCESS_FLAGS
;
69 typedef struct _CSRSS_CON_PROCESS_DATA
72 struct tagCSRSS_CONSOLE
*Console
;
73 struct tagCSRSS_CONSOLE
*ParentConsole
;
75 RTL_CRITICAL_SECTION HandleTableLock
;
76 ULONG HandleTableSize
;
77 struct _CSRSS_HANDLE
*HandleTable
;
78 PCONTROLDISPATCHER CtrlDispatcher
;
79 LIST_ENTRY ConsoleLink
;
80 } CSRSS_CON_PROCESS_DATA
, *PCSRSS_CON_PROCESS_DATA
;
82 typedef struct _CSR_NT_SESSION
85 LIST_ENTRY SessionLink
;
87 } CSR_NT_SESSION
, *PCSR_NT_SESSION
;
89 typedef struct _CSR_PROCESS
93 LIST_ENTRY ThreadList
;
94 struct _CSR_PROCESS
*Parent
;
95 PCSR_NT_SESSION NtSession
;
96 ULONG ExpectedVersion
;
98 ULONG_PTR ClientViewBase
;
99 ULONG_PTR ClientViewBounds
;
100 HANDLE ProcessHandle
;
101 ULONG SequenceNumber
;
105 ULONG ReferenceCount
;
106 ULONG ProcessGroupId
;
107 ULONG ProcessGroupSequence
;
114 // PVOID ServerData[ANYSIZE_ARRAY];
115 CSRSS_CON_PROCESS_DATA
;
116 } CSR_PROCESS
, *PCSR_PROCESS
;
118 typedef struct _CSR_THREAD
120 LARGE_INTEGER CreateTime
;
122 LIST_ENTRY HashLinks
;
124 PCSR_PROCESS Process
;
125 struct _CSR_WAIT_BLOCK
*WaitBlock
;
128 ULONG ReferenceCount
;
129 ULONG ImpersonationCount
;
130 } CSR_THREAD
, *PCSR_THREAD
;
134 (*CSR_WAIT_FUNCTION
)(
135 IN PLIST_ENTRY WaitList
,
136 IN PCSR_THREAD WaitThread
,
137 IN PCSR_API_MESSAGE WaitApiMessage
,
138 IN PVOID WaitContext
,
139 IN PVOID WaitArgument1
,
140 IN PVOID WaitArgument2
,
144 typedef struct _CSR_WAIT_BLOCK
148 LIST_ENTRY UserWaitList
;
150 PCSR_THREAD WaitThread
;
151 CSR_WAIT_FUNCTION WaitFunction
;
152 CSR_API_MESSAGE WaitApiMessage
;
153 } CSR_WAIT_BLOCK
, *PCSR_WAIT_BLOCK
;
157 (NTAPI
*PCSR_CONNECT_CALLBACK
)(
158 IN PCSR_PROCESS CsrProcess
,
159 IN OUT PVOID ConnectionInfo
,
160 IN OUT PULONG ConnectionInfoLength
165 (NTAPI
*PCSR_DISCONNECT_CALLBACK
)(IN PCSR_PROCESS CsrProcess
);
169 (NTAPI
*PCSR_NEWPROCESS_CALLBACK
)(
170 IN PCSR_PROCESS Parent
,
171 IN PCSR_PROCESS CsrProcess
176 (NTAPI
*PCSR_HARDERROR_CALLBACK
)(
177 IN PCSR_THREAD CsrThread
,
178 IN PHARDERROR_MSG HardErrorMessage
183 (NTAPI
*PCSR_SHUTDOWNPROCESS_CALLBACK
)(
184 IN PCSR_PROCESS CsrProcess
,
186 IN BOOLEAN FirstPhase
191 (NTAPI
*PCSR_API_ROUTINE
)(
192 IN OUT PCSR_API_MESSAGE ApiMessage
,
196 typedef struct _CSR_SERVER_DLL
205 ULONG HighestApiSupported
;
206 PCSR_API_ROUTINE
*DispatchTable
;
209 ULONG SizeOfProcessData
;
210 PCSR_CONNECT_CALLBACK ConnectCallback
;
211 PCSR_DISCONNECT_CALLBACK DisconnectCallback
;
212 PCSR_HARDERROR_CALLBACK HardErrorCallback
;
214 PCSR_NEWPROCESS_CALLBACK NewProcessCallback
;
215 PCSR_SHUTDOWNPROCESS_CALLBACK ShutdownProcessCallback
;
217 } CSR_SERVER_DLL
, *PCSR_SERVER_DLL
;
221 (NTAPI
*PCSR_SERVER_DLL_INIT_CALLBACK
)(IN PCSR_SERVER_DLL ServerDll
);
224 typedef NTSTATUS (WINAPI
*CSRSS_API_PROC
)(PCSR_PROCESS ProcessData
,
225 PCSR_API_MESSAGE Request
);
227 typedef struct _CSRSS_API_DEFINITION
230 ULONG MinRequestSize
;
231 CSRSS_API_PROC Handler
;
232 } CSRSS_API_DEFINITION
, *PCSRSS_API_DEFINITION
;
234 #define CSRSS_DEFINE_API(Func, Handler) \
235 { Func, sizeof(CSRSS_##Func), Handler }
237 typedef struct _CSRSS_LISTEN_DATA
239 HANDLE ApiPortHandle
;
240 ULONG ApiDefinitionsCount
;
241 PCSRSS_API_DEFINITION
*ApiDefinitions
;
242 } CSRSS_LISTEN_DATA
, *PCSRSS_LISTEN_DATA
;
244 #define CSR_API(n) NTSTATUS WINAPI n (\
245 PCSR_PROCESS ProcessData,\
246 PCSR_API_MESSAGE Request)
249 extern HANDLE hBootstrapOk
;
250 NTSTATUS NTAPI
CsrServerInitialization(ULONG ArgumentCount
, PCHAR Arguments
[]);
253 CSR_API(CsrConnectProcess
);
254 CSR_API(CsrCreateProcess
);
255 CSR_API(CsrTerminateProcess
);
256 CSR_API(CsrSrvCreateThread
);
257 CSR_API(CsrGetShutdownParameters
);
258 CSR_API(CsrSetShutdownParameters
);
262 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
266 CsrAllocateThread(IN PCSR_PROCESS CsrProcess
);
270 CsrAllocateProcess(VOID
);
274 CsrDeallocateProcess(IN PCSR_PROCESS CsrProcess
);
278 CsrRemoveProcess(IN PCSR_PROCESS CsrProcess
);
282 CsrDereferenceThread(IN PCSR_THREAD CsrThread
);
286 CsrInsertProcess(IN PCSR_PROCESS Parent OPTIONAL
,
287 IN PCSR_PROCESS CurrentProcess OPTIONAL
,
288 IN PCSR_PROCESS CsrProcess
);
292 NTSTATUS FASTCALL
CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions
);
293 VOID FASTCALL
CsrApiCallHandler(PCSR_PROCESS ProcessData
,
294 PCSR_API_MESSAGE Request
);
295 VOID WINAPI
CsrSbApiRequestThread (PVOID PortHandle
);
296 VOID NTAPI
ClientConnectionThread(HANDLE ServerPort
);
300 CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage
);
302 extern HANDLE hApiPort
;
303 extern HANDLE CsrSmApiPort
;
304 extern HANDLE CsrSbApiPort
;
305 extern LIST_ENTRY CsrThreadHashTable
[256];
306 extern PCSR_PROCESS CsrRootProcess
;
307 extern RTL_CRITICAL_SECTION ProcessDataLock
, CsrWaitListsLock
;
308 extern UNICODE_STRING CsrDirectoryName
;
309 extern ULONG CsrDebug
;
310 extern ULONG CsrTotalPerProcessDataLength
;
311 extern SYSTEM_BASIC_INFORMATION CsrNtSysInfo
;
312 extern PVOID CsrSrvSharedSectionHeap
;
313 extern PVOID
*CsrSrvSharedStaticServerData
;
314 extern HANDLE CsrInitializationEvent
;
318 CsrApiPortInitialize(VOID
);
322 ProtectHandle(IN HANDLE ObjectHandle
);
326 CsrInsertThread(IN PCSR_PROCESS Process
,
327 IN PCSR_THREAD Thread
);
330 typedef NTSTATUS (WINAPI
*CSRSS_ENUM_PROCESS_PROC
)(PCSR_PROCESS ProcessData
,
332 NTSTATUS WINAPI
CsrInitializeProcessStructure(VOID
);
333 PCSR_PROCESS WINAPI
CsrGetProcessData(HANDLE ProcessId
);
334 PCSR_PROCESS WINAPI
CsrCreateProcessData(HANDLE ProcessId
);
335 NTSTATUS WINAPI
CsrFreeProcessData( HANDLE Pid
);
336 NTSTATUS WINAPI
CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc
, PVOID Context
);
337 PCSR_THREAD NTAPI
CsrAddStaticServerThread(IN HANDLE hThread
, IN PCLIENT_ID ClientId
, IN ULONG ThreadFlags
);
338 PCSR_THREAD NTAPI
CsrLocateThreadInProcess(IN PCSR_PROCESS CsrProcess OPTIONAL
, IN PCLIENT_ID Cid
);
339 PCSR_THREAD NTAPI
CsrLocateThreadByClientId(OUT PCSR_PROCESS
*Process OPTIONAL
, IN PCLIENT_ID ClientId
);
340 NTSTATUS NTAPI
CsrLockProcessByClientId(IN HANDLE Pid
, OUT PCSR_PROCESS
*CsrProcess OPTIONAL
);
341 NTSTATUS NTAPI
CsrCreateThread(IN PCSR_PROCESS CsrProcess
, IN HANDLE hThread
, IN PCLIENT_ID ClientId
);
342 NTSTATUS NTAPI
CsrUnlockProcess(IN PCSR_PROCESS CsrProcess
);
345 VOID NTAPI
CsrThreadRefcountZero(IN PCSR_THREAD CsrThread
);
349 CsrInitializeNtSessionList(VOID
);
353 CsrSrvAttachSharedSection(IN PCSR_PROCESS CsrProcess OPTIONAL
,
354 OUT PCSR_CONNECTION_INFO ConnectInfo
);
358 CsrSrvCreateSharedSection(IN PCHAR ParameterValue
);
363 IN OUT PCSR_API_MESSAGE ApiMessage
,
369 CsrSrvUnusedFunction(
370 IN OUT PCSR_API_MESSAGE ApiMessage
,
376 CsrSrvIdentifyAlertableThread(
377 IN OUT PCSR_API_MESSAGE ApiMessage
,
383 CsrSrvSetPriorityClass(
384 IN OUT PCSR_API_MESSAGE ApiMessage
,
389 CSR_API(CsrRegisterServicesProcess
);