1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/frontendctl.c
5 * PURPOSE: Terminal Front-Ends Control
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "consrv.h"
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* PUBLIC SERVER APIS *********************************************************/
17
18 /**********************************************************************
19 * HardwareStateProperty
20 *
21 * DESCRIPTION
22 * Set/Get the value of the HardwareState and switch
23 * between direct video buffer ouput and GDI windowed
24 * output.
25 * ARGUMENTS
26 * Client hands us a CONSOLE_GETSETHWSTATE object.
27 * We use the same object to Request.
28 * NOTE
29 * ConsoleHwState has the correct size to be compatible
30 * with NT's, but values are not.
31 */
32 #if 0
33 static NTSTATUS
34 SetConsoleHardwareState(PCONSRV_CONSOLE Console, ULONG ConsoleHwState)
35 {
36 DPRINT1("Console Hardware State: %d\n", ConsoleHwState);
37
38 if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState)
39 ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState))
40 {
41 if (Console->HardwareState != ConsoleHwState)
42 {
43 /* TODO: implement switching from full screen to windowed mode */
44 /* TODO: or back; now simply store the hardware state */
45 Console->HardwareState = ConsoleHwState;
46 }
47
48 return STATUS_SUCCESS;
49 }
50
51 return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */
52 }
53 #endif
54
55 /* API_NUMBER: ConsolepGetHardwareState */
CON_API(SrvGetConsoleHardwareState,CONSOLE_GETSETHWSTATE,HardwareStateRequest)56 CON_API(SrvGetConsoleHardwareState,
57 CONSOLE_GETSETHWSTATE, HardwareStateRequest)
58 {
59 #if 0
60 NTSTATUS Status;
61 PCONSOLE_SCREEN_BUFFER Buff;
62
63 Status = ConSrvGetTextModeBuffer(ProcessData,
64 HardwareStateRequest->OutputHandle,
65 &Buff,
66 GENERIC_READ,
67 TRUE);
68 if (!NT_SUCCESS(Status))
69 return Status;
70
71 ASSERT((PCONSOLE)Console == Buff->Header.Console);
72
73 HardwareStateRequest->State = Console->HardwareState;
74
75 ConSrvReleaseScreenBuffer(Buff, TRUE);
76 return STATUS_SUCCESS;
77 #else
78 UNIMPLEMENTED;
79 return STATUS_NOT_IMPLEMENTED;
80 #endif
81 }
82
83 /* API_NUMBER: ConsolepSetHardwareState */
CON_API(SrvSetConsoleHardwareState,CONSOLE_GETSETHWSTATE,HardwareStateRequest)84 CON_API(SrvSetConsoleHardwareState,
85 CONSOLE_GETSETHWSTATE, HardwareStateRequest)
86 {
87 #if 0
88 NTSTATUS Status;
89 PCONSOLE_SCREEN_BUFFER Buff;
90
91 Status = ConSrvGetTextModeBuffer(ProcessData,
92 HardwareStateRequest->OutputHandle,
93 &Buff,
94 GENERIC_WRITE,
95 TRUE);
96 if (!NT_SUCCESS(Status))
97 return Status;
98
99 ASSERT((PCONSOLE)Console == Buff->Header.Console);
100
101 DPRINT("Setting console hardware state.\n");
102 Status = SetConsoleHardwareState(Console, HardwareStateRequest->State);
103
104 ConSrvReleaseScreenBuffer(Buff, TRUE);
105 return STATUS_SUCCESS;
106 #else
107 UNIMPLEMENTED;
108 return STATUS_NOT_IMPLEMENTED;
109 #endif
110 }
111
112 /* API_NUMBER: ConsolepGetDisplayMode */
CON_API(SrvGetConsoleDisplayMode,CONSOLE_GETDISPLAYMODE,GetDisplayModeRequest)113 CON_API(SrvGetConsoleDisplayMode,
114 CONSOLE_GETDISPLAYMODE, GetDisplayModeRequest)
115 {
116 GetDisplayModeRequest->DisplayMode = TermGetDisplayMode(Console);
117 return STATUS_SUCCESS;
118 }
119
120 /* API_NUMBER: ConsolepSetDisplayMode */
CON_API(SrvSetConsoleDisplayMode,CONSOLE_SETDISPLAYMODE,SetDisplayModeRequest)121 CON_API(SrvSetConsoleDisplayMode,
122 CONSOLE_SETDISPLAYMODE, SetDisplayModeRequest)
123 {
124 NTSTATUS Status;
125 PCONSOLE_SCREEN_BUFFER Buff;
126
127 Status = ConSrvGetScreenBuffer(ProcessData,
128 SetDisplayModeRequest->OutputHandle,
129 &Buff,
130 GENERIC_WRITE,
131 TRUE);
132 if (!NT_SUCCESS(Status))
133 return Status;
134
135 ASSERT((PCONSOLE)Console == Buff->Header.Console);
136
137 if (TermSetDisplayMode(Console, SetDisplayModeRequest->DisplayMode))
138 {
139 SetDisplayModeRequest->NewSBDim = Buff->ScreenBufferSize;
140 Status = STATUS_SUCCESS;
141 }
142 else
143 {
144 Status = STATUS_INVALID_PARAMETER;
145 }
146
147 ConSrvReleaseScreenBuffer(Buff, TRUE);
148 return Status;
149 }
150
151 /* API_NUMBER: ConsolepGetLargestWindowSize */
CON_API(SrvGetLargestConsoleWindowSize,CONSOLE_GETLARGESTWINDOWSIZE,GetLargestWindowSizeRequest)152 CON_API(SrvGetLargestConsoleWindowSize,
153 CONSOLE_GETLARGESTWINDOWSIZE, GetLargestWindowSizeRequest)
154 {
155 NTSTATUS Status;
156 PCONSOLE_SCREEN_BUFFER Buff;
157
158 Status = ConSrvGetTextModeBuffer(ProcessData,
159 GetLargestWindowSizeRequest->OutputHandle,
160 &Buff,
161 GENERIC_READ,
162 TRUE);
163 if (!NT_SUCCESS(Status))
164 return Status;
165
166 ASSERT((PCONSOLE)Console == Buff->Header.Console);
167
168 /*
169 * Retrieve the largest possible console window size, without
170 * taking into account the size of the console screen buffer
171 * (thus differs from ConDrvGetConsoleScreenBufferInfo).
172 */
173 TermGetLargestConsoleWindowSize(Console, &GetLargestWindowSizeRequest->Size);
174
175 ConSrvReleaseScreenBuffer(Buff, TRUE);
176 return STATUS_SUCCESS;
177 }
178
179 /* API_NUMBER: ConsolepShowCursor */
CON_API(SrvShowConsoleCursor,CONSOLE_SHOWCURSOR,ShowCursorRequest)180 CON_API(SrvShowConsoleCursor,
181 CONSOLE_SHOWCURSOR, ShowCursorRequest)
182 {
183 NTSTATUS Status;
184 PCONSOLE_SCREEN_BUFFER Buff;
185
186 Status = ConSrvGetScreenBuffer(ProcessData,
187 ShowCursorRequest->OutputHandle,
188 &Buff,
189 GENERIC_WRITE,
190 TRUE);
191 if (!NT_SUCCESS(Status))
192 return Status;
193
194 ASSERT((PCONSOLE)Console == Buff->Header.Console);
195
196 ShowCursorRequest->RefCount = TermShowMouseCursor(Console, ShowCursorRequest->Show);
197
198 ConSrvReleaseScreenBuffer(Buff, TRUE);
199 return STATUS_SUCCESS;
200 }
201
202 /* API_NUMBER: ConsolepSetCursor */
CON_API(SrvSetConsoleCursor,CONSOLE_SETCURSOR,SetCursorRequest)203 CON_API(SrvSetConsoleCursor,
204 CONSOLE_SETCURSOR, SetCursorRequest)
205 {
206 NTSTATUS Status;
207 BOOL Success;
208 PCONSOLE_SCREEN_BUFFER Buff;
209
210 // NOTE: Tests show that this function is used only for graphics screen buffers
211 // and otherwise it returns FALSE and sets last error to ERROR_INVALID_HANDLE.
212 // I find that behaviour is ridiculous but ok, let's accept it at the moment...
213 Status = ConSrvGetGraphicsBuffer(ProcessData,
214 SetCursorRequest->OutputHandle,
215 &Buff,
216 GENERIC_WRITE,
217 TRUE);
218 if (!NT_SUCCESS(Status))
219 return Status;
220
221 ASSERT((PCONSOLE)Console == Buff->Header.Console);
222
223 Success = TermSetMouseCursor(Console, SetCursorRequest->CursorHandle);
224
225 ConSrvReleaseScreenBuffer(Buff, TRUE);
226 return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
227 }
228
229 /* API_NUMBER: ConsolepMenuControl */
CON_API(SrvConsoleMenuControl,CONSOLE_MENUCONTROL,MenuControlRequest)230 CON_API(SrvConsoleMenuControl,
231 CONSOLE_MENUCONTROL, MenuControlRequest)
232 {
233 NTSTATUS Status;
234 PCONSOLE_SCREEN_BUFFER Buff;
235
236 Status = ConSrvGetScreenBuffer(ProcessData,
237 MenuControlRequest->OutputHandle,
238 &Buff,
239 GENERIC_WRITE,
240 TRUE);
241 if (!NT_SUCCESS(Status))
242 return Status;
243
244 ASSERT((PCONSOLE)Console == Buff->Header.Console);
245
246 MenuControlRequest->MenuHandle = TermMenuControl(Console,
247 MenuControlRequest->CmdIdLow,
248 MenuControlRequest->CmdIdHigh);
249
250 ConSrvReleaseScreenBuffer(Buff, TRUE);
251 return STATUS_SUCCESS;
252 }
253
254 /* API_NUMBER: ConsolepSetMenuClose */
CON_API(SrvSetConsoleMenuClose,CONSOLE_SETMENUCLOSE,SetMenuCloseRequest)255 CON_API(SrvSetConsoleMenuClose,
256 CONSOLE_SETMENUCLOSE, SetMenuCloseRequest)
257 {
258 return (TermSetMenuClose(Console, SetMenuCloseRequest->Enable)
259 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
260 }
261
262 /* Used by USERSRV!SrvGetThreadConsoleDesktop() */
263 NTSTATUS
264 NTAPI
GetThreadConsoleDesktop(IN ULONG_PTR ThreadId,OUT HDESK * ConsoleDesktop)265 GetThreadConsoleDesktop(
266 IN ULONG_PTR ThreadId,
267 OUT HDESK* ConsoleDesktop)
268 {
269 NTSTATUS Status;
270 PCSR_THREAD CsrThread;
271 PCONSRV_CONSOLE Console;
272
273 /* No console desktop handle by default */
274 *ConsoleDesktop = NULL;
275
276 /* Retrieve and lock the thread */
277 Status = CsrLockThreadByClientId(ULongToHandle(ThreadId), &CsrThread);
278 if (!NT_SUCCESS(Status))
279 return Status;
280
281 ASSERT(CsrThread->Process);
282
283 /* Retrieve the console to which the process is attached, and unlock the thread */
284 Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrThread->Process),
285 &Console, TRUE);
286 CsrUnlockThread(CsrThread);
287
288 if (!NT_SUCCESS(Status))
289 return Status;
290
291 /* Retrieve the console desktop handle, and release the console */
292 *ConsoleDesktop = TermGetThreadConsoleDesktop(Console);
293 ConSrvReleaseConsole(Console, TRUE);
294
295 return STATUS_SUCCESS;
296 }
297
298 /* API_NUMBER: ConsolepGetConsoleWindow */
CON_API(SrvGetConsoleWindow,CONSOLE_GETWINDOW,GetWindowRequest)299 CON_API(SrvGetConsoleWindow,
300 CONSOLE_GETWINDOW, GetWindowRequest)
301 {
302 GetWindowRequest->WindowHandle = TermGetConsoleWindowHandle(Console);
303 return STATUS_SUCCESS;
304 }
305
306 /* API_NUMBER: ConsolepSetIcon */
CON_API(SrvSetConsoleIcon,CONSOLE_SETICON,SetIconRequest)307 CON_API(SrvSetConsoleIcon,
308 CONSOLE_SETICON, SetIconRequest)
309 {
310 return (TermChangeIcon(Console, SetIconRequest->IconHandle)
311 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
312 }
313
314 /* API_NUMBER: ConsolepGetSelectionInfo */
CON_API(SrvGetConsoleSelectionInfo,CONSOLE_GETSELECTIONINFO,GetSelectionInfoRequest)315 CON_API(SrvGetConsoleSelectionInfo,
316 CONSOLE_GETSELECTIONINFO, GetSelectionInfoRequest)
317 {
318 return (TermGetSelectionInfo(Console, &GetSelectionInfoRequest->Info)
319 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
320 }
321
322 /* API_NUMBER: ConsolepGetNumberOfFonts */
CON_API(SrvGetConsoleNumberOfFonts,CONSOLE_GETNUMFONTS,GetNumFontsRequest)323 CON_API(SrvGetConsoleNumberOfFonts,
324 CONSOLE_GETNUMFONTS, GetNumFontsRequest)
325 {
326 // FIXME!
327 // TermGetNumberOfFonts(Console, ...);
328 DPRINT1("%s not yet implemented\n", __FUNCTION__);
329 GetNumFontsRequest->NumFonts = 0;
330 return STATUS_SUCCESS;
331 }
332
333 /* API_NUMBER: ConsolepGetFontInfo */
CON_API(SrvGetConsoleFontInfo,CONSOLE_GETFONTINFO,GetFontInfoRequest)334 CON_API(SrvGetConsoleFontInfo,
335 CONSOLE_GETFONTINFO, GetFontInfoRequest)
336 {
337 NTSTATUS Status;
338 PCONSOLE_SCREEN_BUFFER Buff;
339
340 Status = ConSrvGetTextModeBuffer(ProcessData,
341 GetFontInfoRequest->OutputHandle,
342 &Buff,
343 GENERIC_READ,
344 TRUE);
345 if (!NT_SUCCESS(Status))
346 return Status;
347
348 ASSERT((PCONSOLE)Console == Buff->Header.Console);
349
350 // FIXME!
351 // TermGetFontInfo(Console, ...);
352 DPRINT1("%s not yet implemented\n", __FUNCTION__);
353 GetFontInfoRequest->NumFonts = 0;
354
355 ConSrvReleaseScreenBuffer(Buff, TRUE);
356 return STATUS_SUCCESS;
357 }
358
359 /* API_NUMBER: ConsolepGetFontSize */
CON_API(SrvGetConsoleFontSize,CONSOLE_GETFONTSIZE,GetFontSizeRequest)360 CON_API(SrvGetConsoleFontSize,
361 CONSOLE_GETFONTSIZE, GetFontSizeRequest)
362 {
363 NTSTATUS Status;
364 PCONSOLE_SCREEN_BUFFER Buff;
365
366 Status = ConSrvGetTextModeBuffer(ProcessData,
367 GetFontSizeRequest->OutputHandle,
368 &Buff,
369 GENERIC_READ,
370 TRUE);
371 if (!NT_SUCCESS(Status))
372 return Status;
373
374 ASSERT((PCONSOLE)Console == Buff->Header.Console);
375
376 // FIXME!
377 // TermGetFontSize(Console, ...);
378 DPRINT1("%s not yet implemented\n", __FUNCTION__);
379
380 ConSrvReleaseScreenBuffer(Buff, TRUE);
381 return STATUS_SUCCESS;
382 }
383
384 /* API_NUMBER: ConsolepGetCurrentFont */
CON_API(SrvGetConsoleCurrentFont,CONSOLE_GETCURRENTFONT,GetCurrentFontRequest)385 CON_API(SrvGetConsoleCurrentFont,
386 CONSOLE_GETCURRENTFONT, GetCurrentFontRequest)
387 {
388 NTSTATUS Status;
389 PCONSOLE_SCREEN_BUFFER Buff;
390
391 Status = ConSrvGetTextModeBuffer(ProcessData,
392 GetCurrentFontRequest->OutputHandle,
393 &Buff,
394 GENERIC_READ,
395 TRUE);
396 if (!NT_SUCCESS(Status))
397 return Status;
398
399 ASSERT((PCONSOLE)Console == Buff->Header.Console);
400
401 // FIXME!
402 // TermGetCurrentFont(Console, ...);
403 DPRINT1("%s not yet implemented\n", __FUNCTION__);
404 GetCurrentFontRequest->FontIndex = 0;
405
406 ConSrvReleaseScreenBuffer(Buff, TRUE);
407 return STATUS_SUCCESS;
408 }
409
410 /* API_NUMBER: ConsolepSetFont */
CON_API(SrvSetConsoleFont,CONSOLE_SETFONT,SetFontRequest)411 CON_API(SrvSetConsoleFont,
412 CONSOLE_SETFONT, SetFontRequest)
413 {
414 NTSTATUS Status;
415 PCONSOLE_SCREEN_BUFFER Buff;
416
417 Status = ConSrvGetTextModeBuffer(ProcessData,
418 SetFontRequest->OutputHandle,
419 &Buff,
420 GENERIC_WRITE,
421 TRUE);
422 if (!NT_SUCCESS(Status))
423 return Status;
424
425 ASSERT((PCONSOLE)Console == Buff->Header.Console);
426
427 // FIXME!
428 // TermSetFont(Console, ...);
429 DPRINT1("%s not yet implemented\n", __FUNCTION__);
430
431 ConSrvReleaseScreenBuffer(Buff, TRUE);
432 return STATUS_SUCCESS;
433 }
434
435 /* EOF */
436