[WIN32CSR] Protect ProcessData->Console with the HandleTableLock.
[reactos.git] / reactos / subsystems / win32 / csrss / win32csr / conio.c
index 0db7c91..cb75428 100644 (file)
@@ -8,9 +8,8 @@
 
 /* INCLUDES ******************************************************************/
 
-#include "w32csr.h"
-
 #define NDEBUG
+#include "w32csr.h"
 #include <debug.h>
 
 /* GLOBALS *******************************************************************/
 #define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \
   WideCharToMultiByte((Console)->CodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL)
 
+#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \
+  MultiByteToWideChar((Console)->CodePage, 0, (sChar), 1, (dWChar), 1)
+
 #define ConsoleUnicodeCharToAnsiChar(Console, dChar, sWChar) \
   WideCharToMultiByte((Console)->OutputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL)
 
-#define ConsoleAnsiCharToUnicodeChar(Console, sWChar, dChar) \
-  MultiByteToWideChar((Console)->OutputCodePage, 0, (dChar), 1, (sWChar), 1)
+#define ConsoleAnsiCharToUnicodeChar(Console, dWChar, sChar) \
+  MultiByteToWideChar((Console)->OutputCodePage, 0, (sChar), 1, (dWChar), 1)
 
 
 /* FUNCTIONS *****************************************************************/
 NTSTATUS FASTCALL
 ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console)
 {
-  PCSRSS_CONSOLE ProcessConsole = ProcessData->Console;
+  PCSRSS_CONSOLE ProcessConsole;
+
+  RtlEnterCriticalSection(&ProcessData->HandleTableLock);
+  ProcessConsole = ProcessData->Console;
 
   if (!ProcessConsole)
     {
       *Console = NULL;
+      RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
       return STATUS_INVALID_HANDLE;
     }
 
   InterlockedIncrement(&ProcessConsole->Header.ReferenceCount);
+  RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
   EnterCriticalSection(&(ProcessConsole->Header.Lock));
   *Console = ProcessConsole;
 
@@ -66,7 +73,7 @@ ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, DWORD
 
       Thread = CreateRemoteThread(ProcessData->Process, NULL, 0,
                                   (LPTHREAD_START_ROUTINE) ProcessData->CtrlDispatcher,
-                                  (PVOID) Event, 0, NULL);
+                                  UlongToPtr(Event), 0, NULL);
       if (NULL == Thread)
         {
           DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError());
@@ -83,29 +90,23 @@ ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData)
   ConioConsoleCtrlEventTimeout(Event, ProcessData, 0);
 }
 
-DWORD FASTCALL
-ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
+PBYTE FASTCALL
+ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
 {
-  return 2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X);
+  return &Buff->Buffer[2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X)];
 }
 
-#define GET_CELL_BUFFER(b,o)\
-(b)->Buffer[(o)++]
-
-#define SET_CELL_BUFFER(b,o,c,a)\
-(b)->Buffer[(o)++]=(c),\
-(b)->Buffer[(o)++]=(a)
-
 static VOID FASTCALL
 ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff)
 {
-  DWORD Offset = ConioGetBufferOffset(Buff, 0, Buff->CurrentY);
+  PBYTE Ptr = ConioCoordToPointer(Buff, 0, Buff->CurrentY);
   UINT Pos;
 
   for (Pos = 0; Pos < Buff->MaxX; Pos++)
     {
-      /* Fill the cell: Offset is incremented by the macro */
-      SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib);
+      /* Fill the cell */
+      *Ptr++ = ' ';
+      *Ptr++ = Buff->DefaultAttrib;
     }
 }
 
@@ -139,7 +140,7 @@ CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console,
   return STATUS_SUCCESS;
 }
 
-static NTSTATUS STDCALL
+static NTSTATUS WINAPI
 CsrInitConsole(PCSRSS_CONSOLE Console)
 {
   NTSTATUS Status;
@@ -191,7 +192,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
     }
   /* init screen buffer with defaults */
   NewBuffer->CursorInfo.bVisible = TRUE;
-  NewBuffer->CursorInfo.dwSize = 5;
+  NewBuffer->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE;
   /* make console active, and insert into console list */
   Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer;
 
@@ -251,26 +252,19 @@ CSR_API(CsrAllocConsole)
     Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
     Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
-    if (ProcessData == NULL)
-    {
-        DPRINT1("No process data\n");
-        return Request->Status = STATUS_INVALID_PARAMETER;
-    }
-
+    RtlEnterCriticalSection(&ProcessData->HandleTableLock);
     if (ProcessData->Console)
     {
         DPRINT1("Process already has a console\n");
-        Request->Status = STATUS_INVALID_PARAMETER;
+        RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
         return STATUS_INVALID_PARAMETER;
     }
 
-    /* Assume success */
-    Request->Status = STATUS_SUCCESS;
-
     /* If we don't need a console, then get out of here */
     if (!Request->Data.AllocConsoleRequest.ConsoleNeeded)
     {
         DPRINT("No console needed\n");
+        RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
         return STATUS_SUCCESS;
     }
 
@@ -284,7 +278,7 @@ CSR_API(CsrAllocConsole)
         if (NULL == Console)
         {
             DPRINT1("Not enough memory for console\n");
-            Request->Status = STATUS_NO_MEMORY;
+            RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
             return STATUS_NO_MEMORY;
         }
         /* initialize list head */
@@ -292,12 +286,13 @@ CSR_API(CsrAllocConsole)
         /* insert process data required for GUI initialization */
         InsertHeadList(&Console->ProcessList, &ProcessData->ProcessEntry);
         /* Initialize the Console */
