[WIN32CSR] Make CsrFreeConsole close the process's console handles.
[reactos.git] / reactos / 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 <debug.h>
13
14 /* Not defined in any header file */
15 extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check);
16 extern VOID WINAPI PrivateCsrssInitialized();
17 extern VOID WINAPI InitializeAppSwitchHook();
18
19 /* GLOBALS *******************************************************************/
20
21 HANDLE Win32CsrApiHeap;
22 HINSTANCE Win32CsrDllHandle = NULL;
23 static CSRSS_EXPORTED_FUNCS CsrExports;
24
25 static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
26 {
27 CSRSS_DEFINE_API(WRITE_CONSOLE, CsrWriteConsole),
28 CSRSS_DEFINE_API(READ_CONSOLE, CsrReadConsole),
29 CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole),
30 CSRSS_DEFINE_API(FREE_CONSOLE, CsrFreeConsole),
31 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO, CsrGetScreenBufferInfo),
32 CSRSS_DEFINE_API(SET_CURSOR, CsrSetCursor),
33 CSRSS_DEFINE_API(FILL_OUTPUT, CsrFillOutputChar),
34 CSRSS_DEFINE_API(READ_INPUT, CsrReadInputEvent),
35 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR, CsrWriteConsoleOutputChar),
36 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CsrWriteConsoleOutputAttrib),
37 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB, CsrFillOutputAttrib),
38 CSRSS_DEFINE_API(GET_CURSOR_INFO, CsrGetCursorInfo),
39 CSRSS_DEFINE_API(SET_CURSOR_INFO, CsrSetCursorInfo),
40 CSRSS_DEFINE_API(SET_ATTRIB, CsrSetTextAttrib),
41 CSRSS_DEFINE_API(GET_CONSOLE_MODE, CsrGetConsoleMode),
42 CSRSS_DEFINE_API(SET_CONSOLE_MODE, CsrSetConsoleMode),
43 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER, CsrCreateScreenBuffer),
44 CSRSS_DEFINE_API(SET_SCREEN_BUFFER, CsrSetScreenBuffer),
45 CSRSS_DEFINE_API(SET_TITLE, CsrSetTitle),
46 CSRSS_DEFINE_API(GET_TITLE, CsrGetTitle),
47 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT, CsrWriteConsoleOutput),
48 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER, CsrFlushInputBuffer),
49 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER, CsrScrollConsoleScreenBuffer),
50 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR, CsrReadConsoleOutputChar),
51 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB, CsrReadConsoleOutputAttrib),
52 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS, CsrGetNumberOfConsoleInputEvents),
53 CSRSS_DEFINE_API(EXIT_REACTOS, CsrExitReactos),
54 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT, CsrPeekConsoleInput),
55 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT, CsrReadConsoleOutput),
56 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT, CsrWriteConsoleInput),
57 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE, CsrHardwareStateProperty),
58 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW, CsrGetConsoleWindow),
59 CSRSS_DEFINE_API(CREATE_DESKTOP, CsrCreateDesktop),
60 CSRSS_DEFINE_API(SHOW_DESKTOP, CsrShowDesktop),
61 CSRSS_DEFINE_API(HIDE_DESKTOP, CsrHideDesktop),
62 CSRSS_DEFINE_API(SET_CONSOLE_ICON, CsrSetConsoleIcon),
63 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW, CsrSetLogonNotifyWindow),
64 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS, CsrRegisterLogonProcess),
65 CSRSS_DEFINE_API(GET_CONSOLE_CP, CsrGetConsoleCodePage),
66 CSRSS_DEFINE_API(SET_CONSOLE_CP, CsrSetConsoleCodePage),
67 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
68 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
69 CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
70 CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS, CsrAddConsoleAlias),
71 CSRSS_DEFINE_API(GET_CONSOLE_ALIAS, CsrGetConsoleAlias),
72 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES, CsrGetAllConsoleAliases),
73 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CsrGetAllConsoleAliasesLength),
74 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES, CsrGetConsoleAliasesExes),
75 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CsrGetConsoleAliasesExesLength),
76 CSRSS_DEFINE_API(GENERATE_CTRL_EVENT, CsrGenerateCtrlEvent),
77 CSRSS_DEFINE_API(SET_SCREEN_BUFFER_SIZE, CsrSetScreenBufferSize),
78 { 0, 0, NULL }
79 };
80
81 static CSRSS_OBJECT_DEFINITION Win32CsrObjectDefinitions[] =
82 {
83 { CONIO_CONSOLE_MAGIC, ConioDeleteConsole },
84 { CONIO_SCREEN_BUFFER_MAGIC, ConioDeleteScreenBuffer },
85 { 0, NULL }
86 };
87
88 /* FUNCTIONS *****************************************************************/
89
90 BOOL WINAPI
91 DllMain(HANDLE hDll,
92 DWORD dwReason,
93 LPVOID lpReserved)
94 {
95 if (DLL_PROCESS_ATTACH == dwReason)
96 {
97 Win32CsrDllHandle = hDll;
98 InitializeAppSwitchHook();
99 }
100
101 return TRUE;
102 }
103
104 NTSTATUS FASTCALL
105 Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData,
106 PHANDLE Handle,
107 Object_t *Object,
108 DWORD Access,
109 BOOL Inheritable)
110 {
111 return (CsrExports.CsrInsertObjectProc)(ProcessData, Handle, Object, Access, Inheritable);
112 }
113
114 NTSTATUS FASTCALL
115 Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
116 HANDLE Handle,
117 Object_t **Object,
118 DWORD Access)
119 {
120 return (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access);
121 }
122
123 NTSTATUS FASTCALL
124 Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
125 HANDLE Handle,
126 Object_t **Object,
127 DWORD Access,
128 LONG Type)
129 {
130 NTSTATUS Status;
131
132 Status = (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access);
133 if (! NT_SUCCESS(Status))
134 {
135 return Status;
136 }
137
138 if ((*Object)->Type != Type)
139 {
140 (CsrExports.CsrReleaseObjectByPointerProc)(*Object);
141 return STATUS_INVALID_HANDLE;
142 }
143
144 EnterCriticalSection(&((*Object)->Lock));
145
146 return STATUS_SUCCESS;
147 }
148
149 VOID FASTCALL
150 Win32CsrUnlockObject(Object_t *Object)
151 {
152 LeaveCriticalSection(&(Object->Lock));
153 (CsrExports.CsrReleaseObjectByPointerProc)(Object);
154 }
155
156 NTSTATUS FASTCALL
157 Win32CsrReleaseObjectByPointer(Object_t *Object)
158 {
159 return (CsrExports.CsrReleaseObjectByPointerProc)(Object);
160 }
161
162 NTSTATUS FASTCALL
163 Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
164 HANDLE Object)
165 {
166 return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
167 }
168
169 NTSTATUS FASTCALL
170 Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData)
171 {
172 return (CsrExports.CsrReleaseConsoleProc)(ProcessData);
173 }
174
175 NTSTATUS FASTCALL
176 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
177 PVOID Context)
178 {
179 return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context);
180 }
181
182 static BOOL WINAPI
183 Win32CsrInitComplete(void)
184 {
185 PrivateCsrssInitialized();
186
187 return TRUE;
188 }
189
190 BOOL WINAPI
191 Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
192 PCSRSS_OBJECT_DEFINITION *ObjectDefinitions,
193 CSRPLUGIN_INIT_COMPLETE_PROC *InitComplete,
194 CSRPLUGIN_HARDERROR_PROC *HardError,
195 PCSRSS_EXPORTED_FUNCS Exports,
196 HANDLE CsrssApiHeap)
197 {
198 NTSTATUS Status;
199 CsrExports = *Exports;
200 Win32CsrApiHeap = CsrssApiHeap;
201
202 Status = NtUserInitialize(0 ,NULL, NULL);
203
204 PrivateCsrssManualGuiCheck(0);
205 CsrInitConsoleSupport();
206
207 *ApiDefinitions = Win32CsrApiDefinitions;
208 *ObjectDefinitions = Win32CsrObjectDefinitions;
209 *InitComplete = Win32CsrInitComplete;
210 *HardError = Win32CsrHardError;
211
212 return TRUE;
213 }
214
215 /* EOF */