[ros-diffs] [jmorlan] 34568: Clean up console code a bit: - Get/SetConsoleTitle: Get rid of unnecessary handle creation; instead, just have csrss get the console from the ProcessData. - Instead of using ShowX/ShowY to store the origin of the buffer, use the VirtualX member that was put there for this purpose. Rename it to VirtualY, though, since it's a row number. ShowX/ShowY should hold the position of the visible window, once that's implemented. - From the CSRSS_CONSOLE structure: remove hActiveBuffer (redundant), CodePageId (unused), and hWindowIcon (only used as a temporary) - Make cursor coordinates be "logical", not "physical". This simplifies various things. - ConioConsoleFromProcessData: If process has no console, return STATUS_INVALID_HANDLE; don't pretend to succeed (causing many functions to access memory around address 0, which is probably not a good thing). Remove various Console != NULL checks which are now unnecessary.

jmorlan at svn.reactos.org jmorlan at svn.reactos.org
Thu Jul 17 23:53:40 CEST 2008


Author: jmorlan
Date: Thu Jul 17 16:53:39 2008
New Revision: 34568

URL: http://svn.reactos.org/svn/reactos?rev=34568&view=rev
Log:
Clean up console code a bit:
- Get/SetConsoleTitle: Get rid of unnecessary handle creation; instead, just have csrss get the console from the ProcessData.
- Instead of using ShowX/ShowY to store the origin of the buffer, use the VirtualX member that was put there for this purpose. Rename it to VirtualY, though, since it's a row number. ShowX/ShowY should hold the position of the visible window, once that's implemented.
- From the CSRSS_CONSOLE structure: remove hActiveBuffer (redundant), CodePageId (unused), and hWindowIcon (only used as a temporary)
- Make cursor coordinates be "logical", not "physical". This simplifies various things.
- ConioConsoleFromProcessData: If process has no console, return STATUS_INVALID_HANDLE; don't pretend to succeed (causing many functions to access memory around address 0, which is probably not a good thing). Remove various Console != NULL checks which are now unnecessary.

Modified:
    trunk/reactos/dll/win32/kernel32/misc/console.c
    trunk/reactos/subsystems/win32/csrss/include/conio.h
    trunk/reactos/subsystems/win32/csrss/win32csr/conio.c
    trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c
    trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c

Modified: trunk/reactos/dll/win32/kernel32/misc/console.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/console.c?rev=34568&r1=34567&r2=34568&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/console.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/console.c [iso-8859-1] Thu Jul 17 16:53:39 2008
@@ -3285,13 +3285,6 @@
 {
    PCSR_API_MESSAGE Request; ULONG CsrRequest;
    NTSTATUS Status;
-   HANDLE hConsole;
-
-   hConsole = CreateFileW(L"CONIN$", GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-   if (hConsole == INVALID_HANDLE_VALUE)
-   {
-      return 0;
-   }
 
    Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
                              CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
@@ -3302,13 +3295,11 @@
    }
 
    CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
-   Request->Data.GetTitleRequest.ConsoleHandle = hConsole;
 
    Status = CsrClientCallServer(Request, 
                                 NULL, 
                                 CsrRequest, 
                                 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
-   CloseHandle(hConsole);
    if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request->Status)))
    {
       RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
@@ -3388,13 +3379,6 @@
   PCSR_API_MESSAGE Request; ULONG CsrRequest;
   NTSTATUS Status;
   unsigned int c;
-  HANDLE hConsole;
-
-  hConsole = CreateFileW(L"CONIN$", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-  if (hConsole == INVALID_HANDLE_VALUE)
-  {
-     return FALSE;
-  }
 
   Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
                             max (sizeof(CSR_API_MESSAGE),
@@ -3407,7 +3391,6 @@
   }
 
   CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
-  Request->Data.SetTitleRequest.Console = hConsole;
 
   for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
     Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
@@ -3416,7 +3399,6 @@
 			       NULL,
                                CsrRequest,
 			       max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
-  CloseHandle(hConsole);
   if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request->Status ) )
     {
       RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
@@ -3446,13 +3428,6 @@
   PCSR_API_MESSAGE Request; ULONG CsrRequest;
   NTSTATUS Status;
   unsigned int c;
-  HANDLE hConsole;
-
-  hConsole = CreateFileW(L"CONIN$", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-  if (hConsole == INVALID_HANDLE_VALUE)
-  {
-     return FALSE;
-  }
 
   Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
                             max (sizeof(CSR_API_MESSAGE),
@@ -3465,7 +3440,6 @@
   }
 
   CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
-  Request->Data.SetTitleRequest.Console = hConsole;
 
   for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
     Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
@@ -3474,7 +3448,6 @@
 			       NULL,
                                CsrRequest,
 			       max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
-  CloseHandle(hConsole);
   if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request->Status ) )
     {
       RtlFreeHeap(RtlGetProcessHeap(), 0, Request);

Modified: trunk/reactos/subsystems/win32/csrss/include/conio.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/include/conio.h?rev=34568&r1=34567&r2=34568&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/include/conio.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/include/conio.h [iso-8859-1] Thu Jul 17 16:53:39 2008
@@ -25,7 +25,7 @@
  * do a massive memcpy() to scroll the contents of the buffer up to     *
  * scroll the screen on output, instead I just shift down the position  *
  * to be displayed, and let it wrap around to the top again.            *
- * The VirtualX member keeps track of the top X coord that win32        *
+ * The VirtualY member keeps track of the top Y coord that win32        *
  * clients THINK is currently being displayed, because they think that  *
  * when the display reaches the bottom of the buffer and another line   *
  * being printed causes another line to scroll down, that the buffer IS *
@@ -42,7 +42,7 @@
   ULONG CurrentX;                  /* Current X cursor position */
   ULONG CurrentY;                  /* Current Y cursor position */
   BYTE DefaultAttrib;              /* default char attribute */
-  USHORT VirtualX;                 /* top row of buffer being displayed, reported to callers */
+  USHORT VirtualY;                 /* top row of buffer being displayed, reported to callers */
   CONSOLE_CURSOR_INFO CursorInfo;
   USHORT Mode;
 } CSRSS_SCREEN_BUFFER, *PCSRSS_SCREEN_BUFFER;
