2 * reactos/subsys/csrss/win32csr/conio.c
4 * Console I/O functions
6 * ReactOS Operating System
9 /* INCLUDES ******************************************************************/
15 /* FUNCTIONS *****************************************************************/
18 ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData
, PCSRSS_CONSOLE
*Console
)
20 PCSRSS_CONSOLE ProcessConsole
;
22 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
23 ProcessConsole
= ProcessData
->Console
;
28 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
29 return STATUS_INVALID_HANDLE
;
32 InterlockedIncrement(&ProcessConsole
->ReferenceCount
);
33 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
34 EnterCriticalSection(&(ProcessConsole
->Lock
));
35 *Console
= ProcessConsole
;
37 return STATUS_SUCCESS
;
41 ConioConsoleCtrlEventTimeout(DWORD Event
, PCSRSS_PROCESS_DATA ProcessData
, DWORD Timeout
)
45 DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData
->ProcessId
);
47 if (ProcessData
->CtrlDispatcher
)
50 Thread
= CreateRemoteThread(ProcessData
->Process
, NULL
, 0,
51 (LPTHREAD_START_ROUTINE
) ProcessData
->CtrlDispatcher
,
52 UlongToPtr(Event
), 0, NULL
);
55 DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError());
58 WaitForSingleObject(Thread
, Timeout
);
64 ConioConsoleCtrlEvent(DWORD Event
, PCSRSS_PROCESS_DATA ProcessData
)
66 ConioConsoleCtrlEventTimeout(Event
, ProcessData
, 0);
69 static NTSTATUS WINAPI
70 CsrInitConsole(PCSRSS_CONSOLE Console
, BOOL Visible
)
73 SECURITY_ATTRIBUTES SecurityAttributes
;
74 PCSRSS_SCREEN_BUFFER NewBuffer
;
79 Console
->Title
.MaximumLength
= Console
->Title
.Length
= 0;
80 Console
->Title
.Buffer
= NULL
;
82 hInst
= GetModuleHandleW(L
"win32csr");
83 if (LoadStringW(hInst
,IDS_COMMAND_PROMPT
,Title
,sizeof(Title
)/sizeof(Title
[0])))
85 RtlCreateUnicodeString(&Console
->Title
, Title
);
89 RtlCreateUnicodeString(&Console
->Title
, L
"Command Prompt");
92 Console
->ReferenceCount
= 0;
93 Console
->LineBuffer
= NULL
;
94 Console
->Header
.Type
= CONIO_CONSOLE_MAGIC
;
95 Console
->Header
.Console
= Console
;
96 Console
->Mode
= ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
| ENABLE_PROCESSED_INPUT
| ENABLE_MOUSE_INPUT
;
97 InitializeListHead(&Console
->BufferList
);
98 Console
->ActiveBuffer
= NULL
;
99 InitializeListHead(&Console
->InputEvents
);
100 InitializeListHead(&Console
->HistoryBuffers
);
101 Console
->CodePage
= GetOEMCP();
102 Console
->OutputCodePage
= GetOEMCP();
104 SecurityAttributes
.nLength
= sizeof(SECURITY_ATTRIBUTES
);
105 SecurityAttributes
.lpSecurityDescriptor
= NULL
;
106 SecurityAttributes
.bInheritHandle
= TRUE
;
108 Console
->ActiveEvent
= CreateEventW(&SecurityAttributes
, TRUE
, FALSE
, NULL
);
109 if (NULL
== Console
->ActiveEvent
)
111 RtlFreeUnicodeString(&Console
->Title
);
112 return STATUS_UNSUCCESSFUL
;
114 Console
->PrivateData
= NULL
;
115 InitializeCriticalSection(&Console
->Lock
);
117 GuiMode
= DtbgIsDesktopVisible();
119 /* allocate console screen buffer */
120 NewBuffer
= HeapAlloc(Win32CsrApiHeap
, HEAP_ZERO_MEMORY
, sizeof(CSRSS_SCREEN_BUFFER
));
121 if (NULL
== NewBuffer
)
123 RtlFreeUnicodeString(&Console
->Title
);
124 DeleteCriticalSection(&Console
->Lock
);
125 CloseHandle(Console
->ActiveEvent
);
126 return STATUS_INSUFFICIENT_RESOURCES
;
128 /* init screen buffer with defaults */
129 NewBuffer
->CursorInfo
.bVisible
= TRUE
;
130 NewBuffer
->CursorInfo
.dwSize
= CSR_DEFAULT_CURSOR_SIZE
;
131 /* make console active, and insert into console list */
132 Console
->ActiveBuffer
= (PCSRSS_SCREEN_BUFFER
) NewBuffer
;
136 Status
= TuiInitConsole(Console
);
137 if (! NT_SUCCESS(Status
))
139 DPRINT1("Failed to open text-mode console, switching to gui-mode\n");
145 Status
= GuiInitConsole(Console
, Visible
);
146 if (! NT_SUCCESS(Status
))
148 HeapFree(Win32CsrApiHeap
,0, NewBuffer
);
149 RtlFreeUnicodeString(&Console
->Title
);
150 DeleteCriticalSection(&Console
->Lock
);
151 CloseHandle(Console
->ActiveEvent
);
152 DPRINT1("GuiInitConsole: failed\n");
157 Status
= CsrInitConsoleScreenBuffer(Console
, NewBuffer
);
158 if (! NT_SUCCESS(Status
))
160 ConioCleanupConsole(Console
);
161 RtlFreeUnicodeString(&Console
->Title
);
162 DeleteCriticalSection(&Console
->Lock
);
163 CloseHandle(Console
->ActiveEvent
);
164 HeapFree(Win32CsrApiHeap
, 0, NewBuffer
);
165 DPRINT1("CsrInitConsoleScreenBuffer: failed\n");
169 /* copy buffer contents to screen */
170 ConioDrawConsole(Console
);
172 return STATUS_SUCCESS
;
175 CSR_API(CsrAllocConsole
)
177 PCSRSS_CONSOLE Console
;
178 NTSTATUS Status
= STATUS_SUCCESS
;
179 BOOLEAN NewConsole
= FALSE
;
181 DPRINT("CsrAllocConsole\n");
183 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
184 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
186 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
187 if (ProcessData
->Console
)
189 DPRINT1("Process already has a console\n");
190 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
191 return STATUS_INVALID_PARAMETER
;
194 /* If we don't need a console, then get out of here */
195 if (!Request
->Data
.AllocConsoleRequest
.ConsoleNeeded
)
197 DPRINT("No console needed\n");
198 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
199 return STATUS_SUCCESS
;
202 /* If we already have one, then don't create a new one... */
203 if (!Request
->Data
.AllocConsoleRequest
.Console
||
204 Request
->Data
.AllocConsoleRequest
.Console
!= ProcessData
->ParentConsole
)
206 /* Allocate a console structure */
208 Console
= HeapAlloc(Win32CsrApiHeap
, HEAP_ZERO_MEMORY
, sizeof(CSRSS_CONSOLE
));
211 DPRINT1("Not enough memory for console\n");
212 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
213 return STATUS_NO_MEMORY
;
215 /* initialize list head */
216 InitializeListHead(&Console
->ProcessList
);
217 /* insert process data required for GUI initialization */
218 InsertHeadList(&Console
->ProcessList
, &ProcessData
->ProcessEntry
);
219 /* Initialize the Console */
220 Status
= CsrInitConsole(Console
, Request
->Data
.AllocConsoleRequest
.Visible
);
221 if (!NT_SUCCESS(Status
))
223 DPRINT1("Console init failed\n");
224 HeapFree(Win32CsrApiHeap
, 0, Console
);
225 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
231 /* Reuse our current console */
232 Console
= Request
->Data
.AllocConsoleRequest
.Console
;
235 /* Set the Process Console */
236 ProcessData
->Console
= Console
;
238 /* Return it to the caller */
239 Request
->Data
.AllocConsoleRequest
.Console
= Console
;
241 /* Add a reference count because the process is tied to the console */
242 _InterlockedIncrement(&Console
->ReferenceCount
);
244 if (NewConsole
|| !ProcessData
->bInheritHandles
)
246 /* Insert the Objects */
247 Status
= Win32CsrInsertObject(ProcessData
,
248 &Request
->Data
.AllocConsoleRequest
.InputHandle
,
250 GENERIC_READ
| GENERIC_WRITE
,
252 FILE_SHARE_READ
| FILE_SHARE_WRITE
);
253 if (! NT_SUCCESS(Status
))
255 DPRINT1("Failed to insert object\n");
256 ConioDeleteConsole((Object_t
*) Console
);
257 ProcessData
->Console
= 0;
258 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
262 Status
= Win32CsrInsertObject(ProcessData
,
263 &Request
->Data
.AllocConsoleRequest
.OutputHandle
,
264 &Console
->ActiveBuffer
->Header
,
265 GENERIC_READ
| GENERIC_WRITE
,
267 FILE_SHARE_READ
| FILE_SHARE_WRITE
);
268 if (!NT_SUCCESS(Status
))
270 DPRINT1("Failed to insert object\n");
271 ConioDeleteConsole((Object_t
*) Console
);
272 Win32CsrReleaseObject(ProcessData
,
273 Request
->Data
.AllocConsoleRequest
.InputHandle
);
274 ProcessData
->Console
= 0;
275 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
280 /* Duplicate the Event */
281 if (!DuplicateHandle(GetCurrentProcess(),
282 ProcessData
->Console
->ActiveEvent
,
283 ProcessData
->Process
,
284 &ProcessData
->ConsoleEvent
,
289 DPRINT1("DuplicateHandle() failed: %d\n", GetLastError
);
290 ConioDeleteConsole((Object_t
*) Console
);
291 if (NewConsole
|| !ProcessData
->bInheritHandles
)
293 Win32CsrReleaseObject(ProcessData
,
294 Request
->Data
.AllocConsoleRequest
.OutputHandle
);
295 Win32CsrReleaseObject(ProcessData
,
296 Request
->Data
.AllocConsoleRequest
.InputHandle
);
298 ProcessData
->Console
= 0;
299 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
303 /* Set the Ctrl Dispatcher */
304 ProcessData
->CtrlDispatcher
= Request
->Data
.AllocConsoleRequest
.CtrlDispatcher
;
305 DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData
->CtrlDispatcher
);
309 /* Insert into the list if it has not been added */
310 InsertHeadList(&ProcessData
->Console
->ProcessList
, &ProcessData
->ProcessEntry
);
313 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
314 return STATUS_SUCCESS
;
317 CSR_API(CsrFreeConsole
)
319 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
320 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
322 return Win32CsrReleaseConsole(ProcessData
);
326 ConioDeleteConsole(Object_t
*Object
)
328 PCSRSS_CONSOLE Console
= (PCSRSS_CONSOLE
) Object
;
331 DPRINT("ConioDeleteConsole\n");
333 /* Drain input event queue */
334 while (Console
->InputEvents
.Flink
!= &Console
->InputEvents
)
336 Event
= (ConsoleInput
*) Console
->InputEvents
.Flink
;
337 Console
->InputEvents
.Flink
= Console
->InputEvents
.Flink
->Flink
;
338 Console
->InputEvents
.Flink
->Flink
->Blink
= &Console
->InputEvents
;
339 HeapFree(Win32CsrApiHeap
, 0, Event
);
342 ConioCleanupConsole(Console
);
343 if (Console
->LineBuffer
)
344 RtlFreeHeap(Win32CsrApiHeap
, 0, Console
->LineBuffer
);
345 while (!IsListEmpty(&Console
->HistoryBuffers
))
346 HistoryDeleteBuffer((struct tagHISTORY_BUFFER
*)Console
->HistoryBuffers
.Flink
);
348 ConioDeleteScreenBuffer(Console
->ActiveBuffer
);
349 if (!IsListEmpty(&Console
->BufferList
))
351 DPRINT1("BUG: screen buffer list not empty\n");
354 CloseHandle(Console
->ActiveEvent
);
355 if (Console
->UnpauseEvent
) CloseHandle(Console
->UnpauseEvent
);
356 DeleteCriticalSection(&Console
->Lock
);
357 RtlFreeUnicodeString(&Console
->Title
);
358 IntDeleteAllAliases(Console
->Aliases
);
359 HeapFree(Win32CsrApiHeap
, 0, Console
);
363 CsrInitConsoleSupport(VOID
)
365 DPRINT("CSR: CsrInitConsoleSupport()\n");
367 /* Should call LoadKeyboardLayout */
371 ConioPause(PCSRSS_CONSOLE Console
, UINT Flags
)
373 Console
->PauseFlags
|= Flags
;
374 if (!Console
->UnpauseEvent
)
375 Console
->UnpauseEvent
= CreateEvent(NULL
, TRUE
, FALSE
, NULL
);
379 ConioUnpause(PCSRSS_CONSOLE Console
, UINT Flags
)
381 Console
->PauseFlags
&= ~Flags
;
382 if (Console
->PauseFlags
== 0 && Console
->UnpauseEvent
)
384 SetEvent(Console
->UnpauseEvent
);
385 CloseHandle(Console
->UnpauseEvent
);
386 Console
->UnpauseEvent
= NULL
;
390 CSR_API(CsrSetConsoleMode
)
393 PCSRSS_CONSOLE Console
;
394 PCSRSS_SCREEN_BUFFER Buff
;
396 DPRINT("CsrSetConsoleMode\n");
398 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
399 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
400 Status
= Win32CsrLockObject(ProcessData
,
401 Request
->Data
.SetConsoleModeRequest
.ConsoleHandle
,
402 (Object_t
**) &Console
, GENERIC_WRITE
, 0);
403 if (! NT_SUCCESS(Status
))
408 Buff
= (PCSRSS_SCREEN_BUFFER
)Console
;
409 if (CONIO_CONSOLE_MAGIC
== Console
->Header
.Type
)
411 Console
->Mode
= Request
->Data
.SetConsoleModeRequest
.Mode
& CONSOLE_INPUT_MODE_VALID
;
413 else if (CONIO_SCREEN_BUFFER_MAGIC
== Console
->Header
.Type
)
415 Buff
->Mode
= Request
->Data
.SetConsoleModeRequest
.Mode
& CONSOLE_OUTPUT_MODE_VALID
;
419 Status
= STATUS_INVALID_HANDLE
;
422 Win32CsrUnlockObject((Object_t
*)Console
);
427 CSR_API(CsrGetConsoleMode
)
430 PCSRSS_CONSOLE Console
;
431 PCSRSS_SCREEN_BUFFER Buff
; /* gee, I really wish I could use an anonymous union here */
433 DPRINT("CsrGetConsoleMode\n");
435 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
436 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
437 Status
= Win32CsrLockObject(ProcessData
, Request
->Data
.GetConsoleModeRequest
.ConsoleHandle
,
438 (Object_t
**) &Console
, GENERIC_READ
, 0);
439 if (! NT_SUCCESS(Status
))
443 Status
= STATUS_SUCCESS
;
444 Buff
= (PCSRSS_SCREEN_BUFFER
) Console
;
445 if (CONIO_CONSOLE_MAGIC
== Console
->Header
.Type
)
447 Request
->Data
.GetConsoleModeRequest
.ConsoleMode
= Console
->Mode
;
449 else if (CONIO_SCREEN_BUFFER_MAGIC
== Buff
->Header
.Type
)
451 Request
->Data
.GetConsoleModeRequest
.ConsoleMode
= Buff
->Mode
;
455 Status
= STATUS_INVALID_HANDLE
;
458 Win32CsrUnlockObject((Object_t
*)Console
);
465 PCSRSS_CONSOLE Console
;
468 DPRINT("CsrSetTitle\n");
470 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
471 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
472 if (!Win32CsrValidateBuffer(ProcessData
, Request
->Data
.SetTitleRequest
.Title
,
473 Request
->Data
.SetTitleRequest
.Length
, 1))
475 return STATUS_ACCESS_VIOLATION
;
478 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
479 if(NT_SUCCESS(Status
))
481 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Request
->Data
.SetTitleRequest
.Length
);
484 /* copy title to console */
485 RtlFreeUnicodeString(&Console
->Title
);
486 Console
->Title
.Buffer
= Buffer
;
487 Console
->Title
.Length
= Console
->Title
.MaximumLength
= Request
->Data
.SetTitleRequest
.Length
;
488 memcpy(Console
->Title
.Buffer
, Request
->Data
.SetTitleRequest
.Title
, Console
->Title
.Length
);
489 if (! ConioChangeTitle(Console
))
491 Status
= STATUS_UNSUCCESSFUL
;
495 Status
= STATUS_SUCCESS
;
500 Status
= STATUS_NO_MEMORY
;
502 ConioUnlockConsole(Console
);
511 PCSRSS_CONSOLE Console
;
514 DPRINT("CsrGetTitle\n");
516 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
517 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
519 if (!Win32CsrValidateBuffer(ProcessData
, Request
->Data
.GetTitleRequest
.Title
,
520 Request
->Data
.GetTitleRequest
.Length
, 1))
522 return STATUS_ACCESS_VIOLATION
;
525 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
526 if (! NT_SUCCESS(Status
))
528 DPRINT1("Can't get console\n");
532 /* Copy title of the console to the user title buffer */
533 if (Request
->Data
.GetTitleRequest
.Length
>= sizeof(WCHAR
))
535 Length
= min(Request
->Data
.GetTitleRequest
.Length
- sizeof(WCHAR
), Console
->Title
.Length
);
536 memcpy(Request
->Data
.GetTitleRequest
.Title
, Console
->Title
.Buffer
, Length
);
537 Request
->Data
.GetTitleRequest
.Title
[Length
/ sizeof(WCHAR
)] = L
'\0';
540 Request
->Data
.GetTitleRequest
.Length
= Console
->Title
.Length
;
542 ConioUnlockConsole(Console
);
543 return STATUS_SUCCESS
;
546 /**********************************************************************
547 * HardwareStateProperty
550 * Set/Get the value of the HardwareState and switch
551 * between direct video buffer ouput and GDI windowed
554 * Client hands us a CSRSS_CONSOLE_HARDWARE_STATE
555 * object. We use the same object to Request.
557 * ConsoleHwState has the correct size to be compatible
558 * with NT's, but values are not.
560 static NTSTATUS FASTCALL
561 SetConsoleHardwareState (PCSRSS_CONSOLE Console
, DWORD ConsoleHwState
)
563 DPRINT1("Console Hardware State: %d\n", ConsoleHwState
);
565 if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED
== ConsoleHwState
)
566 ||(CONSOLE_HARDWARE_STATE_DIRECT
== ConsoleHwState
))
568 if (Console
->HardwareState
!= ConsoleHwState
)
570 /* TODO: implement switching from full screen to windowed mode */
571 /* TODO: or back; now simply store the hardware state */
572 Console
->HardwareState
= ConsoleHwState
;
575 return STATUS_SUCCESS
;
578 return STATUS_INVALID_PARAMETER_3
; /* Client: (handle, set_get, [mode]) */
581 CSR_API(CsrHardwareStateProperty
)
583 PCSRSS_CONSOLE Console
;
586 DPRINT("CsrHardwareStateProperty\n");
588 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
589 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
591 Status
= ConioLockConsole(ProcessData
,
592 Request
->Data
.ConsoleHardwareStateRequest
.ConsoleHandle
,
595 if (! NT_SUCCESS(Status
))
597 DPRINT1("Failed to get console handle in SetConsoleHardwareState\n");
601 switch (Request
->Data
.ConsoleHardwareStateRequest
.SetGet
)
603 case CONSOLE_HARDWARE_STATE_GET
:
604 Request
->Data
.ConsoleHardwareStateRequest
.State
= Console
->HardwareState
;
607 case CONSOLE_HARDWARE_STATE_SET
:
608 DPRINT("Setting console hardware state.\n");
609 Status
= SetConsoleHardwareState(Console
, Request
->Data
.ConsoleHardwareStateRequest
.State
);
613 Status
= STATUS_INVALID_PARAMETER_2
; /* Client: (handle, [set_get], mode) */
617 ConioUnlockConsole(Console
);
622 CSR_API(CsrGetConsoleWindow
)
624 PCSRSS_CONSOLE Console
;
627 DPRINT("CsrGetConsoleWindow\n");
629 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
630 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
632 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
633 if (! NT_SUCCESS(Status
))
638 Request
->Data
.GetConsoleWindowRequest
.WindowHandle
= Console
->hWindow
;
639 ConioUnlockConsole(Console
);
641 return STATUS_SUCCESS
;
644 CSR_API(CsrSetConsoleIcon
)
646 PCSRSS_CONSOLE Console
;
649 DPRINT("CsrSetConsoleIcon\n");
651 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
652 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
654 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
655 if (! NT_SUCCESS(Status
))
660 Status
= (ConioChangeIcon(Console
, Request
->Data
.SetConsoleIconRequest
.WindowIcon
)
661 ? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL
);
662 ConioUnlockConsole(Console
);
667 CSR_API(CsrGetConsoleCodePage
)
669 PCSRSS_CONSOLE Console
;
672 DPRINT("CsrGetConsoleCodePage\n");
674 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
675 if (! NT_SUCCESS(Status
))
680 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
681 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
682 Request
->Data
.GetConsoleCodePage
.CodePage
= Console
->CodePage
;
683 ConioUnlockConsole(Console
);
684 return STATUS_SUCCESS
;
687 CSR_API(CsrSetConsoleCodePage
)
689 PCSRSS_CONSOLE Console
;
692 DPRINT("CsrSetConsoleCodePage\n");
694 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
695 if (! NT_SUCCESS(Status
))
700 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
701 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
703 if (IsValidCodePage(Request
->Data
.SetConsoleCodePage
.CodePage
))
705 Console
->CodePage
= Request
->Data
.SetConsoleCodePage
.CodePage
;
706 ConioUnlockConsole(Console
);
707 return STATUS_SUCCESS
;
710 ConioUnlockConsole(Console
);
711 return STATUS_INVALID_PARAMETER
;
714 CSR_API(CsrGetConsoleOutputCodePage
)
716 PCSRSS_CONSOLE Console
;
719 DPRINT("CsrGetConsoleOutputCodePage\n");
721 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
722 if (! NT_SUCCESS(Status
))
727 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
728 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
729 Request
->Data
.GetConsoleOutputCodePage
.CodePage
= Console
->OutputCodePage
;
730 ConioUnlockConsole(Console
);
731 return STATUS_SUCCESS
;
734 CSR_API(CsrSetConsoleOutputCodePage
)
736 PCSRSS_CONSOLE Console
;
739 DPRINT("CsrSetConsoleOutputCodePage\n");
741 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
742 if (! NT_SUCCESS(Status
))
747 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
748 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
750 if (IsValidCodePage(Request
->Data
.SetConsoleOutputCodePage
.CodePage
))
752 Console
->OutputCodePage
= Request
->Data
.SetConsoleOutputCodePage
.CodePage
;
753 ConioUnlockConsole(Console
);
754 return STATUS_SUCCESS
;
757 ConioUnlockConsole(Console
);
758 return STATUS_INVALID_PARAMETER
;
761 CSR_API(CsrGetProcessList
)
764 PCSRSS_CONSOLE Console
;
765 PCSRSS_PROCESS_DATA current
;
766 PLIST_ENTRY current_entry
;
770 DPRINT("CsrGetProcessList\n");
772 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
773 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
775 Buffer
= Request
->Data
.GetProcessListRequest
.ProcessId
;
776 if (!Win32CsrValidateBuffer(ProcessData
, Buffer
, Request
->Data
.GetProcessListRequest
.nMaxIds
, sizeof(DWORD
)))
777 return STATUS_ACCESS_VIOLATION
;
779 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
780 if (! NT_SUCCESS(Status
))
785 for (current_entry
= Console
->ProcessList
.Flink
;
786 current_entry
!= &Console
->ProcessList
;
787 current_entry
= current_entry
->Flink
)
789 current
= CONTAINING_RECORD(current_entry
, CSRSS_PROCESS_DATA
, ProcessEntry
);
790 if (++nItems
<= Request
->Data
.GetProcessListRequest
.nMaxIds
)
792 *Buffer
++ = HandleToUlong(current
->ProcessId
);
796 ConioUnlockConsole(Console
);
798 Request
->Data
.GetProcessListRequest
.nProcessIdsTotal
= nItems
;
799 return STATUS_SUCCESS
;
802 CSR_API(CsrGenerateCtrlEvent
)
804 PCSRSS_CONSOLE Console
;
805 PCSRSS_PROCESS_DATA current
;
806 PLIST_ENTRY current_entry
;
810 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
811 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
813 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
814 if (! NT_SUCCESS(Status
))
819 Group
= Request
->Data
.GenerateCtrlEvent
.ProcessGroup
;
820 Status
= STATUS_INVALID_PARAMETER
;
821 for (current_entry
= Console
->ProcessList
.Flink
;
822 current_entry
!= &Console
->ProcessList
;
823 current_entry
= current_entry
->Flink
)
825 current
= CONTAINING_RECORD(current_entry
, CSRSS_PROCESS_DATA
, ProcessEntry
);
826 if (Group
== 0 || current
->ProcessGroup
== Group
)
828 ConioConsoleCtrlEvent(Request
->Data
.GenerateCtrlEvent
.Event
, current
);
829 Status
= STATUS_SUCCESS
;
833 ConioUnlockConsole(Console
);
838 CSR_API(CsrGetConsoleSelectionInfo
)
841 PCSRSS_CONSOLE Console
;
843 Request
->Header
.u1
.s1
.TotalLength
= sizeof(CSR_API_MESSAGE
);
844 Request
->Header
.u1
.s1
.DataLength
= sizeof(CSR_API_MESSAGE
) - sizeof(PORT_MESSAGE
);
846 Status
= ConioConsoleFromProcessData(ProcessData
, &Console
);
847 if (NT_SUCCESS(Status
))
849 memset(&Request
->Data
.GetConsoleSelectionInfo
.Info
, 0, sizeof(CONSOLE_SELECTION_INFO
));
850 if (Console
->Selection
.dwFlags
!= 0)
851 Request
->Data
.GetConsoleSelectionInfo
.Info
= Console
->Selection
;
852 ConioUnlockConsole(Console
);