- NTSTATUS Status;
- SECURITY_ATTRIBUTES SecurityAttributes;
- PCSRSS_SCREEN_BUFFER NewBuffer;
- BOOL GuiMode;
-
- Console->Title.MaximumLength = Console->Title.Length = 0;
- Console->Title.Buffer = NULL;
-
- //FIXME
- RtlCreateUnicodeString(&Console->Title, L"Command Prompt");
-
- Console->ReferenceCount = 0;
- Console->WaitingChars = 0;
- Console->WaitingLines = 0;
- Console->EchoCount = 0;
- Console->Header.Type = CONIO_CONSOLE_MAGIC;
- Console->Header.Console = Console;
- Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT;
- Console->EarlyReturn = FALSE;
- InitializeListHead(&Console->BufferList);
- Console->ActiveBuffer = NULL;
- InitializeListHead(&Console->InputEvents);
- 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))
+ NTSTATUS Status;
+ SECURITY_ATTRIBUTES SecurityAttributes;
+ PCSRSS_SCREEN_BUFFER NewBuffer;
+ BOOL GuiMode;
+
+ Console->Title.MaximumLength = Console->Title.Length = 0;
+ Console->Title.Buffer = NULL;
+
+ //FIXME
+ RtlCreateUnicodeString(&Console->Title, L"Command Prompt");
+
+ Console->ReferenceCount = 0;
+ Console->WaitingChars = 0;
+ Console->WaitingLines = 0;
+ Console->EchoCount = 0;
+ Console->Header.Type = CONIO_CONSOLE_MAGIC;
+ Console->Header.Console = Console;
+ Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT;
+ Console->EarlyReturn = FALSE;
+ InitializeListHead(&Console->BufferList);
+ Console->ActiveBuffer = NULL;
+ InitializeListHead(&Console->InputEvents);
+ 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))
- PLIST_ENTRY CurrentEntry;
- ConsoleInput *Input;
- PUCHAR Buffer;
- PWCHAR UnicodeBuffer;
- ULONG i;
- ULONG nNumberOfCharsToRead, CharSize;
- PCSRSS_CONSOLE Console;
- NTSTATUS Status;
-
- DPRINT("CsrReadConsole\n");
-
- CharSize = (Request->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
-
- /* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */
- nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
- Buffer = Request->Data.ReadConsoleRequest.Buffer;
- UnicodeBuffer = (PWCHAR)Buffer;
- Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle,
- &Console, GENERIC_READ);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
- Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent;
- for (i = 0; i < nNumberOfCharsToRead && Console->InputEvents.Flink != &Console->InputEvents; i++)
- {
- /* remove input event from queue */
- CurrentEntry = RemoveHeadList(&Console->InputEvents);
- if (IsListEmpty(&Console->InputEvents))
- {
- ResetEvent(Console->ActiveEvent);
- }
- Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
-
- /* only pay attention to valid ascii chars, on key down */
- if (KEY_EVENT == Input->InputEvent.EventType
- && Input->InputEvent.Event.KeyEvent.bKeyDown
- && Input->InputEvent.Event.KeyEvent.uChar.AsciiChar != '\0')
- {
- /*
- * backspace handling - if we are in charge of echoing it then we handle it here
- * otherwise we treat it like a normal char.
- */
- if ('\b' == Input->InputEvent.Event.KeyEvent.uChar.AsciiChar && 0
- != (Console->Mode & ENABLE_ECHO_INPUT))
+ PLIST_ENTRY CurrentEntry;
+ ConsoleInput *Input;
+ PUCHAR Buffer;
+ PWCHAR UnicodeBuffer;
+ ULONG i;
+ ULONG nNumberOfCharsToRead, CharSize;
+ PCSRSS_CONSOLE Console;
+ NTSTATUS Status;
+
+ DPRINT("CsrReadConsole\n");
+
+ CharSize = (Request->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
+
+ /* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */
+ nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
+ Buffer = Request->Data.ReadConsoleRequest.Buffer;
+ UnicodeBuffer = (PWCHAR)Buffer;
+ Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle,
+ &Console, GENERIC_READ);
+ if (! NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent;
+ for (i = 0; i < nNumberOfCharsToRead && Console->InputEvents.Flink != &Console->InputEvents; i++)
+ {
+ /* remove input event from queue */
+ CurrentEntry = RemoveHeadList(&Console->InputEvents);
+ if (IsListEmpty(&Console->InputEvents))
+ {
+ ResetEvent(Console->ActiveEvent);
+ }
+ Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
+
+ /* only pay attention to valid ascii chars, on key down */
+ if (KEY_EVENT == Input->InputEvent.EventType
+ && Input->InputEvent.Event.KeyEvent.bKeyDown
+ && Input->InputEvent.Event.KeyEvent.uChar.AsciiChar != '\0')
+ {
+ /*
+ * backspace handling - if we are in charge of echoing it then we handle it here
+ * otherwise we treat it like a normal char.
+ */
+ if ('\b' == Input->InputEvent.Event.KeyEvent.uChar.AsciiChar && 0
+ != (Console->Mode & ENABLE_ECHO_INPUT))
- else
- { /* otherwise, return STATUS_NOTIFY_CLEANUP to tell client to back up its buffer */
- Console->WaitingChars--;
- ConioUnlockConsole(Console);
- HeapFree(Win32CsrApiHeap, 0, Input);
- Request->Data.ReadConsoleRequest.NrCharactersRead = 0;
- return STATUS_NOTIFY_CLEANUP;
+ else
+ {
+ /* otherwise, return STATUS_NOTIFY_CLEANUP to tell client to back up its buffer */
+ Console->WaitingChars--;
+ ConioUnlockConsole(Console);
+ HeapFree(Win32CsrApiHeap, 0, Input);
+ Request->Data.ReadConsoleRequest.NrCharactersRead = 0;
+ return STATUS_NOTIFY_CLEANUP;
- SMALL_RECT *Intersection,
- SMALL_RECT *Rect1,
- SMALL_RECT *Rect2)
-{
- if (ConioIsRectEmpty(Rect1) ||
- (ConioIsRectEmpty(Rect2)) ||
- (Rect1->Top > Rect2->Bottom) ||
- (Rect1->Left > Rect2->Right) ||
- (Rect1->Bottom < Rect2->Top) ||
- (Rect1->Right < Rect2->Left))
- {
- /* The rectangles do not intersect */
- ConioInitRect(Intersection, 0, -1, 0, -1);
- return FALSE;
- }
-
- ConioInitRect(Intersection,
- max(Rect1->Top, Rect2->Top),
- max(Rect1->Left, Rect2->Left),
- min(Rect1->Bottom, Rect2->Bottom),
- min(Rect1->Right, Rect2->Right));
-
- return TRUE;
+ SMALL_RECT *Intersection,
+ SMALL_RECT *Rect1,
+ SMALL_RECT *Rect2)
+{
+ if (ConioIsRectEmpty(Rect1) ||
+ (ConioIsRectEmpty(Rect2)) ||
+ (Rect1->Top > Rect2->Bottom) ||
+ (Rect1->Left > Rect2->Right) ||
+ (Rect1->Bottom < Rect2->Top) ||
+ (Rect1->Right < Rect2->Left))
+ {
+ /* The rectangles do not intersect */
+ ConioInitRect(Intersection, 0, -1, 0, -1);
+ return FALSE;
+ }
+
+ ConioInitRect(Intersection,
+ max(Rect1->Top, Rect2->Top),
+ max(Rect1->Left, Rect2->Left),
+ min(Rect1->Bottom, Rect2->Bottom),
+ min(Rect1->Right, Rect2->Right));
+
+ return TRUE;
- /* add event to the queue */
- InsertTailList(&Console->InputEvents, &KeyEventRecord->ListEntry);
- Console->WaitingChars++;
- /* if line input mode is enabled, only wake the client on enter key down */
- if (0 == (Console->Mode & ENABLE_LINE_INPUT)
- || Console->EarlyReturn
- || ('\n' == KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar
- && KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown))
+ /* add event to the queue */
+ InsertTailList(&Console->InputEvents, &KeyEventRecord->ListEntry);
+ Console->WaitingChars++;
+ /* if line input mode is enabled, only wake the client on enter key down */
+ if (0 == (Console->Mode & ENABLE_LINE_INPUT)
+ || Console->EarlyReturn
+ || ('\n' == KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar
+ && KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown))
- /* walk the input queue looking for a char to backspace */
- for (TempInput = (ConsoleInput *) Console->InputEvents.Blink;
- TempInput != (ConsoleInput *) &Console->InputEvents
- && (KEY_EVENT == TempInput->InputEvent.EventType
- || ! TempInput->InputEvent.Event.KeyEvent.bKeyDown
- || '\b' == TempInput->InputEvent.Event.KeyEvent.uChar.AsciiChar);
- TempInput = (ConsoleInput *) TempInput->ListEntry.Blink)
+ /* walk the input queue looking for a char to backspace */
+ for (TempInput = (ConsoleInput *) Console->InputEvents.Blink;
+ TempInput != (ConsoleInput *) &Console->InputEvents
+ && (KEY_EVENT == TempInput->InputEvent.EventType
+ || ! TempInput->InputEvent.Event.KeyEvent.bKeyDown
+ || '\b' == TempInput->InputEvent.Event.KeyEvent.uChar.AsciiChar);
+ TempInput = (ConsoleInput *) TempInput->ListEntry.Blink)
- static BYTE KeyState[256] = { 0 };
- /* MSDN mentions that you should use the last virtual key code received
- * when putting a virtual key identity to a WM_CHAR message since multiple
- * or translated keys may be involved. */
- static UINT LastVirtualKey = 0;
- DWORD ShiftState;
- ConsoleInput *ConInRec;
- UINT RepeatCount;
- CHAR AsciiChar;
- WCHAR UnicodeChar;
- UINT VirtualKeyCode;
- UINT VirtualScanCode;
- BOOL Down = FALSE;
- INPUT_RECORD er;
- ULONG ResultSize = 0;
-
- RepeatCount = 1;
- VirtualScanCode = (msg->lParam >> 16) & 0xff;
- Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR ||
- msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR;
-
- GetKeyboardState(KeyState);
- ShiftState = ConioGetShiftState(KeyState);
-
- if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR)
- {
- VirtualKeyCode = LastVirtualKey;
- UnicodeChar = msg->wParam;
+ static BYTE KeyState[256] = { 0 };
+ /* MSDN mentions that you should use the last virtual key code received
+ * when putting a virtual key identity to a WM_CHAR message since multiple
+ * or translated keys may be involved. */
+ static UINT LastVirtualKey = 0;
+ DWORD ShiftState;
+ ConsoleInput *ConInRec;
+ UINT RepeatCount;
+ CHAR AsciiChar;
+ WCHAR UnicodeChar;
+ UINT VirtualKeyCode;
+ UINT VirtualScanCode;
+ BOOL Down = FALSE;
+ INPUT_RECORD er;
+ ULONG ResultSize = 0;
+
+ RepeatCount = 1;
+ VirtualScanCode = (msg->lParam >> 16) & 0xff;
+ Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR ||
+ msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR;
+
+ GetKeyboardState(KeyState);
+ ShiftState = ConioGetShiftState(KeyState);
+
+ if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR)
+ {
+ VirtualKeyCode = LastVirtualKey;
+ UnicodeChar = msg->wParam;
- PCSRSS_PROCESS_DATA current;
- PLIST_ENTRY current_entry;
- DPRINT1("Console_Api Ctrl-C\n");
- current_entry = Console->ProcessList.Flink;
- while (current_entry != &Console->ProcessList)
- {
- current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry);
- current_entry = current_entry->Flink;
- ConioConsoleCtrlEvent((DWORD)CTRL_C_EVENT, current);
- }
- HeapFree(Win32CsrApiHeap, 0, ConInRec);
- return;
+ PCSRSS_PROCESS_DATA current;
+ PLIST_ENTRY current_entry;
+ DPRINT1("Console_Api Ctrl-C\n");
+ current_entry = Console->ProcessList.Flink;
+ while (current_entry != &Console->ProcessList)
+ {
+ current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry);
+ current_entry = current_entry->Flink;
+ ConioConsoleCtrlEvent((DWORD)CTRL_C_EVENT, current);
+ }
+ HeapFree(Win32CsrApiHeap, 0, ConInRec);
+ return;
- Console = Buff->Header.Console;
- pInfo = &Request->Data.ScreenBufferInfoRequest.Info;
- pInfo->dwSize.X = Buff->MaxX;
- pInfo->dwSize.Y = Buff->MaxY;
- pInfo->dwCursorPosition.X = Buff->CurrentX;
- pInfo->dwCursorPosition.Y = Buff->CurrentY;
- pInfo->wAttributes = Buff->DefaultAttrib;
- pInfo->srWindow.Left = Buff->ShowX;
- pInfo->srWindow.Right = Buff->ShowX + Console->Size.X - 1;
- pInfo->srWindow.Top = Buff->ShowY;
- pInfo->srWindow.Bottom = Buff->ShowY + Console->Size.Y - 1;
- pInfo->dwMaximumWindowSize.X = Buff->MaxX;
- pInfo->dwMaximumWindowSize.Y = Buff->MaxY;
- ConioUnlockScreenBuffer(Buff);
-
- return STATUS_SUCCESS;
+ Console = Buff->Header.Console;
+ pInfo = &Request->Data.ScreenBufferInfoRequest.Info;
+ pInfo->dwSize.X = Buff->MaxX;
+ pInfo->dwSize.Y = Buff->MaxY;
+ pInfo->dwCursorPosition.X = Buff->CurrentX;
+ pInfo->dwCursorPosition.Y = Buff->CurrentY;
+ pInfo->wAttributes = Buff->DefaultAttrib;
+ pInfo->srWindow.Left = Buff->ShowX;
+ pInfo->srWindow.Right = Buff->ShowX + Console->Size.X - 1;
+ pInfo->srWindow.Top = Buff->ShowY;
+ pInfo->srWindow.Bottom = Buff->ShowY + Console->Size.Y - 1;
+ pInfo->dwMaximumWindowSize.X = Buff->MaxX;
+ pInfo->dwMaximumWindowSize.Y = Buff->MaxY;
+ ConioUnlockScreenBuffer(Buff);
+
+ return STATUS_SUCCESS;
- NTSTATUS Status;
- PCHAR String, tmpString = NULL;
- PBYTE Buffer;
- PCSRSS_CONSOLE Console;
- PCSRSS_SCREEN_BUFFER Buff;
- DWORD X, Y, Length, CharSize, Written = 0;
- SMALL_RECT UpdateRect;
-
- DPRINT("CsrWriteConsoleOutputChar\n");
-
- CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
-
- if (Request->Header.u1.s1.TotalLength
- < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
- + (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize))
- {
- DPRINT1("Invalid request size\n");
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
- return STATUS_INVALID_PARAMETER;
- }
-
- Status = ConioLockScreenBuffer(ProcessData,
- Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle,
- &Buff,
- GENERIC_WRITE);
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
- if (NT_SUCCESS(Status))
- {
- Console = Buff->Header.Console;
- if(Request->Data.WriteConsoleOutputCharRequest.Unicode)
- {
- Length = WideCharToMultiByte(Console->OutputCodePage, 0,
- (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String,
- Request->Data.WriteConsoleOutputCharRequest.Length,
- NULL, 0, NULL, NULL);
- tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length);
- if (String)
+ NTSTATUS Status;
+ PCHAR String, tmpString = NULL;
+ PBYTE Buffer;
+ PCSRSS_CONSOLE Console;
+ PCSRSS_SCREEN_BUFFER Buff;
+ DWORD X, Y, Length, CharSize, Written = 0;
+ SMALL_RECT UpdateRect;
+
+ DPRINT("CsrWriteConsoleOutputChar\n");
+
+ CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
+
+ if (Request->Header.u1.s1.TotalLength
+ < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
+ + (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize))
+ {
+ DPRINT1("Invalid request size\n");
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ Status = ConioLockScreenBuffer(ProcessData,
+ Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle,
+ &Buff,
+ GENERIC_WRITE);
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ if (NT_SUCCESS(Status))
+ {
+ Console = Buff->Header.Console;
+ if(Request->Data.WriteConsoleOutputCharRequest.Unicode)
+ {
+ Length = WideCharToMultiByte(Console->OutputCodePage, 0,
+ (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String,
+ Request->Data.WriteConsoleOutputCharRequest.Length,
+ NULL, 0, NULL, NULL);
+ tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length);
+ if (String)
- X = Request->Data.FillOutputRequest.Position.X;
- Y = (Request->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY;
- Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
- if(Request->Data.FillOutputRequest.Unicode)
- ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar);
- else
- Char = Request->Data.FillOutputRequest.Char.AsciiChar;
- Length = Request->Data.FillOutputRequest.Length;
- while (Length--)
- {
- *Buffer = Char;
- Buffer += 2;
- Written++;
- if (++X == Buff->MaxX)
- {
- if (++Y == Buff->MaxY)
+ X = Request->Data.FillOutputRequest.Position.X;
+ Y = (Request->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY;
+ Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
+ if(Request->Data.FillOutputRequest.Unicode)
+ ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar);
+ else
+ Char = Request->Data.FillOutputRequest.Char.AsciiChar;
+ Length = Request->Data.FillOutputRequest.Length;
+ while (Length--)
+ {
+ *Buffer = Char;
+ Buffer += 2;
+ Written++;
+ if (++X == Buff->MaxX)
+ {
+ if (++Y == Buff->MaxY)
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
- Status = Win32CsrLockObject(ProcessData,
- Request->Data.SetConsoleModeRequest.ConsoleHandle,
- (Object_t **) &Console, GENERIC_WRITE, 0);
- if (! NT_SUCCESS(Status))
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ Status = Win32CsrLockObject(ProcessData,
+ Request->Data.SetConsoleModeRequest.ConsoleHandle,
+ (Object_t **) &Console, GENERIC_WRITE, 0);
+ if (! NT_SUCCESS(Status))
- /* Copy title of the console to the user title buffer */
- RtlZeroMemory(&Request->Data.GetTitleRequest, sizeof(CSRSS_GET_TITLE));
- Request->Data.GetTitleRequest.Length = Console->Title.Length;
- memcpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer,
- Console->Title.Length);
- Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + Console->Title.Length;
+ /* Copy title of the console to the user title buffer */
+ RtlZeroMemory(&Request->Data.GetTitleRequest, sizeof(CSRSS_GET_TITLE));
+ Request->Data.GetTitleRequest.Length = Console->Title.Length;
+ memcpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer,
+ Console->Title.Length);
+ Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + Console->Title.Length;
- SHORT i, X, Y, SizeX, SizeY;
- PCSRSS_CONSOLE Console;
- PCSRSS_SCREEN_BUFFER Buff;
- SMALL_RECT ScreenBuffer;
- CHAR_INFO* CurCharInfo;
- SMALL_RECT WriteRegion;
- CHAR_INFO* CharInfo;
- COORD BufferCoord;
- COORD BufferSize;
- NTSTATUS Status;
- PBYTE Ptr;
- DWORD PSize;
-
- DPRINT("CsrWriteConsoleOutput\n");
-
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
- Status = ConioLockScreenBuffer(ProcessData,
- Request->Data.WriteConsoleOutputRequest.ConsoleHandle,
- &Buff,
- GENERIC_WRITE);
- if (! NT_SUCCESS(Status))
- {
- return Status;
+ SHORT i, X, Y, SizeX, SizeY;
+ PCSRSS_CONSOLE Console;
+ PCSRSS_SCREEN_BUFFER Buff;
+ SMALL_RECT ScreenBuffer;
+ CHAR_INFO* CurCharInfo;
+ SMALL_RECT WriteRegion;
+ CHAR_INFO* CharInfo;
+ COORD BufferCoord;
+ COORD BufferSize;
+ NTSTATUS Status;
+ PBYTE Ptr;
+ DWORD PSize;
+
+ DPRINT("CsrWriteConsoleOutput\n");
+
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ Status = ConioLockScreenBuffer(ProcessData,
+ Request->Data.WriteConsoleOutputRequest.ConsoleHandle,
+ &Buff,
+ GENERIC_WRITE);
+ if (! NT_SUCCESS(Status))
+ {
+ return Status;
- BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize;
- PSize = BufferSize.X * BufferSize.Y * sizeof(CHAR_INFO);
- BufferCoord = Request->Data.WriteConsoleOutputRequest.BufferCoord;
- CharInfo = Request->Data.WriteConsoleOutputRequest.CharInfo;
- if (((PVOID)CharInfo < ProcessData->CsrSectionViewBase) ||
- (((ULONG_PTR)CharInfo + PSize) >
- ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
+ BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize;
+ PSize = BufferSize.X * BufferSize.Y * sizeof(CHAR_INFO);
+ BufferCoord = Request->Data.WriteConsoleOutputRequest.BufferCoord;
+ CharInfo = Request->Data.WriteConsoleOutputRequest.CharInfo;
+ if (((PVOID)CharInfo < ProcessData->CsrSectionViewBase) ||
+ (((ULONG_PTR)CharInfo + PSize) >
+ ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
- PCSRSS_CONSOLE Console;
- PCSRSS_SCREEN_BUFFER Buff;
- SMALL_RECT ScreenBuffer;
- SMALL_RECT SrcRegion;
- SMALL_RECT DstRegion;
- SMALL_RECT UpdateRegion;
- SMALL_RECT ScrollRectangle;
- SMALL_RECT ClipRectangle;
- NTSTATUS Status;
- HANDLE ConsoleHandle;
- BOOLEAN UseClipRectangle;
- COORD DestinationOrigin;
- CHAR_INFO Fill;
- CHAR FillChar;
-
- DPRINT("CsrScrollConsoleScreenBuffer\n");
-
- ConsoleHandle = Request->Data.ScrollConsoleScreenBufferRequest.ConsoleHandle;
- UseClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.UseClipRectangle;
- DestinationOrigin = Request->Data.ScrollConsoleScreenBufferRequest.DestinationOrigin;
- Fill = Request->Data.ScrollConsoleScreenBufferRequest.Fill;
-
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
- Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff, GENERIC_WRITE);
- if (! NT_SUCCESS(Status))
- {
- return Status;
+ PCSRSS_CONSOLE Console;
+ PCSRSS_SCREEN_BUFFER Buff;
+ SMALL_RECT ScreenBuffer;
+ SMALL_RECT SrcRegion;
+ SMALL_RECT DstRegion;
+ SMALL_RECT UpdateRegion;
+ SMALL_RECT ScrollRectangle;
+ SMALL_RECT ClipRectangle;
+ NTSTATUS Status;
+ HANDLE ConsoleHandle;
+ BOOLEAN UseClipRectangle;
+ COORD DestinationOrigin;
+ CHAR_INFO Fill;
+ CHAR FillChar;
+
+ DPRINT("CsrScrollConsoleScreenBuffer\n");
+
+ ConsoleHandle = Request->Data.ScrollConsoleScreenBufferRequest.ConsoleHandle;
+ UseClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.UseClipRectangle;
+ DestinationOrigin = Request->Data.ScrollConsoleScreenBufferRequest.DestinationOrigin;
+ Fill = Request->Data.ScrollConsoleScreenBufferRequest.Fill;
+
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff, GENERIC_WRITE);
+ if (! NT_SUCCESS(Status))
+ {
+ return Status;
- PDWORD Buffer;
- PCSRSS_CONSOLE Console;
- PCSRSS_PROCESS_DATA current;
- PLIST_ENTRY current_entry;
- ULONG nItems = 0;
- NTSTATUS Status;
- ULONG_PTR Offset;
-
- DPRINT("CsrGetProcessList\n");
-
- Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
- Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
- Buffer = Request->Data.GetProcessListRequest.ProcessId;
- Offset = (PBYTE)Buffer - (PBYTE)ProcessData->CsrSectionViewBase;
- if (Offset >= ProcessData->CsrSectionViewSize
- || (Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)) > (ProcessData->CsrSectionViewSize - Offset)
- || Offset & (sizeof(DWORD) - 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-
- Status = ConioConsoleFromProcessData(ProcessData, &Console);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
+ PDWORD Buffer;
+ PCSRSS_CONSOLE Console;
+ PCSRSS_PROCESS_DATA current;
+ PLIST_ENTRY current_entry;
+ ULONG nItems = 0;
+ NTSTATUS Status;
+ ULONG_PTR Offset;
+
+ DPRINT("CsrGetProcessList\n");
+
+ Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+ Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);