@@ -59,7 +59,7 @@
   BOOL (STDCALL *UpdateScreenInfo)(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer);
   BOOL (STDCALL *ChangeTitle)(PCSRSS_CONSOLE Console);
   VOID (STDCALL *CleanupConsole)(PCSRSS_CONSOLE Console);
-  BOOL (STDCALL *ChangeIcon)(PCSRSS_CONSOLE Console);
+  BOOL (STDCALL *ChangeIcon)(PCSRSS_CONSOLE Console, HICON hWindowIcon);
 } CSRSS_CONSOLE_VTBL, *PCSRSS_CONSOLE_VTBL;
 
 typedef struct tagCSRSS_CONSOLE
@@ -71,19 +71,12 @@
   WORD WaitingChars;
   WORD WaitingLines;                    /* number of chars and lines in input queue */
   PCSRSS_SCREEN_BUFFER ActiveBuffer;    /* Pointer to currently active screen buffer */
-  HANDLE hActiveBuffer;
   WORD Mode;                            /* Console mode flags */
   WORD EchoCount;                       /* count of chars to echo, in line buffered mode */
   UNICODE_STRING Title;                 /* Title of console */
-  struct				/* active code pages */
-    {
-      UINT Input;
-      UINT Output;
-    } CodePageId;
   BOOL EarlyReturn;                     /* wake client and return data, even if we are in line buffered mode, and we don't have a complete line */
   DWORD HardwareState;                  /* _GDI_MANAGED, _DIRECT */
   HWND hWindow;
-  HICON hWindowIcon;
   COORD Size;
   PVOID PrivateData;
   UINT CodePage;
@@ -95,11 +88,7 @@
 VOID STDCALL ConioDeleteConsole(Object_t *Object);
 VOID STDCALL ConioDeleteScreenBuffer(Object_t *Buffer);
 void STDCALL ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode);
-void FASTCALL ConioPhysicalToLogical(PCSRSS_SCREEN_BUFFER Buff,
-                                     ULONG PhysicalX,
-                                     ULONG PhysicalY,
-                                     LONG *LogicalX,
-                                     LONG *LogicalY);
+DWORD FASTCALL ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buf, ULONG X, ULONG Y);
 VOID FASTCALL ConioDrawConsole(PCSRSS_CONSOLE Console);
 VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData);
 VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData,
@@ -171,7 +160,7 @@
     Win32CsrLockObject((ProcessData), (Handle), (Object_t **)(Ptr), CONIO_SCREEN_BUFFER_MAGIC)
 #define ConioUnlockScreenBuffer(Buff) \
     Win32CsrUnlockObject((Object_t *) Buff)
-#define ConioChangeIcon(Console) (Console)->Vtbl->ChangeIcon(Console)
+#define ConioChangeIcon(Console, hWindowIcon) (Console)->Vtbl->ChangeIcon(Console, hWindowIcon)
 
 #endif /* CONIO_H_INCLUDED */
 

Modified: trunk/reactos/subsystems/win32/csrss/win32csr/conio.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win32csr/conio.c?rev=34568&r1=34567&r2=34568&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/win32csr/conio.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/win32csr/conio.c [iso-8859-1] Thu Jul 17 16:53:39 2008
@@ -44,7 +44,7 @@
   if (!ProcessConsole)
     {
       *Console = NULL;
-      return STATUS_SUCCESS;
+      return STATUS_INVALID_HANDLE;
     }
 
   EnterCriticalSection(&(ProcessConsole->Header.Lock));
@@ -82,6 +82,12 @@
   ConioConsoleCtrlEventTimeout(Event, ProcessData, INFINITE);
 }
 
+DWORD FASTCALL
+ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
+{
+  return 2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X);
+}
+
 #define GET_CELL_BUFFER(b,o)\
 (b)->Buffer[(o)++]
 
@@ -92,7 +98,7 @@
 static VOID FASTCALL
 ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff)
 {
-  DWORD Offset = 2 * (Buff->CurrentY * Buff->MaxX);
+  DWORD Offset = ConioGetBufferOffset(Buff, 0, Buff->CurrentY);
   UINT Pos;
 
   for (Pos = 0; Pos < Buff->MaxX; Pos++)
@@ -112,6 +118,7 @@
   Buffer->Header.ReferenceCount = 0;
   Buffer->ShowX = 0;
   Buffer->ShowY = 0;
+  Buffer->VirtualY = 0;
   Buffer->Buffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, Buffer->MaxX * Buffer->MaxY * 2);
   if (NULL == Buffer->Buffer)
     {
@@ -153,7 +160,6 @@
   Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT;
   Console->EarlyReturn = FALSE;
   Console->ActiveBuffer = NULL;
-  Console->hActiveBuffer = INVALID_HANDLE_VALUE;
   InitializeListHead(&Console->InputEvents);
   Console->CodePage = GetOEMCP();
   Console->OutputCodePage = GetOEMCP();
@@ -187,7 +193,6 @@
   NewBuffer->CursorInfo.dwSize = 5;
   /* make console active, and insert into console list */
   Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer;
-  Console->hActiveBuffer = INVALID_HANDLE_VALUE;
 
   if (! GuiMode)
     {
@@ -335,7 +340,6 @@
             ProcessData->Console = 0;
             return Request->Status = Status;
         }
-        Console->hActiveBuffer = Request->Data.AllocConsoleRequest.OutputHandle;
     }
 
     /* Duplicate the Event */
