980d12311cb6eb8f49cd4767c1cf45bc30214891
[reactos.git] / win32ss / user / winsrv / init.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User API Server DLL
4 * FILE: win32ss/user/winsrv/init.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru)
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8 */
9
10 #include "winsrv.h"
11
12 #define NDEBUG
13 #include <debug.h>
14
15 HANDLE DllHandle = NULL;
16 // HANDLE WinSrvApiPort = NULL;
17
18 /* Memory */
19 HANDLE UserSrvHeap = NULL; // Our own heap.
20 // HANDLE BaseSrvSharedHeap = NULL; // Shared heap with CSR. (CsrSrvSharedSectionHeap)
21 // PBASE_STATIC_SERVER_DATA BaseStaticServerData = NULL; // Data that we can share amongst processes. Initialized inside BaseSrvSharedHeap.
22
23
24 PCSR_API_ROUTINE UserServerApiDispatchTable[UserpMaxApiNumber] =
25 {
26 SrvExitWindowsEx,
27 // SrvEndTask,
28 // SrvLogon,
29 SrvRegisterServicesProcess, // Not present in Win7
30 // SrvActivateDebugger,
31 // SrvGetThreadConsoleDesktop, // Not present in Win7
32 // SrvDeviceEvent,
33 SrvRegisterLogonProcess, // Not present in Win7
34 // SrvCreateSystemThreads,
35 // SrvRecordShutdownReason,
36 // SrvCancelShutdown, // Added in Vista
37 // SrvConsoleHandleOperation, // Added in Win7
38 // SrvGetSetShutdownBlockReason, // Added in Vista
39 };
40
41 BOOLEAN UserServerApiServerValidTable[UserpMaxApiNumber] =
42 {
43 FALSE, // SrvExitWindowsEx
44 // FALSE, // SrvEndTask
45 // FALSE, // SrvLogon
46 FALSE, // SrvRegisterServicesProcess
47 // FALSE, // SrvActivateDebugger
48 // TRUE, // SrvGetThreadConsoleDesktop
49 // FALSE, // SrvDeviceEvent
50 FALSE, // SrvRegisterLogonProcess
51 // FALSE, // SrvCreateSystemThreads
52 // FALSE, // SrvRecordShutdownReason
53 // FALSE, // SrvCancelShutdown
54 // FALSE, // SrvConsoleHandleOperation
55 // FALSE, // SrvGetSetShutdownBlockReason
56
57 // FALSE
58 };
59
60 PCHAR UserServerApiNameTable[UserpMaxApiNumber] =
61 {
62 "SrvExitWindowsEx",
63 // "SrvEndTask",
64 // "SrvLogon",
65 "SrvRegisterServicesProcess",
66 // "SrvActivateDebugger",
67 // "SrvGetThreadConsoleDesktop",
68 // "SrvDeviceEvent",
69 "SrvRegisterLogonProcess",
70 // "SrvCreateSystemThreads",
71 // "SrvRecordShutdownReason",
72 // "SrvCancelShutdown",
73 // "SrvConsoleHandleOperation",
74 // "SrvGetSetShutdownBlockReason",
75
76 // NULL
77 };
78
79 /*
80 PCSR_API_ROUTINE Win32CsrApiDefinitions[] =
81 {
82 CsrGetHandle,
83 CsrGetHandle,
84 CsrCloseHandle,
85 CsrVerifyHandle,
86 CsrDuplicateHandle,
87 CsrGetInputWaitHandle,
88 CsrFillOutputChar,
89 CsrReadInputEvent,
90 CsrWriteConsoleOutputChar,
91 CsrWriteConsoleOutputAttrib,
92 CsrFillOutputAttrib,
93 CsrSetTextAttrib,
94 CsrWriteConsoleOutput,
95 CsrFlushInputBuffer,
96 CsrReadConsoleOutputChar,
97 CsrReadConsoleOutputAttrib,
98 CsrExitReactos,
99 CsrHardwareStateProperty,
100 CsrCreateDesktop,
101 CsrShowDesktop,
102 CsrHideDesktop,
103 CsrSetLogonNotifyWindow,
104 CsrRegisterLogonProcess,
105 CsrGenerateCtrlEvent,
106 };
107
108 static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
109 {
110 CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetHandle),
111 CSRSS_DEFINE_API(GET_OUTPUT_HANDLE, CsrGetHandle),
112 CSRSS_DEFINE_API(CLOSE_HANDLE, CsrCloseHandle),
113 CSRSS_DEFINE_API(VERIFY_HANDLE, CsrVerifyHandle),
114 CSRSS_DEFINE_API(DUPLICATE_HANDLE, CsrDuplicateHandle),
115 CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
116 CSRSS_DEFINE_API(WRITE_CONSOLE, CsrWriteConsole),
117 CSRSS_DEFINE_API(READ_CONSOLE, CsrReadConsole),
118 CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole),
119 CSRSS_DEFINE_API(FREE_CONSOLE, CsrFreeConsole),
120 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO, CsrGetScreenBufferInfo),
121 CSRSS_DEFINE_API(SET_CURSOR, CsrSetCursor),
122 CSRSS_DEFINE_API(FILL_OUTPUT, CsrFillOutputChar),
123 CSRSS_DEFINE_API(READ_INPUT, CsrReadInputEvent),
124 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR, CsrWriteConsoleOutputChar),
125 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CsrWriteConsoleOutputAttrib),
126 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB, CsrFillOutputAttrib),
127 CSRSS_DEFINE_API(GET_CURSOR_INFO, CsrGetCursorInfo),
128 CSRSS_DEFINE_API(SET_CURSOR_INFO, CsrSetCursorInfo),
129 CSRSS_DEFINE_API(SET_ATTRIB, CsrSetTextAttrib),
130 CSRSS_DEFINE_API(GET_CONSOLE_MODE, CsrGetConsoleMode),
131 CSRSS_DEFINE_API(SET_CONSOLE_MODE, CsrSetConsoleMode),
132 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER, CsrCreateScreenBuffer),
133 CSRSS_DEFINE_API(SET_SCREEN_BUFFER, CsrSetScreenBuffer),
134 CSRSS_DEFINE_API(SET_TITLE, CsrSetTitle),
135 CSRSS_DEFINE_API(GET_TITLE, CsrGetTitle),
136 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT, CsrWriteConsoleOutput),
137 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER, CsrFlushInputBuffer),
138 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER, CsrScrollConsoleScreenBuffer),
139 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR, CsrReadConsoleOutputChar),
140 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB, CsrReadConsoleOutputAttrib),
141 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS, CsrGetNumberOfConsoleInputEvents),
142 CSRSS_DEFINE_API(EXIT_REACTOS, CsrExitReactos),
143 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT, CsrPeekConsoleInput),
144 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT, CsrReadConsoleOutput),
145 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT, CsrWriteConsoleInput),
146 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE, CsrHardwareStateProperty),
147 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW, CsrGetConsoleWindow),
148 CSRSS_DEFINE_API(CREATE_DESKTOP, CsrCreateDesktop),
149 CSRSS_DEFINE_API(SHOW_DESKTOP, CsrShowDesktop),
150 CSRSS_DEFINE_API(HIDE_DESKTOP, CsrHideDesktop),
151 CSRSS_DEFINE_API(SET_CONSOLE_ICON, CsrSetConsoleIcon),
152 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW, CsrSetLogonNotifyWindow),
153 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS, CsrRegisterLogonProcess),
154 CSRSS_DEFINE_API(GET_CONSOLE_CP, CsrGetConsoleCodePage),
155 CSRSS_DEFINE_API(SET_CONSOLE_CP, CsrSetConsoleCodePage),
156 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
157 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
158 CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
159 CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS, CsrAddConsoleAlias),
160 CSRSS_DEFINE_API(GET_CONSOLE_ALIAS, CsrGetConsoleAlias),
161 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES, CsrGetAllConsoleAliases),
162 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CsrGetAllConsoleAliasesLength),
163 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES, CsrGetConsoleAliasesExes),
164 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CsrGetConsoleAliasesExesLength),
165 CSRSS_DEFINE_API(GENERATE_CTRL_EVENT, CsrGenerateCtrlEvent),
166 CSRSS_DEFINE_API(SET_SCREEN_BUFFER_SIZE, CsrSetScreenBufferSize),
167 CSRSS_DEFINE_API(GET_CONSOLE_SELECTION_INFO, CsrGetConsoleSelectionInfo),
168 CSRSS_DEFINE_API(GET_COMMAND_HISTORY_LENGTH, CsrGetCommandHistoryLength),
169 CSRSS_DEFINE_API(GET_COMMAND_HISTORY, CsrGetCommandHistory),
170 CSRSS_DEFINE_API(EXPUNGE_COMMAND_HISTORY, CsrExpungeCommandHistory),
171 CSRSS_DEFINE_API(SET_HISTORY_NUMBER_COMMANDS, CsrSetHistoryNumberCommands),
172 CSRSS_DEFINE_API(GET_HISTORY_INFO, CsrGetHistoryInfo),
173 CSRSS_DEFINE_API(SET_HISTORY_INFO, CsrSetHistoryInfo),
174 { 0, 0, NULL }
175 };
176 */
177
178
179 /* FUNCTIONS ******************************************************************/
180
181 /*
182 VOID WINAPI UserStaticServerThread(PVOID x)
183 {
184 // NTSTATUS Status = STATUS_SUCCESS;
185 PPORT_MESSAGE Request = (PPORT_MESSAGE)x;
186 PPORT_MESSAGE Reply = NULL;
187 ULONG MessageType = 0;
188
189 DPRINT("WINSRV: %s(%08lx) called\n", __FUNCTION__, x);
190
191 MessageType = Request->u2.s2.Type;
192 DPRINT("WINSRV: %s(%08lx) received a message (Type=%d)\n",
193 __FUNCTION__, x, MessageType);
194 switch (MessageType)
195 {
196 default:
197 Reply = Request;
198 /\* Status = *\/ NtReplyPort(WinSrvApiPort, Reply);
199 break;
200 }
201 }
202 */
203
204 ULONG
205 InitializeVideoAddressSpace(VOID)
206 {
207 OBJECT_ATTRIBUTES ObjectAttributes;
208 UNICODE_STRING PhysMemName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
209 NTSTATUS Status;
210 HANDLE PhysMemHandle;
211 PVOID BaseAddress;
212 LARGE_INTEGER Offset;
213 SIZE_T ViewSize;
214 CHAR IVTAndBda[1024+256];
215
216 /* Free the 1MB pre-reserved region. In reality, ReactOS should simply support us mapping the view into the reserved area, but it doesn't. */
217 BaseAddress = 0;
218 ViewSize = 1024 * 1024;
219 Status = ZwFreeVirtualMemory(NtCurrentProcess(),
220 &BaseAddress,
221 &ViewSize,
222 MEM_RELEASE);
223 if (!NT_SUCCESS(Status))
224 {
225 DPRINT1("Couldn't unmap reserved memory (%x)\n", Status);
226 return 0;
227 }
228
229 /* Open the physical memory section */
230 InitializeObjectAttributes(&ObjectAttributes,
231 &PhysMemName,
232 0,
233 NULL,
234 NULL);
235 Status = ZwOpenSection(&PhysMemHandle,
236 SECTION_ALL_ACCESS,
237 &ObjectAttributes);
238 if (!NT_SUCCESS(Status))
239 {
240 DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
241 return 0;
242 }
243
244 /* Map the BIOS and device registers into the address space */
245 Offset.QuadPart = 0xa0000;
246 ViewSize = 0x100000 - 0xa0000;
247 BaseAddress = (PVOID)0xa0000;
248 Status = ZwMapViewOfSection(PhysMemHandle,
249 NtCurrentProcess(),
250 &BaseAddress,
251 0,
252 ViewSize,
253 &Offset,
254 &ViewSize,
255 ViewUnmap,
256 0,
257 PAGE_EXECUTE_READWRITE);
258 if (!NT_SUCCESS(Status))
259 {
260 DPRINT1("Couldn't map physical memory (%x)\n", Status);
261 ZwClose(PhysMemHandle);
262 return 0;
263 }
264
265 /* Close physical memory section handle */
266 ZwClose(PhysMemHandle);
267
268 if (BaseAddress != (PVOID)0xa0000)
269 {
270 DPRINT1("Couldn't map physical memory at the right address (was %x)\n",
271 BaseAddress);
272 return 0;
273 }
274
275 /* Allocate some low memory to use for the non-BIOS
276 * parts of the v86 mode address space
277 */
278 BaseAddress = (PVOID)0x1;
279 ViewSize = 0xa0000 - 0x1000;
280 Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
281 &BaseAddress,
282 0,
283 &ViewSize,
284 MEM_RESERVE | MEM_COMMIT,
285 PAGE_EXECUTE_READWRITE);
286 if (!NT_SUCCESS(Status))
287 {
288 DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status);
289 return 0;
290 }
291 if (BaseAddress != (PVOID)0x0)
292 {
293 DPRINT1("Failed to allocate virtual memory at right address (was %x)\n",
294 BaseAddress);
295 return 0;
296 }
297
298 /* Get the real mode IVT and BDA from the kernel */
299 Status = NtVdmControl(VdmInitialize, IVTAndBda);
300 if (!NT_SUCCESS(Status))
301 {
302 DPRINT1("NtVdmControl failed (status %x)\n", Status);
303 return 0;
304 }
305
306 /* Return success */
307 return 1;
308 }
309
310 /**********************************************************************
311 * CsrpInitVideo/3
312 *
313 * TODO: we need a virtual device for sessions other than
314 * TODO: the console one
315 */
316 NTSTATUS
317 CsrpInitVideo(VOID)
318 {
319 OBJECT_ATTRIBUTES ObjectAttributes;
320 UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1");
321 IO_STATUS_BLOCK Iosb;
322 HANDLE VideoHandle = (HANDLE) 0;
323 NTSTATUS Status = STATUS_SUCCESS;
324
325 DPRINT("CSR: %s called\n", __FUNCTION__);
326
327 InitializeVideoAddressSpace();
328
329 InitializeObjectAttributes(&ObjectAttributes,
330 &DeviceName,
331 0,
332 NULL,
333 NULL);
334 Status = NtOpenFile(&VideoHandle,
335 FILE_ALL_ACCESS,
336 &ObjectAttributes,
337 &Iosb,
338 0,
339 0);
340 if (NT_SUCCESS(Status))
341 {
342 NtClose(VideoHandle);
343 }
344
345 return Status;
346 }
347
348 VOID
349 WINAPI
350 PrivateCsrssManualGuiCheck(LONG Check)
351 {
352 NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
353 }
354
355 CSR_SERVER_DLL_INIT(UserServerDllInitialization)
356 {
357 /*
358 NTSTATUS Status = STATUS_SUCCESS;
359
360 DPRINT("WINSRV: %s called\n", __FUNCTION__);
361
362 // Get the listening port from csrsrv.dll
363 WinSrvApiPort = CsrQueryApiPort ();
364 if (NULL == WinSrvApiPort)
365 {
366 return STATUS_UNSUCCESSFUL;
367 }
368 // Register our message dispatcher
369 Status = CsrAddStaticServerThread (UserStaticServerThread);
370 if (NT_SUCCESS(Status))
371 {
372 //TODO: perform the real user server internal initialization here
373 }
374 return Status;
375 */
376
377 /* Initialize memory */
378 UserSrvHeap = RtlGetProcessHeap(); // Initialize our own heap.
379 // BaseSrvSharedHeap = LoadedServerDll->SharedSection; // Get the CSR shared heap.
380 // LoadedServerDll->SharedSection = BaseStaticServerData;
381
382 CsrpInitVideo();
383 NtUserInitialize(0, NULL, NULL);
384 PrivateCsrssManualGuiCheck(0);
385
386 /* Setup the DLL Object */
387 LoadedServerDll->ApiBase = USERSRV_FIRST_API_NUMBER;
388 LoadedServerDll->HighestApiSupported = UserpMaxApiNumber;
389 LoadedServerDll->DispatchTable = UserServerApiDispatchTable;
390 LoadedServerDll->ValidTable = UserServerApiServerValidTable;
391 LoadedServerDll->NameTable = UserServerApiNameTable;
392 LoadedServerDll->SizeOfProcessData = 0;
393 LoadedServerDll->ConnectCallback = NULL;
394 // LoadedServerDll->DisconnectCallback = Win32CsrReleaseConsole;
395 // LoadedServerDll->NewProcessCallback = Win32CsrDuplicateHandleTable;
396 LoadedServerDll->HardErrorCallback = Win32CsrHardError;
397
398 /* All done */
399 return STATUS_SUCCESS;
400 }
401
402 // PUSER_SOUND_SENTRY. Used in basesrv.dll
403 BOOL WINAPI _UserSoundSentry(VOID)
404 {
405 // Do something.
406 return TRUE;
407 }
408
409 BOOL
410 WINAPI
411 DllMain(IN HANDLE hDll,
412 IN DWORD dwReason,
413 IN LPVOID lpReserved)
414 {
415 UNREFERENCED_PARAMETER(dwReason);
416 UNREFERENCED_PARAMETER(lpReserved);
417
418 if (DLL_PROCESS_ATTACH == dwReason)
419 {
420 DllHandle = hDll;
421 }
422
423 return TRUE;
424 }
425
426 /* EOF */