ReactOS 0.4.15-dev-8058-ga7cbb60
init.c
Go to the documentation of this file.
1/*
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)
8 */
9
10/* INCLUDES *******************************************************************/
11
12#include "usersrv.h"
13#include "api.h" // USERSRV Public server APIs definitions
14#include "../consrv/api.h" // CONSRV Public server APIs definitions
15
16#define NDEBUG
17#include <debug.h>
18
19/* GLOBALS ********************************************************************/
20
22
23/* Handles for Power and Media events. Used by both usersrv and win32k. */
26
27/* Copy of CSR Port handle for win32k */
29
30/* Memory */
31HANDLE UserServerHeap = NULL; // Our own heap.
32
33// Windows Server 2003 table from http://j00ru.vexillium.org/csrss_list/api_list.html#Windows_2k3
35{
36 SrvExitWindowsEx,
37 SrvEndTask,
38 SrvLogon,
39 SrvRegisterServicesProcess, // Not present in Win7
40 SrvActivateDebugger,
41 SrvGetThreadConsoleDesktop, // Not present in Win7
42 SrvDeviceEvent,
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
49};
50
52{
53 FALSE, // SrvExitWindowsEx
54 FALSE, // SrvEndTask
55 FALSE, // SrvLogon
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
66};
67
68/*
69 * On Windows Server 2003, CSR Servers contain
70 * the API Names Table only in Debug Builds.
71 */
72#ifdef CSR_DBG
73PCHAR UserServerApiNameTable[UserpMaxApiNumber - USERSRV_FIRST_API_NUMBER] =
74{
75 "SrvExitWindowsEx",
76 "SrvEndTask",
77 "SrvLogon",
78 "SrvRegisterServicesProcess",
79 "SrvActivateDebugger",
80 "SrvGetThreadConsoleDesktop",
81 "SrvDeviceEvent",
82 "SrvRegisterLogonProcess",
83 "SrvCreateSystemThreads",
84 "SrvRecordShutdownReason",
85 // "SrvCancelShutdown",
86 // "SrvConsoleHandleOperation",
87 // "SrvGetSetShutdownBlockReason",
88};
89#endif
90
91/* FUNCTIONS ******************************************************************/
92
95 IN HWND hWnd,
97{
98 if (GetWindow(hWnd, GW_OWNER) == NULL)
99 {
100 *(HWND*)lParam = hWnd;
101 return FALSE;
102 }
103 return TRUE;
104}
105
106// PUSER_SOUND_SENTRY. Used in basesrv.dll
108{
109 // TODO: Do something.
110 return TRUE;
111}
112
113ULONG
114NTAPI
116{
117 NtUserCallOneParam((DWORD_PTR)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS);
119 return 0;
120}
121
122/* API_NUMBER: UserpCreateSystemThreads */
123CSR_API(SrvCreateSystemThreads)
124{
126 if (!NT_SUCCESS(Status))
127 {
128 DPRINT1("Cannot start system thread!\n");
129 }
130
131 return Status;
132}
133
134/* API_NUMBER: UserpActivateDebugger */
135CSR_API(SrvActivateDebugger)
136{
137 DPRINT1("%s not yet implemented\n", __FUNCTION__);
139}
140
141/* API_NUMBER: UserpGetThreadConsoleDesktop */
142CSR_API(SrvGetThreadConsoleDesktop)
143{
145 PUSER_GET_THREAD_CONSOLE_DESKTOP GetThreadConsoleDesktopRequest = &((PUSER_API_MESSAGE)ApiMessage)->Data.GetThreadConsoleDesktopRequest;
146
147 Status = GetThreadConsoleDesktop(GetThreadConsoleDesktopRequest->ThreadId,
148 &GetThreadConsoleDesktopRequest->ConsoleDesktop);
149 if (!NT_SUCCESS(Status))
150 {
151 DPRINT1("GetThreadConsoleDesktop(%lu) failed with Status 0x%08x\n",
152 GetThreadConsoleDesktopRequest->ThreadId, Status);
153 }
154
155 /* Windows-compatibility: Always return success since User32 relies on this! */
156 return STATUS_SUCCESS;
157}
158
159/* API_NUMBER: UserpDeviceEvent */
160CSR_API(SrvDeviceEvent)
161{
162 DPRINT1("%s not yet implemented\n", __FUNCTION__);
164}
165
166/* API_NUMBER: UserpLogon */
167CSR_API(SrvLogon)
168{
169 PUSER_LOGON LogonRequest = &((PUSER_API_MESSAGE)ApiMessage)->Data.LogonRequest;
170
171 DPRINT1("We are logged %s\n", LogonRequest->IsLogon ? "on" : "off");
172
173 /* Impersonate the caller in order to retrieve settings in its context */
175 return STATUS_UNSUCCESSFUL;
176
178
179 /* We are done */
181 return STATUS_SUCCESS;
182}
183
185NTAPI
187 IN OUT PVOID ConnectionInfo,
188 IN OUT PULONG ConnectionInfoLength)
189{
191 // PUSERCONNECT
192 PUSERSRV_API_CONNECTINFO ConnectInfo = (PUSERSRV_API_CONNECTINFO)ConnectionInfo;
193
194 DPRINT("UserClientConnect\n");
195
196 /* Check if we don't have an API port yet */
197 if (CsrApiPort == NULL)
198 {
199 /* Query the API port and save it globally */
201
202 /* Inform win32k about the API port */
205 &CsrApiPort,
206 sizeof(CsrApiPort));
207 if (!NT_SUCCESS(Status))
208 {
209 return Status;
210 }
211 }
212
213 /* Check connection info validity */
214 if ( ConnectionInfo == NULL ||
215 ConnectionInfoLength == NULL ||
216 *ConnectionInfoLength != sizeof(*ConnectInfo) )
217 {
218 DPRINT1("USERSRV: Connection failed - ConnectionInfo = 0x%p ; ConnectionInfoLength = 0x%p (%lu), expected %lu\n",
219 ConnectionInfo,
220 ConnectionInfoLength,
221 ConnectionInfoLength ? *ConnectionInfoLength : (ULONG)-1,
222 sizeof(*ConnectInfo));
223
225 }
226
227 /* Pass the request to win32k */
228 ConnectInfo->dwDispatchCount = 0; // gDispatchTableValues;
229 Status = NtUserProcessConnect(CsrProcess->ProcessHandle,
230 ConnectInfo,
231 *ConnectionInfoLength);
232
233 return Status;
234}
235
236CSR_SERVER_DLL_INIT(UserServerDllInitialization)
237{
239
240 /* Initialize the memory */
241 UserServerHeap = RtlGetProcessHeap();
242
243 /* Setup the DLL Object */
244 LoadedServerDll->ApiBase = USERSRV_FIRST_API_NUMBER;
245 LoadedServerDll->HighestApiSupported = UserpMaxApiNumber;
246 LoadedServerDll->DispatchTable = UserServerApiDispatchTable;
247 LoadedServerDll->ValidTable = UserServerApiServerValidTable;
248#ifdef CSR_DBG
249 LoadedServerDll->NameTable = UserServerApiNameTable;
250#endif
251 LoadedServerDll->SizeOfProcessData = 0;
252 LoadedServerDll->ConnectCallback = UserClientConnect;
253 LoadedServerDll->DisconnectCallback = NULL;
254 LoadedServerDll->HardErrorCallback = UserServerHardError;
255 LoadedServerDll->ShutdownProcessCallback = UserClientShutdown;
256
257 UserServerDllInstance = LoadedServerDll->ServerHandle;
258
259 /* Create the power request event */
262 NULL,
264 FALSE);
265 if (!NT_SUCCESS(Status))
266 {
267 DPRINT1("Power request event creation failed with Status 0x%08x\n", Status);
268 return Status;
269 }
270
271 /* Create the media request event */
274 NULL,
276 FALSE);
277 if (!NT_SUCCESS(Status))
278 {
279 DPRINT1("Media request event creation failed with Status 0x%08x\n", Status);
280 return Status;
281 }
282
283 /* Set the process creation notify routine for BASE */
285
286 /* Initialize the hard errors cache */
288
289 /* Initialize the kernel mode subsystem */
293 if (!NT_SUCCESS(Status))
294 {
295 DPRINT1("NtUserInitialize failed with Status 0x%08x\n", Status);
296 return Status;
297 }
298
299 /* All done */
300 return STATUS_SUCCESS;
301}
302
303/* EOF */
unsigned char BOOLEAN
HWND hWnd
Definition: settings.c:17
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
VOID NTAPI BaseSetProcessCreateNotify(IN BASE_PROCESS_CREATE_NOTIFY_ROUTINE ProcessCreateNotifyProc)
Definition: proc.c:321
LPARAM lParam
Definition: combotst.c:139
HANDLE NTAPI CsrQueryApiPort(VOID)
Definition: api.c:1097
BOOLEAN NTAPI CsrImpersonateClient(IN PCSR_THREAD CsrThread)
Definition: procsup.c:932
#define CSR_API(n)
Definition: csrsrv.h:176
BOOLEAN NTAPI CsrRevertToSelf(VOID)
Definition: procsup.c:1057
NTSTATUS(NTAPI * PCSR_API_ROUTINE)(IN OUT PCSR_API_MESSAGE ApiMessage, IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
Definition: csrsrv.h:171
#define CSR_SERVER_DLL_INIT(n)
Definition: csrsrv.h:255
NTSTATUS NTAPI CsrExecServerThread(IN PVOID ThreadHandler, IN ULONG Flags)
Definition: thredsup.c:886
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define CALLBACK
Definition: compat.h:35
#define __FUNCTION__
Definition: types.h:116
unsigned int BOOL
Definition: ntddk_ex.h:94
Status
Definition: gdiplustypes.h:25
VOID UserInitHardErrorsCache(VOID)
Definition: harderror.c:1189
DWORD_PTR NTAPI NtUserCallOneParam(DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:153
BOOL NTAPI NtUserNotifyProcessCreate(HANDLE NewProcessId, HANDLE ParentThreadId, ULONG dwUnknown, ULONG CreateFlags)
Definition: ntstubs.c:463
NTSTATUS NTAPI NtUserSetInformationThread(IN HANDLE ThreadHandle, IN USERTHREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: ntstubs.c:673
#define USER_VERSION
Definition: ntuser.h:1149
@ UserThreadCsrApiPort
Definition: ntuser.h:78
NTSTATUS NTAPI NtUserProcessConnect(IN HANDLE ProcessHandle, OUT PUSERCONNECT pUserConnect, IN ULONG Size)
Definition: ntstubs.c:476
NTSTATUS NTAPI NtUserInitialize(DWORD dwWinVersion, HANDLE hPowerRequestEvent, HANDLE hMediaRequestEvent)
Definition: ntuser.c:171
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
NTSYSAPI VOID NTAPI RtlExitUserThread(_In_ NTSTATUS Status)
@ SynchronizationEvent
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
Definition: event.c:96
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define STATUS_SUCCESS
Definition: shellext.h:65
static PUSER_SOUND_SENTRY _UserSoundSentry
Definition: sndsntry.c:21
#define DPRINT
Definition: sndvol32.h:71
BOOL IsLogon
Definition: winmsg.h:65
HANDLE CsrApiPort
Definition: init.c:33
uint32_t * PULONG
Definition: typedefs.h:59
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
PKPROCESS CsrProcess
Definition: videoprt.c:39
NTSTATUS NTAPI GetThreadConsoleDesktop(IN ULONG_PTR ThreadId, OUT HDESK *ConsoleDesktop)
Definition: frontendctl.c:265
VOID FASTCALL GetTimeouts(IN PSHUTDOWN_SETTINGS ShutdownSettings)
Definition: init.c:87
SHUTDOWN_SETTINGS ShutdownSettings
Definition: init.c:24
VOID NTAPI UserServerHardError(IN PCSR_THREAD ThreadData, IN PHARDERROR_MSG Message)
Definition: harderror.c:1082
ULONG NTAPI UserClientShutdown(IN PCSR_PROCESS CsrProcess, IN ULONG Flags, IN BOOLEAN FirstPhase)
Definition: shutdown.c:732
HANDLE ghMediaRequestEvent
Definition: init.c:25
BOOL CALLBACK FindTopLevelWnd(IN HWND hWnd, IN LPARAM lParam)
Definition: init.c:94
HANDLE UserServerHeap
Definition: init.c:31
NTSTATUS NTAPI UserClientConnect(IN PCSR_PROCESS CsrProcess, IN OUT PVOID ConnectionInfo, IN OUT PULONG ConnectionInfoLength)
Definition: init.c:186
HANDLE ghPowerRequestEvent
Definition: init.c:24
HINSTANCE UserServerDllInstance
Definition: init.c:21
PCSR_API_ROUTINE UserServerApiDispatchTable[UserpMaxApiNumber - USERSRV_FIRST_API_NUMBER]
Definition: init.c:34
BOOLEAN UserServerApiServerValidTable[UserpMaxApiNumber - USERSRV_FIRST_API_NUMBER]
Definition: init.c:51
ULONG NTAPI CreateSystemThreads(PVOID pParam)
Definition: init.c:115
LONG_PTR LPARAM
Definition: windef.h:208
@ UserpMaxApiNumber
Definition: winmsg.h:35
#define USERSRV_FIRST_API_NUMBER
Definition: winmsg.h:16
struct _USER_API_MESSAGE * PUSER_API_MESSAGE
#define PUSERSRV_API_CONNECTINFO
Definition: winmsg.h:41
#define GW_OWNER
Definition: winuser.h:766
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
#define NtCurrentThread()