-        Request->Status = CsrInitConsole(Console);
-        if (!NT_SUCCESS(Request->Status))
+        Status = CsrInitConsole(Console);
+        if (!NT_SUCCESS(Status))
         {
             DPRINT1("Console init failed\n");
             HeapFree(Win32CsrApiHeap, 0, Console);
-            return Request->Status;
+            RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+            return Status;
         }
     }
     else
@@ -328,7 +323,8 @@ CSR_API(CsrAllocConsole)
             DPRINT1("Failed to insert object\n");
             ConioDeleteConsole((Object_t *) Console);
             ProcessData->Console = 0;
-            return Request->Status = Status;
+            RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+            return Status;
         }
 
         Status = Win32CsrInsertObject(ProcessData,
@@ -343,7 +339,8 @@ CSR_API(CsrAllocConsole)
             Win32CsrReleaseObject(ProcessData,
                                   Request->Data.AllocConsoleRequest.InputHandle);
             ProcessData->Console = 0;
-            return Request->Status = Status;
+            RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+            return Status;
         }
     }
 
@@ -366,7 +363,8 @@ CSR_API(CsrAllocConsole)
                                   Request->Data.AllocConsoleRequest.InputHandle);
         }
         ProcessData->Console = 0;
-        return Request->Status = Status;
+        RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+        return Status;
     }
 
     /* Set the Ctrl Dispatcher */
@@ -379,30 +377,16 @@ CSR_API(CsrAllocConsole)
         InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry);
     }
 
+    RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
     return STATUS_SUCCESS;
 }
 
 CSR_API(CsrFreeConsole)
 {
-  PCSRSS_CONSOLE Console;
-
-
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
-  if (ProcessData == NULL || ProcessData->Console == NULL)
-    {
-      return Request->Status = STATUS_INVALID_PARAMETER;
-    }
-
-  Console = ProcessData->Console;
-  ProcessData->Console = NULL;
-  RemoveEntryList(&ProcessData->ProcessEntry);
-  if (0 == InterlockedDecrement(&Console->Header.ReferenceCount))
-    {
-      ConioDeleteConsole((Object_t *) Console);
-    }
-  return STATUS_SUCCESS;
+  return Win32CsrReleaseConsole(ProcessData);
 }
 
 static VOID FASTCALL
@@ -433,7 +417,7 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                   CHAR *Buffer, DWORD Length, BOOL Attrib)
 {
   UINT i;
-  DWORD Offset;
+  PBYTE Ptr;
   RECT UpdateRect;
   LONG CursorStartX, CursorStartY;
   UINT ScrolledLines;
@@ -474,8 +458,9 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                     {
                       Buff->CurrentX--;
                     }
-                  Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY);
-                  SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib);
+                  Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY);
+                  Ptr[0] = ' ';
+                  Ptr[1] = Buff->DefaultAttrib;
                   UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX);
                   UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
                 }
@@ -500,12 +485,11 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                 {
                   EndX = Buff->MaxX;
                 }
-              Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY);
+              Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY);
               while (Buff->CurrentX < EndX)
                 {
-                  Buff->Buffer[Offset] = ' ';
-                  Buff->Buffer[Offset + 1] = Buff->DefaultAttrib;
-                  Offset += 2;
+                  *Ptr++ = ' ';
+                  *Ptr++ = Buff->DefaultAttrib;
                   Buff->CurrentX++;
                 }
               UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX - 1);
@@ -526,11 +510,11 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
         }
       UpdateRect.left = min(UpdateRect.left, (LONG)Buff->CurrentX);
       UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
-      Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY);
-      Buff->Buffer[Offset++] = Buffer[i];
+      Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY);
+      Ptr[0] = Buffer[i];
       if (Attrib)
         {
-          Buff->Buffer[Offset] = Buff->DefaultAttrib;
+          Ptr[1] = Buff->DefaultAttrib;
         }
       Buff->CurrentX++;
       if (Buff->CurrentX == Buff->MaxX)
@@ -582,7 +566,7 @@ CSR_API(CsrReadConsole)
                                &Console, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
   Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent;
   for (i = 0; i < nNumberOfCharsToRead && Console->InputEvents.Flink != &Console->InputEvents; i++)
@@ -591,7 +575,6 @@ CSR_API(CsrReadConsole)
       CurrentEntry = RemoveHeadList(&Console->InputEvents);
       if (IsListEmpty(&Console->InputEvents))
       {
-         CHECKPOINT;
          ResetEvent(Console->ActiveEvent);
       }
       Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
@@ -625,7 +608,6 @@ CSR_API(CsrReadConsole)
                   ConioUnlockConsole(Console);
                   HeapFree(Win32CsrApiHeap, 0, Input);
                   Request->Data.ReadConsoleRequest.NrCharactersRead = 0;
-                  Request->Status = STATUS_NOTIFY_CLEANUP;
                   return STATUS_NOTIFY_CLEANUP;
 
                 }
@@ -636,7 +618,7 @@ CSR_API(CsrReadConsole)
           else
             {
               if(Request->Data.ReadConsoleRequest.Unicode)
-                UnicodeBuffer[i] = Input->InputEvent.Event.KeyEvent.uChar.AsciiChar; /* FIXME */
+                ConsoleInputAnsiCharToUnicodeChar(Console, &UnicodeBuffer[i], &Input->InputEvent.Event.KeyEvent.uChar.AsciiChar);
               else
                 Buffer[i] = Input->InputEvent.Event.KeyEvent.uChar.AsciiChar;
             }
