3 * reactos/subsys/csrss/init.c
5 * Initialize the CSRSS subsystem server process.
7 * ReactOS Operating System
11 /* INCLUDES ******************************************************************/
13 #include <csrss/csrss.h>
14 #include <ddk/ntddk.h>
15 #include <ntdll/csr.h>
16 #include <ntdll/rtl.h>
17 #include <ntdll/ldr.h>
18 #include <win32k/win32k.h>
19 #include <rosrtl/string.h>
20 #include <sm/helper.h>
23 #include "csrplugin.h"
28 /* GLOBALS ******************************************************************/
30 HANDLE CsrInitEvent
= INVALID_HANDLE_VALUE
;
31 HANDLE CsrHeap
= INVALID_HANDLE_VALUE
;
33 HANDLE CsrObjectDirectory
= INVALID_HANDLE_VALUE
;
35 UNICODE_STRING CsrDirectoryName
;
37 extern HANDLE CsrssApiHeap
;
39 static unsigned InitCompleteProcCount
;
40 static CSRPLUGIN_INIT_COMPLETE_PROC
*InitCompleteProcs
= NULL
;
42 static NTSTATUS FASTCALL
43 AddInitCompleteProc(CSRPLUGIN_INIT_COMPLETE_PROC Proc
)
45 CSRPLUGIN_INIT_COMPLETE_PROC
*NewProcs
;
47 NewProcs
= RtlAllocateHeap(CsrssApiHeap
, 0,
48 (InitCompleteProcCount
+ 1)
49 * sizeof(CSRPLUGIN_INIT_COMPLETE_PROC
));
52 return STATUS_NO_MEMORY
;
54 if (0 != InitCompleteProcCount
)
56 RtlCopyMemory(NewProcs
, InitCompleteProcs
,
57 InitCompleteProcCount
* sizeof(CSRPLUGIN_INIT_COMPLETE_PROC
));
58 RtlFreeHeap(CsrssApiHeap
, 0, InitCompleteProcs
);
60 NewProcs
[InitCompleteProcCount
] = Proc
;
61 InitCompleteProcs
= NewProcs
;
62 InitCompleteProcCount
++;
64 return STATUS_SUCCESS
;
68 CallInitComplete(void)
74 if (0 != InitCompleteProcCount
)
76 for (i
= 0; i
< InitCompleteProcCount
&& Ok
; i
++)
78 Ok
= (*(InitCompleteProcs
[i
]))();
80 RtlFreeHeap(CsrssApiHeap
, 0, InitCompleteProcs
);
87 InitializeVideoAddressSpace(VOID
);
96 OBJECT_ATTRIBUTES Attributes
;
99 /* DbgPrint ("Arguments: %ld\n", ArgumentCount);
100 for (i = 0; i < ArgumentCount; i++)
102 DbgPrint ("Argument %ld: %S\n", i, ArgumentArray[i]);
106 /* create object directory ('\Windows') */
107 RtlCreateUnicodeString (&CsrDirectoryName
,
110 InitializeObjectAttributes (&Attributes
,
116 Status
= NtCreateDirectoryObject(&CsrObjectDirectory
,
127 OBJECT_ATTRIBUTES ObjectAttributes
;
128 UNICODE_STRING DeviceName
;
129 IO_STATUS_BLOCK Iosb
;
133 InitializeVideoAddressSpace();
135 RtlRosInitUnicodeStringFromLiteral(&DeviceName
, L
"\\??\\DISPLAY1");
136 InitializeObjectAttributes(&ObjectAttributes
,
141 Status
= NtOpenFile(&VideoHandle
,
147 if (NT_SUCCESS(Status
))
149 NtClose(VideoHandle
);
153 static NTSTATUS FASTCALL
157 UNICODE_STRING DllName
;
159 ANSI_STRING ProcName
;
160 CSRPLUGIN_INITIALIZE_PROC InitProc
;
161 CSRSS_EXPORTED_FUNCS Exports
;
162 PCSRSS_API_DEFINITION ApiDefinitions
;
163 PCSRSS_OBJECT_DEFINITION ObjectDefinitions
;
164 CSRPLUGIN_INIT_COMPLETE_PROC InitCompleteProc
;
166 RtlInitUnicodeString(&DllName
, L
"win32csr.dll");
167 Status
= LdrLoadDll(NULL
, 0, &DllName
, (PVOID
*) &hInst
);
168 if (! NT_SUCCESS(Status
))
172 RtlInitAnsiString(&ProcName
, "Win32CsrInitialization");
173 Status
= LdrGetProcedureAddress(hInst
, &ProcName
, 0, (PVOID
*) &InitProc
);
174 if (! NT_SUCCESS(Status
))
178 Exports
.CsrInsertObjectProc
= CsrInsertObject
;
179 Exports
.CsrGetObjectProc
= CsrGetObject
;
180 Exports
.CsrReleaseObjectProc
= CsrReleaseObject
;
181 if (! (*InitProc
)(&ApiDefinitions
, &ObjectDefinitions
, &InitCompleteProc
,
182 &Exports
, CsrssApiHeap
))
184 return STATUS_UNSUCCESSFUL
;
187 Status
= CsrApiRegisterDefinitions(ApiDefinitions
);
188 if (! NT_SUCCESS(Status
))
192 Status
= CsrRegisterObjectDefinitions(ObjectDefinitions
);
193 if (! NT_SUCCESS(Status
))
197 if (NULL
!= InitCompleteProc
)
199 Status
= AddInitCompleteProc(InitCompleteProc
);
205 CSRSS_API_DEFINITION NativeDefinitions
[] =
207 CSRSS_DEFINE_API(CSRSS_CREATE_PROCESS
, CsrCreateProcess
),
208 CSRSS_DEFINE_API(CSRSS_TERMINATE_PROCESS
, CsrTerminateProcess
),
209 CSRSS_DEFINE_API(CSRSS_CONNECT_PROCESS
, CsrConnectProcess
),
210 CSRSS_DEFINE_API(CSRSS_REGISTER_SERVICES_PROCESS
, CsrRegisterServicesProcess
),
211 CSRSS_DEFINE_API(CSRSS_GET_SHUTDOWN_PARAMETERS
, CsrGetShutdownParameters
),
212 CSRSS_DEFINE_API(CSRSS_SET_SHUTDOWN_PARAMETERS
, CsrSetShutdownParameters
),
213 CSRSS_DEFINE_API(CSRSS_GET_INPUT_HANDLE
, CsrGetInputHandle
),
214 CSRSS_DEFINE_API(CSRSS_GET_OUTPUT_HANDLE
, CsrGetOutputHandle
),
215 CSRSS_DEFINE_API(CSRSS_CLOSE_HANDLE
, CsrCloseHandle
),
216 CSRSS_DEFINE_API(CSRSS_VERIFY_HANDLE
, CsrVerifyHandle
),
217 CSRSS_DEFINE_API(CSRSS_DUPLICATE_HANDLE
, CsrDuplicateHandle
),
218 CSRSS_DEFINE_API(CSRSS_GET_INPUT_WAIT_HANDLE
, CsrGetInputWaitHandle
),
222 /**********************************************************************
224 * CsrpRegisterSubsystem/0
227 * Register CSRSS in the SM to manage IMAGE_SUBSYSTEM_WINDOWS_CUI
228 * processes (environment subsystem server).
231 * STATUS_SUCCESS on success.
233 static NTSTATUS FASTCALL
234 CsrpRegisterSubsystem(PHANDLE hSmApiPort
)
236 NTSTATUS Status
= STATUS_SUCCESS
;
237 UNICODE_STRING SbApiPortName
;
239 RtlInitUnicodeString (& SbApiPortName
, L
"\\Windows\\SbApiPort");
240 Status
= SmConnectApiPort (& SbApiPortName
,
242 IMAGE_SUBSYSTEM_WINDOWS_CUI
,
244 if(!NT_SUCCESS(Status
))
246 DPRINT("CSR: unable to connect to the SM (Status=0x%lx)\n", Status
);
249 DisplayString(L
"CSR: registered with SM\n");
254 /**********************************************************************
256 * CsrServerInitialization
259 * Create a directory object (\windows) and a named LPC port
263 * TRUE: Initialization OK; otherwise FALSE.
267 CsrServerInitialization (
273 HANDLE hSmApiPort
= (HANDLE
) 0;
274 OBJECT_ATTRIBUTES ObAttributes
;
275 UNICODE_STRING PortName
;
276 HANDLE ApiPortHandle
;
277 // HANDLE hSbApiPort = (HANDLE) 0;
279 DisplayString(L
"CSR: CsrServerInitialization\n");
281 Status
= CsrpRegisterSubsystem(& hSmApiPort
);
282 if (! NT_SUCCESS(Status
))
284 DPRINT1("CSR: Unable to register subsystem (Status: %x)\n", Status
);
288 Status
= CsrParseCommandLine (ArgumentCount
, ArgumentArray
);
289 if (! NT_SUCCESS(Status
))
291 DPRINT1("CSR: Unable to parse the command line (Status: %x)\n", Status
);
297 CsrssApiHeap
= RtlCreateHeap(HEAP_GROWABLE
,
303 if (CsrssApiHeap
== NULL
)
305 DPRINT1("CSR: Failed to create private heap, aborting\n");
309 Status
= CsrApiRegisterDefinitions(NativeDefinitions
);
310 if (! NT_SUCCESS(Status
))
315 /* NEW NAMED PORT: \Windows\ApiPort */
316 RtlRosInitUnicodeStringFromLiteral(&PortName
, L
"\\Windows\\ApiPort");
317 InitializeObjectAttributes(&ObAttributes
,
322 Status
= NtCreatePort(&ApiPortHandle
,
327 if (! NT_SUCCESS(Status
))
329 DPRINT1("CSR: Unable to create \\Windows\\ApiPort (Status %x)\n", Status
);
332 Status
= RtlCreateUserThread(NtCurrentProcess(),
338 (PTHREAD_START_ROUTINE
)ServerApiPortThread
,
342 if (! NT_SUCCESS(Status
))
344 DPRINT1("CSR: Unable to create server thread\n");
345 NtClose(ApiPortHandle
);
349 /* TODO: create \Windows\SbApiPort */
351 Status
= CsrClientConnectToServer();
352 if (!NT_SUCCESS(Status
))
354 DPRINT1("CsrClientConnectToServer() failed (Status %x)\n", Status
);
357 Status
= InitWin32Csr();
358 if (! NT_SUCCESS(Status
))
360 DPRINT1("CSR: Unable to load usermode dll (Status %x)\n", Status
);
364 if (CallInitComplete())
367 Status
= SmCompleteSession (hSmApiPort
,hSbApiPort
,ApiPortHandle
);
369 NtClose (hSmApiPort
);