@@ -398,29 +402,23 @@
 static VOID FASTCALL
 ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, UINT *ScrolledLines)
 {
+  /* If we hit bottom, slide the viewable screen */
   if (++Buff->CurrentY == Buff->MaxY)
     {
-      Buff->CurrentY = 0;
-    }
-  /* If we hit bottom, slide the viewable screen */
-  if (Buff->CurrentY == Buff->ShowY)
-    {
-      if (++Buff->ShowY == Buff->MaxY)
-        {
-          Buff->ShowY = 0;
+      Buff->CurrentY--;
+      if (++Buff->VirtualY == Buff->MaxY)
+        {
+          Buff->VirtualY = 0;
         }
       (*ScrolledLines)++;
       ClearLineBuffer(Buff);
+      if (UpdateRect->top != 0)
+        {
+          UpdateRect->top--;
+        }
     }
   UpdateRect->left = 0;
   UpdateRect->right = Buff->MaxX - 1;
-  if (UpdateRect->top == (LONG)Buff->CurrentY)
-    {
-      if (++UpdateRect->top == Buff->MaxY)
-        {
-          UpdateRect->top = 0;
-        }
-    }
   UpdateRect->bottom = Buff->CurrentY;
 }
 
@@ -434,7 +432,8 @@
   LONG CursorStartX, CursorStartY;
   UINT ScrolledLines;
 
-  ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &CursorStartX, &CursorStartY);
+  CursorStartX = Buff->CurrentX;
+  CursorStartY = Buff->CurrentY;
   UpdateRect.left = Buff->MaxX;
   UpdateRect.top = Buff->CurrentY;
   UpdateRect.right = -1;
@@ -456,31 +455,20 @@
           else if (Buffer[i] == '\b')
             {
               /* Only handle BS if we're not on the first pos of the first line */
-              if (0 != Buff->CurrentX || Buff->ShowY != Buff->CurrentY)
+              if (0 != Buff->CurrentX || 0 != Buff->CurrentY)
                 {
                   if (0 == Buff->CurrentX)
                     {
                       /* slide virtual position up */
                       Buff->CurrentX = Buff->MaxX - 1;
-                      if (0 == Buff->CurrentY)
-                        {
-                          Buff->CurrentY = Buff->MaxY;
-                        }
-                      else
-                        {
-                          Buff->CurrentY--;
-                        }
-                      if ((0 == UpdateRect.top && UpdateRect.bottom < (LONG)Buff->CurrentY)
-                          || (0 != UpdateRect.top && (LONG)Buff->CurrentY < UpdateRect.top))
-                        {
-                          UpdateRect.top = Buff->CurrentY;
-                        }
+                      Buff->CurrentY--;
+                      UpdateRect.top = min(UpdateRect.top, (LONG)Buff->CurrentY);
                     }
                   else
                     {
-                       Buff->CurrentX--;
+                      Buff->CurrentX--;
                     }
-                  Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX);
+                  Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY);
                   SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib);
                   UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX);
                   UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
@@ -506,7 +494,7 @@
                 {
                   EndX = Buff->MaxX;
                 }
-              Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX);
+              Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY);
               while (Buff->CurrentX < EndX)
                 {
                   Buff->Buffer[Offset] = ' ';
@@ -532,7 +520,7 @@
         }
       UpdateRect.left = min(UpdateRect.left, (LONG)Buff->CurrentX);
       UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
-      Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX);
+      Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY);
       Buff->Buffer[Offset++] = Buffer[i];
       if (Attrib)
         {
@@ -553,11 +541,7 @@
         }
     }
 
-  ConioPhysicalToLogical(Buff, UpdateRect.left, UpdateRect.top, &(UpdateRect.left),
-                         &(UpdateRect.top));
-  ConioPhysicalToLogical(Buff, UpdateRect.right, UpdateRect.bottom, &(UpdateRect.right),
-                         &(UpdateRect.bottom));
-  if (! ConioIsRectEmpty(&UpdateRect) && NULL != Console && Buff == Console->ActiveBuffer)
+  if (! ConioIsRectEmpty(&UpdateRect) && Buff == Console->ActiveBuffer)
     {
       ConioWriteStream(Console, &UpdateRect, CursorStartX, CursorStartY, ScrolledLines,
                        Buffer, Length);
@@ -709,24 +693,6 @@
   return Request->Status;
 }
 