@@ -659,27 +641,27 @@ CSR_API(CsrReadConsole)
   Request->Data.ReadConsoleRequest.NrCharactersRead = i;
   if (0 == i)
     {
-      Request->Status = STATUS_PENDING;    /* we didn't read anything */
+      Status = STATUS_PENDING;    /* we didn't read anything */
     }
   else if (0 != (Console->Mode & ENABLE_LINE_INPUT))
     {
       if (0 == Console->WaitingLines ||
           (Request->Data.ReadConsoleRequest.Unicode ? (L'\n' != UnicodeBuffer[i - 1]) : ('\n' != Buffer[i - 1])))
         {
-          Request->Status = STATUS_PENDING; /* line buffered, didn't get a complete line */
+          Status = STATUS_PENDING; /* line buffered, didn't get a complete line */
         }
       else
         {
           Console->WaitingLines--;
-          Request->Status = STATUS_SUCCESS; /* line buffered, did get a complete line */
+          Status = STATUS_SUCCESS; /* line buffered, did get a complete line */
         }
     }
   else
     {
-      Request->Status = STATUS_SUCCESS;  /* not line buffered, did read something */
+      Status = STATUS_SUCCESS;  /* not line buffered, did read something */
     }
 
-  if (Request->Status == STATUS_PENDING)
+  if (Status == STATUS_PENDING)
     {
       Console->EchoCount = nNumberOfCharsToRead - i;
     }
@@ -696,10 +678,10 @@ CSR_API(CsrReadConsole)
       Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
     }
 
-  return Request->Status;
+  return Status;
 }
 
-BOOLEAN __inline ConioGetIntersection(
+__inline BOOLEAN ConioGetIntersection(
   RECT *Intersection,
   RECT *Rect1,
   RECT *Rect2)
@@ -725,7 +707,7 @@ BOOLEAN __inline ConioGetIntersection(
   return TRUE;
 }
 
-BOOLEAN __inline ConioGetUnion(
+__inline BOOLEAN ConioGetUnion(
   RECT *Union,
   RECT *Rect1,
   RECT *Rect2)
@@ -786,8 +768,8 @@ ConioMoveRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer,
     }
   for (i = 0; i < Height; i++)
     {
-      PWORD SRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, SY)];
-      PWORD DRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, DY)];
+      PWORD SRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, SY);
+      PWORD DRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, DY);
 
       SX = SrcRegion->left;
       DX = DstRegion->left;
@@ -852,7 +834,7 @@ CSR_API(CsrWriteConsole)
       DPRINT1("Invalid request size\n");
       Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
       Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-      return Request->Status = STATUS_INVALID_PARAMETER;
+      return STATUS_INVALID_PARAMETER;
     }
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
 
@@ -861,7 +843,7 @@ CSR_API(CsrWriteConsole)
 
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   if(Request->Data.WriteConsoleRequest.Unicode)
@@ -893,8 +875,8 @@ CSR_API(CsrWriteConsole)
       Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
       if (NT_SUCCESS(Status))
         {
-          Request->Status = ConioWriteConsole(Console, Buff, Buffer,
-                                              Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE);
+          Status = ConioWriteConsole(Console, Buff, Buffer,
+                                     Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE);
           if (NT_SUCCESS(Status))
             {
               Written = Request->Data.WriteConsoleRequest.NrCharactersToWrite;
@@ -910,10 +892,10 @@ CSR_API(CsrWriteConsole)
 
   Request->Data.WriteConsoleRequest.NrCharactersWritten = Written;
 
-  return Request->Status = Status;
+  return Status;
 }
 
-VOID STDCALL
+VOID WINAPI
 ConioDeleteScreenBuffer(Object_t *Object)
 {
   PCSRSS_SCREEN_BUFFER Buffer = (PCSRSS_SCREEN_BUFFER) Object;
@@ -933,7 +915,7 @@ ConioDrawConsole(PCSRSS_CONSOLE Console)
 }
 
 
-VOID STDCALL
+VOID WINAPI
 ConioDeleteConsole(Object_t *Object)
 {
   PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Object;
@@ -965,7 +947,7 @@ ConioDeleteConsole(Object_t *Object)
   HeapFree(Win32CsrApiHeap, 0, Console);
 }
 
-VOID STDCALL
+VOID WINAPI
 CsrInitConsoleSupport(VOID)
 {
   DPRINT("CSR: CsrInitConsoleSupport()\n");
@@ -978,7 +960,6 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
                  ConsoleInput *KeyEventRecord)
 {
   BOOL updown;
-  BOOL bClientWake = FALSE;
   ConsoleInput *TempInput;
 
   if (0 != (Console->Mode & (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)))
@@ -1022,8 +1003,6 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
         {
           Console->WaitingLines++;
         }
-      bClientWake = TRUE;
-      SetEvent(Console->ActiveEvent);
     }
   KeyEventRecord->Echoed = FALSE;
   if (0 != (Console->Mode & (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT))
@@ -1055,10 +1034,7 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
           RemoveEntryList(&KeyEventRecord->ListEntry);
           HeapFree(Win32CsrApiHeap, 0, KeyEventRecord);
           Console->WaitingChars -= 2;
-        }
-      else
-        {
-          SetEvent(Console->ActiveEvent);
+          return;
         }
     }
   else
@@ -1079,10 +1055,7 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
     }
 
   /* Console->WaitingChars++; */
-  if (bClientWake || 0 == (Console->Mode & ENABLE_LINE_INPUT))
-    {
-      SetEvent(Console->ActiveEvent);
-    }
+  SetEvent(Console->ActiveEvent);
 }
 
 static DWORD FASTCALL
@@ -1115,7 +1088,7 @@ ConioGetShiftState(PBYTE KeyState)
   return ssOut;
 }
 
