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)
15 HANDLE DllHandle
= NULL
;
16 // HANDLE WinSrvApiPort = NULL;
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.
24 PCSR_API_ROUTINE UserServerApiDispatchTable
[UserpMaxApiNumber
] =
29 SrvRegisterServicesProcess
, // Not present in Win7
30 // SrvActivateDebugger,
31 // SrvGetThreadConsoleDesktop, // Not present in Win7
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
41 BOOLEAN UserServerApiServerValidTable
[UserpMaxApiNumber
] =
43 FALSE
, // SrvExitWindowsEx
44 // FALSE, // SrvEndTask
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
60 PCHAR UserServerApiNameTable
[UserpMaxApiNumber
] =
65 "SrvRegisterServicesProcess",
66 // "SrvActivateDebugger",
67 // "SrvGetThreadConsoleDesktop",
69 "SrvRegisterLogonProcess",
70 // "SrvCreateSystemThreads",
71 // "SrvRecordShutdownReason",
72 // "SrvCancelShutdown",
73 // "SrvConsoleHandleOperation",
74 // "SrvGetSetShutdownBlockReason",
80 PCSR_API_ROUTINE Win32CsrApiDefinitions[] =
87 CsrGetInputWaitHandle,
90 CsrWriteConsoleOutputChar,
91 CsrWriteConsoleOutputAttrib,
94 CsrWriteConsoleOutput,
96 CsrReadConsoleOutputChar,
97 CsrReadConsoleOutputAttrib,
99 CsrHardwareStateProperty,
103 CsrSetLogonNotifyWindow,
104 CsrRegisterLogonProcess,
105 CsrGenerateCtrlEvent,
108 static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
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),
179 /* FUNCTIONS ******************************************************************/
182 VOID WINAPI UserStaticServerThread(PVOID x)
184 // NTSTATUS Status = STATUS_SUCCESS;
185 PPORT_MESSAGE Request = (PPORT_MESSAGE)x;
186 PPORT_MESSAGE Reply = NULL;
187 ULONG MessageType = 0;
189 DPRINT("WINSRV: %s(%08lx) called\n", __FUNCTION__, x);
191 MessageType = Request->u2.s2.Type;
192 DPRINT("WINSRV: %s(%08lx) received a message (Type=%d)\n",
193 __FUNCTION__, x, MessageType);
198 /\* Status = *\/ NtReplyPort(WinSrvApiPort, Reply);
205 InitializeVideoAddressSpace(VOID
)
207 OBJECT_ATTRIBUTES ObjectAttributes
;
208 UNICODE_STRING PhysMemName
= RTL_CONSTANT_STRING(L
"\\Device\\PhysicalMemory");
210 HANDLE PhysMemHandle
;
212 LARGE_INTEGER Offset
;
214 CHAR IVTAndBda
[1024+256];
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. */
218 ViewSize
= 1024 * 1024;
219 Status
= ZwFreeVirtualMemory(NtCurrentProcess(),
223 if (!NT_SUCCESS(Status
))
225 DPRINT1("Couldn't unmap reserved memory (%x)\n", Status
);
229 /* Open the physical memory section */
230 InitializeObjectAttributes(&ObjectAttributes
,
235 Status
= ZwOpenSection(&PhysMemHandle
,
238 if (!NT_SUCCESS(Status
))
240 DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
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
,
257 PAGE_EXECUTE_READWRITE
);
258 if (!NT_SUCCESS(Status
))
260 DPRINT1("Couldn't map physical memory (%x)\n", Status
);
261 ZwClose(PhysMemHandle
);
265 /* Close physical memory section handle */
266 ZwClose(PhysMemHandle
);
268 if (BaseAddress
!= (PVOID
)0xa0000)
270 DPRINT1("Couldn't map physical memory at the right address (was %x)\n",
275 /* Allocate some low memory to use for the non-BIOS
276 * parts of the v86 mode address space
278 BaseAddress
= (PVOID
)0x1;
279 ViewSize
= 0xa0000 - 0x1000;
280 Status
= ZwAllocateVirtualMemory(NtCurrentProcess(),
284 MEM_RESERVE
| MEM_COMMIT
,
285 PAGE_EXECUTE_READWRITE
);
286 if (!NT_SUCCESS(Status
))
288 DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status
);
291 if (BaseAddress
!= (PVOID
)0x0)
293 DPRINT1("Failed to allocate virtual memory at right address (was %x)\n",
298 /* Get the real mode IVT and BDA from the kernel */
299 Status
= NtVdmControl(VdmInitialize
, IVTAndBda
);
300 if (!NT_SUCCESS(Status
))
302 DPRINT1("NtVdmControl failed (status %x)\n", Status
);
310 /**********************************************************************
313 * TODO: we need a virtual device for sessions other than
314 * TODO: the console one
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
;
325 DPRINT("CSR: %s called\n", __FUNCTION__
);
327 InitializeVideoAddressSpace();
329 InitializeObjectAttributes(&ObjectAttributes
,
334 Status
= NtOpenFile(&VideoHandle
,
340 if (NT_SUCCESS(Status
))
342 NtClose(VideoHandle
);
350 PrivateCsrssManualGuiCheck(LONG Check
)
352 NtUserCallOneParam(Check
, ONEPARAM_ROUTINE_CSRSS_GUICHECK
);
355 CSR_SERVER_DLL_INIT(UserServerDllInitialization
)
358 NTSTATUS Status = STATUS_SUCCESS;
360 DPRINT("WINSRV: %s called\n", __FUNCTION__);
362 // Get the listening port from csrsrv.dll
363 WinSrvApiPort = CsrQueryApiPort ();
364 if (NULL == WinSrvApiPort)
366 return STATUS_UNSUCCESSFUL;
368 // Register our message dispatcher
369 Status = CsrAddStaticServerThread (UserStaticServerThread);
370 if (NT_SUCCESS(Status))
372 //TODO: perform the real user server internal initialization here
377 /* Initialize memory */
378 UserSrvHeap
= RtlGetProcessHeap(); // Initialize our own heap.
379 // BaseSrvSharedHeap = LoadedServerDll->SharedSection; // Get the CSR shared heap.
380 // LoadedServerDll->SharedSection = BaseStaticServerData;
383 NtUserInitialize(0, NULL
, NULL
);
384 PrivateCsrssManualGuiCheck(0);
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
;
399 return STATUS_SUCCESS
;
402 // PUSER_SOUND_SENTRY. Used in basesrv.dll
403 BOOL WINAPI
_UserSoundSentry(VOID
)
411 DllMain(IN HANDLE hDll
,
413 IN LPVOID lpReserved
)
415 UNREFERENCED_PARAMETER(dwReason
);
416 UNREFERENCED_PARAMETER(lpReserved
);
418 if (DLL_PROCESS_ATTACH
== dwReason
)