13 #include <csr/server.h>
15 /* PSEH for SEH Support */
16 #include <pseh/pseh.h>
18 /* DEFINES *******************************************************************/
20 #define CSR_SERVER_DLL_MAX 4
22 #define CsrAcquireProcessLock() \
23 RtlEnterCriticalSection(&CsrProcessLock);
25 #define CsrReleaseProcessLock() \
26 RtlLeaveCriticalSection(&CsrProcessLock);
28 #define CsrAcquireWaitLock() \
29 RtlEnterCriticalSection(&CsrWaitListsLock);
31 #define CsrReleaseWaitLock() \
32 RtlLeaveCriticalSection(&CsrWaitListsLock);
34 #define CsrAcquireNtSessionLock() \
35 RtlEnterCriticalSection(&CsrNtSessionLock)
37 #define CsrReleaseNtSessionLock() \
38 RtlLeaveCriticalSection(&CsrNtSessionLock)
40 #define CsrHashThread(t) \
41 (HandleToUlong(t)&(256 - 1))
44 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager"
46 #define SESSION_ROOT L"\\Sessions"
47 #define GLOBAL_ROOT L"\\GLOBAL??"
48 #define SYMLINK_NAME L"SymbolicLink"
49 #define SB_PORT_NAME L"SbAbiPort"
50 #define CSR_PORT_NAME L"ApiPort"
51 #define UNICODE_PATH_SEP L"\\"
53 /* DATA **********************************************************************/
55 extern ULONG CsrTotalPerProcessDataLength
;
56 extern ULONG CsrMaxApiRequestThreads
;
57 extern PCSR_SERVER_DLL CsrLoadedServerDll
[CSR_SERVER_DLL_MAX
];
58 extern PCSR_PROCESS CsrRootProcess
;
59 extern UNICODE_STRING CsrSbApiPortName
;
60 extern UNICODE_STRING CsrApiPortName
;
61 extern HANDLE CsrSbApiPort
;
62 extern HANDLE CsrSmApiPort
;
63 extern HANDLE CsrApiPort
;
64 extern HANDLE CsrHeap
;
65 extern RTL_CRITICAL_SECTION CsrProcessLock
;
66 extern RTL_CRITICAL_SECTION CsrWaitListsLock
;
67 extern LIST_ENTRY CsrThreadHashTable
[256];
68 extern HANDLE CsrInitializationEvent
;
69 extern SYSTEM_BASIC_INFORMATION CsrNtSysInfo
;
70 extern UNICODE_STRING CsrDirectoryName
;
71 extern HANDLE CsrObjectDirectory
;
72 extern PSB_API_ROUTINE CsrServerSbApiDispatch
[5];
74 /* FUNCTIONS *****************************************************************/
76 /* FIXME: Public APIs should go in the CSR Server Include */
87 CsrServerInitialization(
94 CsrCreateSessionObjectDirectory(IN ULONG SessionId
);
98 CsrCreateObjectDirectory(IN PCHAR ObjectDirectory
);
102 CsrSrvCreateSharedSection(IN PCHAR ParameterValue
);
106 CsrInitializeNtSessions(VOID
);
110 CsrInitializeProcesses(VOID
);
114 CsrApiPortInitialize(VOID
);
118 CsrSbApiPortInitialize(VOID
);
122 CsrSbCreateSession(IN PSB_API_MESSAGE ApiMessage
);
126 CsrSbForeignSessionComplete(IN PSB_API_MESSAGE ApiMessage
);
130 CsrSbCreateProcess(IN PSB_API_MESSAGE ApiMessage
);
134 CsrAllocateProcess(VOID
);
138 CsrAllocateThread(IN PCSR_PROCESS CsrProcess
);
143 IN PCSR_PROCESS Process
,
144 IN PCSR_THREAD Thread
149 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
153 CsrDeallocateProcess(IN PCSR_PROCESS CsrProcess
);
164 CsrImpersonateClient(IN PCSR_THREAD CsrThread
);
168 CsrRevertToSelf(VOID
);
172 CsrLocateThreadByClientId(
173 OUT PCSR_PROCESS
*Process
,
174 IN PCLIENT_ID ClientId
179 CsrDereferenceNtSession(
180 IN PCSR_NT_SESSION Session
,
186 CsrReferenceNtSession(PCSR_NT_SESSION Session
);
190 CsrLockedDereferenceThread(PCSR_THREAD CsrThread
);
194 CsrLockedDereferenceProcess(PCSR_PROCESS CsrProcess
);
198 CsrLockProcessByClientId(
200 OUT PCSR_PROCESS
*CsrProcess OPTIONAL
205 CsrUnlockProcess(PCSR_PROCESS CsrProcess
);
210 IN OUT PCSR_API_MESSAGE ApiMessage
,
216 CsrSrvUnusedFunction(
217 IN OUT PCSR_API_MESSAGE ApiMessage
,
223 CsrSrvIdentifyAlertableThread(
224 IN OUT PCSR_API_MESSAGE ApiMessage
,
230 CsrSrvSetPriorityClass(
231 IN OUT PCSR_API_MESSAGE ApiMessage
,
237 CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll
);
241 CsrDereferenceThread(PCSR_THREAD CsrThread
);
245 CsrSbApiRequestThread(IN PVOID Parameter
);
249 CsrApiRequestThread(IN PVOID Parameter
);
253 CsrAddStaticServerThread(
255 IN PCLIENT_ID ClientId
,
261 CsrConnectToUser(VOID
);
265 CsrLocateThreadInProcess(
266 IN PCSR_PROCESS CsrProcess OPTIONAL
,
272 CsrSbApiHandleConnectionRequest(IN PSB_API_MESSAGE Message
);
276 CsrApiHandleConnectionRequest(IN PCSR_API_MESSAGE ApiMessage
);
280 CsrSrvAttachSharedSection(
281 IN PCSR_PROCESS CsrProcess OPTIONAL
,
282 OUT PCSR_CONNECTION_INFO ConnectInfo
287 CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage
);
292 IN PCSR_WAIT_BLOCK WaitBlock
,
293 IN PLIST_ENTRY WaitList
,
294 IN PVOID WaitArgument1
,
295 IN PVOID WaitArgument2
,
297 IN BOOLEAN DereferenceThread
302 CsrDereferenceProcess(PCSR_PROCESS CsrProcess
);
307 IN PCSR_PROCESS Parent OPTIONAL
,
308 IN PCSR_PROCESS CurrentProcess OPTIONAL
,
309 IN PCSR_PROCESS CsrProcess
314 CsrPopulateDosDevicesDirectory(
315 IN HANDLE DosDevicesDirectory
,
316 IN PPROCESS_DEVICEMAP_INFORMATION DeviceMap
321 CsrValidateMessageBuffer(
322 IN PCSR_API_MESSAGE ApiMessage
,
324 IN ULONG ArgumentSize
,
325 IN ULONG ArgumentCount
330 CsrCreateLocalSystemSD(OUT PSECURITY_DESCRIPTOR
*LocalSystemSd
);
334 CsrDestroyThread(IN PCLIENT_ID Cid
);
340 IN NTSTATUS ExitStatus
343 _SEH_FILTER(CsrUnhandledExceptionFilter
);
347 CsrProcessRefcountZero(IN PCSR_PROCESS CsrProcess
);
351 CsrThreadRefcountZero(IN PCSR_THREAD CsrThread
);
355 CsrSetDirectorySecurity(IN HANDLE ObjectDirectory
);