-VOID STDCALL
+VOID WINAPI
 ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
 {
   static BYTE KeyState[256] = { 0 };
@@ -1298,6 +1271,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
 CSR_API(CsrGetScreenBufferInfo)
 {
   NTSTATUS Status;
+  PCSRSS_CONSOLE Console;
   PCSRSS_SCREEN_BUFFER Buff;
   PCONSOLE_SCREEN_BUFFER_INFO pInfo;
 
@@ -1306,10 +1280,16 @@ CSR_API(CsrGetScreenBufferInfo)
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
+  Status = ConioConsoleFromProcessData(ProcessData, &Console);
+  if (! NT_SUCCESS(Status))
+    {
+      return Status;
+    }
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      ConioUnlockConsole(Console);
+      return Status;
     }
   pInfo = &Request->Data.ScreenBufferInfoRequest.Info;
   pInfo->dwSize.X = Buff->MaxX;
@@ -1317,17 +1297,16 @@ CSR_API(CsrGetScreenBufferInfo)
   pInfo->dwCursorPosition.X = Buff->CurrentX;
   pInfo->dwCursorPosition.Y = Buff->CurrentY;
   pInfo->wAttributes = Buff->DefaultAttrib;
-  pInfo->srWindow.Left = 0;
-  pInfo->srWindow.Right = Buff->MaxX - 1;
-  pInfo->srWindow.Top = 0;
-  pInfo->srWindow.Bottom = Buff->MaxY - 1;
+  pInfo->srWindow.Left = Buff->ShowX;
+  pInfo->srWindow.Right = Buff->ShowX + Console->Size.X - 1;
+  pInfo->srWindow.Top = Buff->ShowY;
+  pInfo->srWindow.Bottom = Buff->ShowY + Console->Size.Y - 1;
   pInfo->dwMaximumWindowSize.X = Buff->MaxX;
   pInfo->dwMaximumWindowSize.Y = Buff->MaxY;
   ConioUnlockScreenBuffer(Buff);
+  ConioUnlockConsole(Console);
 
-  Request->Status = STATUS_SUCCESS;
-
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetCursor)
@@ -1343,7 +1322,7 @@ CSR_API(CsrSetCursor)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@@ -1353,7 +1332,7 @@ CSR_API(CsrSetCursor)
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   NewCursorX = Request->Data.SetCursorRequest.Position.X;
@@ -1363,7 +1342,7 @@ CSR_API(CsrSetCursor)
     {
       ConioUnlockScreenBuffer(Buff);
       ConioUnlockConsole(Console);
-      return Request->Status = STATUS_INVALID_PARAMETER;
+      return STATUS_INVALID_PARAMETER;
     }
   OldCursorX = Buff->CurrentX;
   OldCursorY = Buff->CurrentY;
@@ -1375,14 +1354,14 @@ CSR_API(CsrSetCursor)
         {
           ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
-          return Request->Status = STATUS_UNSUCCESSFUL;
+          return STATUS_UNSUCCESSFUL;
         }
     }
 
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 static VOID FASTCALL
@@ -1433,7 +1412,7 @@ CSR_API(CsrWriteConsoleOutputChar)
       DPRINT1("Invalid request size\n");
       Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
       Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-      return Request->Status = STATUS_INVALID_PARAMETER;
+      return STATUS_INVALID_PARAMETER;
     }
 
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
@@ -1512,7 +1491,7 @@ CSR_API(CsrWriteConsoleOutputChar)
       ConioUnlockConsole(Console);
     }
   Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written;
-  return Request->Status = Status;
+  return Status;
 }
 
 CSR_API(CsrFillOutputChar)
@@ -1533,14 +1512,14 @@ CSR_API(CsrFillOutputChar)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   X = Request->Data.FillOutputRequest.Position.X;
@@ -1578,7 +1557,7 @@ CSR_API(CsrFillOutputChar)
   ConioUnlockConsole(Console);
   Length = Request->Data.FillOutputRequest.Length;
   Request->Data.FillOutputRequest.NrCharactersWritten = Length;
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrReadInputEvent)
@@ -1598,7 +1577,7 @@ CSR_API(CsrReadInputEvent)
   Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   /* only get input if there is any */
@@ -1657,7 +1636,7 @@ CSR_API(CsrReadInputEvent)
 
   ConioUnlockConsole(Console);
 
-  return Request->Status = Status;
+  return Status;
 }
 
 CSR_API(CsrWriteConsoleOutputAttrib)
@@ -1679,7 +1658,7 @@ CSR_API(CsrWriteConsoleOutputAttrib)
       DPRINT1("Invalid request size\n");
       Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
       Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-      return Request->Status = STATUS_INVALID_PARAMETER;
+      return STATUS_INVALID_PARAMETER;
     }
 
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
@@ -1687,7 +1666,7 @@ CSR_API(CsrWriteConsoleOutputAttrib)
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData,
@@ -1697,7 +1676,7 @@ CSR_API(CsrWriteConsoleOutputAttrib)
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X;
@@ -1734,7 +1713,7 @@ CSR_API(CsrWriteConsoleOutputAttrib)
 
   ConioUnlockScreenBuffer(Buff);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrFillOutputAttrib)
@@ -1752,7 +1731,7 @@ CSR_API(CsrFillOutputAttrib)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@@ -1761,7 +1740,7 @@ CSR_API(CsrFillOutputAttrib)
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   X = Request->Data.FillOutputAttribRequest.Coord.X;
@@ -1794,7 +1773,7 @@ CSR_API(CsrFillOutputAttrib)
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 
@@ -1811,13 +1790,13 @@ CSR_API(CsrGetCursorInfo)
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
   Request->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible;
   Request->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize;
   ConioUnlockScreenBuffer(Buff);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetCursorInfo)