-VOID FASTCALL
-ConioPhysicalToLogical(PCSRSS_SCREEN_BUFFER Buff,
-                       ULONG PhysicalX,
-                       ULONG PhysicalY,
-                       LONG *LogicalX,
-                       LONG *LogicalY)
-{
-   *LogicalX = PhysicalX;
-   if (PhysicalY < Buff->ShowY)
-     {
-       *LogicalY = Buff->MaxY - Buff->ShowY + PhysicalY;
-     }
-   else
-     {
-       *LogicalY = PhysicalY - Buff->ShowY;
-     }
-}
-
 BOOLEAN __inline ConioGetIntersection(
   RECT *Intersection,
   RECT *Rect1,
@@ -814,8 +780,8 @@
     }
   for (i = 0; i < Height; i++)
     {
-      PWORD SRow = (PWORD)&ScreenBuffer->Buffer[((SY + ScreenBuffer->ShowY) % ScreenBuffer->MaxY) * ScreenBuffer->MaxX * 2];
-      PWORD DRow = (PWORD)&ScreenBuffer->Buffer[((DY + ScreenBuffer->ShowY) % ScreenBuffer->MaxY) * ScreenBuffer->MaxX * 2];
+      PWORD SRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, SY)];
+      PWORD DRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, DY)];
 
       SX = SrcRegion->left;
       DX = DstRegion->left;
@@ -934,10 +900,7 @@
           RtlFreeHeap(GetProcessHeap(), 0, Buffer);
         }
     }
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   Request->Data.WriteConsoleRequest.NrCharactersWritten = Written;
 
@@ -988,7 +951,6 @@
     }
 
   Console->ActiveBuffer = NULL;
-  Console->hActiveBuffer = INVALID_HANDLE_VALUE;
 
   CloseHandle(Console->ActiveEvent);
   DeleteCriticalSection(&Console->Header.Lock);
@@ -1050,27 +1012,22 @@
           if (VK_UP == KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode)
             {
               /* only scroll up if there is room to scroll up into */
-              if (Console->ActiveBuffer->ShowY != ((Console->ActiveBuffer->CurrentY + 1) %
-                                                     Console->ActiveBuffer->MaxY))
+              if (Console->ActiveBuffer->CurrentY != Console->ActiveBuffer->MaxY - 1)
                 {
-                  Console->ActiveBuffer->ShowY = (Console->ActiveBuffer->ShowY +
-                                                  Console->ActiveBuffer->MaxY - 1) %
-                                                 Console->ActiveBuffer->MaxY;
+                  Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY +
+                                                     Console->ActiveBuffer->MaxY - 1) %
+                                                    Console->ActiveBuffer->MaxY;
+                  Console->ActiveBuffer->CurrentY++;
                 }
             }
-          else if (Console->ActiveBuffer->ShowY != Console->ActiveBuffer->CurrentY)
-            /* only scroll down if there is room to scroll down into */
-            {
-              if (Console->ActiveBuffer->ShowY % Console->ActiveBuffer->MaxY !=
-                  Console->ActiveBuffer->CurrentY)
+          else
+            {
+              /* only scroll down if there is room to scroll down into */
+              if (Console->ActiveBuffer->CurrentY != 0)
                 {
-                  if (((Console->ActiveBuffer->CurrentY + 1) % Console->ActiveBuffer->MaxY) !=
-                      (Console->ActiveBuffer->ShowY + Console->ActiveBuffer->MaxY) %
-                      Console->ActiveBuffer->MaxY)
-                    {
-                      Console->ActiveBuffer->ShowY = (Console->ActiveBuffer->ShowY + 1) %
-                                                     Console->ActiveBuffer->MaxY;
-                    }
+                  Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + 1) %
+                                                    Console->ActiveBuffer->MaxY;
+                  Console->ActiveBuffer->CurrentY--;
                 }
             }
           ConioDrawConsole(Console);
@@ -1363,8 +1320,8 @@
   pInfo = &Request->Data.ScreenBufferInfoRequest.Info;
   pInfo->dwSize.X = Buff->MaxX;
   pInfo->dwSize.Y = Buff->MaxY;
-  pInfo->dwCursorPosition.X = Buff->CurrentX - Buff->ShowX;
-  pInfo->dwCursorPosition.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
+  pInfo->dwCursorPosition.X = Buff->CurrentX;
+  pInfo->dwCursorPosition.Y = Buff->CurrentY;
   pInfo->wAttributes = Buff->DefaultAttrib;
   pInfo->srWindow.Left = 0;
   pInfo->srWindow.Right = Buff->MaxX - 1;
@@ -1401,10 +1358,7 @@
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
       return Request->Status = Status;
     }
 
@@ -1414,33 +1368,25 @@
       NewCursorY < 0 || NewCursorY >= Buff->MaxY)
     {
       ConioUnlockScreenBuffer(Buff);
-      if (NULL != Console)
-        {
+      ConioUnlockConsole(Console);
+      return Request->Status = STATUS_INVALID_PARAMETER;
+    }
+  OldCursorX = Buff->CurrentX;
+  OldCursorY = Buff->CurrentY;
+  Buff->CurrentX = NewCursorX;
+  Buff->CurrentY = NewCursorY;
+  if (Buff == Console->ActiveBuffer)
+    {
+      if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY))
+        {
+          ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
-        }
-      return Request->Status = STATUS_INVALID_PARAMETER;
-    }
-  ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &OldCursorX, &OldCursorY);
-  Buff->CurrentX = NewCursorX + Buff->ShowX;
-  Buff->CurrentY = (NewCursorY + Buff->ShowY) % Buff->MaxY;
-  if (NULL != Console && Buff == Console->ActiveBuffer)
-    {
-      if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY))
-        {
-          ConioUnlockScreenBuffer(Buff);
-          if (NULL != Console)
-            {
-              ConioUnlockConsole(Console);
-            }
           return Request->Status = STATUS_UNSUCCESSFUL;
         }
     }
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   return Request->Status = STATUS_SUCCESS;
 }
