7 #define WIN32_NO_STATUS
10 #include <ndk/ntndk.h>
14 #include <csr/server.h>
16 /* PSEH for SEH Support */
17 #include <pseh/pseh.h>
19 /* DEFINES *******************************************************************/
21 #define CSR_SERVER_DLL_MAX 4
23 #define CsrAcquireProcessLock() \
24 RtlEnterCriticalSection(&CsrProcessLock);
26 #define CsrReleaseProcessLock() \
27 RtlLeaveCriticalSection(&CsrProcessLock);
29 #define CsrAcquireWaitLock() \
30 RtlEnterCriticalSection(&CsrWaitListsLock);
32 #define CsrReleaseWaitLock() \
33 RtlLeaveCriticalSection(&CsrWaitListsLock);
35 #define CsrAcquireNtSessionLock() \
36 RtlEnterCriticalSection(&CsrNtSessionLock)
38 #define CsrReleaseNtSessionLock() \
39 RtlLeaveCriticalSection(&CsrNtSessionLock)
41 #define CsrHashThread(t) \
42 (HandleToUlong(t)&(256 - 1))
45 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager"
47 #define SESSION_ROOT L"\\Sessions"
48 #define GLOBAL_ROOT L"\\GLOBAL??"
49 #define SYMLINK_NAME L"SymbolicLink"
50 #define SB_PORT_NAME L"SbAbiPort"
51 #define CSR_PORT_NAME L"ApiPort"
52 #define UNICODE_PATH_SEP L"\\"
54 /* DATA **********************************************************************/
56 extern ULONG CsrTotalPerProcessDataLength
;
57 extern ULONG CsrMaxApiRequestThreads
;
58 extern PCSR_SERVER_DLL CsrLoadedServerDll
[CSR_SERVER_DLL_MAX
];
59 extern PCSR_PROCESS CsrRootProcess
;
60 extern UNICODE_STRING CsrSbApiPortName
;
61 extern UNICODE_STRING CsrApiPortName
;
62 extern HANDLE CsrSbApiPort
;
63 extern HANDLE CsrSmApiPort
;
64 extern HANDLE CsrApiPort
;
65 extern HANDLE CsrHeap
;
66 extern RTL_CRITICAL_SECTION CsrProcessLock
;
67 extern RTL_CRITICAL_SECTION CsrWaitListsLock
;
68 extern LIST_ENTRY CsrThreadHashTable
[256];
69 extern HANDLE CsrInitializationEvent
;
70 extern SYSTEM_BASIC_INFORMATION CsrNtSysInfo
;
71 extern UNICODE_STRING CsrDirectoryName
;
72 extern HANDLE CsrObjectDirectory
;
73 extern PSB_API_ROUTINE CsrServerSbApiDispatch
[5];
75 /* FUNCTIONS *****************************************************************/
77 /* FIXME: Public APIs should go in the CSR Server Include */
88 CsrServerInitialization(
95 CsrCreateSessionObjectDirectory(IN ULONG SessionId
);
99 CsrCreateObjectDirectory(IN PCHAR ObjectDirectory
);
103 CsrSrvCreateSharedSection(IN PCHAR ParameterValue
);
107 CsrInitializeNtSessions(VOID
);
111 CsrInitializeProcesses(VOID
);
115 CsrApiPortInitialize(VOID
);
119 CsrSbApiPortInitialize(VOID
);
123 CsrSbCreateSession(IN PSB_API_MESSAGE ApiMessage
);
127 CsrSbTerminateSession(IN PSB_API_MESSAGE ApiMessage
);
131 CsrSbForeignSessionComplete(IN PSB_API_MESSAGE ApiMessage
);
135 CsrSbCreateProcess(IN PSB_API_MESSAGE ApiMessage
);
139 CsrAllocateProcess(VOID
);
143 CsrAllocateThread(IN PCSR_PROCESS CsrProcess
);
148 IN PCSR_PROCESS Process
,
149 IN PCSR_THREAD Thread
154 CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess
);
158 CsrDeallocateProcess(IN PCSR_PROCESS CsrProcess
);
169 CsrImpersonateClient(IN PCSR_THREAD CsrThread
);
173 CsrRevertToSelf(VOID
);
177 CsrLocateThreadByClientId(
178 OUT PCSR_PROCESS
*Process
,
179 IN PCLIENT_ID ClientId
184 CsrDereferenceNtSession(
185 IN PCSR_NT_SESSION Session
,
191 CsrReferenceNtSession(PCSR_NT_SESSION Session
);
195 CsrLockedDereferenceThread(PCSR_THREAD CsrThread
);
199 CsrLockedDereferenceProcess(PCSR_PROCESS CsrProcess
);
203 CsrLockProcessByClientId(
205 OUT PCSR_PROCESS
*CsrProcess OPTIONAL
210 CsrUnlockProcess(PCSR_PROCESS CsrProcess
);
215 IN OUT PCSR_API_MESSAGE ApiMessage
,
221 CsrSrvUnusedFunction(
222 IN OUT PCSR_API_MESSAGE ApiMessage
,
228 CsrSrvIdentifyAlertableThread(
229 IN OUT PCSR_API_MESSAGE ApiMessage
,
235 CsrSrvSetPriorityClass(
236 IN OUT PCSR_API_MESSAGE ApiMessage
,
242 CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll
);
246 CsrDereferenceThread(PCSR_THREAD CsrThread
);
250 CsrSbApiRequestThread(IN PVOID Parameter
);
254 CsrApiRequestThread(IN PVOID Parameter
);
258 CsrAddStaticServerThread(
260 IN PCLIENT_ID ClientId
,
266 CsrConnectToUser(VOID
);
270 CsrLocateThreadInProcess(
271 IN PCSR_PROCESS CsrProcess OPTIONAL
,
277 CsrSbApiHandleConnectionRequest(IN PSB_API_MESSAGE Message
);
281 CsrApiHandleConnectionRequest(IN PCSR_API_MESSAGE ApiMessage
);
285 CsrSrvAttachSharedSection(
286 IN PCSR_PROCESS CsrProcess OPTIONAL
,
287 OUT PCSR_CONNECTION_INFO ConnectInfo
292 CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage
);
297 IN PCSR_WAIT_BLOCK WaitBlock
,
298 IN PLIST_ENTRY WaitList
,
299 IN PVOID WaitArgument1
,
300 IN PVOID WaitArgument2
,
302 IN BOOLEAN DereferenceThread
307 CsrDereferenceProcess(PCSR_PROCESS CsrProcess
);
312 IN PCSR_PROCESS Parent OPTIONAL
,
313 IN PCSR_PROCESS CurrentProcess OPTIONAL
,
314 IN PCSR_PROCESS CsrProcess
319 CsrPopulateDosDevicesDirectory(
320 IN HANDLE DosDevicesDirectory
,
321 IN PPROCESS_DEVICEMAP_INFORMATION DeviceMap
326 CsrValidateMessageBuffer(
327 IN PCSR_API_MESSAGE ApiMessage
,
329 IN ULONG ArgumentSize
,
330 IN ULONG ArgumentCount
335 CsrCreateLocalSystemSD(OUT PSECURITY_DESCRIPTOR
*LocalSystemSd
);
339 CsrDestroyThread(IN PCLIENT_ID Cid
);
345 IN NTSTATUS ExitStatus
348 _SEH_FILTER(CsrUnhandledExceptionFilter
);
352 CsrProcessRefcountZero(IN PCSR_PROCESS CsrProcess
);
356 CsrThreadRefcountZero(IN PCSR_THREAD CsrThread
);
360 CsrSetDirectorySecurity(IN HANDLE ObjectDirectory
);