@@ -1836,14 +1815,14 @@ CSR_API(CsrSetCursorInfo)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   Size = Request->Data.SetCursorInfoRequest.Info.dwSize;
@@ -1867,14 +1846,14 @@ CSR_API(CsrSetCursorInfo)
         {
           ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
-          return Request->Status = STATUS_UNSUCCESSFUL;
+          return STATUS_UNSUCCESSFUL;
         }
     }
 
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetTextAttrib)
@@ -1888,14 +1867,14 @@ CSR_API(CsrSetTextAttrib)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib;
@@ -1905,14 +1884,14 @@ CSR_API(CsrSetTextAttrib)
         {
           ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
-          return Request->Status = STATUS_UNSUCCESSFUL;
+          return STATUS_UNSUCCESSFUL;
         }
     }
 
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleMode)
@@ -1930,7 +1909,7 @@ CSR_API(CsrSetConsoleMode)
                              (Object_t **) &Console, GENERIC_WRITE);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Buff = (PCSRSS_SCREEN_BUFFER)Console;
@@ -1949,7 +1928,7 @@ CSR_API(CsrSetConsoleMode)
 
   Win32CsrReleaseObjectByPointer((Object_t *)Console);
 
-  return Request->Status = Status;
+  return Status;
 }
 
 CSR_API(CsrGetConsoleMode)
@@ -1966,9 +1945,9 @@ CSR_API(CsrGetConsoleMode)
                              (Object_t **) &Console, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
-  Request->Status = STATUS_SUCCESS;
+  Status = STATUS_SUCCESS;
   Buff = (PCSRSS_SCREEN_BUFFER) Console;
   if (CONIO_CONSOLE_MAGIC == Console->Header.Type)
     {
@@ -1980,11 +1959,11 @@ CSR_API(CsrGetConsoleMode)
     }
   else
     {
-      Request->Status = STATUS_INVALID_HANDLE;
+      Status = STATUS_INVALID_HANDLE;
     }
 
   Win32CsrReleaseObjectByPointer((Object_t *)Console);
-  return Request->Status;
+  return Status;
 }
 
 CSR_API(CsrCreateScreenBuffer)
@@ -1995,15 +1974,11 @@ CSR_API(CsrCreateScreenBuffer)
 
   DPRINT("CsrCreateScreenBuffer\n");
 
-  if (ProcessData == NULL)
-    {
-      return Request->Status = STATUS_INVALID_PARAMETER;
-    }
-
+  RtlEnterCriticalSection(&ProcessData->HandleTableLock);
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@@ -2023,7 +1998,7 @@ CSR_API(CsrCreateScreenBuffer)
       else
         {
           Buff->CursorInfo.bVisible = TRUE;
-          Buff->CursorInfo.dwSize = 5;
+          Buff->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE;
         }
 
       if (Buff->MaxX == 0)
@@ -2037,13 +2012,9 @@ CSR_API(CsrCreateScreenBuffer)
         }
 
       Status = CsrInitConsoleScreenBuffer(Console, Buff);
-      if(NT_SUCCESS(Status))
+      if(NT_SUCCESS(Status))
         {
-          Request->Status = Status;
-        }
-      else
-        {
-          Request->Status = Win32CsrInsertObject(ProcessData,
+          Status = Win32CsrInsertObject(ProcessData,
             &Request->Data.CreateScreenBufferRequest.OutputHandle,
             &Buff->Header,
             Request->Data.CreateScreenBufferRequest.Access,
@@ -2052,11 +2023,12 @@ CSR_API(CsrCreateScreenBuffer)
     }
   else
     {
-      Request->Status = STATUS_INSUFFICIENT_RESOURCES;
+      Status = STATUS_INSUFFICIENT_RESOURCES;
     }
 
   ConioUnlockConsole(Console);
-  return Request->Status;
+  RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+  return Status;
 }
 
 CSR_API(CsrSetScreenBuffer)
@@ -2070,7 +2042,7 @@ CSR_API(CsrSetScreenBuffer)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@@ -2080,14 +2052,14 @@ CSR_API(CsrSetScreenBuffer)
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   if (Buff == Console->ActiveBuffer)
     {
       ConioUnlockScreenBuffer(Buff);
       ConioUnlockConsole(Console);
-      return Request->Status = STATUS_SUCCESS;
+      return STATUS_SUCCESS;
     }
 
   /* drop reference to old buffer, maybe delete */
@@ -2105,7 +2077,7 @@ CSR_API(CsrSetScreenBuffer)
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetTitle)
@@ -2123,17 +2095,13 @@ CSR_API(CsrSetTitle)
       DPRINT1("Invalid request size\n");
       Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
       Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-      return Request->Status = STATUS_INVALID_PARAMETER;
+      return STATUS_INVALID_PARAMETER;
     }
 
   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))
-    {
-      Request->Status = Status;
-    }
-  else
+  if(NT_SUCCESS(Status))
     {
       Buffer =  RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length);
       if (Buffer)
@@ -2145,21 +2113,21 @@ CSR_API(CsrSetTitle)
           memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length);
           if (! ConioChangeTitle(Console))
             {
-              Request->Status = STATUS_UNSUCCESSFUL;
+              Status = STATUS_UNSUCCESSFUL;
             }
           else
             {
-              Request->Status = STATUS_SUCCESS;
+              Status = STATUS_SUCCESS;
             }
         }
       else
         {
-          Request->Status = STATUS_NO_MEMORY;
+          Status = STATUS_NO_MEMORY;
         }
       ConioUnlockConsole(Console);
     }
 