@@ -1532,8 +1478,8 @@
                                          &Buff);
           if (NT_SUCCESS(Status))
             {
-              X = Request->Data.WriteConsoleOutputCharRequest.Coord.X + Buff->ShowX;
-              Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
+              X = Request->Data.WriteConsoleOutputCharRequest.Coord.X;
+              Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY;
               Length = Request->Data.WriteConsoleOutputCharRequest.Length;
               Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
               while (Length--)
@@ -1551,15 +1497,15 @@
                       X = 0;
                     }
                 }
-              if (NULL != Console && Buff == Console->ActiveBuffer)
+              if (Buff == Console->ActiveBuffer)
                 {
                   ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord,
                                          Request->Data.WriteConsoleOutputCharRequest.Length);
                   ConioDrawRegion(Console, &UpdateRect);
                 }
 
-                Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X - Buff->ShowX;
-                Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
+                Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X;
+                Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
 
                 ConioUnlockScreenBuffer(Buff);
             }
@@ -1568,10 +1514,7 @@
               RtlFreeHeap(GetProcessHeap(), 0, tmpString);
             }
         }
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
     }
   Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written;
   return Request->Status = Status;
@@ -1601,15 +1544,12 @@
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
-      return Request->Status = Status;
-    }
-
-  X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX;
-  Y = (Request->Data.FillOutputRequest.Position.Y + Buff->ShowY) % Buff->MaxY;
+      ConioUnlockConsole(Console);
+      return Request->Status = Status;
+    }
+
+  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);
@@ -1632,7 +1572,7 @@
         }
     }
 
-  if (NULL != Console && Buff == Console->ActiveBuffer)
+  if (Buff == Console->ActiveBuffer)
     {
       ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputRequest.Position,
                              Request->Data.FillOutputRequest.Length);
@@ -1640,10 +1580,7 @@
     }
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
   Length = Request->Data.FillOutputRequest.Length;
   Request->Data.FillOutputRequest.NrCharactersWritten = Length;
   return Request->Status;
@@ -1763,15 +1700,12 @@
                                  &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
-      return Request->Status = Status;
-    }
-
-  X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X + Buff->ShowX;
-  Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
+      ConioUnlockConsole(Console);
+      return Request->Status = Status;
+    }
+
+  X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X;
+  Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY;
   Length = Request->Data.WriteConsoleOutputAttribRequest.Length;
   Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1];
   Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute;
@@ -1790,20 +1724,17 @@
         }
     }
 
-  if (NULL != Console && Buff == Console->ActiveBuffer)
+  if (Buff == Console->ActiveBuffer)
     {
       ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputAttribRequest.Coord,
                              Request->Data.WriteConsoleOutputAttribRequest.Length);
       ConioDrawRegion(Console, &UpdateRect);
     }
 
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
-
-  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = Buff->CurrentX - Buff->ShowX;
-  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
+  ConioUnlockConsole(Console);
+
+  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = X;
+  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
 
   ConioUnlockScreenBuffer(Buff);
 
@@ -1833,15 +1764,12 @@
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
-      return Request->Status = Status;
-    }
-
-  X = Request->Data.FillOutputAttribRequest.Coord.X + Buff->ShowX;
-  Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
+      ConioUnlockConsole(Console);
+      return Request->Status = Status;
+    }
+
+  X = Request->Data.FillOutputAttribRequest.Coord.X;
+  Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY;
   Length = Request->Data.FillOutputAttribRequest.Length;
   Attr = Request->Data.FillOutputAttribRequest.Attribute;
   Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1];
@@ -1860,7 +1788,7 @@
         }
     }
 
-  if (NULL != Console && Buff == Console->ActiveBuffer)
+  if (Buff == Console->ActiveBuffer)
     {
       ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputAttribRequest.Coord,
                              Request->Data.FillOutputAttribRequest.Length);
@@ -1868,10 +1796,7 @@
     }
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   return Request->Status = STATUS_SUCCESS;
 }
@@ -1921,10 +1846,7 @@
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
       return Request->Status = Status;
     }
 
@@ -1945,7 +1867,7 @@
       Buff->CursorInfo.dwSize = Size;
       Buff->CursorInfo.bVisible = Visible;
 
-      if (NULL != Console && ! ConioSetCursorInfo(Console, Buff))
+      if (! ConioSetCursorInfo(Console, Buff))
         {
           ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
@@ -1954,10 +1876,7 @@
     }
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   return Request->Status = STATUS_SUCCESS;
 }
@@ -1979,15 +1898,12 @@
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
       return Request->Status = Status;
     }
 
   Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib;
-  if (NULL != Console && Buff == Console->ActiveBuffer)
+  if (Buff == Console->ActiveBuffer)
     {
       if (! ConioUpdateScreenInfo(Console, Buff))
         {
@@ -1998,10 +1914,7 @@
     }
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   return Request->Status = STATUS_SUCCESS;
 }
@@ -2095,10 +2008,6 @@
     {
       return Request->Status = Status;
     }
-  if (NULL == Console)
-    {
-      return Request->Status = STATUS_INVALID_HANDLE;
-    }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
@@ -2162,11 +2071,6 @@
     {
       return Request->Status = Status;
     }
-  if (NULL == Console)
-    {
-      DPRINT1("Trying to set screen buffer for app without console\n");
-      return Request->Status = STATUS_INVALID_HANDLE;
-    }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
@@ -2192,7 +2096,6 @@
     }
   /* tie console to new buffer */
   Console->ActiveBuffer = Buff;
