6 #define WIN32_NO_STATUS
12 #include <csr/server.h>
14 /* PSEH for SEH Support */
15 #include <pseh/pseh2.h>
17 /* DEFINES *******************************************************************/
19 #define CSR_SERVER_DLL_MAX 4
21 #define CsrAcquireProcessLock() \
22 RtlEnterCriticalSection(&CsrProcessLock);
24 #define CsrReleaseProcessLock() \
25 RtlLeaveCriticalSection(&CsrProcessLock);
27 #define CsrAcquireWaitLock() \
28 RtlEnterCriticalSection(&CsrWaitListsLock);
30 #define CsrReleaseWaitLock() \
31 RtlLeaveCriticalSection(&CsrWaitListsLock);
33 #define CsrAcquireNtSessionLock() \
34 RtlEnterCriticalSection(&CsrNtSessionLock)
36 #define CsrReleaseNtSessionLock() \
37 RtlLeaveCriticalSection(&CsrNtSessionLock)
39 #define CsrHashThread(t) \
40 (HandleToUlong(t)&(256 - 1))
43 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager"
45 #define SESSION_ROOT L"\\Sessions"
46 #define GLOBAL_ROOT L"\\GLOBAL??"
47 #define SYMLINK_NAME L"SymbolicLink"
48 #define SB_PORT_NAME L"SbAbiPort"
49 #define CSR_PORT_NAME L"ApiPort"
50 #define UNICODE_PATH_SEP L"\\"
52 #define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
53 #define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
55 /* DATA **********************************************************************/
57 extern ULONG CsrTotalPerProcessDataLength
;
58 extern ULONG CsrMaxApiRequestThreads
;
59 extern PCSR_SERVER_DLL CsrLoadedServerDll
[CSR_SERVER_DLL_MAX
];
60 extern PCSR_PROCESS CsrRootProcess
;
61 extern UNICODE_STRING CsrSbApiPortName
;
62 extern UNICODE_STRING CsrApiPortName
;
63 extern HANDLE CsrSbApiPort
;
64 extern HANDLE CsrSmApiPort
;
65 extern HANDLE CsrApiPort
;
66 extern HANDLE CsrHeap
;
67 extern RTL_CRITICAL_SECTION CsrProcessLock
;
68 extern RTL_CRITICAL_SECTION CsrWaitListsLock
;
69 extern LIST_ENTRY CsrThreadHashTable
[256];
70 extern HANDLE CsrInitializationEvent
;
71 extern SYSTEM_BASIC_INFORMATION CsrNtSysInfo
;
72 extern UNICODE_STRING CsrDirectoryName
;
73 extern HANDLE CsrObjectDirectory
;
74 extern PSB_API_ROUTINE CsrServerSbApiDispatch
[5];
76 /* FUNCTIONS *****************************************************************/
78 /* FIXME: Public APIs should go in the CSR Server Include */
89 CsrServerInitialization(
96 CsrCreateSessionObjectDirectory(IN ULONG SessionId
);
100 CsrCreateObjectDirectory(IN PCHAR ObjectDirectory
);
104 CsrSrvCreateSharedSection(IN PCHAR ParameterValue
);
108 CsrInitializeNtSessions(VOID
);
112 CsrInitializeProcesses(VOID
);
116 CsrApiPortInitialize(VOID
);
120 CsrSbApiPortInitialize(VOID
);
124 CsrSbCreateSession(IN PSB_API_MESSAGE ApiMessage
);
128 CsrSbTerminateSession(IN PSB_API_MESSAGE ApiMessage
);
132 CsrSbForeignSessionComplete(IN PSB_API_MESSAGE ApiMessage
);
136 CsrSbCreateProcess(IN PSB_API_MESSAGE ApiMessage
);
140 CsrAllocateProcess(VOID
);
144 CsrAllocateThread(IN PCSR_PROCESS CsrProcess
);
149 IN PCSR_PROCESS Process
,
150 IN PCSR_THREAD Thread
155 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
159 CsrDeallocateProcess(IN PCSR_PROCESS CsrProcess
);
170 CsrImpersonateClient(IN PCSR_THREAD CsrThread
);
174 CsrRevertToSelf(VOID
);
178 CsrLocateThreadByClientId(
179 OUT PCSR_PROCESS
*Process
,
180 IN PCLIENT_ID ClientId
185 CsrDereferenceNtSession(
186 IN PCSR_NT_SESSION Session
,
192 CsrReferenceNtSession(PCSR_NT_SESSION Session
);
196 CsrLockedDereferenceThread(PCSR_THREAD CsrThread
);
200 CsrLockedDereferenceProcess(PCSR_PROCESS CsrProcess
);
204 CsrLockProcessByClientId(
206 OUT PCSR_PROCESS
*CsrProcess OPTIONAL
211 CsrUnlockProcess(PCSR_PROCESS CsrProcess
);
216 IN OUT PCSR_API_MESSAGE ApiMessage
,
222 CsrSrvUnusedFunction(
223 IN OUT PCSR_API_MESSAGE ApiMessage
,
229 CsrSrvIdentifyAlertableThread(
230 IN OUT PCSR_API_MESSAGE ApiMessage
,
236 CsrSrvSetPriorityClass(
237 IN OUT PCSR_API_MESSAGE ApiMessage
,
243 CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll
);
247 CsrDereferenceThread(PCSR_THREAD CsrThread
);
251 CsrSbApiRequestThread(IN PVOID Parameter
);
255 CsrApiRequestThread(IN PVOID Parameter
);
259 CsrAddStaticServerThread(
261 IN PCLIENT_ID ClientId
,
267 CsrConnectToUser(VOID
);
271 CsrLocateThreadInProcess(
272 IN PCSR_PROCESS CsrProcess OPTIONAL
,
278 CsrSbApiHandleConnectionRequest(IN PSB_API_MESSAGE Message
);
282 CsrApiHandleConnectionRequest(IN PCSR_API_MESSAGE ApiMessage
);
286 CsrSrvAttachSharedSection(
287 IN PCSR_PROCESS CsrProcess OPTIONAL
,
288 OUT PCSR_CONNECTION_INFO ConnectInfo
293 CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage
);
298 IN PCSR_WAIT_BLOCK WaitBlock
,
299 IN PLIST_ENTRY WaitList
,
300 IN PVOID WaitArgument1
,
301 IN PVOID WaitArgument2
,
303 IN BOOLEAN DereferenceThread
308 CsrDereferenceProcess(PCSR_PROCESS CsrProcess
);
313 IN PCSR_PROCESS Parent OPTIONAL
,
314 IN PCSR_PROCESS CurrentProcess OPTIONAL
,
315 IN PCSR_PROCESS CsrProcess
320 CsrPopulateDosDevicesDirectory(
321 IN HANDLE DosDevicesDirectory
,
322 IN PPROCESS_DEVICEMAP_INFORMATION DeviceMap
327 CsrValidateMessageBuffer(
328 IN PCSR_API_MESSAGE ApiMessage
,
330 IN ULONG ArgumentSize
,
331 IN ULONG ArgumentCount
336 CsrCreateLocalSystemSD(OUT PSECURITY_DESCRIPTOR
*LocalSystemSd
);
340 CsrDestroyThread(IN PCLIENT_ID Cid
);
346 IN NTSTATUS ExitStatus
351 CsrUnhandledExceptionFilter(
352 IN PEXCEPTION_POINTERS ExceptionInfo
357 CsrProcessRefcountZero(IN PCSR_PROCESS CsrProcess
);
361 CsrThreadRefcountZero(IN PCSR_THREAD CsrThread
);
365 CsrSetDirectorySecurity(IN HANDLE ObjectDirectory
);