-  return Request->Status;
+  return Status;
 }
 
 CSR_API(CsrGetTitle)
@@ -2176,7 +2144,7 @@ CSR_API(CsrGetTitle)
   if (! NT_SUCCESS(Status))
     {
       DPRINT1("Can't get console\n");
-      return Request->Status = Status;
+      return Status;
     }
 
   /* Copy title of the console to the user title buffer */
@@ -2193,9 +2161,7 @@ CSR_API(CsrGetTitle)
       Request->Header.u1.s1.TotalLength = Length;
       Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
     }
-  Request->Status = STATUS_SUCCESS;
-
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrWriteConsoleOutput)
@@ -2210,7 +2176,7 @@ CSR_API(CsrWriteConsoleOutput)
   COORD BufferCoord;
   COORD BufferSize;
   NTSTATUS Status;
-  DWORD Offset;
+  PBYTE Ptr;
   DWORD PSize;
 
   DPRINT("CsrWriteConsoleOutput\n");
@@ -2218,7 +2184,7 @@ CSR_API(CsrWriteConsoleOutput)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@@ -2230,7 +2196,7 @@ CSR_API(CsrWriteConsoleOutput)
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize;
@@ -2243,7 +2209,7 @@ CSR_API(CsrWriteConsoleOutput)
     {
       ConioUnlockScreenBuffer(Buff);
       ConioUnlockConsole(Console);
-      return Request->Status = STATUS_ACCESS_VIOLATION;
+      return STATUS_ACCESS_VIOLATION;
     }
   WriteRegion.left = Request->Data.WriteConsoleOutputRequest.WriteRegion.Left;
   WriteRegion.top = Request->Data.WriteConsoleOutputRequest.WriteRegion.Top;
@@ -2264,25 +2230,26 @@ CSR_API(CsrWriteConsoleOutput)
 
       /* It is okay to have a WriteRegion completely outside the screen buffer.
          No data is written then. */
-      return Request->Status = STATUS_SUCCESS;
+      return STATUS_SUCCESS;
     }
 
   for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++)
     {
       CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X;
-      Offset = ConioGetBufferOffset(Buff, WriteRegion.left, Y);
+      Ptr = ConioCoordToPointer(Buff, WriteRegion.left, Y);
       for (X = WriteRegion.left; X <= WriteRegion.right; X++)
         {
+          CHAR AsciiChar;
           if (Request->Data.WriteConsoleOutputRequest.Unicode)
             {
-              CHAR AsciiChar;
               ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar);
-              SET_CELL_BUFFER(Buff, Offset, AsciiChar, CurCharInfo->Attributes);
             }
           else
             {
-              SET_CELL_BUFFER(Buff, Offset, CurCharInfo->Char.AsciiChar, CurCharInfo->Attributes);
+              AsciiChar = CurCharInfo->Char.AsciiChar;
             }
+          *Ptr++ = AsciiChar;
+          *Ptr++ = CurCharInfo->Attributes;
           CurCharInfo++;
         }
     }
@@ -2297,7 +2264,7 @@ CSR_API(CsrWriteConsoleOutput)
   Request->Data.WriteConsoleOutputRequest.WriteRegion.Left = WriteRegion.left;
   Request->Data.WriteConsoleOutputRequest.WriteRegion.Top = WriteRegion.top;
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrFlushInputBuffer)
@@ -2317,7 +2284,7 @@ CSR_API(CsrFlushInputBuffer)
                             GENERIC_WRITE);
   if(! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   /* Discard all entries in the input event queue */
@@ -2333,7 +2300,7 @@ CSR_API(CsrFlushInputBuffer)
 
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrScrollConsoleScreenBuffer)
@@ -2363,7 +2330,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@@ -2372,7 +2339,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   ScrollRectangle.left = Request->Data.ScrollConsoleScreenBufferRequest.ScrollRectangle.Left;
@@ -2386,7 +2353,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
     {
       ConioUnlockScreenBuffer(Buff);
       ConioUnlockConsole(Console);
-      return Request->Status = STATUS_SUCCESS;
+      return STATUS_SUCCESS;
     }
 
   /* If the source was clipped on the left or top, adjust the destination accordingly */
@@ -2409,7 +2376,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
         {
           ConioUnlockConsole(Console);
           ConioUnlockScreenBuffer(Buff);
-          return Request->Status = STATUS_SUCCESS;
+          return STATUS_SUCCESS;
       }
     }
   else
@@ -2443,7 +2410,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrReadConsoleOutputChar)
@@ -2468,14 +2435,14 @@ CSR_API(CsrReadConsoleOutputChar)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Request->Status = Status;
+      return Status;
     }
 
   Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X;
@@ -2508,7 +2475,6 @@ CSR_API(CsrReadConsoleOutputChar)
     }
 
   *ReadBuffer = 0;
-  Request->Status = STATUS_SUCCESS;
   Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos;
   Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
 
@@ -2522,7 +2488,7 @@ CSR_API(CsrReadConsoleOutputChar)
       Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
     }
 
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 
@@ -2544,7 +2510,7 @@ CSR_API(CsrReadConsoleOutputAttrib)
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X;
@@ -2571,7 +2537,6 @@ CSR_API(CsrReadConsoleOutputAttrib)
 
   *ReadBuffer = 0;
 
-  Request->Status = STATUS_SUCCESS;
   Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos;
   Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
 
@@ -2585,7 +2550,7 @@ CSR_API(CsrReadConsoleOutputAttrib)
       Request->Header.u1.s1.DataLength = CurrentLength - sizeof(PORT_MESSAGE);
     }
 
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 
@@ -2605,7 +2570,7 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
   Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   CurrentItem = Console->InputEvents.Flink;
