2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/consrv/console.c
5 * PURPOSE: Console I/O functions
9 /* INCLUDES ******************************************************************/
12 #include "guiconsole.h"
13 #include "tuiconsole.h"
18 /* FUNCTIONS *****************************************************************/
21 DtbgIsDesktopVisible(VOID
)
23 HWND VisibleDesktopWindow
= GetDesktopWindow(); // DESKTOPWNDPROC
25 if (VisibleDesktopWindow
!= NULL
&&
26 !IsWindowVisible(VisibleDesktopWindow
))
28 VisibleDesktopWindow
= NULL
;
31 return VisibleDesktopWindow
!= NULL
;
35 ConioConsoleFromProcessData(PCONSOLE_PROCESS_DATA ProcessData
,
36 PCSRSS_CONSOLE
*Console
)
38 PCSRSS_CONSOLE ProcessConsole
;
40 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
41 ProcessConsole
= ProcessData
->Console
;
46 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
47 return STATUS_INVALID_HANDLE
;
50 InterlockedIncrement(&ProcessConsole
->ReferenceCount
);
51 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
52 EnterCriticalSection(&(ProcessConsole
->Lock
));
53 *Console
= ProcessConsole
;
55 return STATUS_SUCCESS
;
59 ConioConsoleCtrlEventTimeout(DWORD Event
,
60 PCONSOLE_PROCESS_DATA ProcessData
,
65 DPRINT("ConioConsoleCtrlEvent Parent pProcessIds = %x\n", ProcessData
->Process
->ClientId
.UniqueProcess
);
67 if (ProcessData
->CtrlDispatcher
)
69 Thread
= CreateRemoteThread(ProcessData
->Process
->ProcessHandle
, NULL
, 0,
70 ProcessData
->CtrlDispatcher
,
71 UlongToPtr(Event
), 0, NULL
);
74 DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError());
78 WaitForSingleObject(Thread
, Timeout
);
84 ConioConsoleCtrlEvent(DWORD Event
, PCONSOLE_PROCESS_DATA ProcessData
)
86 ConioConsoleCtrlEventTimeout(Event
, ProcessData
, 0);
89 static NTSTATUS WINAPI
90 CsrInitConsole(PCSRSS_CONSOLE Console
, int ShowCmd
)
93 SECURITY_ATTRIBUTES SecurityAttributes
;
94 PCSRSS_SCREEN_BUFFER NewBuffer
;
98 Console
->Title
.MaximumLength
= Console
->Title
.Length
= 0;
99 Console
->Title
.Buffer
= NULL
;
101 if (LoadStringW(ConSrvDllInstance
, IDS_COMMAND_PROMPT
, Title
, sizeof(Title
) / sizeof(Title
[0])))
103 RtlCreateUnicodeString(&Console
->Title
, Title
);
107 RtlCreateUnicodeString(&Console
->Title
, L
"Command Prompt");
110 Console
->ReferenceCount
= 0;
111 Console
->LineBuffer
= NULL
;
112 Console
->Header
.Type
= CONIO_CONSOLE_MAGIC
;
113 Console
->Header
.Console
= Console
;
114 Console
->Mode
= ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
| ENABLE_PROCESSED_INPUT
| ENABLE_MOUSE_INPUT
;
115 InitializeListHead(&Console
->BufferList
);
116 Console
->ActiveBuffer
= NULL
;
117 InitializeListHead(&Console
->InputEvents
);
118 InitializeListHead(&Console
->HistoryBuffers
);
119 Console
->CodePage
= GetOEMCP();
120 Console
->OutputCodePage
= GetOEMCP();
122 SecurityAttributes
.nLength
= sizeof(SECURITY_ATTRIBUTES
);
123 SecurityAttributes
.lpSecurityDescriptor
= NULL
;
124 SecurityAttributes
.bInheritHandle
= TRUE
;
126 Console
->ActiveEvent
= CreateEventW(&SecurityAttributes
, TRUE
, FALSE
, NULL
);
127 if (NULL
== Console
->ActiveEvent
)
129 RtlFreeUnicodeString(&Console
->Title
);
130 return STATUS_UNSUCCESSFUL
;
132 Console
->PrivateData
= NULL
;
133 InitializeCriticalSection(&Console
->Lock
);
135 GuiMode
= DtbgIsDesktopVisible();
137 /* allocate console screen buffer */
138 NewBuffer
= HeapAlloc(ConSrvHeap
, HEAP_ZERO_MEMORY
, sizeof(CSRSS_SCREEN_BUFFER
));
139 if (NULL
== NewBuffer
)
141 RtlFreeUnicodeString(&Console
->Title
);
142 DeleteCriticalSection(&Console
->Lock
);
143 CloseHandle(Console
->ActiveEvent
);
144 return STATUS_INSUFFICIENT_RESOURCES
;
146 /* init screen buffer with defaults */
147 NewBuffer
->CursorInfo
.bVisible
= TRUE
;
148 NewBuffer
->CursorInfo
.dwSize
= CSR_DEFAULT_CURSOR_SIZE
;
149 /* make console active, and insert into console list */
150 Console
->ActiveBuffer
= (PCSRSS_SCREEN_BUFFER
) NewBuffer
;
154 Status
= TuiInitConsole(Console
);
155 if (!NT_SUCCESS(Status
))
157 DPRINT1("Failed to open text-mode console, switching to gui-mode\n");
163 Status
= GuiInitConsole(Console
, ShowCmd
);
164 if (!NT_SUCCESS(Status
))
166 HeapFree(ConSrvHeap
,0, NewBuffer
);
167 RtlFreeUnicodeString(&Console
->Title
);
168 DeleteCriticalSection(&Console
->Lock
);
169 CloseHandle(Console
->ActiveEvent
);
170 DPRINT1("GuiInitConsole: failed\n");
175 Status
= CsrInitConsoleScreenBuffer(Console
, NewBuffer
);
176 if (! NT_SUCCESS(Status
))
178 ConioCleanupConsole(Console
);
179 RtlFreeUnicodeString(&Console
->Title
);
180 DeleteCriticalSection(&Console
->Lock
);
181 CloseHandle(Console
->ActiveEvent
);
182 HeapFree(ConSrvHeap
, 0, NewBuffer
);
183 DPRINT1("CsrInitConsoleScreenBuffer: failed\n");
187 /* copy buffer contents to screen */
188 ConioDrawConsole(Console
);
190 return STATUS_SUCCESS
;
193 CSR_API(SrvOpenConsole
)
195 NTSTATUS Status
= STATUS_SUCCESS
;
196 PCSRSS_OPEN_CONSOLE OpenConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.OpenConsoleRequest
;
197 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
199 DPRINT("SrvOpenConsole\n");
201 OpenConsoleRequest
->Handle
= INVALID_HANDLE_VALUE
;
203 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
205 DPRINT1("SrvOpenConsole - Checkpoint 1\n");
206 DPRINT1("ProcessData = 0x%p ; ProcessData->Console = 0x%p\n", ProcessData
, ProcessData
->Console
);
208 if (ProcessData
->Console
)
210 DWORD DesiredAccess
= OpenConsoleRequest
->Access
;
211 DWORD ShareMode
= OpenConsoleRequest
->ShareMode
;
213 PCSRSS_CONSOLE Console
= ProcessData
->Console
;
216 DPRINT1("SrvOpenConsole - Checkpoint 2\n");
217 EnterCriticalSection(&Console
->Lock
);
218 DPRINT1("SrvOpenConsole - Checkpoint 3\n");
220 if (OpenConsoleRequest
->HandleType
== HANDLE_OUTPUT
)
221 Object
= &Console
->ActiveBuffer
->Header
;
223 Object
= &Console
->Header
;
225 if (((DesiredAccess
& GENERIC_READ
) && Object
->ExclusiveRead
!= 0) ||
226 ((DesiredAccess
& GENERIC_WRITE
) && Object
->ExclusiveWrite
!= 0) ||
227 (!(ShareMode
& FILE_SHARE_READ
) && Object
->AccessRead
!= 0) ||
228 (!(ShareMode
& FILE_SHARE_WRITE
) && Object
->AccessWrite
!= 0))
230 DPRINT1("Sharing violation\n");
231 Status
= STATUS_SHARING_VIOLATION
;
235 Status
= Win32CsrInsertObject(ProcessData
,
236 &OpenConsoleRequest
->Handle
,
239 OpenConsoleRequest
->Inheritable
,
243 LeaveCriticalSection(&Console
->Lock
);
246 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
251 CSR_API(SrvAllocConsole
)
253 NTSTATUS Status
= STATUS_SUCCESS
;
254 PCSRSS_ALLOC_CONSOLE AllocConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.AllocConsoleRequest
;
255 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
256 PCSRSS_CONSOLE Console
;
257 BOOLEAN NewConsole
= FALSE
;
259 DPRINT("SrvAllocConsole\n");
261 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
263 if (ProcessData
->Console
)
265 DPRINT1("Process already has a console\n");
266 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
267 return STATUS_INVALID_PARAMETER
;
270 DPRINT1("SrvAllocConsole - Checkpoint 1\n");
272 /* If we don't need a console, then get out of here */
273 if (!AllocConsoleRequest
->ConsoleNeeded
)
275 DPRINT("No console needed\n");
276 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
277 return STATUS_SUCCESS
;
280 /* If we already have one, then don't create a new one... */
281 if (!AllocConsoleRequest
->Console
||
282 AllocConsoleRequest
->Console
!= ProcessData
->ParentConsole
)
284 /* Allocate a console structure */
286 Console
= HeapAlloc(ConSrvHeap
, HEAP_ZERO_MEMORY
, sizeof(CSRSS_CONSOLE
));
289 DPRINT1("Not enough memory for console\n");
290 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
291 return STATUS_NO_MEMORY
;
294 /* Initialize list head */
295 InitializeListHead(&Console
->ProcessList
);
297 /* Insert process data required for GUI initialization */
298 InsertHeadList(&Console
->ProcessList
, &ProcessData
->ConsoleLink
);
300 /* Initialize the Console */
301 Status
= CsrInitConsole(Console
, AllocConsoleRequest
->ShowCmd
);
302 if (!NT_SUCCESS(Status
))
304 DPRINT1("Console init failed\n");
305 HeapFree(ConSrvHeap
, 0, Console
);
306 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
312 /* Reuse our current console */
313 Console
= AllocConsoleRequest
->Console
;
316 /* Set the Process Console */
317 ProcessData
->Console
= Console
;
319 /* Return it to the caller */
320 AllocConsoleRequest
->Console
= Console
;
322 /* Add a reference count because the process is tied to the console */
323 _InterlockedIncrement(&Console
->ReferenceCount
);
325 if (NewConsole
|| !ProcessData
->bInheritHandles
)
327 /* Insert the Objects */
328 Status
= Win32CsrInsertObject(ProcessData
,
329 &AllocConsoleRequest
->InputHandle
,
331 GENERIC_READ
| GENERIC_WRITE
,
333 FILE_SHARE_READ
| FILE_SHARE_WRITE
);
334 if (! NT_SUCCESS(Status
))
336 DPRINT1("Failed to insert object\n");
337 ConioDeleteConsole((Object_t
*) Console
);
338 ProcessData
->Console
= NULL
;
339 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
343 Status
= Win32CsrInsertObject(ProcessData
,
344 &AllocConsoleRequest
->OutputHandle
,
345 &Console
->ActiveBuffer
->Header
,
346 GENERIC_READ
| GENERIC_WRITE
,
348 FILE_SHARE_READ
| FILE_SHARE_WRITE
);
349 if (!NT_SUCCESS(Status
))
351 DPRINT1("Failed to insert object\n");
352 ConioDeleteConsole((Object_t
*) Console
);
353 Win32CsrReleaseObject(ProcessData
,
354 AllocConsoleRequest
->InputHandle
);
355 ProcessData
->Console
= NULL
;
356 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
361 /* Duplicate the Event */
362 Status
= NtDuplicateObject(NtCurrentProcess(),
363 ProcessData
->Console
->ActiveEvent
,
364 ProcessData
->Process
->ProcessHandle
,
365 &ProcessData
->ConsoleEvent
,
366 EVENT_ALL_ACCESS
, 0, 0);
367 if (!NT_SUCCESS(Status
))
369 DPRINT1("NtDuplicateObject() failed: %lu\n", Status
);
370 ConioDeleteConsole((Object_t
*) Console
);
371 if (NewConsole
|| !ProcessData
->bInheritHandles
)
373 Win32CsrReleaseObject(ProcessData
,
374 AllocConsoleRequest
->OutputHandle
);
375 Win32CsrReleaseObject(ProcessData
,
376 AllocConsoleRequest
->InputHandle
);
378 ProcessData
->Console
= NULL
;
379 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
383 /* Set the Ctrl Dispatcher */
384 ProcessData
->CtrlDispatcher
= AllocConsoleRequest
->CtrlDispatcher
;
385 DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData
->CtrlDispatcher
);
389 /* Insert into the list if it has not been added */
390 InsertHeadList(&ProcessData
->Console
->ProcessList
, &ProcessData
->ConsoleLink
);
393 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
394 return STATUS_SUCCESS
;
397 CSR_API(SrvFreeConsole
)
399 Win32CsrReleaseConsole(CsrGetClientThread()->Process
);
400 return STATUS_SUCCESS
;
404 ConioDeleteConsole(Object_t
*Object
)
406 PCSRSS_CONSOLE Console
= (PCSRSS_CONSOLE
) Object
;
409 DPRINT("ConioDeleteConsole\n");
411 /* Drain input event queue */
412 while (Console
->InputEvents
.Flink
!= &Console
->InputEvents
)
414 Event
= (ConsoleInput
*) Console
->InputEvents
.Flink
;
415 Console
->InputEvents
.Flink
= Console
->InputEvents
.Flink
->Flink
;
416 Console
->InputEvents
.Flink
->Flink
->Blink
= &Console
->InputEvents
;
417 HeapFree(ConSrvHeap
, 0, Event
);
420 ConioCleanupConsole(Console
);
421 if (Console
->LineBuffer
)
422 RtlFreeHeap(ConSrvHeap
, 0, Console
->LineBuffer
);
423 while (!IsListEmpty(&Console
->HistoryBuffers
))
424 HistoryDeleteBuffer((struct tagHISTORY_BUFFER
*)Console
->HistoryBuffers
.Flink
);
426 ConioDeleteScreenBuffer(Console
->ActiveBuffer
);
427 if (!IsListEmpty(&Console
->BufferList
))
429 DPRINT1("BUG: screen buffer list not empty\n");
432 CloseHandle(Console
->ActiveEvent
);
433 if (Console
->UnpauseEvent
) CloseHandle(Console
->UnpauseEvent
);
434 DeleteCriticalSection(&Console
->Lock
);
435 RtlFreeUnicodeString(&Console
->Title
);
436 IntDeleteAllAliases(Console
->Aliases
);
437 HeapFree(ConSrvHeap
, 0, Console
);
441 CsrInitConsoleSupport(VOID
)
443 DPRINT("CSR: CsrInitConsoleSupport()\n");
445 /* Should call LoadKeyboardLayout */
449 ConioPause(PCSRSS_CONSOLE Console
, UINT Flags
)
451 Console
->PauseFlags
|= Flags
;
452 if (!Console
->UnpauseEvent
)
453 Console
->UnpauseEvent
= CreateEvent(NULL
, TRUE
, FALSE
, NULL
);
457 ConioUnpause(PCSRSS_CONSOLE Console
, UINT Flags
)
459 Console
->PauseFlags
&= ~Flags
;
460 if (Console
->PauseFlags
== 0 && Console
->UnpauseEvent
)
462 SetEvent(Console
->UnpauseEvent
);
463 CloseHandle(Console
->UnpauseEvent
);
464 Console
->UnpauseEvent
= NULL
;
468 CSR_API(SrvSetConsoleMode
)
471 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleModeRequest
;
472 PCSRSS_CONSOLE Console
;
473 PCSRSS_SCREEN_BUFFER Buff
;
475 DPRINT("SrvSetConsoleMode\n");
477 Status
= Win32CsrLockObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
478 ConsoleModeRequest
->ConsoleHandle
,
479 (Object_t
**) &Console
, GENERIC_WRITE
, 0);
480 if (!NT_SUCCESS(Status
)) return Status
;
482 Buff
= (PCSRSS_SCREEN_BUFFER
)Console
;
484 if (CONIO_CONSOLE_MAGIC
== Console
->Header
.Type
)
486 Console
->Mode
= ConsoleModeRequest
->ConsoleMode
& CONSOLE_INPUT_MODE_VALID
;
488 else if (CONIO_SCREEN_BUFFER_MAGIC
== Console
->Header
.Type
)
490 Buff
->Mode
= ConsoleModeRequest
->ConsoleMode
& CONSOLE_OUTPUT_MODE_VALID
;
494 Status
= STATUS_INVALID_HANDLE
;
497 Win32CsrUnlockObject((Object_t
*)Console
);
502 CSR_API(SrvGetConsoleMode
)
505 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleModeRequest
;
506 PCSRSS_CONSOLE Console
;
507 PCSRSS_SCREEN_BUFFER Buff
;
509 DPRINT("SrvGetConsoleMode\n");
511 Status
= Win32CsrLockObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
512 ConsoleModeRequest
->ConsoleHandle
,
513 (Object_t
**) &Console
, GENERIC_READ
, 0);
514 if (!NT_SUCCESS(Status
)) return Status
;
516 Status
= STATUS_SUCCESS
;
517 Buff
= (PCSRSS_SCREEN_BUFFER
) Console
;
519 if (CONIO_CONSOLE_MAGIC
== Console
->Header
.Type
)
521 ConsoleModeRequest
->ConsoleMode
= Console
->Mode
;
523 else if (CONIO_SCREEN_BUFFER_MAGIC
== Buff
->Header
.Type
)
525 ConsoleModeRequest
->ConsoleMode
= Buff
->Mode
;
529 Status
= STATUS_INVALID_HANDLE
;
532 Win32CsrUnlockObject((Object_t
*)Console
);
536 CSR_API(SrvSetConsoleTitle
)
539 PCSRSS_CONSOLE_TITLE TitleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.TitleRequest
;
540 // PCSR_PROCESS Process = CsrGetClientThread()->Process;
541 PCSRSS_CONSOLE Console
;
544 DPRINT("SrvSetConsoleTitle\n");
546 if (!CsrValidateMessageBuffer(ApiMessage
,
547 (PVOID
)&TitleRequest
->Title
,
548 TitleRequest
->Length
,
551 return STATUS_INVALID_PARAMETER
;
554 if (!Win32CsrValidateBuffer(Process, TitleRequest->Title,
555 TitleRequest->Length, 1))
557 return STATUS_ACCESS_VIOLATION;
561 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
562 if(NT_SUCCESS(Status
))
564 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0, TitleRequest
->Length
);
567 /* Copy title to console */
568 RtlFreeUnicodeString(&Console
->Title
);
569 Console
->Title
.Buffer
= Buffer
;
570 Console
->Title
.Length
= Console
->Title
.MaximumLength
= TitleRequest
->Length
;
571 memcpy(Console
->Title
.Buffer
, TitleRequest
->Title
, Console
->Title
.Length
);
573 if (!ConioChangeTitle(Console
))
575 Status
= STATUS_UNSUCCESSFUL
;
579 Status
= STATUS_SUCCESS
;
584 Status
= STATUS_NO_MEMORY
;
587 ConioUnlockConsole(Console
);
593 CSR_API(SrvGetConsoleTitle
)
596 PCSRSS_CONSOLE_TITLE TitleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.TitleRequest
;
597 // PCSR_PROCESS Process = CsrGetClientThread()->Process;
598 PCSRSS_CONSOLE Console
;
601 DPRINT("SrvGetConsoleTitle\n");
603 if (!CsrValidateMessageBuffer(ApiMessage
,
604 (PVOID
)&TitleRequest
->Title
,
605 TitleRequest
->Length
,
608 return STATUS_INVALID_PARAMETER
;
611 if (!Win32CsrValidateBuffer(Process, TitleRequest->Title,
612 TitleRequest->Length, 1))
614 return STATUS_ACCESS_VIOLATION;
618 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
619 if (!NT_SUCCESS(Status
))
621 DPRINT1("Can't get console\n");
625 /* Copy title of the console to the user title buffer */
626 if (TitleRequest
->Length
>= sizeof(WCHAR
))
628 Length
= min(TitleRequest
->Length
- sizeof(WCHAR
), Console
->Title
.Length
);
629 memcpy(TitleRequest
->Title
, Console
->Title
.Buffer
, Length
);
630 TitleRequest
->Title
[Length
/ sizeof(WCHAR
)] = L
'\0';
633 TitleRequest
->Length
= Console
->Title
.Length
;
635 ConioUnlockConsole(Console
);
636 return STATUS_SUCCESS
;
639 /**********************************************************************
640 * HardwareStateProperty
643 * Set/Get the value of the HardwareState and switch
644 * between direct video buffer ouput and GDI windowed
647 * Client hands us a CSRSS_CONSOLE_HARDWARE_STATE
648 * object. We use the same object to Request.
650 * ConsoleHwState has the correct size to be compatible
651 * with NT's, but values are not.
653 static NTSTATUS FASTCALL
654 SetConsoleHardwareState(PCSRSS_CONSOLE Console
, DWORD ConsoleHwState
)
656 DPRINT1("Console Hardware State: %d\n", ConsoleHwState
);
658 if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED
== ConsoleHwState
)
659 ||(CONSOLE_HARDWARE_STATE_DIRECT
== ConsoleHwState
))
661 if (Console
->HardwareState
!= ConsoleHwState
)
663 /* TODO: implement switching from full screen to windowed mode */
664 /* TODO: or back; now simply store the hardware state */
665 Console
->HardwareState
= ConsoleHwState
;
668 return STATUS_SUCCESS
;
671 return STATUS_INVALID_PARAMETER_3
; /* Client: (handle, set_get, [mode]) */
674 CSR_API(SrvGetConsoleHardwareState
)
677 PCSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleHardwareStateRequest
;
678 PCSRSS_CONSOLE Console
;
680 DPRINT("SrvGetConsoleHardwareState\n");
682 Status
= ConioLockConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
683 ConsoleHardwareStateRequest
->ConsoleHandle
,
686 if (!NT_SUCCESS(Status
))
688 DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n");
692 ConsoleHardwareStateRequest
->State
= Console
->HardwareState
;
694 ConioUnlockConsole(Console
);
699 CSR_API(SrvSetConsoleHardwareState
)
702 PCSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleHardwareStateRequest
;
703 PCSRSS_CONSOLE Console
;
705 DPRINT("SrvSetConsoleHardwareState\n");
707 Status
= ConioLockConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
708 ConsoleHardwareStateRequest
->ConsoleHandle
,
711 if (!NT_SUCCESS(Status
))
713 DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n");
717 DPRINT("Setting console hardware state.\n");
718 Status
= SetConsoleHardwareState(Console
, ConsoleHardwareStateRequest
->State
);
720 ConioUnlockConsole(Console
);
725 CSR_API(SrvGetConsoleWindow
)
728 PCSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetConsoleWindowRequest
;
729 PCSRSS_CONSOLE Console
;
731 DPRINT("SrvGetConsoleWindow\n");
733 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
734 if (!NT_SUCCESS(Status
)) return Status
;
736 GetConsoleWindowRequest
->WindowHandle
= Console
->hWindow
;
737 ConioUnlockConsole(Console
);
739 return STATUS_SUCCESS
;
742 CSR_API(SrvSetConsoleIcon
)
745 PCSRSS_SET_CONSOLE_ICON SetConsoleIconRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetConsoleIconRequest
;
746 PCSRSS_CONSOLE Console
;
748 DPRINT("SrvSetConsoleIcon\n");
750 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
751 if (!NT_SUCCESS(Status
)) return Status
;
753 Status
= (ConioChangeIcon(Console
, SetConsoleIconRequest
->WindowIcon
)
755 : STATUS_UNSUCCESSFUL
);
757 ConioUnlockConsole(Console
);
762 CSR_API(SrvGetConsoleCP
)
765 PCSRSS_CONSOLE_CP ConsoleCPRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleCPRequest
;
766 PCSRSS_CONSOLE Console
;
768 DPRINT("SrvGetConsoleCP, getting %s Code Page\n",
769 ConsoleCPRequest
->InputCP
? "Input" : "Output");
771 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
772 if (!NT_SUCCESS(Status
)) return Status
;
774 ConsoleCPRequest
->CodePage
= (ConsoleCPRequest
->InputCP
? Console
->CodePage
775 : Console
->OutputCodePage
);
776 ConioUnlockConsole(Console
);
777 return STATUS_SUCCESS
;
780 CSR_API(SrvSetConsoleCP
)
783 PCSRSS_CONSOLE_CP ConsoleCPRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleCPRequest
;
784 PCSRSS_CONSOLE Console
;
786 DPRINT("SrvSetConsoleCP, setting %s Code Page\n",
787 ConsoleCPRequest
->InputCP
? "Input" : "Output");
789 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
790 if (!NT_SUCCESS(Status
)) return Status
;
792 if (IsValidCodePage(ConsoleCPRequest
->CodePage
))
794 if (ConsoleCPRequest
->InputCP
)
795 Console
->CodePage
= ConsoleCPRequest
->CodePage
;
797 Console
->OutputCodePage
= ConsoleCPRequest
->CodePage
;
799 ConioUnlockConsole(Console
);
800 return STATUS_SUCCESS
;
803 ConioUnlockConsole(Console
);
804 return STATUS_INVALID_PARAMETER
;
807 CSR_API(SrvGetConsoleProcessList
)
810 PCSRSS_GET_PROCESS_LIST GetProcessListRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetProcessListRequest
;
812 // PCSR_PROCESS Process = CsrGetClientThread()->Process;
813 PCSRSS_CONSOLE Console
;
814 PCONSOLE_PROCESS_DATA current
;
815 PLIST_ENTRY current_entry
;
818 DPRINT("SrvGetConsoleProcessList\n");
820 if (!CsrValidateMessageBuffer(ApiMessage
,
821 (PVOID
)&GetProcessListRequest
->pProcessIds
,
822 GetProcessListRequest
->nMaxIds
,
825 return STATUS_INVALID_PARAMETER
;
828 Buffer
= GetProcessListRequest
->pProcessIds
;
831 if (!Win32CsrValidateBuffer(ProcessData, Buffer, GetProcessListRequest->nMaxIds, sizeof(DWORD)))
832 return STATUS_ACCESS_VIOLATION;
835 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
836 if (!NT_SUCCESS(Status
)) return Status
;
838 for (current_entry
= Console
->ProcessList
.Flink
;
839 current_entry
!= &Console
->ProcessList
;
840 current_entry
= current_entry
->Flink
)
842 current
= CONTAINING_RECORD(current_entry
, CONSOLE_PROCESS_DATA
, ConsoleLink
);
843 if (++nItems
<= GetProcessListRequest
->nMaxIds
)
845 *Buffer
++ = HandleToUlong(current
->Process
->ClientId
.UniqueProcess
);
849 ConioUnlockConsole(Console
);
851 GetProcessListRequest
->nProcessIdsTotal
= nItems
;
852 return STATUS_SUCCESS
;
855 CSR_API(SrvGenerateConsoleCtrlEvent
)
858 PCSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GenerateCtrlEvent
;
859 PCSRSS_CONSOLE Console
;
860 PCONSOLE_PROCESS_DATA current
;
861 PLIST_ENTRY current_entry
;
864 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
865 if (!NT_SUCCESS(Status
)) return Status
;
867 Group
= GenerateCtrlEvent
->ProcessGroup
;
868 Status
= STATUS_INVALID_PARAMETER
;
869 for (current_entry
= Console
->ProcessList
.Flink
;
870 current_entry
!= &Console
->ProcessList
;
871 current_entry
= current_entry
->Flink
)
873 current
= CONTAINING_RECORD(current_entry
, CONSOLE_PROCESS_DATA
, ConsoleLink
);
874 if (Group
== 0 || current
->Process
->ProcessGroupId
== Group
)
876 ConioConsoleCtrlEvent(GenerateCtrlEvent
->Event
, current
);
877 Status
= STATUS_SUCCESS
;
881 ConioUnlockConsole(Console
);
886 CSR_API(SrvGetConsoleSelectionInfo
)
889 PCSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetConsoleSelectionInfo
;
890 PCSRSS_CONSOLE Console
;
892 Status
= ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
);
893 if (NT_SUCCESS(Status
))
895 memset(&GetConsoleSelectionInfo
->Info
, 0, sizeof(CONSOLE_SELECTION_INFO
));
896 if (Console
->Selection
.dwFlags
!= 0)
897 GetConsoleSelectionInfo
->Info
= Console
->Selection
;
898 ConioUnlockConsole(Console
);