-  Console->hActiveBuffer = Request->Data.SetScreenBufferRequest.OutputHandle;
   /* inc ref count on new buffer */
   InterlockedIncrement(&Buff->Header.ReferenceCount);
   /* Redraw the console */
@@ -2222,7 +2125,7 @@
       return Request->Status = STATUS_INVALID_PARAMETER;
     }
 
-  Status = ConioLockConsole(ProcessData, Request->Data.SetTitleRequest.Console, &Console);
+  Status = ConioConsoleFromProcessData(ProcessData, &Console);
   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))
@@ -2252,8 +2155,8 @@
         {
           Request->Status = STATUS_NO_MEMORY;
         }
-    }
-  ConioUnlockConsole(Console);
+      ConioUnlockConsole(Console);
+    }
 
   return Request->Status;
 }
@@ -2268,9 +2171,7 @@
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-  Status = ConioLockConsole(ProcessData,
-                            Request->Data.GetTitleRequest.ConsoleHandle,
-                            &Console);
+  Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
       DPRINT1("Can't get console\n");
@@ -2327,10 +2228,7 @@
                                  &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
       return Request->Status = Status;
     }
 
@@ -2371,7 +2269,7 @@
   for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++)
     {
       CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X;
-      Offset = (((Y + Buff->ShowY) % Buff->MaxY) * Buff->MaxX + WriteRegion.left) * 2;
+      Offset = ConioGetBufferOffset(Buff, WriteRegion.left, Y);
       for (X = WriteRegion.left; X <= WriteRegion.right; X++)
         {
           if (Request->Data.WriteConsoleOutputRequest.Unicode)
@@ -2388,10 +2286,7 @@
         }
     }
 
-  if (NULL != Console)
-    {
-      ConioDrawRegion(Console, &WriteRegion);
-    }
+  ConioDrawRegion(Console, &WriteRegion);
 
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
@@ -2474,10 +2369,7 @@
   Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
       return Request->Status = Status;
     }
 
@@ -2491,10 +2383,7 @@
   if (! ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle))
     {
       ConioUnlockScreenBuffer(Buff);
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
+      ConioUnlockConsole(Console);
       return Request->Status = STATUS_SUCCESS;
     }
 
@@ -2516,10 +2405,7 @@
       ClipRectangle.bottom = Request->Data.ScrollConsoleScreenBufferRequest.ClipRectangle.Bottom;
       if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer))
         {
-          if (NULL != Console)
-            {
-              ConioUnlockConsole(Console);
-            }
+          ConioUnlockConsole(Console);
           ConioUnlockScreenBuffer(Buff);
           return Request->Status = STATUS_SUCCESS;
       }
@@ -2542,7 +2428,7 @@
 
   ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, Fill.Attributes << 8 | (BYTE)FillChar);
 
-  if (NULL != Console && Buff == Console->ActiveBuffer)
+  if (Buff == Console->ActiveBuffer)
     {
       ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion);
       if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle))
@@ -2553,10 +2439,7 @@
     }
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   return Request->Status = STATUS_SUCCESS;
 }
@@ -2589,15 +2472,12 @@
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
-        {
-          ConioUnlockConsole(Console);
-        }
-      return Request->Status = Status;
-    }
-
-  Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X + Buff->ShowX;
-  Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->ShowY) % Buff->MaxY;
+      ConioUnlockConsole(Console);
+      return Request->Status = Status;
+    }
+
+  Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X;
+  Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
 
   for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i)
     {
@@ -2627,14 +2507,11 @@
 
   *ReadBuffer = 0;
   Request->Status = STATUS_SUCCESS;
-  Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos - Buff->ShowX;
-  Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
+  Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos;
+  Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
 
   ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
-    }
+  ConioUnlockConsole(Console);
 
   Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize;
   if (Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE))
@@ -2668,8 +2545,8 @@
       return Request->Status = Status;
     }
 