@@ -2624,10 +2589,9 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
 
   ConioUnlockConsole(Console);
 
-  Request->Status = STATUS_SUCCESS;
   Request->Data.GetNumInputEventsRequest.NumInputEvents = NumEvents;
 
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 
@@ -2650,7 +2614,7 @@ CSR_API(CsrPeekConsoleInput)
   Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ);
   if(! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   InputRecord = Request->Data.PeekConsoleInputRequest.InputRecord;
@@ -2661,8 +2625,7 @@ CSR_API(CsrPeekConsoleInput)
       || (((ULONG_PTR)InputRecord + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockConsole(Console);
-      Request->Status = STATUS_ACCESS_VIOLATION;
-      return Request->Status ;
+      return STATUS_ACCESS_VIOLATION;
     }
 
   NumItems = 0;
@@ -2696,10 +2659,9 @@ CSR_API(CsrPeekConsoleInput)
 
   ConioUnlockConsole(Console);
 
-  Request->Status = STATUS_SUCCESS;
   Request->Data.PeekConsoleInputRequest.Length = NumItems;
 
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 
@@ -2716,7 +2678,8 @@ CSR_API(CsrReadConsoleOutput)
   COORD BufferCoord;
   RECT ReadRegion;
   RECT ScreenRect;
-  DWORD i, Offset;
+  DWORD i;
+  PBYTE Ptr;
   LONG X, Y;
   UINT CodePage;
 
@@ -2728,7 +2691,7 @@ CSR_API(CsrReadConsoleOutput)
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff, GENERIC_READ);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   CharInfo = Request->Data.ReadConsoleOutputRequest.CharInfo;
@@ -2748,8 +2711,7 @@ CSR_API(CsrReadConsoleOutput)
       || (((ULONG_PTR)CharInfo + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockScreenBuffer(Buff);
-      Request->Status = STATUS_ACCESS_VIOLATION;
-      return Request->Status ;
+      return STATUS_ACCESS_VIOLATION;
     }
 
   SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&ReadRegion));
@@ -2761,41 +2723,39 @@ CSR_API(CsrReadConsoleOutput)
   if (! ConioGetIntersection(&ReadRegion, &ScreenRect, &ReadRegion))
     {
       ConioUnlockScreenBuffer(Buff);
-      Request->Status = STATUS_SUCCESS;
-      return Request->Status;
+      return STATUS_SUCCESS;
     }
 
   for (i = 0, Y = ReadRegion.top; Y < ReadRegion.bottom; ++i, ++Y)
     {
       CurCharInfo = CharInfo + (i * BufferSize.X);
 
-      Offset = ConioGetBufferOffset(Buff, ReadRegion.left, Y);
+      Ptr = ConioCoordToPointer(Buff, ReadRegion.left, Y);
       for (X = ReadRegion.left; X < ReadRegion.right; ++X)
         {
           if (Request->Data.ReadConsoleOutputRequest.Unicode)
             {
               MultiByteToWideChar(CodePage, 0,
-                                  (PCHAR)&GET_CELL_BUFFER(Buff, Offset), 1,
+                                  (PCHAR)Ptr++, 1,
                                   &CurCharInfo->Char.UnicodeChar, 1);
             }
           else
             {
-              CurCharInfo->Char.AsciiChar = GET_CELL_BUFFER(Buff, Offset);
+              CurCharInfo->Char.AsciiChar = *Ptr++;
             }
-          CurCharInfo->Attributes = GET_CELL_BUFFER(Buff, Offset);
+          CurCharInfo->Attributes = *Ptr++;
           ++CurCharInfo;
         }
     }
 
   ConioUnlockScreenBuffer(Buff);
 
-  Request->Status = STATUS_SUCCESS;
   Request->Data.ReadConsoleOutputRequest.ReadRegion.Right = ReadRegion.left + SizeX - 1;
   Request->Data.ReadConsoleOutputRequest.ReadRegion.Bottom = ReadRegion.top + SizeY - 1;
   Request->Data.ReadConsoleOutputRequest.ReadRegion.Left = ReadRegion.left;
   Request->Data.ReadConsoleOutputRequest.ReadRegion.Top = ReadRegion.top;
 
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 
@@ -2817,7 +2777,7 @@ CSR_API(CsrWriteConsoleInput)
   Status = ConioLockConsole(ProcessData, Request->Data.WriteConsoleInputRequest.ConsoleHandle, &Console, GENERIC_WRITE);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   InputRecord = Request->Data.WriteConsoleInputRequest.InputRecord;
@@ -2828,8 +2788,7 @@ CSR_API(CsrWriteConsoleInput)
       || (((ULONG_PTR)InputRecord + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockConsole(Console);
-      Request->Status = STATUS_ACCESS_VIOLATION;
-      return Request->Status ;
+      return STATUS_ACCESS_VIOLATION;
     }
 
   for (i = 0; i < Length; i++)
@@ -2838,8 +2797,7 @@ CSR_API(CsrWriteConsoleInput)
       if (NULL == Record)
         {
           ConioUnlockConsole(Console);
-          Request->Status = STATUS_INSUFFICIENT_RESOURCES;
-          return Request->Status;
+          return STATUS_INSUFFICIENT_RESOURCES;
         }
 
       Record->Echoed = FALSE;
@@ -2855,10 +2813,9 @@ CSR_API(CsrWriteConsoleInput)
 
   ConioUnlockConsole(Console);
 
-  Request->Status = STATUS_SUCCESS;
   Request->Data.WriteConsoleInputRequest.Length = i;
 
-  return Request->Status;
+  return STATUS_SUCCESS;
 }
 
 /**********************************************************************
@@ -2913,7 +2870,7 @@ CSR_API(CsrHardwareStateProperty)
   if (! NT_SUCCESS(Status))
     {
       DPRINT1("Failed to get console handle in SetConsoleHardwareState\n");
-      return Request->Status = Status;
+      return Status;
     }
 
   switch (Request->Data.ConsoleHardwareStateRequest.SetGet)
@@ -2924,17 +2881,17 @@ CSR_API(CsrHardwareStateProperty)
 
       case CONSOLE_HARDWARE_STATE_SET:
         DPRINT("Setting console hardware state.\n");
-        Request->Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State);
+        Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State);
         break;
 
       default:
-        Request->Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */
+        Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */
         break;
     }
 
   ConioUnlockConsole(Console);
 
