- Hackish solution of issue #2062.
[reactos.git] / reactos / subsystems / win32 / csrss / win32csr / dllmain.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: subsys/csrss/win32csr/dllmain.c
6 * PURPOSE: Initialization
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "w32csr.h"
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* Not defined in any header file */
17 extern VOID STDCALL PrivateCsrssManualGuiCheck(LONG Check);
18 extern VOID STDCALL PrivateCsrssInitialized();
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(WRITE_CONSOLE, CsrWriteConsole),
29 CSRSS_DEFINE_API(READ_CONSOLE, CsrReadConsole),
30 CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole),
31 CSRSS_DEFINE_API(FREE_CONSOLE, CsrFreeConsole),
32 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO, CsrGetScreenBufferInfo),
33 CSRSS_DEFINE_API(SET_CURSOR, CsrSetCursor),
34 CSRSS_DEFINE_API(FILL_OUTPUT, CsrFillOutputChar),
35 CSRSS_DEFINE_API(READ_INPUT, CsrReadInputEvent),
36 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR, CsrWriteConsoleOutputChar),
37 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CsrWriteConsoleOutputAttrib),
38 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB, CsrFillOutputAttrib),
39 CSRSS_DEFINE_API(GET_CURSOR_INFO, CsrGetCursorInfo),
40 CSRSS_DEFINE_API(SET_CURSOR_INFO, CsrSetCursorInfo),
41 CSRSS_DEFINE_API(SET_ATTRIB, CsrSetTextAttrib),
42 CSRSS_DEFINE_API(GET_CONSOLE_MODE, CsrGetConsoleMode),
43 CSRSS_DEFINE_API(SET_CONSOLE_MODE, CsrSetConsoleMode),
44 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER, CsrCreateScreenBuffer),
45 CSRSS_DEFINE_API(SET_SCREEN_BUFFER, CsrSetScreenBuffer),
46 CSRSS_DEFINE_API(SET_TITLE, CsrSetTitle),
47 CSRSS_DEFINE_API(GET_TITLE, CsrGetTitle),
48 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT, CsrWriteConsoleOutput),
49 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER, CsrFlushInputBuffer),
50 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER, CsrScrollConsoleScreenBuffer),
51 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR, CsrReadConsoleOutputChar),
52 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB, CsrReadConsoleOutputAttrib),
53 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS, CsrGetNumberOfConsoleInputEvents),
54 CSRSS_DEFINE_API(EXIT_REACTOS, CsrExitReactos),
55 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT, CsrPeekConsoleInput),
56 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT, CsrReadConsoleOutput),
57 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT, CsrWriteConsoleInput),
58 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE, CsrHardwareStateProperty),
59 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW, CsrGetConsoleWindow),
60 CSRSS_DEFINE_API(CREATE_DESKTOP, CsrCreateDesktop),
61 CSRSS_DEFINE_API(SHOW_DESKTOP, CsrShowDesktop),
62 CSRSS_DEFINE_API(HIDE_DESKTOP, CsrHideDesktop),
63 CSRSS_DEFINE_API(SET_CONSOLE_ICON, CsrSetConsoleIcon),
64 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW, CsrSetLogonNotifyWindow),
65 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS, CsrRegisterLogonProcess),
66 CSRSS_DEFINE_API(GET_CONSOLE_CP, CsrGetConsoleCodePage),
67 CSRSS_DEFINE_API(SET_CONSOLE_CP, CsrSetConsoleCodePage),
68 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
69 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
70 CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
71 { 0, 0, NULL }
72 };
73
74 static CSRSS_OBJECT_DEFINITION Win32CsrObjectDefinitions[] =
75 {
76 { CONIO_CONSOLE_MAGIC, ConioDeleteConsole },
77 { CONIO_SCREEN_BUFFER_MAGIC, ConioDeleteScreenBuffer },
78 { 0, NULL }
79 };
80
81 /* FUNCTIONS *****************************************************************/
82
83 BOOL STDCALL
84 DllMain(HANDLE hDll,
85 DWORD dwReason,
86 LPVOID lpReserved)
87 {
88 if (DLL_PROCESS_ATTACH == dwReason)
89 {
90 Win32CsrDllHandle = hDll;
91 }
92
93 return TRUE;
94 }
95
96 NTSTATUS FASTCALL
97 Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData,
98 PHANDLE Handle,
99 Object_t *Object)
100 {
101 InitializeCriticalSection(&(Object->Lock));
102
103 return (CsrExports.CsrInsertObjectProc)(ProcessData, Handle, Object);
104 }
105
106 NTSTATUS FASTCALL
107 Win32CsrInsertObject2(PCSRSS_PROCESS_DATA ProcessData,
108 PHANDLE Handle,
109 Object_t *Object)
110 {
111 return (CsrExports.CsrInsertObjectProc)(ProcessData, Handle, Object);
112 }
113
114 NTSTATUS FASTCALL
115 Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
116 HANDLE Handle,
117 Object_t **Object)
118 {
119 return (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object);
120 }
121
122 NTSTATUS FASTCALL
123 Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
124 HANDLE Handle,
125 Object_t **Object,
126 LONG Type)
127 {
128 NTSTATUS Status;
129
130 Status = (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object);
131 if (! NT_SUCCESS(Status))
132 {
133 return Status;
134 }
135
136 if ((*Object)->Type != Type)
137 {
138 return STATUS_INVALID_HANDLE;
139 }
140
141 EnterCriticalSection(&((*Object)->Lock));
142
143 return STATUS_SUCCESS;
144 }
145
146 VOID FASTCALL
147 Win32CsrUnlockObject(Object_t *Object)
148 {
149 LeaveCriticalSection(&(Object->Lock));
150 }
151
152 NTSTATUS FASTCALL
153 Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
154 HANDLE Object)
155 {
156 return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
157 }
158
159 NTSTATUS FASTCALL
160 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
161 PVOID Context)
162 {
163 return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context);
164 }
165
166 static BOOL STDCALL
167 Win32CsrInitComplete(void)
168 {
169 PrivateCsrssInitialized();
170
171 return TRUE;
172 }
173
174 static BOOL STDCALL
175 Win32CsrHardError(void)
176 {
177 MessageBox(0, "Hard Error", "TODO", 0);
178 return TRUE;
179 }
180
181
182 BOOL STDCALL
183 Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
184 PCSRSS_OBJECT_DEFINITION *ObjectDefinitions,
185 CSRPLUGIN_INIT_COMPLETE_PROC *InitComplete,
186 CSRPLUGIN_HARDERROR_PROC *HardError,
187 PCSRSS_EXPORTED_FUNCS Exports,
188 HANDLE CsrssApiHeap)
189 {
190 CsrExports = *Exports;
191 Win32CsrApiHeap = CsrssApiHeap;
192
193 PrivateCsrssManualGuiCheck(0);
194 CsrInitConsoleSupport();
195
196 *ApiDefinitions = Win32CsrApiDefinitions;
197 *ObjectDefinitions = Win32CsrObjectDefinitions;
198 *InitComplete = Win32CsrInitComplete;
199 *HardError = Win32CsrHardError;
200
201 return TRUE;
202 }
203
204 /* EOF */