+++ /dev/null
-/*
- * reactos/subsys/csrss/win32csr/conio.c
- *
- * Console I/O functions
- *
- * ReactOS Operating System
- */
-
-/* INCLUDES ******************************************************************/
-
-#define NDEBUG
-#include "w32csr.h"
-#include <debug.h>
-
-/* FUNCTIONS *****************************************************************/
-
-NTSTATUS FASTCALL
-ConioConsoleFromProcessData(PCSR_PROCESS ProcessData, PCSRSS_CONSOLE *Console)
-{
- PCSRSS_CONSOLE ProcessConsole;
-
- RtlEnterCriticalSection(&ProcessData->HandleTableLock);
- ProcessConsole = ProcessData->Console;
-
- if (!ProcessConsole)
- {
- *Console = NULL;
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return STATUS_INVALID_HANDLE;
- }
-
- InterlockedIncrement(&ProcessConsole->ReferenceCount);
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- EnterCriticalSection(&(ProcessConsole->Lock));
- *Console = ProcessConsole;
-
- return STATUS_SUCCESS;
-}
-
-VOID FASTCALL
-ConioConsoleCtrlEventTimeout(DWORD Event, PCSR_PROCESS ProcessData, DWORD Timeout)
-{
- HANDLE Thread;
-
- DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData->ClientId.UniqueProcess);
-
- if (ProcessData->CtrlDispatcher)
- {
-
- Thread = CreateRemoteThread(ProcessData->ProcessHandle, NULL, 0,
- (LPTHREAD_START_ROUTINE) ProcessData->CtrlDispatcher,
- UlongToPtr(Event), 0, NULL);
- if (NULL == Thread)
- {
- DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError());
- return;
- }
- WaitForSingleObject(Thread, Timeout);
- CloseHandle(Thread);
- }
-}
-
-VOID FASTCALL
-ConioConsoleCtrlEvent(DWORD Event, PCSR_PROCESS ProcessData)
-{
- ConioConsoleCtrlEventTimeout(Event, ProcessData, 0);
-}
-
-static NTSTATUS WINAPI
-CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
-{
- NTSTATUS Status;
- SECURITY_ATTRIBUTES SecurityAttributes;
- PCSRSS_SCREEN_BUFFER NewBuffer;
- BOOL GuiMode;
- WCHAR Title[255];
- HINSTANCE hInst;
-
- Console->Title.MaximumLength = Console->Title.Length = 0;
- Console->Title.Buffer = NULL;
-
- hInst = GetModuleHandleW(L"win32csr");
- if (LoadStringW(hInst,IDS_COMMAND_PROMPT,Title,sizeof(Title)/sizeof(Title[0])))
- {
- RtlCreateUnicodeString(&Console->Title, Title);
- }
- else
- {
- RtlCreateUnicodeString(&Console->Title, L"Command Prompt");
- }
-
- Console->ReferenceCount = 0;
- Console->LineBuffer = NULL;
- Console->Header.Type = CONIO_CONSOLE_MAGIC;
- Console->Header.Console = Console;
- Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT;
- InitializeListHead(&Console->BufferList);
- Console->ActiveBuffer = NULL;
- InitializeListHead(&Console->InputEvents);
- InitializeListHead(&Console->HistoryBuffers);
- Console->CodePage = GetOEMCP();
- Console->OutputCodePage = GetOEMCP();
-
- SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
- SecurityAttributes.lpSecurityDescriptor = NULL;
- SecurityAttributes.bInheritHandle = TRUE;
-
- Console->ActiveEvent = CreateEventW(&SecurityAttributes, TRUE, FALSE, NULL);
- if (NULL == Console->ActiveEvent)
- {
- RtlFreeUnicodeString(&Console->Title);
- return STATUS_UNSUCCESSFUL;
- }
- Console->PrivateData = NULL;
- InitializeCriticalSection(&Console->Lock);
-
- GuiMode = DtbgIsDesktopVisible();
-
- /* allocate console screen buffer */
- NewBuffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER));
- if (NULL == NewBuffer)
- {
- RtlFreeUnicodeString(&Console->Title);
- DeleteCriticalSection(&Console->Lock);
- CloseHandle(Console->ActiveEvent);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- /* init screen buffer with defaults */
- NewBuffer->CursorInfo.bVisible = TRUE;
- NewBuffer->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE;
- /* make console active, and insert into console list */
- Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer;
-
- if (! GuiMode)
- {
- Status = TuiInitConsole(Console);
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Failed to open text-mode console, switching to gui-mode\n");
- GuiMode = TRUE;
- }
- }
- else /* GuiMode */
- {
- Status = GuiInitConsole(Console, ShowCmd);
- if (! NT_SUCCESS(Status))
- {
- HeapFree(Win32CsrApiHeap,0, NewBuffer);
- RtlFreeUnicodeString(&Console->Title);
- DeleteCriticalSection(&Console->Lock);
- CloseHandle(Console->ActiveEvent);
- DPRINT1("GuiInitConsole: failed\n");
- return Status;
- }
- }
-
- Status = CsrInitConsoleScreenBuffer(Console, NewBuffer);
- if (! NT_SUCCESS(Status))
- {
- ConioCleanupConsole(Console);
- RtlFreeUnicodeString(&Console->Title);
- DeleteCriticalSection(&Console->Lock);
- CloseHandle(Console->ActiveEvent);
- HeapFree(Win32CsrApiHeap, 0, NewBuffer);
- DPRINT1("CsrInitConsoleScreenBuffer: failed\n");
- return Status;
- }
-
- /* copy buffer contents to screen */
- ConioDrawConsole(Console);
-
- return STATUS_SUCCESS;
-}
-
-CSR_API(CsrAllocConsole)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status = STATUS_SUCCESS;
- BOOLEAN NewConsole = FALSE;
-
- DPRINT("CsrAllocConsole\n");
-
- RtlEnterCriticalSection(&ProcessData->HandleTableLock);
- if (ProcessData->Console)
- {
- DPRINT1("Process already has a console\n");
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return STATUS_INVALID_PARAMETER;
- }
-
- /* If we don't need a console, then get out of here */
- if (!Request->Data.AllocConsoleRequest.ConsoleNeeded)
- {
- DPRINT("No console needed\n");
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return STATUS_SUCCESS;
- }
-
- /* If we already have one, then don't create a new one... */
- if (!Request->Data.AllocConsoleRequest.Console ||
- Request->Data.AllocConsoleRequest.Console != ProcessData->ParentConsole)
- {
- /* Allocate a console structure */
- NewConsole = TRUE;
- Console = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_CONSOLE));
- if (NULL == Console)
- {
- DPRINT1("Not enough memory for console\n");
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return STATUS_NO_MEMORY;
- }
- /* initialize list head */
- InitializeListHead(&Console->ProcessList);
- /* insert process data required for GUI initialization */
- InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink);
- /* Initialize the Console */
- Status = CsrInitConsole(Console, Request->Data.AllocConsoleRequest.ShowCmd);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Console init failed\n");
- HeapFree(Win32CsrApiHeap, 0, Console);
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return Status;
- }
- }
- else
- {
- /* Reuse our current console */
- Console = Request->Data.AllocConsoleRequest.Console;
- }
-
- /* Set the Process Console */
- ProcessData->Console = Console;
-
- /* Return it to the caller */
- Request->Data.AllocConsoleRequest.Console = Console;
-
- /* Add a reference count because the process is tied to the console */
- _InterlockedIncrement(&Console->ReferenceCount);
-
- if (NewConsole || !ProcessData->bInheritHandles)
- {
- /* Insert the Objects */
- Status = Win32CsrInsertObject(ProcessData,
- &Request->Data.AllocConsoleRequest.InputHandle,
- &Console->Header,
- GENERIC_READ | GENERIC_WRITE,
- TRUE,
- FILE_SHARE_READ | FILE_SHARE_WRITE);
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Failed to insert object\n");
- ConioDeleteConsole((Object_t *) Console);
- ProcessData->Console = 0;
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return Status;
- }
-
- Status = Win32CsrInsertObject(ProcessData,
- &Request->Data.AllocConsoleRequest.OutputHandle,
- &Console->ActiveBuffer->Header,
- GENERIC_READ | GENERIC_WRITE,
- TRUE,
- FILE_SHARE_READ | FILE_SHARE_WRITE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to insert object\n");
- ConioDeleteConsole((Object_t *) Console);
- Win32CsrReleaseObject(ProcessData,
- Request->Data.AllocConsoleRequest.InputHandle);
- ProcessData->Console = 0;
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return Status;
- }
- }
-
- /* Duplicate the Event */
- if (!DuplicateHandle(GetCurrentProcess(),
- ProcessData->Console->ActiveEvent,
- ProcessData->ProcessHandle,
- &ProcessData->ConsoleEvent,
- EVENT_ALL_ACCESS,
- FALSE,
- 0))
- {
- DPRINT1("DuplicateHandle() failed: %lu\n", GetLastError());
- ConioDeleteConsole((Object_t *) Console);
- if (NewConsole || !ProcessData->bInheritHandles)
- {
- Win32CsrReleaseObject(ProcessData,
- Request->Data.AllocConsoleRequest.OutputHandle);
- Win32CsrReleaseObject(ProcessData,
- Request->Data.AllocConsoleRequest.InputHandle);
- }
- ProcessData->Console = 0;
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return Status;
- }
-
- /* Set the Ctrl Dispatcher */
- ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher;
- DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
-
- if (!NewConsole)
- {
- /* Insert into the list if it has not been added */
- InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink);
- }
-
- RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- return STATUS_SUCCESS;
-}
-
-CSR_API(CsrFreeConsole)
-{
- Win32CsrReleaseConsole(ProcessData);
- return STATUS_SUCCESS;
-}
-
-VOID WINAPI
-ConioDeleteConsole(Object_t *Object)
-{
- PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Object;
- ConsoleInput *Event;
-
- DPRINT("ConioDeleteConsole\n");
-
- /* Drain input event queue */
- while (Console->InputEvents.Flink != &Console->InputEvents)
- {
- Event = (ConsoleInput *) Console->InputEvents.Flink;
- Console->InputEvents.Flink = Console->InputEvents.Flink->Flink;
- Console->InputEvents.Flink->Flink->Blink = &Console->InputEvents;
- HeapFree(Win32CsrApiHeap, 0, Event);
- }
-
- ConioCleanupConsole(Console);
- if (Console->LineBuffer)
- RtlFreeHeap(Win32CsrApiHeap, 0, Console->LineBuffer);
- while (!IsListEmpty(&Console->HistoryBuffers))
- HistoryDeleteBuffer((struct tagHISTORY_BUFFER *)Console->HistoryBuffers.Flink);
-
- ConioDeleteScreenBuffer(Console->ActiveBuffer);
- if (!IsListEmpty(&Console->BufferList))
- {
- DPRINT1("BUG: screen buffer list not empty\n");
- }
-
- CloseHandle(Console->ActiveEvent);
- if (Console->UnpauseEvent) CloseHandle(Console->UnpauseEvent);
- DeleteCriticalSection(&Console->Lock);
- RtlFreeUnicodeString(&Console->Title);
- IntDeleteAllAliases(Console->Aliases);
- HeapFree(Win32CsrApiHeap, 0, Console);
-}
-
-VOID WINAPI
-CsrInitConsoleSupport(VOID)
-{
- DPRINT("CSR: CsrInitConsoleSupport()\n");
-
- /* Should call LoadKeyboardLayout */
-}
-
-VOID FASTCALL
-ConioPause(PCSRSS_CONSOLE Console, UINT Flags)
-{
- Console->PauseFlags |= Flags;
- if (!Console->UnpauseEvent)
- Console->UnpauseEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-}
-
-VOID FASTCALL
-ConioUnpause(PCSRSS_CONSOLE Console, UINT Flags)
-{
- Console->PauseFlags &= ~Flags;
- if (Console->PauseFlags == 0 && Console->UnpauseEvent)
- {
- SetEvent(Console->UnpauseEvent);
- CloseHandle(Console->UnpauseEvent);
- Console->UnpauseEvent = NULL;
- }
-}
-
-CSR_API(CsrSetConsoleMode)
-{
- NTSTATUS Status;
- PCSRSS_CONSOLE Console;
- PCSRSS_SCREEN_BUFFER Buff;
-
- DPRINT("CsrSetConsoleMode\n");
-
- Status = Win32CsrLockObject(ProcessData,
- Request->Data.SetConsoleModeRequest.ConsoleHandle,
- (Object_t **) &Console, GENERIC_WRITE, 0);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- Buff = (PCSRSS_SCREEN_BUFFER)Console;
- if (CONIO_CONSOLE_MAGIC == Console->Header.Type)
- {
- Console->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_INPUT_MODE_VALID;
- }
- else if (CONIO_SCREEN_BUFFER_MAGIC == Console->Header.Type)
- {
- Buff->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_OUTPUT_MODE_VALID;
- }
- else
- {
- Status = STATUS_INVALID_HANDLE;
- }
-
- Win32CsrUnlockObject((Object_t *)Console);
-
- return Status;
-}
-
-CSR_API(CsrGetConsoleMode)
-{
- NTSTATUS Status;
- PCSRSS_CONSOLE Console;
- PCSRSS_SCREEN_BUFFER Buff; /* gee, I really wish I could use an anonymous union here */
-
- DPRINT("CsrGetConsoleMode\n");
-
- Status = Win32CsrLockObject(ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle,
- (Object_t **) &Console, GENERIC_READ, 0);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
- Status = STATUS_SUCCESS;
- Buff = (PCSRSS_SCREEN_BUFFER) Console;
- if (CONIO_CONSOLE_MAGIC == Console->Header.Type)
- {
- Request->Data.GetConsoleModeRequest.ConsoleMode = Console->Mode;
- }
- else if (CONIO_SCREEN_BUFFER_MAGIC == Buff->Header.Type)
- {
- Request->Data.GetConsoleModeRequest.ConsoleMode = Buff->Mode;
- }
- else
- {
- Status = STATUS_INVALID_HANDLE;
- }
-
- Win32CsrUnlockObject((Object_t *)Console);
- return Status;
-}
-
-CSR_API(CsrSetTitle)
-{
- NTSTATUS Status;
- PCSRSS_CONSOLE Console;
- PWCHAR Buffer;
-
- DPRINT("CsrSetTitle\n");
-
- if (!Win32CsrValidateBuffer(ProcessData, Request->Data.SetTitleRequest.Title,
- Request->Data.SetTitleRequest.Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if(NT_SUCCESS(Status))
- {
- Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length);
- if (Buffer)
- {
- /* copy title to console */
- RtlFreeUnicodeString(&Console->Title);
- Console->Title.Buffer = Buffer;
- Console->Title.Length = Console->Title.MaximumLength = Request->Data.SetTitleRequest.Length;
- memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length);
- if (! ConioChangeTitle(Console))
- {
- Status = STATUS_UNSUCCESSFUL;
- }
- else
- {
- Status = STATUS_SUCCESS;
- }
- }
- else
- {
- Status = STATUS_NO_MEMORY;
- }
- ConioUnlockConsole(Console);
- }
-
- return Status;
-}
-
-CSR_API(CsrGetTitle)
-{
- NTSTATUS Status;
- PCSRSS_CONSOLE Console;
- DWORD Length;
-
- DPRINT("CsrGetTitle\n");
-
-
- if (!Win32CsrValidateBuffer(ProcessData, Request->Data.GetTitleRequest.Title,
- Request->Data.GetTitleRequest.Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Can't get console\n");
- return Status;
- }
-
- /* Copy title of the console to the user title buffer */
- if (Request->Data.GetTitleRequest.Length >= sizeof(WCHAR))
- {
- Length = min(Request->Data.GetTitleRequest.Length - sizeof(WCHAR), Console->Title.Length);
- memcpy(Request->Data.GetTitleRequest.Title, Console->Title.Buffer, Length);
- Request->Data.GetTitleRequest.Title[Length / sizeof(WCHAR)] = L'\0';
- }
-
- Request->Data.GetTitleRequest.Length = Console->Title.Length;
-
- ConioUnlockConsole(Console);
- return STATUS_SUCCESS;
-}
-
-/**********************************************************************
- * HardwareStateProperty
- *
- * DESCRIPTION
- * Set/Get the value of the HardwareState and switch
- * between direct video buffer ouput and GDI windowed
- * output.
- * ARGUMENTS
- * Client hands us a CSRSS_CONSOLE_HARDWARE_STATE
- * object. We use the same object to Request.
- * NOTE
- * ConsoleHwState has the correct size to be compatible
- * with NT's, but values are not.
- */
-static NTSTATUS FASTCALL
-SetConsoleHardwareState (PCSRSS_CONSOLE Console, DWORD ConsoleHwState)
-{
- DPRINT1("Console Hardware State: %d\n", ConsoleHwState);
-
- if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState)
- ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState))
- {
- if (Console->HardwareState != ConsoleHwState)
- {
- /* TODO: implement switching from full screen to windowed mode */
- /* TODO: or back; now simply store the hardware state */
- Console->HardwareState = ConsoleHwState;
- }
-
- return STATUS_SUCCESS;
- }
-
- return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */
-}
-
-CSR_API(CsrHardwareStateProperty)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrHardwareStateProperty\n");
-
- Status = ConioLockConsole(ProcessData,
- Request->Data.ConsoleHardwareStateRequest.ConsoleHandle,
- &Console,
- GENERIC_READ);
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Failed to get console handle in SetConsoleHardwareState\n");
- return Status;
- }
-
- switch (Request->Data.ConsoleHardwareStateRequest.SetGet)
- {
- case CONSOLE_HARDWARE_STATE_GET:
- Request->Data.ConsoleHardwareStateRequest.State = Console->HardwareState;
- break;
-
- case CONSOLE_HARDWARE_STATE_SET:
- DPRINT("Setting console hardware state.\n");
- Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State);
- break;
-
- default:
- Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */
- break;
- }
-
- ConioUnlockConsole(Console);
-
- return Status;
-}
-
-CSR_API(CsrGetConsoleWindow)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrGetConsoleWindow\n");
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- Request->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow;
- ConioUnlockConsole(Console);
-
- return STATUS_SUCCESS;
-}
-
-CSR_API(CsrSetConsoleIcon)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrSetConsoleIcon\n");
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon)
- ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
- ConioUnlockConsole(Console);
-
- return Status;
-}
-
-CSR_API(CsrGetConsoleCodePage)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrGetConsoleCodePage\n");
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- Request->Data.GetConsoleCodePage.CodePage = Console->CodePage;
- ConioUnlockConsole(Console);
- return STATUS_SUCCESS;
-}
-
-CSR_API(CsrSetConsoleCodePage)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrSetConsoleCodePage\n");
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- if (IsValidCodePage(Request->Data.SetConsoleCodePage.CodePage))
- {
- Console->CodePage = Request->Data.SetConsoleCodePage.CodePage;
- ConioUnlockConsole(Console);
- return STATUS_SUCCESS;
- }
-
- ConioUnlockConsole(Console);
- return STATUS_INVALID_PARAMETER;
-}
-
-CSR_API(CsrGetConsoleOutputCodePage)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrGetConsoleOutputCodePage\n");
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- Request->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage;
- ConioUnlockConsole(Console);
- return STATUS_SUCCESS;
-}
-
-CSR_API(CsrSetConsoleOutputCodePage)
-{
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrSetConsoleOutputCodePage\n");
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- if (IsValidCodePage(Request->Data.SetConsoleOutputCodePage.CodePage))
- {
- Console->OutputCodePage = Request->Data.SetConsoleOutputCodePage.CodePage;
- ConioUnlockConsole(Console);
- return STATUS_SUCCESS;
- }
-
- ConioUnlockConsole(Console);
- return STATUS_INVALID_PARAMETER;
-}
-
-CSR_API(CsrGetProcessList)
-{
- PDWORD Buffer;
- PCSRSS_CONSOLE Console;
- PCSR_PROCESS current;
- PLIST_ENTRY current_entry;
- ULONG nItems = 0;
- NTSTATUS Status;
-
- DPRINT("CsrGetProcessList\n");
-
- Buffer = Request->Data.GetProcessListRequest.ProcessId;
- if (!Win32CsrValidateBuffer(ProcessData, Buffer, Request->Data.GetProcessListRequest.nMaxIds, sizeof(DWORD)))
- return STATUS_ACCESS_VIOLATION;
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- for (current_entry = Console->ProcessList.Flink;
- current_entry != &Console->ProcessList;
- current_entry = current_entry->Flink)
- {
- current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink);
- if (++nItems <= Request->Data.GetProcessListRequest.nMaxIds)
- {
- *Buffer++ = HandleToUlong(current->ClientId.UniqueProcess);
- }
- }
-
- ConioUnlockConsole(Console);
-
- Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
- return STATUS_SUCCESS;
-}
-
-CSR_API(CsrGenerateCtrlEvent)
-{
- PCSRSS_CONSOLE Console;
- PCSR_PROCESS current;
- PLIST_ENTRY current_entry;
- DWORD Group;
- NTSTATUS Status;
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
-
- Group = Request->Data.GenerateCtrlEvent.ProcessGroup;
- Status = STATUS_INVALID_PARAMETER;
- for (current_entry = Console->ProcessList.Flink;
- current_entry != &Console->ProcessList;
- current_entry = current_entry->Flink)
- {
- current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink);
- if (Group == 0 || current->ProcessGroupId == Group)
- {
- ConioConsoleCtrlEvent(Request->Data.GenerateCtrlEvent.Event, current);
- Status = STATUS_SUCCESS;
- }
- }
-
- ConioUnlockConsole(Console);
-
- return Status;
-}
-
-CSR_API(CsrGetConsoleSelectionInfo)
-{
- NTSTATUS Status;
- PCSRSS_CONSOLE Console;
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (NT_SUCCESS(Status))
- {
- memset(&Request->Data.GetConsoleSelectionInfo.Info, 0, sizeof(CONSOLE_SELECTION_INFO));
- if (Console->Selection.dwFlags != 0)
- Request->Data.GetConsoleSelectionInfo.Info = Console->Selection;
- ConioUnlockConsole(Console);
- }
- return Status;
-}
-
-/* EOF */