-  return Request->Status;
+  return Status;
 }
 
 CSR_API(CsrGetConsoleWindow)
@@ -2950,13 +2907,13 @@ CSR_API(CsrGetConsoleWindow)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow;
   ConioUnlockConsole(Console);
 
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleIcon)
@@ -2972,14 +2929,14 @@ CSR_API(CsrSetConsoleIcon)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
-  Request->Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon)
-                     ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
+  Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon)
+            ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
   ConioUnlockConsole(Console);
 
-  return Request->Status;
+  return Status;
 }
 
 CSR_API(CsrGetConsoleCodePage)
@@ -2992,14 +2949,14 @@ CSR_API(CsrGetConsoleCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Request->Data.GetConsoleCodePage.CodePage = Console->CodePage;
   ConioUnlockConsole(Console);
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleCodePage)
@@ -3012,19 +2969,21 @@ CSR_API(CsrSetConsoleCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
   if (IsValidCodePage(Request->Data.SetConsoleCodePage.CodePage))
     {
       Console->CodePage = Request->Data.SetConsoleCodePage.CodePage;
       ConioUnlockConsole(Console);
-      return Request->Status = STATUS_SUCCESS;
+      return STATUS_SUCCESS;
     }
+
   ConioUnlockConsole(Console);
-  return Request->Status = STATUS_UNSUCCESSFUL;
+  return STATUS_INVALID_PARAMETER;
 }
 
 CSR_API(CsrGetConsoleOutputCodePage)
@@ -3037,14 +2996,14 @@ CSR_API(CsrGetConsoleOutputCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Request->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage;
   ConioUnlockConsole(Console);
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleOutputCodePage)
@@ -3057,19 +3016,21 @@ CSR_API(CsrSetConsoleOutputCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Request->Status = Status;
+      return Status;
     }
 
   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
   if (IsValidCodePage(Request->Data.SetConsoleOutputCodePage.CodePage))
     {
       Console->OutputCodePage = Request->Data.SetConsoleOutputCodePage.CodePage;
       ConioUnlockConsole(Console);
-      return Request->Status = STATUS_SUCCESS;
+      return STATUS_SUCCESS;
     }
+
   ConioUnlockConsole(Console);
-  return Request->Status = STATUS_UNSUCCESSFUL;
+  return STATUS_INVALID_PARAMETER;
 }
 
 CSR_API(CsrGetProcessList)
@@ -3094,7 +3055,7 @@ CSR_API(CsrGetProcessList)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
   {
-    return Request->Status = Status;
+    return Status;
   }
 
   DPRINT1("Console_Api Ctrl-C\n");
@@ -3122,7 +3083,72 @@ CSR_API(CsrGetProcessList)
      Request->Header.u1.s1.TotalLength = Length;
      Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
   }
-  return Request->Status = STATUS_SUCCESS;
+  return STATUS_SUCCESS;
+}
+
+CSR_API(CsrGenerateCtrlEvent)
+{
+  PCSRSS_CONSOLE Console;
+  PCSRSS_PROCESS_DATA current;
+  PLIST_ENTRY current_entry;
+  DWORD Group;
+  NTSTATUS Status;
+
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
+  Status = ConioConsoleFromProcessData(ProcessData, &Console);
+  if (! NT_SUCCESS(Status))
+  {
+    return Status;
+  }
+
+  Group = Request->Data.GenerateCtrlEvent.ProcessGroup;
+  Status = STATUS_INVALID_PARAMETER;
+  for (current_entry = Console->ProcessList.Flink;
+       current_entry != &Console->ProcessList;
+       current_entry = current_entry->Flink)
+  {
+    current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry);
+    if (Group == 0 || current->ProcessGroup == Group)
+    {
+      ConioConsoleCtrlEvent(Request->Data.GenerateCtrlEvent.Event, current);
+      Status = STATUS_SUCCESS;
+    }
+  }
+
+  ConioUnlockConsole(Console);
+
+  return Status;
+}
+
+CSR_API(CsrSetScreenBufferSize)
+{
+    NTSTATUS Status;
+    PCSRSS_CONSOLE Console;
+    PCSRSS_SCREEN_BUFFER Buff;
+
+    Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+    Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
+    Status = ConioConsoleFromProcessData(ProcessData, &Console);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferSize.OutputHandle, &Buff, GENERIC_WRITE);
+    if (!NT_SUCCESS(Status))
+    {
+        ConioUnlockConsole(Console);
+        return Status;
+    }
+
+    Status = ConioResizeBuffer(Console, Buff, Request->Data.SetScreenBufferSize.Size);
+    ConioUnlockScreenBuffer(Buff);
+    ConioUnlockConsole(Console);
+
+    return Status;
 }
 
 /* EOF */