* Sync up to trunk head (r64829).
[reactos.git] / win32ss / user / winsrv / usersrv / init.c
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
14 #include "api.h"
15
16 #define NDEBUG
17 #include <debug.h>
18
19 /* GLOBALS ********************************************************************/
20
21 HINSTANCE UserServerDllInstance = NULL;
22
23 /* Memory */
24 HANDLE UserServerHeap = NULL; // Our own heap.
25
26 // Windows Server 2003 table from http://j00ru.vexillium.org/csrss_list/api_list.html#Windows_2k3
27 PCSR_API_ROUTINE UserServerApiDispatchTable[UserpMaxApiNumber - USERSRV_FIRST_API_NUMBER] =
28 {
29 SrvExitWindowsEx,
30 SrvEndTask,
31 SrvLogon,
32 SrvRegisterServicesProcess, // Not present in Win7
33 SrvActivateDebugger,
34 SrvGetThreadConsoleDesktop, // Not present in Win7
35 SrvDeviceEvent,
36 SrvRegisterLogonProcess, // Not present in Win7
37 SrvCreateSystemThreads,
38 SrvRecordShutdownReason,
39 // SrvCancelShutdown, // Added in Vista
40 // SrvConsoleHandleOperation, // Added in Win7
41 // SrvGetSetShutdownBlockReason, // Added in Vista
42 };
43
44 BOOLEAN UserServerApiServerValidTable[UserpMaxApiNumber - USERSRV_FIRST_API_NUMBER] =
45 {
46 FALSE, // SrvExitWindowsEx
47 FALSE, // SrvEndTask
48 FALSE, // SrvLogon
49 FALSE, // SrvRegisterServicesProcess
50 FALSE, // SrvActivateDebugger
51 TRUE, // SrvGetThreadConsoleDesktop
52 FALSE, // SrvDeviceEvent
53 FALSE, // SrvRegisterLogonProcess
54 FALSE, // SrvCreateSystemThreads
55 FALSE, // SrvRecordShutdownReason
56 // FALSE, // SrvCancelShutdown
57 // FALSE, // SrvConsoleHandleOperation
58 // FALSE, // SrvGetSetShutdownBlockReason
59 };
60
61 /*
62 * On Windows Server 2003, CSR Servers contain
63 * the API Names Table only in Debug Builds.
64 */
65 #ifdef CSR_DBG
66 PCHAR UserServerApiNameTable[UserpMaxApiNumber - USERSRV_FIRST_API_NUMBER] =
67 {
68 "SrvExitWindowsEx",
69 "SrvEndTask",
70 "SrvLogon",
71 "SrvRegisterServicesProcess",
72 "SrvActivateDebugger",
73 "SrvGetThreadConsoleDesktop",
74 "SrvDeviceEvent",
75 "SrvRegisterLogonProcess",
76 "SrvCreateSystemThreads",
77 "SrvRecordShutdownReason",
78 // "SrvCancelShutdown",
79 // "SrvConsoleHandleOperation",
80 // "SrvGetSetShutdownBlockReason",
81 };
82 #endif
83
84 /* FUNCTIONS ******************************************************************/
85
86 // PUSER_SOUND_SENTRY. Used in basesrv.dll
87 BOOL WINAPI _UserSoundSentry(VOID)
88 {
89 // TODO: Do something.
90 return TRUE;
91 }
92
93 // From win32ss/user/win32csr/dllmain.c
94 VOID
95 WINAPI
96 PrivateCsrssManualGuiCheck(LONG Check)
97 {
98 NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
99 }
100
101 ULONG
102 NTAPI
103 CreateSystemThreads(PVOID pParam)
104 {
105 NtUserCallOneParam((DWORD)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS);
106 DPRINT1("This thread should not terminate!\n");
107 return 0;
108 }
109
110 CSR_API(SrvCreateSystemThreads)
111 {
112 DPRINT1("%s not yet implemented\n", __FUNCTION__);
113 return STATUS_NOT_IMPLEMENTED;
114 }
115
116 CSR_API(SrvActivateDebugger)
117 {
118 DPRINT1("%s not yet implemented\n", __FUNCTION__);
119 return STATUS_NOT_IMPLEMENTED;
120 }
121
122 CSR_API(SrvGetThreadConsoleDesktop)
123 {
124 DPRINT1("%s not yet implemented\n", __FUNCTION__);
125 return STATUS_NOT_IMPLEMENTED;
126 }
127
128 CSR_API(SrvDeviceEvent)
129 {
130 DPRINT1("%s not yet implemented\n", __FUNCTION__);
131 return STATUS_NOT_IMPLEMENTED;
132 }
133
134 CSR_SERVER_DLL_INIT(UserServerDllInitialization)
135 {
136 /*** From win32csr... ***/
137 HANDLE ServerThread;
138 CLIENT_ID ClientId;
139 NTSTATUS Status;
140 UINT i;
141 /*** END - From win32csr... ***/
142
143 /* Initialize the memory */
144 UserServerHeap = RtlGetProcessHeap();
145
146 /* Initialize the video */
147 NtUserInitialize(0, NULL, NULL); //
148 PrivateCsrssManualGuiCheck(0);
149
150 /* Setup the DLL Object */
151 LoadedServerDll->ApiBase = USERSRV_FIRST_API_NUMBER;
152 LoadedServerDll->HighestApiSupported = UserpMaxApiNumber;
153 LoadedServerDll->DispatchTable = UserServerApiDispatchTable;
154 LoadedServerDll->ValidTable = UserServerApiServerValidTable;
155 #ifdef CSR_DBG
156 LoadedServerDll->NameTable = UserServerApiNameTable;
157 #endif
158 LoadedServerDll->SizeOfProcessData = 0;
159 LoadedServerDll->ConnectCallback = NULL;
160 LoadedServerDll->DisconnectCallback = NULL;
161 LoadedServerDll->HardErrorCallback = UserServerHardError;
162 LoadedServerDll->ShutdownProcessCallback = NULL;
163
164 UserServerDllInstance = LoadedServerDll->ServerHandle;
165
166 /*** From win32csr... See r54125 ***/
167 /* Start the Raw Input Thread and the Desktop Thread */
168 for (i = 0; i < 2; ++i)
169 {
170 Status = RtlCreateUserThread(NtCurrentProcess(),
171 NULL, TRUE, 0, 0, 0,
172 CreateSystemThreads,
173 (PVOID)i, &ServerThread, &ClientId);
174 if (NT_SUCCESS(Status))
175 {
176 NtResumeThread(ServerThread, NULL);
177 NtClose(ServerThread);
178 }
179 else
180 DPRINT1("Cannot start Raw Input Thread!\n");
181 }
182 /*** END - From win32csr... ***/
183
184 /* All done */
185 return STATUS_SUCCESS;
186 }
187
188 /* EOF */