mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 23:12:56 +00:00
[CONSRV]
Move some output functions to the future console driver (i.e. for the moment, CSR console server functions SrvConsole* call ConDrv* functions). Don't worry, internal headers will be rearranged, so that: <ConDrv***_function_prototype>(...); CSR_API(SrvConsole***) { ... } constructions will be avoided in the future. For now, just make everything working. svn path=/trunk/; revision=59308
This commit is contained in:
parent
f1638cd57e
commit
a9f7c466c3
4 changed files with 358 additions and 223 deletions
|
@ -19,6 +19,7 @@ list(APPEND SOURCE
|
||||||
init.c
|
init.c
|
||||||
lineinput.c
|
lineinput.c
|
||||||
settings.c
|
settings.c
|
||||||
|
condrv/conoutput.c
|
||||||
condrv/console.c
|
condrv/console.c
|
||||||
condrv/graphics.c
|
condrv/graphics.c
|
||||||
frontends/input.c
|
frontends/input.c
|
||||||
|
|
287
reactos/win32ss/user/consrv/condrv/conoutput.c
Normal file
287
reactos/win32ss/user/consrv/condrv/conoutput.c
Normal file
|
@ -0,0 +1,287 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS Console Server DLL
|
||||||
|
* FILE: win32ss/user/consrv/condrv/conoutput.c
|
||||||
|
* PURPOSE: General Console Output Functions
|
||||||
|
* PROGRAMMERS: Jeffrey Morlan
|
||||||
|
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *******************************************************************/
|
||||||
|
|
||||||
|
#include "consrv.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "include/conio.h"
|
||||||
|
#include "conio.h"
|
||||||
|
#include "conoutput.h"
|
||||||
|
#include "handle.h"
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
||||||
|
IN OUT PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_BUFFER_INFO TextModeInfo);
|
||||||
|
NTSTATUS
|
||||||
|
GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
||||||
|
IN OUT PCONSOLE Console,
|
||||||
|
IN PGRAPHICS_BUFFER_INFO GraphicsInfo);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
TEXTMODE_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
|
VOID
|
||||||
|
GRAPHICS_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
||||||
|
IN OUT PCONSOLE Console,
|
||||||
|
IN SIZE_T Size)
|
||||||
|
{
|
||||||
|
if (Buffer == NULL || Console == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
*Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY, max(sizeof(CONSOLE_SCREEN_BUFFER), Size));
|
||||||
|
if (*Buffer == NULL) return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* Initialize the header with the default type */
|
||||||
|
ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console);
|
||||||
|
(*Buffer)->Vtbl = NULL;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
|
||||||
|
{
|
||||||
|
if (Buffer->Header.Type == TEXTMODE_BUFFER)
|
||||||
|
TEXTMODE_BUFFER_Destroy(Buffer);
|
||||||
|
else if (Buffer->Header.Type == GRAPHICS_BUFFER)
|
||||||
|
GRAPHICS_BUFFER_Destroy(Buffer);
|
||||||
|
else if (Buffer->Header.Type == SCREEN_BUFFER)
|
||||||
|
ConsoleFreeHeap(Buffer);
|
||||||
|
// else
|
||||||
|
// do_nothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConDrvCreateConsoleScreenBuffer
|
||||||
|
NTSTATUS FASTCALL
|
||||||
|
ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
||||||
|
IN OUT PCONSOLE Console,
|
||||||
|
IN ULONG BufferType,
|
||||||
|
IN PVOID ScreenBufferInfo)
|
||||||
|
{
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
if ( Console == NULL || Buffer == NULL ||
|
||||||
|
(BufferType != CONSOLE_TEXTMODE_BUFFER && BufferType != CONSOLE_GRAPHICS_BUFFER) )
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BufferType == CONSOLE_TEXTMODE_BUFFER)
|
||||||
|
{
|
||||||
|
Status = TEXTMODE_BUFFER_Initialize(Buffer,
|
||||||
|
Console,
|
||||||
|
(PTEXTMODE_BUFFER_INFO)ScreenBufferInfo);
|
||||||
|
}
|
||||||
|
else if (BufferType == CONSOLE_GRAPHICS_BUFFER)
|
||||||
|
{
|
||||||
|
Status = GRAPHICS_BUFFER_Initialize(Buffer,
|
||||||
|
Console,
|
||||||
|
(PGRAPHICS_BUFFER_INFO)ScreenBufferInfo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Never ever go there!! */
|
||||||
|
ASSERT(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Insert the newly created screen buffer into the list, if succeeded */
|
||||||
|
if (NT_SUCCESS(Status)) InsertHeadList(&Console->BufferList, &(*Buffer)->ListEntry);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
|
|
||||||
|
VOID WINAPI
|
||||||
|
ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
|
||||||
|
{
|
||||||
|
PCONSOLE Console = Buffer->Header.Console;
|
||||||
|
PCONSOLE_SCREEN_BUFFER NewBuffer;
|
||||||
|
|
||||||
|
RemoveEntryList(&Buffer->ListEntry);
|
||||||
|
if (Buffer == Console->ActiveBuffer)
|
||||||
|
{
|
||||||
|
/* Delete active buffer; switch to most recently created */
|
||||||
|
Console->ActiveBuffer = NULL;
|
||||||
|
if (!IsListEmpty(&Console->BufferList))
|
||||||
|
{
|
||||||
|
NewBuffer = CONTAINING_RECORD(Console->BufferList.Flink,
|
||||||
|
CONSOLE_SCREEN_BUFFER,
|
||||||
|
ListEntry);
|
||||||
|
ConioSetActiveScreenBuffer(NewBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CONSOLE_SCREEN_BUFFER_Destroy(Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID FASTCALL
|
||||||
|
ConioDrawConsole(PCONSOLE Console)
|
||||||
|
{
|
||||||
|
SMALL_RECT Region;
|
||||||
|
PCONSOLE_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
|
||||||
|
|
||||||
|
if (ActiveBuffer)
|
||||||
|
{
|
||||||
|
ConioInitRect(&Region, 0, 0, ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1);
|
||||||
|
ConioDrawRegion(Console, &Region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
|
||||||
|
{
|
||||||
|
PCONSOLE Console = Buffer->Header.Console;
|
||||||
|
Console->ActiveBuffer = Buffer;
|
||||||
|
ConioResizeTerminal(Console);
|
||||||
|
// ConioDrawConsole(Console);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console,
|
||||||
|
IN PCONSOLE_SCREEN_BUFFER Buffer)
|
||||||
|
{
|
||||||
|
if (Console == NULL || Buffer == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
if (Buffer == Console->ActiveBuffer) return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* If old buffer has no handles, it's now unreferenced */
|
||||||
|
if (Console->ActiveBuffer->Header.HandleCount == 0)
|
||||||
|
{
|
||||||
|
ConioDeleteScreenBuffer(Console->ActiveBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tie console to new buffer */
|
||||||
|
ConioSetActiveScreenBuffer(Buffer);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
PCONSOLE_SCREEN_BUFFER
|
||||||
|
ConDrvGetActiveScreenBuffer(IN PCONSOLE Console)
|
||||||
|
{
|
||||||
|
return (Console ? Console->ActiveBuffer : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvInvalidateBitMapRect(IN PCONSOLE Console,
|
||||||
|
IN PCONSOLE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PSMALL_RECT Region)
|
||||||
|
{
|
||||||
|
if (Console == NULL || Buffer == NULL || Region == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
/* If the output buffer is the current one, redraw the correct portion of the screen */
|
||||||
|
if (Buffer == Console->ActiveBuffer) ConioDrawRegion(Console, Region);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvGetConsoleCursorInfo(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
OUT PCONSOLE_CURSOR_INFO CursorInfo)
|
||||||
|
{
|
||||||
|
if (Console == NULL || Buffer == NULL || CursorInfo == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
*CursorInfo = Buffer->CursorInfo;
|
||||||
|
// CursorInfo->bVisible = Buffer->CursorInfo.bVisible;
|
||||||
|
// CursorInfo->dwSize = Buffer->CursorInfo.dwSize;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleCursorInfo(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PCONSOLE_CURSOR_INFO CursorInfo)
|
||||||
|
{
|
||||||
|
ULONG Size;
|
||||||
|
BOOL Visible, Success = TRUE;
|
||||||
|
|
||||||
|
if (Console == NULL || Buffer == NULL || CursorInfo == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Size = min(max(CursorInfo->dwSize, 1), 100);
|
||||||
|
Visible = CursorInfo->bVisible;
|
||||||
|
|
||||||
|
if ( (Size != Buffer->CursorInfo.dwSize) ||
|
||||||
|
(Visible && !Buffer->CursorInfo.bVisible) ||
|
||||||
|
(!Visible && Buffer->CursorInfo.bVisible) )
|
||||||
|
{
|
||||||
|
Buffer->CursorInfo.dwSize = Size;
|
||||||
|
Buffer->CursorInfo.bVisible = Visible;
|
||||||
|
|
||||||
|
Success = ConioSetCursorInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleCursorPosition(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PCOORD Position)
|
||||||
|
{
|
||||||
|
SHORT OldCursorX, OldCursorY;
|
||||||
|
|
||||||
|
if (Console == NULL || Buffer == NULL || Position == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
if ( Position->X < 0 || Position->X >= Buffer->ScreenBufferSize.X ||
|
||||||
|
Position->Y < 0 || Position->Y >= Buffer->ScreenBufferSize.Y )
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
OldCursorX = Buffer->CursorPosition.X;
|
||||||
|
OldCursorY = Buffer->CursorPosition.Y;
|
||||||
|
Buffer->CursorPosition = *Position;
|
||||||
|
// Buffer->CursorPosition.X = Position->X;
|
||||||
|
// Buffer->CursorPosition.Y = Position->Y;
|
||||||
|
if ( ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer) &&
|
||||||
|
(!ConioSetScreenInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer, OldCursorX, OldCursorY)) )
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -22,256 +22,106 @@
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
|
||||||
IN OUT PCONSOLE Console,
|
|
||||||
IN PTEXTMODE_BUFFER_INFO TextModeInfo);
|
|
||||||
NTSTATUS
|
|
||||||
GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
|
||||||
IN OUT PCONSOLE Console,
|
|
||||||
IN PGRAPHICS_BUFFER_INFO GraphicsInfo);
|
|
||||||
|
|
||||||
VOID
|
|
||||||
TEXTMODE_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
|
|
||||||
VOID
|
|
||||||
GRAPHICS_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
|
||||||
IN OUT PCONSOLE Console,
|
|
||||||
IN SIZE_T Size)
|
|
||||||
{
|
|
||||||
if (Buffer == NULL || Console == NULL)
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
*Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY, max(sizeof(CONSOLE_SCREEN_BUFFER), Size));
|
|
||||||
if (*Buffer == NULL) return STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
|
|
||||||
/* Initialize the header with the default type */
|
|
||||||
ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console);
|
|
||||||
(*Buffer)->Vtbl = NULL;
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
|
|
||||||
{
|
|
||||||
if (Buffer->Header.Type == TEXTMODE_BUFFER)
|
|
||||||
TEXTMODE_BUFFER_Destroy(Buffer);
|
|
||||||
else if (Buffer->Header.Type == GRAPHICS_BUFFER)
|
|
||||||
GRAPHICS_BUFFER_Destroy(Buffer);
|
|
||||||
else if (Buffer->Header.Type == SCREEN_BUFFER)
|
|
||||||
ConsoleFreeHeap(Buffer);
|
|
||||||
// else
|
|
||||||
// do_nothing;
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS FASTCALL
|
|
||||||
ConSrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
|
||||||
IN OUT PCONSOLE Console,
|
|
||||||
IN ULONG BufferType,
|
|
||||||
IN PVOID ScreenBufferInfo)
|
|
||||||
{
|
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
if ( Console == NULL || Buffer == NULL ||
|
|
||||||
(BufferType != CONSOLE_TEXTMODE_BUFFER && BufferType != CONSOLE_GRAPHICS_BUFFER) )
|
|
||||||
{
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BufferType == CONSOLE_TEXTMODE_BUFFER)
|
|
||||||
{
|
|
||||||
Status = TEXTMODE_BUFFER_Initialize(Buffer,
|
|
||||||
Console,
|
|
||||||
(PTEXTMODE_BUFFER_INFO)ScreenBufferInfo);
|
|
||||||
}
|
|
||||||
else if (BufferType == CONSOLE_GRAPHICS_BUFFER)
|
|
||||||
{
|
|
||||||
Status = GRAPHICS_BUFFER_Initialize(Buffer,
|
|
||||||
Console,
|
|
||||||
(PGRAPHICS_BUFFER_INFO)ScreenBufferInfo);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Never ever go there!! */
|
|
||||||
ASSERT(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Insert the newly created screen buffer into the list, if succeeded */
|
|
||||||
if (NT_SUCCESS(Status)) InsertHeadList(&Console->BufferList, &(*Buffer)->ListEntry);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID WINAPI
|
|
||||||
ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
|
|
||||||
{
|
|
||||||
PCONSOLE Console = Buffer->Header.Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER NewBuffer;
|
|
||||||
|
|
||||||
RemoveEntryList(&Buffer->ListEntry);
|
|
||||||
if (Buffer == Console->ActiveBuffer)
|
|
||||||
{
|
|
||||||
/* Delete active buffer; switch to most recently created */
|
|
||||||
Console->ActiveBuffer = NULL;
|
|
||||||
if (!IsListEmpty(&Console->BufferList))
|
|
||||||
{
|
|
||||||
NewBuffer = CONTAINING_RECORD(Console->BufferList.Flink,
|
|
||||||
CONSOLE_SCREEN_BUFFER,
|
|
||||||
ListEntry);
|
|
||||||
ConioSetActiveScreenBuffer(NewBuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CONSOLE_SCREEN_BUFFER_Destroy(Buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID FASTCALL
|
|
||||||
ConioDrawConsole(PCONSOLE Console)
|
|
||||||
{
|
|
||||||
SMALL_RECT Region;
|
|
||||||
PCONSOLE_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
|
|
||||||
|
|
||||||
if (ActiveBuffer)
|
|
||||||
{
|
|
||||||
ConioInitRect(&Region, 0, 0, ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1);
|
|
||||||
ConioDrawRegion(Console, &Region);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID FASTCALL
|
|
||||||
ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
|
|
||||||
{
|
|
||||||
PCONSOLE Console = Buffer->Header.Console;
|
|
||||||
Console->ActiveBuffer = Buffer;
|
|
||||||
ConioResizeTerminal(Console);
|
|
||||||
// ConioDrawConsole(Console);
|
|
||||||
}
|
|
||||||
|
|
||||||
PCONSOLE_SCREEN_BUFFER
|
|
||||||
ConDrvGetActiveScreenBuffer(IN PCONSOLE Console)
|
|
||||||
{
|
|
||||||
return (Console ? Console->ActiveBuffer : NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PUBLIC SERVER APIS *********************************************************/
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvInvalidateBitMapRect(IN PCONSOLE Console,
|
||||||
|
IN PCONSOLE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PSMALL_RECT Region);
|
||||||
CSR_API(SrvInvalidateBitMapRect)
|
CSR_API(SrvInvalidateBitMapRect)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.InvalidateDIBitsRequest;
|
PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.InvalidateDIBitsRequest;
|
||||||
PCONSOLE Console;
|
PCONSOLE_SCREEN_BUFFER Buffer;
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
|
||||||
|
|
||||||
DPRINT("SrvInvalidateBitMapRect\n");
|
DPRINT("SrvInvalidateBitMapRect\n");
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), InvalidateDIBitsRequest->OutputHandle, &Buff, GENERIC_READ, TRUE);
|
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
InvalidateDIBitsRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
Status = ConDrvInvalidateBitMapRect(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
&InvalidateDIBitsRequest->Region);
|
||||||
|
|
||||||
/* If the output buffer is the current one, redraw the correct portion of the screen */
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
if (Buff == Console->ActiveBuffer)
|
return Status;
|
||||||
ConioDrawRegion(Console, &InvalidateDIBitsRequest->Region);
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvGetConsoleCursorInfo(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
OUT PCONSOLE_CURSOR_INFO CursorInfo);
|
||||||
CSR_API(SrvGetConsoleCursorInfo)
|
CSR_API(SrvGetConsoleCursorInfo)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest;
|
PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest;
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleCursorInfo\n");
|
DPRINT("SrvGetConsoleCursorInfo\n");
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), CursorInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE);
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
CursorInfoRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
CursorInfoRequest->Info.bVisible = Buff->CursorInfo.bVisible;
|
Status = ConDrvGetConsoleCursorInfo(Buffer->Header.Console,
|
||||||
CursorInfoRequest->Info.dwSize = Buff->CursorInfo.dwSize;
|
Buffer,
|
||||||
|
&CursorInfoRequest->Info);
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
return STATUS_SUCCESS;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleCursorInfo(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PCONSOLE_CURSOR_INFO CursorInfo);
|
||||||
CSR_API(SrvSetConsoleCursorInfo)
|
CSR_API(SrvSetConsoleCursorInfo)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest;
|
PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest;
|
||||||
PCONSOLE Console;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
|
||||||
DWORD Size;
|
|
||||||
BOOL Visible, Success = TRUE;
|
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleCursorInfo\n");
|
DPRINT("SrvSetConsoleCursorInfo\n");
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), CursorInfoRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
CursorInfoRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
Status = ConDrvSetConsoleCursorInfo(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
&CursorInfoRequest->Info);
|
||||||
|
|
||||||
Size = CursorInfoRequest->Info.dwSize;
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
Visible = CursorInfoRequest->Info.bVisible;
|
return Status;
|
||||||
if (Size < 1) Size = 1;
|
|
||||||
if (100 < Size) Size = 100;
|
|
||||||
|
|
||||||
if ( (Size != Buff->CursorInfo.dwSize) ||
|
|
||||||
(Visible && !Buff->CursorInfo.bVisible) ||
|
|
||||||
(!Visible && Buff->CursorInfo.bVisible) )
|
|
||||||
{
|
|
||||||
Buff->CursorInfo.dwSize = Size;
|
|
||||||
Buff->CursorInfo.bVisible = Visible;
|
|
||||||
|
|
||||||
Success = ConioSetCursorInfo(Console, Buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleCursorPosition(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PCOORD Position);
|
||||||
CSR_API(SrvSetConsoleCursorPosition)
|
CSR_API(SrvSetConsoleCursorPosition)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorPositionRequest;
|
PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorPositionRequest;
|
||||||
PCONSOLE Console;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
|
||||||
SHORT OldCursorX, OldCursorY;
|
|
||||||
SHORT NewCursorX, NewCursorY;
|
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleCursorPosition\n");
|
DPRINT("SrvSetConsoleCursorPosition\n");
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetCursorPositionRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
SetCursorPositionRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
Status = ConDrvSetConsoleCursorPosition(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
&SetCursorPositionRequest->Position);
|
||||||
|
|
||||||
NewCursorX = SetCursorPositionRequest->Position.X;
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
NewCursorY = SetCursorPositionRequest->Position.Y;
|
|
||||||
if ( NewCursorX < 0 || NewCursorX >= Buff->ScreenBufferSize.X ||
|
|
||||||
NewCursorY < 0 || NewCursorY >= Buff->ScreenBufferSize.Y )
|
|
||||||
{
|
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
OldCursorX = Buff->CursorPosition.X;
|
|
||||||
OldCursorY = Buff->CursorPosition.Y;
|
|
||||||
Buff->CursorPosition.X = NewCursorX;
|
|
||||||
Buff->CursorPosition.Y = NewCursorY;
|
|
||||||
if (Buff == Console->ActiveBuffer)
|
|
||||||
{
|
|
||||||
if (!ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY))
|
|
||||||
{
|
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Quit:
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,7 +209,7 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
CreateScreenBufferRequest->Inheritable = FALSE;
|
CreateScreenBufferRequest->Inheritable = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvCreateScreenBuffer(&Buff,
|
Status = ConDrvCreateScreenBuffer(&Buff,
|
||||||
Console,
|
Console,
|
||||||
CreateScreenBufferRequest->ScreenBufferType,
|
CreateScreenBufferRequest->ScreenBufferType,
|
||||||
ScreenBufferInfo);
|
ScreenBufferInfo);
|
||||||
|
@ -395,34 +245,31 @@ Quit:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console,
|
||||||
|
IN PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
CSR_API(SrvSetConsoleActiveScreenBuffer)
|
CSR_API(SrvSetConsoleActiveScreenBuffer)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferRequest;
|
PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferRequest;
|
||||||
PCONSOLE Console;
|
PCONSOLE_SCREEN_BUFFER Buffer;
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleActiveScreenBuffer\n");
|
DPRINT("SrvSetConsoleActiveScreenBuffer\n");
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetScreenBufferRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
SetScreenBufferRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
Status = ConDrvSetConsoleActiveScreenBuffer(Buffer->Header.Console,
|
||||||
|
Buffer);
|
||||||
|
|
||||||
if (Buff == Console->ActiveBuffer) goto Quit;
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
|
return Status;
|
||||||
/* If old buffer has no handles, it's now unreferenced */
|
|
||||||
if (Console->ActiveBuffer->Header.HandleCount == 0)
|
|
||||||
{
|
|
||||||
ConioDeleteScreenBuffer(Console->ActiveBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tie console to new buffer */
|
|
||||||
ConioSetActiveScreenBuffer(Buff);
|
|
||||||
|
|
||||||
Quit:
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TEXT OUTPUT APIS ***********************************************************/
|
||||||
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -33,12 +33,12 @@
|
||||||
#define ConSrvReleaseScreenBuffer(Buff, IsConsoleLocked) \
|
#define ConSrvReleaseScreenBuffer(Buff, IsConsoleLocked) \
|
||||||
ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked))
|
ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked))
|
||||||
|
|
||||||
NTSTATUS FASTCALL ConSrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
NTSTATUS FASTCALL ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
|
||||||
IN OUT PCONSOLE Console,
|
IN OUT PCONSOLE Console,
|
||||||
IN ULONG BufferType,
|
IN ULONG BufferType,
|
||||||
IN PVOID ScreenBufferInfo);
|
IN PVOID ScreenBufferInfo);
|
||||||
VOID WINAPI ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
|
VOID WINAPI ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
VOID FASTCALL ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
|
// VOID FASTCALL ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
|
|
||||||
PCONSOLE_SCREEN_BUFFER
|
PCONSOLE_SCREEN_BUFFER
|
||||||
ConDrvGetActiveScreenBuffer(IN PCONSOLE Console);
|
ConDrvGetActiveScreenBuffer(IN PCONSOLE Console);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue