2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User API Server DLL
4 * FILE: win32ss/user/winsrv/usersrv/init.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru)
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
19 /* GLOBALS ********************************************************************/
21 HINSTANCE UserServerDllInstance
= NULL
;
23 /* Handles for Power and Media events. Used by both usersrv and win32k. */
24 HANDLE ghPowerRequestEvent
;
25 HANDLE ghMediaRequestEvent
;
27 /* Copy of CSR Port handle for win32k */
28 HANDLE CsrApiPort
= NULL
;
31 HANDLE UserServerHeap
= NULL
; // Our own heap.
33 // Windows Server 2003 table from http://j00ru.vexillium.org/csrss_list/api_list.html#Windows_2k3
34 PCSR_API_ROUTINE UserServerApiDispatchTable
[UserpMaxApiNumber
- USERSRV_FIRST_API_NUMBER
] =
39 SrvRegisterServicesProcess
, // Not present in Win7
41 SrvGetThreadConsoleDesktop
, // Not present in Win7
43 SrvRegisterLogonProcess
, // Not present in Win7
44 SrvCreateSystemThreads
,
45 SrvRecordShutdownReason
,
46 // SrvCancelShutdown, // Added in Vista
47 // SrvConsoleHandleOperation, // Added in Win7
48 // SrvGetSetShutdownBlockReason, // Added in Vista
51 BOOLEAN UserServerApiServerValidTable
[UserpMaxApiNumber
- USERSRV_FIRST_API_NUMBER
] =
53 FALSE
, // SrvExitWindowsEx
56 FALSE
, // SrvRegisterServicesProcess
57 FALSE
, // SrvActivateDebugger
58 TRUE
, // SrvGetThreadConsoleDesktop
59 FALSE
, // SrvDeviceEvent
60 FALSE
, // SrvRegisterLogonProcess
61 FALSE
, // SrvCreateSystemThreads
62 FALSE
, // SrvRecordShutdownReason
63 // FALSE, // SrvCancelShutdown
64 // FALSE, // SrvConsoleHandleOperation
65 // FALSE, // SrvGetSetShutdownBlockReason
69 * On Windows Server 2003, CSR Servers contain
70 * the API Names Table only in Debug Builds.
73 PCHAR UserServerApiNameTable
[UserpMaxApiNumber
- USERSRV_FIRST_API_NUMBER
] =
78 "SrvRegisterServicesProcess",
79 "SrvActivateDebugger",
80 "SrvGetThreadConsoleDesktop",
82 "SrvRegisterLogonProcess",
83 "SrvCreateSystemThreads",
84 "SrvRecordShutdownReason",
85 // "SrvCancelShutdown",
86 // "SrvConsoleHandleOperation",
87 // "SrvGetSetShutdownBlockReason",
91 /* FUNCTIONS ******************************************************************/
98 if (GetWindow(hWnd
, GW_OWNER
) == NULL
)
100 *(HWND
*)lParam
= hWnd
;
106 // PUSER_SOUND_SENTRY. Used in basesrv.dll
107 BOOL NTAPI
_UserSoundSentry(VOID
)
109 // TODO: Do something.
115 CreateSystemThreads(PVOID pParam
)
117 NtUserCallOneParam((DWORD
)pParam
, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS
);
118 RtlExitUserThread(0);
122 CSR_API(SrvCreateSystemThreads
)
124 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
125 return STATUS_NOT_IMPLEMENTED
;
128 CSR_API(SrvActivateDebugger
)
130 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
131 return STATUS_NOT_IMPLEMENTED
;
134 CSR_API(SrvGetThreadConsoleDesktop
)
136 PUSER_GET_THREAD_CONSOLE_DESKTOP GetThreadConsoleDesktopRequest
= &((PUSER_API_MESSAGE
)ApiMessage
)->Data
.GetThreadConsoleDesktopRequest
;
138 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
140 /* Return nothing for the moment... */
141 GetThreadConsoleDesktopRequest
->ConsoleDesktop
= NULL
;
143 /* Always succeeds */
144 return STATUS_SUCCESS
;
147 CSR_API(SrvDeviceEvent
)
149 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
150 return STATUS_NOT_IMPLEMENTED
;
155 PUSER_LOGON LogonRequest
= &((PUSER_API_MESSAGE
)ApiMessage
)->Data
.LogonRequest
;
157 DPRINT1("We are logged %s\n", LogonRequest
->IsLogon
? "on" : "off");
159 /* Impersonate the caller in order to retrieve settings in its context */
160 if (!CsrImpersonateClient(NULL
))
161 return STATUS_UNSUCCESSFUL
;
163 GetTimeouts(&ShutdownSettings
);
167 return STATUS_SUCCESS
;
172 UserClientConnect(IN PCSR_PROCESS CsrProcess
,
173 IN OUT PVOID ConnectionInfo
,
174 IN OUT PULONG ConnectionInfoLength
)
178 PUSERSRV_API_CONNECTINFO ConnectInfo
= (PUSERSRV_API_CONNECTINFO
)ConnectionInfo
;
180 DPRINT("UserClientConnect\n");
182 /* Check if we don't have an API port yet */
183 if (CsrApiPort
== NULL
)
185 /* Query the API port and save it globally */
186 CsrApiPort
= CsrQueryApiPort();
188 /* Inform win32k about the API port */
189 Status
= NtUserSetInformationThread(NtCurrentThread(),
190 UserThreadCsrApiPort
,
193 if (!NT_SUCCESS(Status
))
199 /* Check connection info validity */
200 if ( ConnectionInfo
== NULL
||
201 ConnectionInfoLength
== NULL
||
202 *ConnectionInfoLength
!= sizeof(*ConnectInfo
) )
204 DPRINT1("USERSRV: Connection failed - ConnectionInfo = 0x%p ; ConnectionInfoLength = 0x%p (%lu), expected %lu\n",
206 ConnectionInfoLength
,
207 ConnectionInfoLength
? *ConnectionInfoLength
: (ULONG
)-1,
208 sizeof(*ConnectInfo
));
210 return STATUS_INVALID_PARAMETER
;
213 /* Pass the request to win32k */
214 ConnectInfo
->dwDispatchCount
= 0; // gDispatchTableValues;
215 Status
= NtUserProcessConnect(CsrProcess
->ProcessHandle
,
217 *ConnectionInfoLength
);
222 CSR_SERVER_DLL_INIT(UserServerDllInitialization
)
226 /* Initialize the memory */
227 UserServerHeap
= RtlGetProcessHeap();
229 /* Setup the DLL Object */
230 LoadedServerDll
->ApiBase
= USERSRV_FIRST_API_NUMBER
;
231 LoadedServerDll
->HighestApiSupported
= UserpMaxApiNumber
;
232 LoadedServerDll
->DispatchTable
= UserServerApiDispatchTable
;
233 LoadedServerDll
->ValidTable
= UserServerApiServerValidTable
;
235 LoadedServerDll
->NameTable
= UserServerApiNameTable
;
237 LoadedServerDll
->SizeOfProcessData
= 0;
238 LoadedServerDll
->ConnectCallback
= UserClientConnect
;
239 LoadedServerDll
->DisconnectCallback
= NULL
;
240 LoadedServerDll
->HardErrorCallback
= UserServerHardError
;
241 LoadedServerDll
->ShutdownProcessCallback
= UserClientShutdown
;
243 UserServerDllInstance
= LoadedServerDll
->ServerHandle
;
245 /* Create the power request event */
246 Status
= NtCreateEvent(&ghPowerRequestEvent
,
249 SynchronizationEvent
,
251 if (!NT_SUCCESS(Status
))
253 DPRINT1("Power request event creation failed with Status 0x%08x\n", Status
);
257 /* Create the media request event */
258 Status
= NtCreateEvent(&ghMediaRequestEvent
,
261 SynchronizationEvent
,
263 if (!NT_SUCCESS(Status
))
265 DPRINT1("Media request event creation failed with Status 0x%08x\n", Status
);
269 /* Set the process creation notify routine for BASE */
270 BaseSetProcessCreateNotify(NtUserNotifyProcessCreate
);
272 /* Initialize the hard errors cache */
273 UserInitHardErrorsCache();
275 /* Initialize the kernel mode subsystem */
276 Status
= NtUserInitialize(USER_VERSION
,
278 ghMediaRequestEvent
);
279 if (!NT_SUCCESS(Status
))
281 DPRINT1("NtUserInitialize failed with Status 0x%08x\n", Status
);
285 /*** From win32csr... See r54125 ***/
291 /* Start the Raw Input Thread and the Desktop Thread */
292 for (i
= 0; i
< 2; ++i
)
294 Status
= RtlCreateUserThread(NtCurrentProcess(),
297 (PVOID
)i
, &ServerThread
, &ClientId
);
298 if (NT_SUCCESS(Status
))
300 NtResumeThread(ServerThread
, NULL
);
301 NtClose(ServerThread
);
305 DPRINT1("Cannot start Raw Input Thread!\n");
309 /*** END - From win32csr... ***/
312 return STATUS_SUCCESS
;