-  Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X + Buff->ShowX;
-  Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->ShowY) % Buff->MaxY;
+  Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X;
+  Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
 
   for (i = 0; i < Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead; ++i)
     {
@@ -2693,8 +2570,8 @@
   *ReadBuffer = 0;
 
   Request->Status = STATUS_SUCCESS;
-  Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos - Buff->ShowX;
-  Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
+  Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos;
+  Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
 
   ConioUnlockScreenBuffer(Buff);
 
@@ -2890,7 +2767,7 @@
     {
       CurCharInfo = CharInfo + (i * BufferSize.X);
 
-      Offset = (((Y + Buff->ShowY) % Buff->MaxY) * Buff->MaxX + ReadRegion.left) * 2;
+      Offset = ConioGetBufferOffset(Buff, ReadRegion.left, Y);
       for (X = ReadRegion.left; X < ReadRegion.right; ++X)
         {
           if (Request->Data.ReadConsoleOutputRequest.Unicode)
@@ -3095,8 +2972,8 @@
       return Request->Status = Status;
     }
 
-  Console->hWindowIcon = Request->Data.SetConsoleIconRequest.WindowIcon;
-  Request->Status = (ConioChangeIcon(Console) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
+  Request->Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon)
+                     ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
   ConioUnlockConsole(Console);
 
   return Request->Status;

Modified: trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c?rev=34568&r1=34567&r2=34568&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c [iso-8859-1] Thu Jul 17 16:53:39 2008
@@ -780,21 +780,6 @@
 }
 
 static VOID FASTCALL
-GuiConsoleGetLogicalCursorPos(PCSRSS_SCREEN_BUFFER Buff, ULONG *CursorX, ULONG *CursorY)
-{
-  *CursorX = Buff->CurrentX;
-  if (Buff->CurrentY < Buff->ShowY)
-    {
-      *CursorY = Buff->MaxY - Buff->ShowY + Buff->CurrentY;
-    }
-  else
-    {
-      *CursorY = Buff->CurrentY - Buff->ShowY;
-    }
-}
-
-
-static VOID FASTCALL
 GuiConsoleUpdateSelection(HWND hWnd, PRECT rc, PGUI_CONSOLE_DATA GuiData)
 {
   RECT oldRect = GuiData->Selection;
@@ -895,15 +880,7 @@
 
     for (Line = TopLine; Line <= BottomLine; Line++)
     {
-        if (Line + Buff->ShowY < Buff->MaxY)
-        {
-            From = Buff->Buffer + ((Line + Buff->ShowY) * Buff->MaxX + LeftChar) * 2;
-        }
-        else
-        {
-            From = Buff->Buffer +
-                   ((Line - (Buff->MaxY - Buff->ShowY)) * Buff->MaxX + LeftChar) * 2;
-        }
+        From = Buff->Buffer + ConioGetBufferOffset(Buff, LeftChar, Line);
         Start = LeftChar;
         To = GuiData->LineBuffer;
 
@@ -947,9 +924,8 @@
     if (Buff->CursorInfo.bVisible && GuiData->CursorBlinkOn &&
         !GuiData->ForceCursorOff)
     {
-        GuiConsoleGetLogicalCursorPos(Buff,
-                                      &CursorX,
-                                      &CursorY);
+        CursorX = Buff->CurrentX;
+        CursorY = Buff->CurrentY;
         if (LeftChar <= CursorX && CursorX <= RightChar &&
             TopLine <= CursorY && CursorY <= BottomLine)
         {
@@ -958,7 +934,7 @@
             {
                 CursorHeight = 1;
             }
-            From = Buff->Buffer + (Buff->CurrentY * Buff->MaxX + Buff->CurrentX) * 2 + 1;
+            From = Buff->Buffer + ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY) + 1;
 
             if (*From != DEFAULT_ATTRIB)
             {
@@ -1165,8 +1141,8 @@
       GuiInvalidateCell(GuiData, Console->hWindow, CursorStartX, CursorStartY);
     }
 
-  ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY,
-                         &CursorEndX, &CursorEndY);
+  CursorEndX = Buff->CurrentX;
+  CursorEndY = Buff->CurrentY;
   if ((CursorEndX < Region->left || Region->right < CursorEndX
        || CursorEndY < Region->top || Region->bottom < CursorEndY)
       && (CursorEndX != CursorStartX || CursorEndY != CursorStartY))
@@ -1182,8 +1158,8 @@
 
   if (Console->ActiveBuffer == Buff)
     {
-      ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY,
-                             &UpdateRect.left, &UpdateRect.top);
+      UpdateRect.left = Buff->CurrentX;
+      UpdateRect.top = Buff->CurrentY;
       UpdateRect.right = UpdateRect.left;
       UpdateRect.bottom = UpdateRect.top;
       ConioDrawRegion(Console, &UpdateRect);
@@ -1206,8 +1182,8 @@
       UpdateRect.bottom = OldCursorY;
       ConioDrawRegion(Console, &UpdateRect);
       /* Redraw char at new position (shows cursor) */
-      ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY,
-                             &(UpdateRect.left), &(UpdateRect.top));
+      UpdateRect.left = Buff->CurrentX;
+      UpdateRect.top = Buff->CurrentY;
       UpdateRect.right = UpdateRect.left;
       UpdateRect.bottom = UpdateRect.top;
       ConioDrawRegion(Console, &UpdateRect);
@@ -1236,16 +1212,14 @@
   PCSRSS_CONSOLE Console;
   PGUI_CONSOLE_DATA GuiData;
   RECT CursorRect;
-  ULONG CursorX, CursorY;
 
   GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
   GuiData->CursorBlinkOn = ! GuiData->CursorBlinkOn;
 
-  GuiConsoleGetLogicalCursorPos(Console->ActiveBuffer, &CursorX, &CursorY);
-  CursorRect.left = CursorX;
-  CursorRect.top = CursorY;
-  CursorRect.right = CursorX;
-  CursorRect.bottom = CursorY;
+  CursorRect.left = Console->ActiveBuffer->CurrentX;
+  CursorRect.top = Console->ActiveBuffer->CurrentY;
+  CursorRect.right = CursorRect.left;
+  CursorRect.bottom = CursorRect.top;
   GuiDrawRegion(Console, &CursorRect);
 }
 
@@ -1575,21 +1549,16 @@
 {
   DWORD windx, windy;
   RECT rect;
-  PCSRSS_SCREEN_BUFFER ActiveBuffer;
-  PCSRSS_PROCESS_DATA ProcessData = NULL;
-
-  if (Console->ProcessList.Flink != &Console->ProcessList)
-    {
-      ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry);
-      ConioLockScreenBuffer(ProcessData, Console->hActiveBuffer, (Object_t **)&ActiveBuffer);
-    }
+  PCSRSS_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
+
+  EnterCriticalSection(&ActiveBuffer->Header.Lock);
 
   /* apply text / background color */
   GuiData->ScreenText = pConInfo->ScreenText;
   GuiData->ScreenBackground = pConInfo->ScreenBackground;
 
   /* apply cursor size */
-  Console->ActiveBuffer->CursorInfo.dwSize = max(min(pConInfo->CursorSize, 1), 100);
+  ActiveBuffer->CursorInfo.dwSize = max(min(pConInfo->CursorSize, 1), 100);
 
   windx = LOWORD(pConInfo->ScreenBuffer);
   windy = HIWORD(pConInfo->ScreenBuffer);
@@ -1640,13 +1609,13 @@
                 }
 #endif
                 Offset += (diff * 2);
