[CONSRV]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 23 Jun 2013 12:13:21 +0000 (12:13 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 23 Jun 2013 12:13:21 +0000 (12:13 +0000)
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

reactos/win32ss/user/consrv/CMakeLists.txt
reactos/win32ss/user/consrv/condrv/conoutput.c [new file with mode: 0644]
reactos/win32ss/user/consrv/conoutput.c
reactos/win32ss/user/consrv/conoutput.h

index 40432db..7db1234 100644 (file)
@@ -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 (file)
index 0000000..e61b596
--- /dev/null
@@ -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 */
index 39fd9c6..ee0b184 100644 (file)
 
 /* 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;
-
-    /* If the output buffer is the current one, redraw the correct portion of the screen */
-    if (Buff == Console->ActiveBuffer)
-        ConioDrawRegion(Console, &InvalidateDIBitsRequest->Region);
+    Status = ConDrvInvalidateBitMapRect(Buffer->Header.Console,
+                                        Buffer,
+                                        &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;
-
-    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);
-    }
+    Status = ConDrvSetConsoleCursorInfo(Buffer->Header.Console,
+                                        Buffer,
+                                        &CursorInfoRequest->Info);
 
-    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;
-
-    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;
-        }
-    }
+    Status = ConDrvSetConsoleCursorPosition(Buffer->Header.Console,
+                                            Buffer,
+                                            &SetCursorPositionRequest->Position);
 
-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;
+    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);
+/* TEXT OUTPUT APIS ***********************************************************/
 
-Quit:
-    ConSrvReleaseScreenBuffer(Buff, TRUE);
-    return STATUS_SUCCESS;
-}
 
 /* EOF */
index 8d11d7b..1bd1d2f 100644 (file)
 #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);