d8cfa8c8161cbac6603d47a5f4d85264d9cbb68f
[reactos.git] / subsystems / win32 / csrss / win32csr / dllmain.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: subsys/csrss/win32csr/dllmain.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru)
7 */
8
9 /* INCLUDES ******************************************************************/
10 #define NDEBUG
11 #include "w32csr.h"
12 #include "file.h"
13 #include <debug.h>
14
15 /* Not defined in any header file */
16 extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check);
17 extern LIST_ENTRY DosDeviceHistory;
18 extern RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec;
19
20 /* GLOBALS *******************************************************************/
21
22 HANDLE Win32CsrApiHeap;
23 HINSTANCE Win32CsrDllHandle = NULL;
24 static CSRSS_EXPORTED_FUNCS CsrExports;
25
26 static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
27 {
28 CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetHandle),
29 CSRSS_DEFINE_API(GET_OUTPUT_HANDLE, CsrGetHandle),
30 CSRSS_DEFINE_API(CLOSE_HANDLE, CsrCloseHandle),
31 CSRSS_DEFINE_API(VERIFY_HANDLE, CsrVerifyHandle),
32 CSRSS_DEFINE_API(DUPLICATE_HANDLE, CsrDuplicateHandle),
33 CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
34 CSRSS_DEFINE_API(WRITE_CONSOLE, CsrWriteConsole),
35 CSRSS_DEFINE_API(READ_CONSOLE, CsrReadConsole),
36 CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole),
37 CSRSS_DEFINE_API(FREE_CONSOLE, CsrFreeConsole),
38 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO, CsrGetScreenBufferInfo),
39 CSRSS_DEFINE_API(SET_CURSOR, CsrSetCursor),
40 CSRSS_DEFINE_API(FILL_OUTPUT, CsrFillOutputChar),
41 CSRSS_DEFINE_API(READ_INPUT, CsrReadInputEvent),
42 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR, CsrWriteConsoleOutputChar),
43 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CsrWriteConsoleOutputAttrib),
44 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB, CsrFillOutputAttrib),
45 CSRSS_DEFINE_API(GET_CURSOR_INFO, CsrGetCursorInfo),
46 CSRSS_DEFINE_API(SET_CURSOR_INFO, CsrSetCursorInfo),
47 CSRSS_DEFINE_API(SET_ATTRIB, CsrSetTextAttrib),
48 CSRSS_DEFINE_API(GET_CONSOLE_MODE, CsrGetConsoleMode),
49 CSRSS_DEFINE_API(SET_CONSOLE_MODE, CsrSetConsoleMode),
50 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER, CsrCreateScreenBuffer),
51 CSRSS_DEFINE_API(SET_SCREEN_BUFFER, CsrSetScreenBuffer),
52 CSRSS_DEFINE_API(SET_TITLE, CsrSetTitle),
53 CSRSS_DEFINE_API(GET_TITLE, CsrGetTitle),
54 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT, CsrWriteConsoleOutput),
55 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER, CsrFlushInputBuffer),
56 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER, CsrScrollConsoleScreenBuffer),
57 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR, CsrReadConsoleOutputChar),
58 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB, CsrReadConsoleOutputAttrib),
59 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS, CsrGetNumberOfConsoleInputEvents),
60 CSRSS_DEFINE_API(EXIT_REACTOS, CsrExitReactos),
61 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT, CsrPeekConsoleInput),
62 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT, CsrReadConsoleOutput),
63 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT, CsrWriteConsoleInput),
64 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE, CsrHardwareStateProperty),
65 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW, CsrGetConsoleWindow),
66 CSRSS_DEFINE_API(CREATE_DESKTOP, CsrCreateDesktop),
67 CSRSS_DEFINE_API(SHOW_DESKTOP, CsrShowDesktop),
68 CSRSS_DEFINE_API(HIDE_DESKTOP, CsrHideDesktop),
69 CSRSS_DEFINE_API(SET_CONSOLE_ICON, CsrSetConsoleIcon),
70 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW, CsrSetLogonNotifyWindow),
71 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS, CsrRegisterLogonProcess),
72 CSRSS_DEFINE_API(GET_CONSOLE_CP, CsrGetConsoleCodePage),
73 CSRSS_DEFINE_API(SET_CONSOLE_CP, CsrSetConsoleCodePage),
74 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
75 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
76 CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
77 CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS, CsrAddConsoleAlias),
78 CSRSS_DEFINE_API(GET_CONSOLE_ALIAS, CsrGetConsoleAlias),
79 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES, CsrGetAllConsoleAliases),
80 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CsrGetAllConsoleAliasesLength),
81 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES, CsrGetConsoleAliasesExes),
82 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CsrGetConsoleAliasesExesLength),
83 CSRSS_DEFINE_API(GENERATE_CTRL_EVENT, CsrGenerateCtrlEvent),
84 CSRSS_DEFINE_API(SET_SCREEN_BUFFER_SIZE, CsrSetScreenBufferSize),
85 CSRSS_DEFINE_API(GET_CONSOLE_SELECTION_INFO, CsrGetConsoleSelectionInfo),
86 CSRSS_DEFINE_API(GET_COMMAND_HISTORY_LENGTH, CsrGetCommandHistoryLength),
87 CSRSS_DEFINE_API(GET_COMMAND_HISTORY, CsrGetCommandHistory),
88 CSRSS_DEFINE_API(EXPUNGE_COMMAND_HISTORY, CsrExpungeCommandHistory),
89 CSRSS_DEFINE_API(SET_HISTORY_NUMBER_COMMANDS, CsrSetHistoryNumberCommands),
90 CSRSS_DEFINE_API(GET_HISTORY_INFO, CsrGetHistoryInfo),
91 CSRSS_DEFINE_API(SET_HISTORY_INFO, CsrSetHistoryInfo),
92 CSRSS_DEFINE_API(GET_TEMP_FILE, CsrGetTempFile),
93 CSRSS_DEFINE_API(DEFINE_DOS_DEVICE, CsrDefineDosDevice),
94 { 0, 0, NULL }
95 };
96
97 static HHOOK hhk = NULL;
98
99 /* FUNCTIONS *****************************************************************/
100
101 LRESULT
102 CALLBACK
103 KeyboardHookProc(
104 int nCode,
105 WPARAM wParam,
106 LPARAM lParam)
107 {
108 return CallNextHookEx(hhk, nCode, wParam, lParam);
109 }
110
111 BOOL WINAPI
112 DllMain(HANDLE hDll,
113 DWORD dwReason,
114 LPVOID lpReserved)
115 {
116 if (DLL_PROCESS_ATTACH == dwReason)
117 {
118 Win32CsrDllHandle = hDll;
119 //
120 // HACK HACK HACK ReactOS to BOOT! Initialization BUG ALERT! See bug 5655.
121 //
122 hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0);
123 // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
124 // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
125 // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
126 }
127
128 if (DLL_PROCESS_DETACH == dwReason)
129 {
130 CsrCleanupDefineDosDevice();
131 }
132 return TRUE;
133 }
134
135 /* Ensure that a captured buffer is safe to access */
136 BOOL FASTCALL
137 Win32CsrValidateBuffer(PCSRSS_PROCESS_DATA ProcessData, PVOID Buffer,
138 SIZE_T NumElements, SIZE_T ElementSize)
139 {
140 /* Check that the following conditions are true:
141 * 1. The start of the buffer is somewhere within the process's
142 * shared memory section view.
143 * 2. The remaining space in the view is at least as large as the buffer.
144 * (NB: Please don't try to "optimize" this by using multiplication
145 * instead of division; remember that 2147483648 * 2 = 0.)
146 * 3. The buffer is DWORD-aligned.
147 */
148 ULONG_PTR Offset = (BYTE *)Buffer - (BYTE *)ProcessData->CsrSectionViewBase;
149 if (Offset >= ProcessData->CsrSectionViewSize
150 || NumElements > (ProcessData->CsrSectionViewSize - Offset) / ElementSize
151 || (Offset & (sizeof(DWORD) - 1)) != 0)
152 {
153 DPRINT1("Invalid buffer %p(%u*%u); section view is %p(%u)\n",
154 Buffer, NumElements, ElementSize,
155 ProcessData->CsrSectionViewBase, ProcessData->CsrSectionViewSize);
156 return FALSE;
157 }
158 return TRUE;
159 }
160
161 NTSTATUS FASTCALL
162 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
163 PVOID Context)
164 {
165 return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context);
166 }
167
168 static BOOL WINAPI
169 Win32CsrInitComplete(void)
170 {
171 return TRUE;
172 }
173
174 VOID
175 WINAPI
176 PrivateCsrssManualGuiCheck(LONG Check)
177 {
178 NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
179 }
180
181 BOOL WINAPI
182 Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
183 PCSRPLUGIN_SERVER_PROCS ServerProcs,
184 PCSRSS_EXPORTED_FUNCS Exports,
185 HANDLE CsrssApiHeap)
186 {
187 NTSTATUS Status;
188 CsrExports = *Exports;
189 Win32CsrApiHeap = CsrssApiHeap;
190
191 Status = NtUserInitialize(0, NULL, NULL);
192
193 PrivateCsrssManualGuiCheck(0);
194 CsrInitConsoleSupport();
195
196 *ApiDefinitions = Win32CsrApiDefinitions;
197 ServerProcs->InitCompleteProc = Win32CsrInitComplete;
198 ServerProcs->HardErrorProc = Win32CsrHardError;
199 ServerProcs->ProcessInheritProc = Win32CsrDuplicateHandleTable;
200 ServerProcs->ProcessDeletedProc = Win32CsrReleaseConsole;
201
202 Status = RtlInitializeCriticalSection(&Win32CsrDefineDosDeviceCritSec);
203 InitializeListHead(&DosDeviceHistory);
204 return TRUE;
205 }
206
207 /* EOF */