diff --git a/reactos/win32ss/user/consrv/CMakeLists.txt b/reactos/win32ss/user/consrv/CMakeLists.txt index 40432db8fef..7db1234c213 100644 --- a/reactos/win32ss/user/consrv/CMakeLists.txt +++ b/reactos/win32ss/user/consrv/CMakeLists.txt @@ -19,6 +19,7 @@ list(APPEND SOURCE init.c lineinput.c settings.c + condrv/conoutput.c condrv/console.c condrv/graphics.c frontends/input.c diff --git a/reactos/win32ss/user/consrv/condrv/conoutput.c b/reactos/win32ss/user/consrv/condrv/conoutput.c new file mode 100644 index 00000000000..e61b596775d --- /dev/null +++ b/reactos/win32ss/user/consrv/condrv/conoutput.c @@ -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 + + +/* 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 */ diff --git a/reactos/win32ss/user/consrv/conoutput.c b/reactos/win32ss/user/consrv/conoutput.c index 39fd9c66085..ee0b184e8f7 100644 --- a/reactos/win32ss/user/consrv/conoutput.c +++ b/reactos/win32ss/user/consrv/conoutput.c @@ -22,256 +22,106 @@ /* 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 *********************************************************/ +NTSTATUS NTAPI +ConDrvInvalidateBitMapRect(IN PCONSOLE Console, + IN PCONSOLE_SCREEN_BUFFER Buffer, + IN PSMALL_RECT Region); CSR_API(SrvInvalidateBitMapRect) { NTSTATUS Status; PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.InvalidateDIBitsRequest; - PCONSOLE Console; - PCONSOLE_SCREEN_BUFFER Buff; + PCONSOLE_SCREEN_BUFFER Buffer; 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; - 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 */ - if (Buff == Console->ActiveBuffer) - ConioDrawRegion(Console, &InvalidateDIBitsRequest->Region); - - ConSrvReleaseScreenBuffer(Buff, TRUE); - return STATUS_SUCCESS; + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; } +NTSTATUS NTAPI +ConDrvGetConsoleCursorInfo(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + OUT PCONSOLE_CURSOR_INFO CursorInfo); CSR_API(SrvGetConsoleCursorInfo) { NTSTATUS Status; PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest; - PCONSOLE_SCREEN_BUFFER Buff; + PTEXTMODE_SCREEN_BUFFER Buffer; 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; - CursorInfoRequest->Info.bVisible = Buff->CursorInfo.bVisible; - CursorInfoRequest->Info.dwSize = Buff->CursorInfo.dwSize; + Status = ConDrvGetConsoleCursorInfo(Buffer->Header.Console, + Buffer, + &CursorInfoRequest->Info); - ConSrvReleaseScreenBuffer(Buff, TRUE); - return STATUS_SUCCESS; + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; } +NTSTATUS NTAPI +ConDrvSetConsoleCursorInfo(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN PCONSOLE_CURSOR_INFO CursorInfo); CSR_API(SrvSetConsoleCursorInfo) { NTSTATUS Status; PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest; - PCONSOLE Console; - PCONSOLE_SCREEN_BUFFER Buff; - DWORD Size; - BOOL Visible, Success = TRUE; + PTEXTMODE_SCREEN_BUFFER Buffer; 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; - Console = Buff->Header.Console; + Status = ConDrvSetConsoleCursorInfo(Buffer->Header.Console, + Buffer, + &CursorInfoRequest->Info); - Size = CursorInfoRequest->Info.dwSize; - Visible = CursorInfoRequest->Info.bVisible; - 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); + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; } +NTSTATUS NTAPI +ConDrvSetConsoleCursorPosition(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN PCOORD Position); CSR_API(SrvSetConsoleCursorPosition) { - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status; PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorPositionRequest; - PCONSOLE Console; - PCONSOLE_SCREEN_BUFFER Buff; - SHORT OldCursorX, OldCursorY; - SHORT NewCursorX, NewCursorY; + PTEXTMODE_SCREEN_BUFFER Buffer; 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; - Console = Buff->Header.Console; + Status = ConDrvSetConsoleCursorPosition(Buffer->Header.Console, + Buffer, + &SetCursorPositionRequest->Position); - NewCursorX = SetCursorPositionRequest->Position.X; - 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); + ConSrvReleaseScreenBuffer(Buffer, TRUE); return Status; } @@ -359,7 +209,7 @@ CSR_API(SrvCreateConsoleScreenBuffer) CreateScreenBufferRequest->Inheritable = FALSE; } - Status = ConSrvCreateScreenBuffer(&Buff, + Status = ConDrvCreateScreenBuffer(&Buff, Console, CreateScreenBufferRequest->ScreenBufferType, ScreenBufferInfo); @@ -395,34 +245,31 @@ Quit: return Status; } +NTSTATUS NTAPI +ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console, + IN PCONSOLE_SCREEN_BUFFER Buffer); CSR_API(SrvSetConsoleActiveScreenBuffer) { NTSTATUS Status; PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferRequest; - PCONSOLE Console; - PCONSOLE_SCREEN_BUFFER Buff; + PCONSOLE_SCREEN_BUFFER Buffer; 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; - Console = Buff->Header.Console; + Status = ConDrvSetConsoleActiveScreenBuffer(Buffer->Header.Console, + Buffer); - if (Buff == Console->ActiveBuffer) goto Quit; - - /* 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; + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; } + +/* TEXT OUTPUT APIS ***********************************************************/ + + /* EOF */ diff --git a/reactos/win32ss/user/consrv/conoutput.h b/reactos/win32ss/user/consrv/conoutput.h index 8d11d7bf902..1bd1d2f3be8 100644 --- a/reactos/win32ss/user/consrv/conoutput.h +++ b/reactos/win32ss/user/consrv/conoutput.h @@ -33,12 +33,12 @@ #define ConSrvReleaseScreenBuffer(Buff, 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 ULONG BufferType, IN PVOID ScreenBufferInfo); VOID WINAPI ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer); -VOID FASTCALL ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer); +// VOID FASTCALL ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer); PCONSOLE_SCREEN_BUFFER ConDrvGetActiveScreenBuffer(IN PCONSOLE Console);