2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/console.c
5 * PURPOSE: Console Management Functions
6 * PROGRAMMERS: Gé van Geldorp
8 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
11 /* INCLUDES *******************************************************************/
15 #include <ndk/psfuncs.h>
19 #ifdef TUITERM_COMPILE
20 #include "frontends/tui/tuiterm.h"
26 /* GLOBALS ********************************************************************/
29 #ifdef TUITERM_COMPILE
31 TuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd
,
32 IN OUT PCONSOLE_INFO ConsoleInfo
,
33 IN OUT PVOID ExtraConsoleInfo
,
36 TuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd
);
40 GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd
,
41 IN OUT PCONSOLE_INFO ConsoleInfo
,
42 IN OUT PVOID ExtraConsoleInfo
,
45 GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd
);
49 NTSTATUS (NTAPI
*FRONTEND_LOAD
)(IN OUT PFRONTEND FrontEnd
,
50 IN OUT PCONSOLE_INFO ConsoleInfo
,
51 IN OUT PVOID ExtraConsoleInfo
,
55 NTSTATUS (NTAPI
*FRONTEND_UNLOAD
)(IN OUT PFRONTEND FrontEnd
);
58 * If we are not in GUI-mode, start the text-mode terminal emulator.
59 * If we fail, try to start the GUI-mode terminal emulator.
61 * Try to open the GUI-mode terminal emulator. Two cases are possible:
62 * - We are in GUI-mode, therefore GuiMode == TRUE, the previous test-case
63 * failed and we start GUI-mode terminal emulator.
64 * - We are in text-mode, therefore GuiMode == FALSE, the previous test-case
65 * succeeded BUT we failed at starting text-mode terminal emulator.
66 * Then GuiMode was switched to TRUE in order to try to open the GUI-mode
67 * terminal emulator (Win32k will automatically switch to graphical mode,
68 * therefore no additional code is needed).
72 * NOTE: Each entry of the table should be retrieved when loading a front-end
73 * (examples of the CSR servers which register some data for CSRSS).
77 CHAR FrontEndName
[80];
78 FRONTEND_LOAD FrontEndLoad
;
79 FRONTEND_UNLOAD FrontEndUnload
;
80 } FrontEndLoadingMethods
[] =
82 #ifdef TUITERM_COMPILE
83 {"TUI", TuiLoadFrontEnd
, TuiUnloadFrontEnd
},
85 {"GUI", GuiLoadFrontEnd
, GuiUnloadFrontEnd
},
87 // {"Not found", 0, NULL}
91 /* PRIVATE FUNCTIONS **********************************************************/
95 ConioPause(PCONSOLE Console
, UINT Flags
)
97 Console
->PauseFlags
|= Flags
;
98 if (!Console
->UnpauseEvent
)
99 Console
->UnpauseEvent
= CreateEvent(NULL
, TRUE
, FALSE
, NULL
);
103 ConioUnpause(PCONSOLE Console
, UINT Flags
)
105 Console
->PauseFlags
&= ~Flags
;
107 // if ((Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION)) == 0)
108 if (Console
->PauseFlags
== 0 && Console
->UnpauseEvent
)
110 SetEvent(Console
->UnpauseEvent
);
111 CloseHandle(Console
->UnpauseEvent
);
112 Console
->UnpauseEvent
= NULL
;
114 CsrNotifyWait(&Console
->WriteWaitQueue
,
118 if (!IsListEmpty(&Console
->WriteWaitQueue
))
120 CsrDereferenceWait(&Console
->WriteWaitQueue
);
128 ConSrvGetConsole(PCONSOLE_PROCESS_DATA ProcessData
,
132 NTSTATUS Status
= STATUS_SUCCESS
;
133 PCONSOLE ProcessConsole
;
138 // RtlEnterCriticalSection(&ProcessData->HandleTableLock);
140 Status
= ConDrvGetConsole(&ProcessConsole
, ProcessData
->ConsoleHandle
, LockConsole
);
141 if (NT_SUCCESS(Status
)) *Console
= ProcessConsole
;
143 // RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
148 ConSrvReleaseConsole(PCONSOLE Console
,
149 BOOL WasConsoleLocked
)
151 /* Just call the driver */
152 ConDrvReleaseConsole(Console
, WasConsoleLocked
);
157 ConSrvInitConsole(OUT PHANDLE NewConsoleHandle
,
158 OUT PCONSOLE
* NewConsole
,
159 IN OUT PCONSOLE_START_INFO ConsoleStartInfo
,
160 IN ULONG ConsoleLeaderProcessId
)
163 HANDLE ConsoleHandle
;
165 CONSOLE_INFO ConsoleInfo
;
170 if (NewConsole
== NULL
|| ConsoleStartInfo
== NULL
)
171 return STATUS_INVALID_PARAMETER
;
176 * Load the console settings
179 /* 1. Load the default settings */
180 ConSrvGetDefaultSettings(&ConsoleInfo
, ConsoleLeaderProcessId
);
182 /* 2. Get the title of the console (initialize ConsoleInfo.ConsoleTitle) */
183 Length
= min(wcslen(ConsoleStartInfo
->ConsoleTitle
),
184 sizeof(ConsoleInfo
.ConsoleTitle
) / sizeof(ConsoleInfo
.ConsoleTitle
[0]) - 1);
185 wcsncpy(ConsoleInfo
.ConsoleTitle
, ConsoleStartInfo
->ConsoleTitle
, Length
);
186 ConsoleInfo
.ConsoleTitle
[Length
] = L
'\0';
190 * Choose an adequate terminal front-end to load, and load it
192 Status
= STATUS_SUCCESS
;
193 for (i
= 0; i
< sizeof(FrontEndLoadingMethods
) / sizeof(FrontEndLoadingMethods
[0]); ++i
)
195 DPRINT("CONSRV: Trying to load %s terminal emulator...\n", FrontEndLoadingMethods
[i
].FrontEndName
);
196 Status
= FrontEndLoadingMethods
[i
].FrontEndLoad(&FrontEnd
,
199 ConsoleLeaderProcessId
);
200 if (NT_SUCCESS(Status
))
202 DPRINT("CONSRV: %s terminal emulator loaded successfully\n", FrontEndLoadingMethods
[i
].FrontEndName
);
207 DPRINT1("CONSRV: Loading %s terminal emulator failed, Status = 0x%08lx , continuing...\n", FrontEndLoadingMethods
[i
].FrontEndName
, Status
);
211 if (!NT_SUCCESS(Status
))
213 DPRINT1("CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n", Status
);
217 DPRINT("CONSRV: Frontend initialized\n");
220 /******************************************************************************/
222 * 4. Load the remaining console settings via the registry.
224 if ((ConsoleStartInfo
->dwStartupFlags
& STARTF_TITLEISLINKNAME
) == 0)
227 * Either we weren't created by an app launched via a shell-link,
228 * or we failed to load shell-link console properties.
229 * Therefore, load the console infos for the application from the registry.
231 ConSrvReadUserSettings(&ConsoleInfo
, ConsoleLeaderProcessId
);
234 * Now, update them with the properties the user might gave to us
235 * via the STARTUPINFO structure before calling CreateProcess
236 * (and which was transmitted via the ConsoleStartInfo structure).
237 * We therefore overwrite the values read in the registry.
239 if (ConsoleStartInfo
->dwStartupFlags
& STARTF_USEFILLATTRIBUTE
)
241 ConsoleInfo
.ScreenAttrib
= (USHORT
)ConsoleStartInfo
->wFillAttribute
;
243 if (ConsoleStartInfo
->dwStartupFlags
& STARTF_USECOUNTCHARS
)
245 ConsoleInfo
.ScreenBufferSize
= ConsoleStartInfo
->dwScreenBufferSize
;
247 if (ConsoleStartInfo
->dwStartupFlags
& STARTF_USESIZE
)
249 ConsoleInfo
.ConsoleSize
= ConsoleStartInfo
->dwWindowSize
;
253 /* Set-up the code page */
254 ConsoleInfo
.CodePage
= GetOEMCP();
255 /******************************************************************************/
257 Status
= ConDrvInitConsole(&ConsoleHandle
,
260 ConsoleLeaderProcessId
);
261 if (!NT_SUCCESS(Status
))
263 DPRINT1("Creating a new console failed, Status = 0x%08lx\n", Status
);
264 FrontEndLoadingMethods
[i
].FrontEndUnload(&FrontEnd
);
269 DPRINT("Console initialized\n");
271 Status
= ConDrvRegisterFrontEnd(Console
, &FrontEnd
);
272 if (!NT_SUCCESS(Status
))
274 DPRINT1("Failed to register frontend to the given console, Status = 0x%08lx\n", Status
);
275 ConDrvDeleteConsole(Console
);
276 FrontEndLoadingMethods
[i
].FrontEndUnload(&FrontEnd
);
279 DPRINT("FrontEnd registered\n");
281 /* Return the newly created console to the caller and a success code too */
282 *NewConsoleHandle
= ConsoleHandle
;
283 *NewConsole
= Console
;
284 return STATUS_SUCCESS
;
288 ConSrvDeleteConsole(PCONSOLE Console
)
290 DPRINT("ConSrvDeleteConsole\n");
292 /* Just call the driver. ConSrvDeregisterFrontEnd is called on-demand. */
293 ConDrvDeleteConsole(Console
);
297 /* PUBLIC SERVER APIS *********************************************************/
299 CSR_API(SrvAllocConsole
)
301 NTSTATUS Status
= STATUS_SUCCESS
;
302 PCONSOLE_ALLOCCONSOLE AllocConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.AllocConsoleRequest
;
303 PCSR_PROCESS CsrProcess
= CsrGetClientThread()->Process
;
304 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrProcess
);
306 if (ProcessData
->ConsoleHandle
!= NULL
)
308 DPRINT1("Process already has a console\n");
309 return STATUS_ACCESS_DENIED
;
312 if (!CsrValidateMessageBuffer(ApiMessage
,
313 (PVOID
*)&AllocConsoleRequest
->ConsoleStartInfo
,
315 sizeof(CONSOLE_START_INFO
)))
317 return STATUS_INVALID_PARAMETER
;
320 /* Initialize a new Console owned by the Console Leader Process */
321 Status
= ConSrvAllocateConsole(ProcessData
,
322 &AllocConsoleRequest
->InputHandle
,
323 &AllocConsoleRequest
->OutputHandle
,
324 &AllocConsoleRequest
->ErrorHandle
,
325 AllocConsoleRequest
->ConsoleStartInfo
);
326 if (!NT_SUCCESS(Status
))
328 DPRINT1("Console allocation failed\n");
332 /* Return the console handle and the input wait handle to the caller */
333 AllocConsoleRequest
->ConsoleHandle
= ProcessData
->ConsoleHandle
;
334 AllocConsoleRequest
->InputWaitHandle
= ProcessData
->ConsoleEvent
;
336 /* Set the Property-Dialog and Control-Dispatcher handlers */
337 ProcessData
->PropDispatcher
= AllocConsoleRequest
->PropDispatcher
;
338 ProcessData
->CtrlDispatcher
= AllocConsoleRequest
->CtrlDispatcher
;
340 return STATUS_SUCCESS
;
343 CSR_API(SrvAttachConsole
)
345 NTSTATUS Status
= STATUS_SUCCESS
;
346 PCONSOLE_ATTACHCONSOLE AttachConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.AttachConsoleRequest
;
347 PCSR_PROCESS SourceProcess
= NULL
; // The parent process.
348 PCSR_PROCESS TargetProcess
= CsrGetClientThread()->Process
; // Ourselves.
349 HANDLE ProcessId
= ULongToHandle(AttachConsoleRequest
->ProcessId
);
350 PCONSOLE_PROCESS_DATA SourceProcessData
, TargetProcessData
;
352 TargetProcessData
= ConsoleGetPerProcessData(TargetProcess
);
354 if (TargetProcessData
->ConsoleHandle
!= NULL
)
356 DPRINT1("Process already has a console\n");
357 return STATUS_ACCESS_DENIED
;
360 /* Check whether we try to attach to the parent's console */
361 if (ProcessId
== ULongToHandle(ATTACH_PARENT_PROCESS
))
363 PROCESS_BASIC_INFORMATION ProcessInfo
;
364 ULONG Length
= sizeof(ProcessInfo
);
366 /* Get the real parent's ID */
368 Status
= NtQueryInformationProcess(TargetProcess
->ProcessHandle
,
369 ProcessBasicInformation
,
372 if (!NT_SUCCESS(Status
))
374 DPRINT1("SrvAttachConsole - Cannot retrieve basic process info, Status = %lu\n", Status
);
378 ProcessId
= ULongToHandle(ProcessInfo
.InheritedFromUniqueProcessId
);
381 /* Lock the source process via its PID */
382 Status
= CsrLockProcessByClientId(ProcessId
, &SourceProcess
);
383 if (!NT_SUCCESS(Status
)) return Status
;
385 SourceProcessData
= ConsoleGetPerProcessData(SourceProcess
);
387 if (SourceProcessData
->ConsoleHandle
== NULL
)
389 Status
= STATUS_INVALID_HANDLE
;
394 * Inherit the console from the parent,
395 * if any, otherwise return an error.
397 Status
= ConSrvInheritConsole(TargetProcessData
,
398 SourceProcessData
->ConsoleHandle
,
400 &AttachConsoleRequest
->InputHandle
,
401 &AttachConsoleRequest
->OutputHandle
,
402 &AttachConsoleRequest
->ErrorHandle
);
403 if (!NT_SUCCESS(Status
))
405 DPRINT1("Console inheritance failed\n");
409 /* Return the console handle and the input wait handle to the caller */
410 AttachConsoleRequest
->ConsoleHandle
= TargetProcessData
->ConsoleHandle
;
411 AttachConsoleRequest
->InputWaitHandle
= TargetProcessData
->ConsoleEvent
;
413 /* Set the Property-Dialog and Control-Dispatcher handlers */
414 TargetProcessData
->PropDispatcher
= AttachConsoleRequest
->PropDispatcher
;
415 TargetProcessData
->CtrlDispatcher
= AttachConsoleRequest
->CtrlDispatcher
;
417 Status
= STATUS_SUCCESS
;
420 /* Unlock the "source" process and exit */
421 CsrUnlockProcess(SourceProcess
);
425 CSR_API(SrvFreeConsole
)
427 ConSrvRemoveConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
));
428 return STATUS_SUCCESS
;
432 ConDrvGetConsoleMode(IN PCONSOLE Console
,
433 IN PCONSOLE_IO_OBJECT Object
,
434 OUT PULONG ConsoleMode
);
435 CSR_API(SrvGetConsoleMode
)
438 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleModeRequest
;
439 PCONSOLE_IO_OBJECT Object
;
441 Status
= ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
442 ConsoleModeRequest
->Handle
,
443 &Object
, NULL
, GENERIC_READ
, TRUE
, 0);
444 if (!NT_SUCCESS(Status
)) return Status
;
446 Status
= ConDrvGetConsoleMode(Object
->Console
, Object
,
447 &ConsoleModeRequest
->Mode
);
449 ConSrvReleaseObject(Object
, TRUE
);
454 ConDrvSetConsoleMode(IN PCONSOLE Console
,
455 IN PCONSOLE_IO_OBJECT Object
,
456 IN ULONG ConsoleMode
);
457 CSR_API(SrvSetConsoleMode
)
460 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleModeRequest
;
461 PCONSOLE_IO_OBJECT Object
;
463 Status
= ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
464 ConsoleModeRequest
->Handle
,
465 &Object
, NULL
, GENERIC_WRITE
, TRUE
, 0);
466 if (!NT_SUCCESS(Status
)) return Status
;
468 Status
= ConDrvSetConsoleMode(Object
->Console
, Object
,
469 ConsoleModeRequest
->Mode
);
471 ConSrvReleaseObject(Object
, TRUE
);
476 ConDrvGetConsoleTitle(IN PCONSOLE Console
,
478 IN OUT PVOID TitleBuffer
,
479 IN OUT PULONG BufLength
);
480 CSR_API(SrvGetConsoleTitle
)
483 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.TitleRequest
;
486 if (!CsrValidateMessageBuffer(ApiMessage
,
487 (PVOID
)&TitleRequest
->Title
,
488 TitleRequest
->Length
,
491 return STATUS_INVALID_PARAMETER
;
494 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
495 if (!NT_SUCCESS(Status
))
497 DPRINT1("Can't get console\n");
501 Status
= ConDrvGetConsoleTitle(Console
,
502 TitleRequest
->Unicode
,
504 &TitleRequest
->Length
);
506 ConSrvReleaseConsole(Console
, TRUE
);
511 ConDrvSetConsoleTitle(IN PCONSOLE Console
,
513 IN PVOID TitleBuffer
,
515 CSR_API(SrvSetConsoleTitle
)
518 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.TitleRequest
;
521 if (!CsrValidateMessageBuffer(ApiMessage
,
522 (PVOID
)&TitleRequest
->Title
,
523 TitleRequest
->Length
,
526 return STATUS_INVALID_PARAMETER
;
529 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
530 if (!NT_SUCCESS(Status
))
532 DPRINT1("Can't get console\n");
536 Status
= ConDrvSetConsoleTitle(Console
,
537 TitleRequest
->Unicode
,
539 TitleRequest
->Length
);
540 if (NT_SUCCESS(Status
)) TermChangeTitle(Console
);
542 ConSrvReleaseConsole(Console
, TRUE
);
547 ConDrvGetConsoleCP(IN PCONSOLE Console
,
549 IN BOOLEAN OutputCP
);
550 CSR_API(SrvGetConsoleCP
)
553 PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetConsoleCPRequest
;
556 DPRINT("SrvGetConsoleCP, getting %s Code Page\n",
557 GetConsoleCPRequest
->OutputCP
? "Output" : "Input");
559 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
560 if (!NT_SUCCESS(Status
)) return Status
;
562 Status
= ConDrvGetConsoleCP(Console
,
563 &GetConsoleCPRequest
->CodePage
,
564 GetConsoleCPRequest
->OutputCP
);
566 ConSrvReleaseConsole(Console
, TRUE
);
571 ConDrvSetConsoleCP(IN PCONSOLE Console
,
573 IN BOOLEAN OutputCP
);
574 CSR_API(SrvSetConsoleCP
)
576 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
577 PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetConsoleCPRequest
;
580 DPRINT("SrvSetConsoleCP, setting %s Code Page\n",
581 SetConsoleCPRequest
->OutputCP
? "Output" : "Input");
583 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
584 if (!NT_SUCCESS(Status
)) return Status
;
586 Status
= ConDrvSetConsoleCP(Console
,
587 SetConsoleCPRequest
->CodePage
,
588 SetConsoleCPRequest
->OutputCP
);
590 ConSrvReleaseConsole(Console
, TRUE
);
595 ConDrvGetConsoleProcessList(IN PCONSOLE Console
,
596 IN OUT PULONG ProcessIdsList
,
597 IN ULONG MaxIdListItems
,
598 OUT PULONG ProcessIdsTotal
);
599 CSR_API(SrvGetConsoleProcessList
)
602 PCONSOLE_GETPROCESSLIST GetProcessListRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetProcessListRequest
;
605 if (!CsrValidateMessageBuffer(ApiMessage
,
606 (PVOID
)&GetProcessListRequest
->ProcessIdsList
,
607 GetProcessListRequest
->ProcessCount
,
610 return STATUS_INVALID_PARAMETER
;
613 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
614 if (!NT_SUCCESS(Status
)) return Status
;
616 Status
= ConDrvGetConsoleProcessList(Console
,
617 GetProcessListRequest
->ProcessIdsList
,
618 GetProcessListRequest
->ProcessCount
,
619 &GetProcessListRequest
->ProcessCount
);
621 ConSrvReleaseConsole(Console
, TRUE
);
625 CSR_API(SrvGenerateConsoleCtrlEvent
)
628 PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GenerateCtrlEventRequest
;
631 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
632 if (!NT_SUCCESS(Status
)) return Status
;
634 Status
= ConDrvConsoleProcessCtrlEvent(Console
,
635 GenerateCtrlEventRequest
->ProcessGroupId
,
636 GenerateCtrlEventRequest
->CtrlEvent
);
638 ConSrvReleaseConsole(Console
, TRUE
);
642 CSR_API(SrvConsoleNotifyLastClose
)
645 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
648 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
649 if (!NT_SUCCESS(Status
)) return Status
;
651 /* Only one process is allowed to be registered for last close notification */
652 if (!Console
->NotifyLastClose
)
654 Console
->NotifyLastClose
= TRUE
;
655 Console
->NotifiedLastCloseProcess
= ProcessData
;
656 Status
= STATUS_SUCCESS
;
660 Status
= STATUS_ACCESS_DENIED
;
663 ConSrvReleaseConsole(Console
, TRUE
);
669 CSR_API(SrvGetConsoleMouseInfo
)
671 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
672 return STATUS_NOT_IMPLEMENTED
;
675 CSR_API(SrvSetConsoleKeyShortcuts
)
677 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
678 return STATUS_NOT_IMPLEMENTED
;
681 CSR_API(SrvGetConsoleKeyboardLayoutName
)
683 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
684 return STATUS_NOT_IMPLEMENTED
;
687 CSR_API(SrvGetConsoleCharType
)
689 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
690 return STATUS_NOT_IMPLEMENTED
;
693 CSR_API(SrvSetConsoleLocalEUDC
)
695 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
696 return STATUS_NOT_IMPLEMENTED
;
699 CSR_API(SrvSetConsoleCursorMode
)
701 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
702 return STATUS_NOT_IMPLEMENTED
;
705 CSR_API(SrvGetConsoleCursorMode
)
707 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
708 return STATUS_NOT_IMPLEMENTED
;
711 CSR_API(SrvGetConsoleNlsMode
)
713 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
714 return STATUS_NOT_IMPLEMENTED
;
717 CSR_API(SrvSetConsoleNlsMode
)
719 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
720 return STATUS_NOT_IMPLEMENTED
;
723 CSR_API(SrvGetConsoleLangId
)
725 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
726 return STATUS_NOT_IMPLEMENTED
;