-                BufferOffset += (Console->ActiveBuffer->MaxX * 2);
+                BufferOffset += (ActiveBuffer->MaxX * 2);
             }
         }
 
-        if (windy > Console->ActiveBuffer->MaxY)
-        {
-            diff = windy - Console->ActiveBuffer->MaxX;
+        if (windy > ActiveBuffer->MaxY)
+        {
+            diff = windy - ActiveBuffer->MaxX;
 #if HAVE_WMEMSET
                 wmemset((WCHAR*)&Buffer[Offset], value, diff * windx);
 #else
@@ -1658,18 +1627,15 @@
 #endif
         }
 
-        (void)InterlockedExchangePointer((PVOID volatile  *)&Console->ActiveBuffer->Buffer, Buffer);
+        (void)InterlockedExchangePointer((PVOID volatile  *)&ActiveBuffer->Buffer, Buffer);
         HeapFree(Win32CsrApiHeap, 0, OldBuffer);
-        Console->ActiveBuffer->MaxX = windx;
-        Console->ActiveBuffer->MaxY = windy;
+        ActiveBuffer->MaxX = windx;
+        ActiveBuffer->MaxY = windy;
         InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE);
      }
      else
      {
-        if (ProcessData)
-        {
-            ConioUnlockScreenBuffer(ActiveBuffer);
-        }
+        LeaveCriticalSection(&ActiveBuffer->Header.Lock);
         return;
      }
   }
@@ -1687,10 +1653,7 @@
       }
       else
       {
-          if (ProcessData)
-          {
-              ConioUnlockScreenBuffer(ActiveBuffer);
-          }
+          LeaveCriticalSection(&ActiveBuffer->Header.Lock);
           return;
       }
   }
@@ -1709,7 +1672,7 @@
 
       MoveWindow(pConInfo->hConsoleWindow, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);
 
-      if (Console->Size.X < Console->ActiveBuffer->MaxX)
+      if (Console->Size.X < ActiveBuffer->MaxX)
       {
           /* show scrollbar when window becomes smaller than active screen buffer */
           ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, TRUE);
@@ -1720,10 +1683,7 @@
           ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, FALSE);
       }
   }
-  if (ProcessData)
-  {
-      ConioUnlockScreenBuffer(ActiveBuffer);
-  }
+  LeaveCriticalSection(&ActiveBuffer->Header.Lock);
   InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE);
 }
 
@@ -2087,10 +2047,10 @@
 }
 
 static BOOL STDCALL
-GuiChangeIcon(PCSRSS_CONSOLE Console)
-{
-  SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)Console->hWindowIcon);
-  SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)Console->hWindowIcon);
+GuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon)
+{
+  SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)hWindowIcon);
+  SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon);
 
   return TRUE;
 }

Modified: trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c?rev=34568&r1=34567&r2=34568&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c [iso-8859-1] Thu Jul 17 16:53:39 2008
@@ -86,8 +86,7 @@
   LONG i;
   PBYTE Src, SrcEnd;
 
-  Src = Buff->Buffer + (((Region->top + Buff->ShowY) % Buff->MaxY) * Buff->MaxX
-                        + Region->left + Buff->ShowX) * 2;
+  Src = Buff->Buffer + ConioGetBufferOffset(Buff, Region->left, Region->top);
   SrcDelta = Buff->MaxX * 2;
   SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2;
   DestDelta = ConioRectWidth(Region) * 2;
@@ -108,7 +107,6 @@
 {
   DWORD BytesReturned;
   PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
-  LONG CursorX, CursorY;
   PCONSOLE_DRAW ConsoleDraw;
   UINT ConsoleDrawSize;
 
@@ -125,13 +123,12 @@
       DPRINT1("HeapAlloc failed\n");
       return;
     }
-  ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &CursorX, &CursorY);
   ConsoleDraw->X = Region->left;
   ConsoleDraw->Y = Region->top;
   ConsoleDraw->SizeX = ConioRectWidth(Region);
   ConsoleDraw->SizeY = ConioRectHeight(Region);
-  ConsoleDraw->CursorX = CursorX;
-  ConsoleDraw->CursorY = CursorY;
+  ConsoleDraw->CursorX = Buff->CurrentX;
+  ConsoleDraw->CursorY = Buff->CurrentY;
 
   TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region);
 
@@ -189,7 +186,6 @@
 TuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY)
 {
   CONSOLE_SCREEN_BUFFER_INFO Info;
-  LONG CursorX, CursorY;
   DWORD BytesReturned;
 
   if (ActiveConsole->ActiveBuffer != Buff)
@@ -197,9 +193,8 @@
       return TRUE;
     }
 
-  ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &CursorX, &CursorY);
-  Info.dwCursorPosition.X = CursorX;
-  Info.dwCursorPosition.Y = CursorY;
+  Info.dwCursorPosition.X = Buff->CurrentX;
+  Info.dwCursorPosition.Y = Buff->CurrentY;
   Info.wAttributes = Buff->DefaultAttrib;
 
   if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,



More information about the Ros-diffs mailing list