- Don't use STATIC
[reactos.git] / reactos / subsys / csrss / win32csr / conio.c
index da5c7a3..b2cc24f 100644 (file)
@@ -8,21 +8,7 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <string.h>
-#include <windows.h>
-
-#include <csrss/csrss.h>
-#include <ntdll/rtl.h>
-#include <ntdll/ldr.h>
-#include <ddk/ntddblue.h>
-#include <rosrtl/string.h>
-#include <rosrtl/minmax.h>
-#include "api.h"
-#include "conio.h"
-#include "desktopbg.h"
-#include "guiconsole.h"
-#include "tuiconsole.h"
-#include "win32csr.h"
+#include "w32csr.h"
 
 #define NDEBUG
 #include <debug.h>
@@ -51,12 +37,10 @@ extern VOID STDCALL PrivateCsrssAcquireOrReleaseInputOwnership(BOOL Release);
 #define ConsoleAnsiCharToUnicodeChar(Console, sWChar, dChar) \
   MultiByteToWideChar((Console)->CodePage, 0, (dChar), 1, (sWChar), 1)
 
-#define ConsoleUnicodeToAnsiN(Console, dChar, sWChar, nChars) \
-  WideCharToMultiByte((Console)->CodePage, 0, (sWChar), (nChars), (dChar), (nChars) * sizeof(WCHAR), NULL, NULL)
 
 /* FUNCTIONS *****************************************************************/
 
-STATIC NTSTATUS FASTCALL
+static NTSTATUS FASTCALL
 ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console)
 {
   if (NULL == ProcessData->Console)
@@ -75,7 +59,7 @@ VOID FASTCALL
 ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData)
 {
   HANDLE Thread;
-       
+
   DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n",      ProcessData->ProcessId);
 
   if (ProcessData->CtrlDispatcher)
@@ -105,7 +89,7 @@ ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff)
 {
   DWORD Offset = 2 * (Buff->CurrentY * Buff->MaxX);
   UINT Pos;
-       
+
   for (Pos = 0; Pos < Buff->MaxX; Pos++)
     {
       /* Fill the cell: Offset is incremented by the macro */
@@ -113,7 +97,7 @@ ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff)
     }
 }
 
-STATIC NTSTATUS FASTCALL
+static NTSTATUS FASTCALL
 CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console,
                            PCSRSS_SCREEN_BUFFER Buffer)
 {
@@ -144,7 +128,7 @@ CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console,
   return STATUS_SUCCESS;
 }
 
-STATIC NTSTATUS STDCALL
+static NTSTATUS STDCALL
 CsrInitConsole(PCSRSS_CONSOLE Console)
 {
   NTSTATUS Status;
@@ -154,9 +138,9 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
 
   Console->Title.MaximumLength = Console->Title.Length = 0;
   Console->Title.Buffer = NULL;
-  
+
   RtlCreateUnicodeString(&Console->Title, L"Command Prompt");
-  
+
   Console->Header.ReferenceCount = 0;
   Console->WaitingChars = 0;
   Console->WaitingLines = 0;
@@ -226,7 +210,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
     }
   Console->ActiveBuffer = NewBuffer;
   /* add a reference count because the buffer is tied to the console */
-  Console->ActiveBuffer->Header.ReferenceCount++;
+  InterlockedIncrement(&Console->ActiveBuffer->Header.ReferenceCount);
   /* make console active, and insert into console list */
   /* copy buffer contents to screen */
   ConioDrawConsole(Console);
@@ -237,75 +221,135 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
 
 CSR_API(CsrAllocConsole)
 {
-  PCSRSS_CONSOLE Console;
-  NTSTATUS Status;
+    PCSRSS_CONSOLE Console;
+    NTSTATUS Status = STATUS_SUCCESS;
+    BOOLEAN NewConsole = FALSE;
 
-  DPRINT("CsrAllocConsole\n");
+    DPRINT("CsrAllocConsole\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+    Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+    Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
-  if (ProcessData == NULL)
+    if (ProcessData == NULL)
     {
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+        DPRINT1("No process data\n");
+        return Request->Status = STATUS_INVALID_PARAMETER;
     }
 
-  if (ProcessData->Console)
+    if (ProcessData->Console)
     {
-      Reply->Status = STATUS_INVALID_PARAMETER;
-      return STATUS_INVALID_PARAMETER;
+        DPRINT1("Process already has a console\n");
+        Request->Status = STATUS_INVALID_PARAMETER;
+        return STATUS_INVALID_PARAMETER;
     }
 
-  Reply->Status = STATUS_SUCCESS;
-  Console = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_CONSOLE));
-  if (NULL == Console)
+    /* Assume success */
+    Request->Status = STATUS_SUCCESS;
+
+    /* If we don't need a console, then get out of here */
+    if (!Request->Data.AllocConsoleRequest.ConsoleNeeded)
     {
-      Reply->Status = STATUS_NO_MEMORY;
-      return STATUS_NO_MEMORY;
+        DPRINT("No console needed\n");
+        return STATUS_SUCCESS;
     }
-  Reply->Status = CsrInitConsole(Console);
-  if (! NT_SUCCESS(Reply->Status))
+
+    /* If we already have one, then don't create a new one... */
+    if (!Request->Data.AllocConsoleRequest.Console ||
+        Request->Data.AllocConsoleRequest.Console != ProcessData->ParentConsole)
     {
-      HeapFree(Win32CsrApiHeap, 0, Console);
-      return Reply->Status;
-    }
-  ProcessData->Console = Console;
-  Reply->Data.AllocConsoleReply.Console = Console;
+        /* Allocate a console structure */
+        NewConsole = TRUE;
+        Console = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_CONSOLE));
+        if (NULL == Console)
+        {
+            DPRINT1("Not enough memory for console\n");
+            Request->Status = STATUS_NO_MEMORY;
+            return STATUS_NO_MEMORY;
+        }
 
-  /* add a reference count because the process is tied to the console */
-  Console->Header.ReferenceCount++;
-  Status = Win32CsrInsertObject(ProcessData, &Reply->Data.AllocConsoleReply.InputHandle, &Console->Header);
-  if (! NT_SUCCESS(Status))
+        /* Initialize the Console */
+        Request->Status = CsrInitConsole(Console);
+        if (!NT_SUCCESS(Request->Status))
+        {
+            DPRINT1("Console init failed\n");
+            HeapFree(Win32CsrApiHeap, 0, Console);
+            return Request->Status;
+        }
+    }
+    else
     {
-      ConioDeleteConsole((Object_t *) Console);
-      ProcessData->Console = 0;
-      return Reply->Status = Status;
+        /* Reuse our current console */
+        Console = Request->Data.AllocConsoleRequest.Console;
     }
-  Status = Win32CsrInsertObject(ProcessData, &Reply->Data.AllocConsoleReply.OutputHandle, &Console->ActiveBuffer->Header);
-  if (!NT_SUCCESS(Status))
+
+    /* Set the Process Console */
+    ProcessData->Console = Console;
+
+    /* Return it to the caller */
+    Request->Data.AllocConsoleRequest.Console = Console;
+
+    /* Add a reference count because the process is tied to the console */
+    Console->Header.ReferenceCount++;
+
+    if (NewConsole || !ProcessData->bInheritHandles)
     {
-      Console->Header.ReferenceCount--;
-      Win32CsrReleaseObject(ProcessData, Reply->Data.AllocConsoleReply.InputHandle);
-      ProcessData->Console = 0;
-      return Reply->Status = Status;
+        /* Insert the Objects */
+        Status = Win32CsrInsertObject(ProcessData, 
+                                      &Request->Data.AllocConsoleRequest.InputHandle, 
+                                      &Console->Header);
+        if (! NT_SUCCESS(Status))
+        {
+            DPRINT1("Failed to insert object\n");
+            ConioDeleteConsole((Object_t *) Console);
+            ProcessData->Console = 0;
+            return Request->Status = Status;
+        }
+    
+        Status = Win32CsrInsertObject(ProcessData, 
+                                      &Request->Data.AllocConsoleRequest.OutputHandle, 
+                                      &Console->ActiveBuffer->Header);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("Failed to insert object\n");
+            ConioDeleteConsole((Object_t *) Console);
+            Win32CsrReleaseObject(ProcessData, 
+                                  Request->Data.AllocConsoleRequest.InputHandle);
+            ProcessData->Console = 0;
+            return Request->Status = Status;
+        }
     }
 
-  if (! DuplicateHandle(GetCurrentProcess(), ProcessData->Console->ActiveEvent,
-                        ProcessData->Process, &ProcessData->ConsoleEvent, EVENT_ALL_ACCESS, FALSE, 0))
+    /* Duplicate the Event */
+    if (!DuplicateHandle(GetCurrentProcess(), 
+                         ProcessData->Console->ActiveEvent,
+                         ProcessData->Process, 
+                         &ProcessData->ConsoleEvent, 
+                         EVENT_ALL_ACCESS, 
+                         FALSE, 
+                         0))
     {
-      DPRINT1("DuplicateHandle() failed: %d\n", GetLastError);
-      Console->Header.ReferenceCount--;
-      Win32CsrReleaseObject(ProcessData, Reply->Data.AllocConsoleReply.OutputHandle);
-      Win32CsrReleaseObject(ProcessData, Reply->Data.AllocConsoleReply.InputHandle);
-      ProcessData->Console = 0;
-      Reply->Status = Status;
-      return Status;
+        DPRINT1("DuplicateHandle() failed: %d\n", GetLastError);
+        ConioDeleteConsole((Object_t *) Console);
+        if (NewConsole || !ProcessData->bInheritHandles)
+        {
+            Win32CsrReleaseObject(ProcessData,
+                                  Request->Data.AllocConsoleRequest.OutputHandle);
+            Win32CsrReleaseObject(ProcessData,
+                                  Request->Data.AllocConsoleRequest.InputHandle);
+        }
+        ProcessData->Console = 0;
+        return Request->Status = Status;
     }
-  ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher;
-  DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);      
-  InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry);
 
-  return STATUS_SUCCESS;
+    /* Set the Ctrl Dispatcher */
+    ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher;
+    DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
+
+    /* Insert into the list */
+////////////////////////////
+    InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry);
+///////////////////////////
+    return STATUS_SUCCESS;
 }
 
 CSR_API(CsrFreeConsole)
@@ -314,30 +358,29 @@ CSR_API(CsrFreeConsole)
 
   DPRINT("CsrFreeConsole\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  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 Reply->Status = STATUS_INVALID_PARAMETER;
+      return Request->Status = STATUS_INVALID_PARAMETER;
     }
 
   Console = ProcessData->Console;
-  Console->Header.ReferenceCount--;
   ProcessData->Console = NULL;
-  if (0 == Console->Header.ReferenceCount)
+  if (0 == InterlockedDecrement(&Console->Header.ReferenceCount))
     {
       ConioDeleteConsole((Object_t *) Console);
     }
-   
+
   return STATUS_SUCCESS;
 }
 
-STATIC VOID FASTCALL
+static VOID FASTCALL
 ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, UINT *ScrolledLines)
 {
   /* slide the viewable screen */
-  if (((Buff->CurrentY - Buff->ShowY + Buff->MaxY) % Buff->MaxY) == Buff->MaxY - 1)
+  if (((Buff->CurrentY - Buff->ShowY + Buff->MaxY) % Buff->MaxY) == (ULONG)Buff->MaxY - 1)
     {
       if (++Buff->ShowY == Buff->MaxY)
         {
@@ -352,7 +395,7 @@ ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, UINT *ScrolledLines)
   ClearLineBuffer(Buff);
   UpdateRect->left = 0;
   UpdateRect->right = Buff->MaxX - 1;
-  if (UpdateRect->top == Buff->CurrentY)
+  if (UpdateRect->top == (LONG)Buff->CurrentY)
     {
       if (++UpdateRect->top == Buff->MaxY)
         {
@@ -362,11 +405,11 @@ ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, UINT *ScrolledLines)
   UpdateRect->bottom = Buff->CurrentY;
 }
 
-STATIC NTSTATUS FASTCALL
+static NTSTATUS FASTCALL
 ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                   CHAR *Buffer, DWORD Length, BOOL Attrib)
 {
-  int i;
+  UINT i;
   DWORD Offset;
   RECT UpdateRect;
   LONG CursorStartX, CursorStartY;
@@ -408,8 +451,8 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                         {
                           Buff->CurrentY--;
                         }
-                      if ((0 == UpdateRect.top && UpdateRect.bottom < Buff->CurrentY)
-                          || (0 != UpdateRect.top && Buff->CurrentY < UpdateRect.top))
+                      if ((0 == UpdateRect.top && UpdateRect.bottom < (LONG)Buff->CurrentY)
+                          || (0 != UpdateRect.top && (LONG)Buff->CurrentY < UpdateRect.top))
                         {
                           UpdateRect.top = Buff->CurrentY;
                         }
@@ -420,8 +463,8 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                     }
                   Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX);
                   SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib);
-                  UpdateRect.left = RtlRosMin(UpdateRect.left, Buff->CurrentX);
-                  UpdateRect.right = RtlRosMax(UpdateRect.right, (LONG) Buff->CurrentX);
+                  UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX);
+                  UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
                 }
                 continue;
             }
@@ -429,8 +472,8 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
           else if (Buffer[i] == '\r')
             {
               Buff->CurrentX = 0;
-              UpdateRect.left = RtlRosMin(UpdateRect.left, Buff->CurrentX);
-              UpdateRect.right = RtlRosMax(UpdateRect.right, (LONG) Buff->CurrentX);
+              UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX);
+              UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
               continue;
             }
           /* --- TAB --- */
@@ -438,7 +481,7 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
             {
               UINT EndX;
 
-              UpdateRect.left = RtlRosMin(UpdateRect.left, Buff->CurrentX);
+              UpdateRect.left = min(UpdateRect.left, (LONG)Buff->CurrentX);
               EndX = (Buff->CurrentX + 8) & ~7;
               if (EndX > Buff->MaxX)
                 {
@@ -451,7 +494,7 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
                   Offset += 2;
                   Buff->CurrentX++;
                 }
-              UpdateRect.right = RtlRosMax(UpdateRect.right, (LONG) Buff->CurrentX - 1);
+              UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX - 1);
               if (Buff->CurrentX == Buff->MaxX)
                 {
                   if (Buff->Mode & ENABLE_WRAP_AT_EOL_OUTPUT)
@@ -467,8 +510,8 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
               continue;
             }
         }
-      UpdateRect.left = RtlRosMin(UpdateRect.left, Buff->CurrentX);
-      UpdateRect.right = RtlRosMax(UpdateRect.right, (LONG) Buff->CurrentX);
+      UpdateRect.left = min(UpdateRect.left, (LONG)Buff->CurrentX);
+      UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
       Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX);
       Buff->Buffer[Offset++] = Buffer[i];
       if (Attrib)
@@ -509,29 +552,29 @@ CSR_API(CsrReadConsole)
   ConsoleInput *Input;
   PUCHAR Buffer;
   PWCHAR UnicodeBuffer;
-  int i;
+  ULONG i;
   ULONG nNumberOfCharsToRead, CharSize;
   PCSRSS_CONSOLE Console;
   NTSTATUS Status;
-   
+
   DPRINT("CsrReadConsole\n");
-  
+
   CharSize = (Request->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
 
   /* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */
-  nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE_REQUEST / CharSize);
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE;
+  nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
-  Buffer = Reply->Data.ReadConsoleReply.Buffer;
+  Buffer = Request->Data.ReadConsoleRequest.Buffer;
   UnicodeBuffer = (PWCHAR)Buffer;
   Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle,
                                &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Data.ReadConsoleReply.EventHandle = ProcessData->ConsoleEvent;
+  Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent;
   for (i = 0; i < nNumberOfCharsToRead && Console->InputEvents.Flink != &Console->InputEvents; i++)
     {
       /* remove input event from queue */
@@ -567,8 +610,8 @@ CSR_API(CsrReadConsole)
                   Console->WaitingChars--;
                   ConioUnlockConsole(Console);
                   HeapFree(Win32CsrApiHeap, 0, Input);
-                  Reply->Data.ReadConsoleReply.NrCharactersRead = 0;
-                  Reply->Status = STATUS_NOTIFY_CLEANUP;
+                  Request->Data.ReadConsoleRequest.NrCharactersRead = 0;
+                  Request->Status = STATUS_NOTIFY_CLEANUP;
                   return STATUS_NOTIFY_CLEANUP;
                 }
               Request->Data.ReadConsoleRequest.nCharsCanBeDeleted--;
@@ -598,30 +641,30 @@ CSR_API(CsrReadConsole)
       Console->WaitingChars--;
       HeapFree(Win32CsrApiHeap, 0, Input);
     }
-  Reply->Data.ReadConsoleReply.NrCharactersRead = i;
+  Request->Data.ReadConsoleRequest.NrCharactersRead = i;
   if (0 == i)
     {
-      Reply->Status = STATUS_PENDING;    /* we didn't read anything */
+      Request->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])))
         {
-          Reply->Status = STATUS_PENDING; /* line buffered, didn't get a complete line */
+          Request->Status = STATUS_PENDING; /* line buffered, didn't get a complete line */
         }
       else
         {
           Console->WaitingLines--;
-          Reply->Status = STATUS_SUCCESS; /* line buffered, did get a complete line */
+          Request->Status = STATUS_SUCCESS; /* line buffered, did get a complete line */
         }
     }
   else
     {
-      Reply->Status = STATUS_SUCCESS;  /* not line buffered, did read something */
+      Request->Status = STATUS_SUCCESS;  /* not line buffered, did read something */
     }
 
-  if (Reply->Status == STATUS_PENDING)
+  if (Request->Status == STATUS_PENDING)
     {
       Console->EchoCount = nNumberOfCharsToRead - i;
     }
@@ -629,10 +672,16 @@ CSR_API(CsrReadConsole)
     {
       Console->EchoCount = 0;             /* if the client is no longer waiting on input, do not echo */
     }
-  Reply->Header.MessageSize += i * CharSize;
 
   ConioUnlockConsole(Console);
-  return Reply->Status;
+
+  if (CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + i * CharSize > sizeof(CSR_API_MESSAGE))
+    {
+      Request->Header.u1.s1.TotalLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + i * CharSize;
+      Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
+    }
+
+  return Request->Status;
 }
 
 VOID FASTCALL
@@ -679,10 +728,10 @@ inline BOOLEAN ConioGetIntersection(
   }
 
   ConioInitRect(Intersection,
-               RtlRosMax(Rect1->top, Rect2->top),
-               RtlRosMax(Rect1->left, Rect2->left),
-               RtlRosMin(Rect1->bottom, Rect2->bottom),
-               RtlRosMin(Rect1->right, Rect2->right));
+               max(Rect1->top, Rect2->top),
+               max(Rect1->left, Rect2->left),
+               min(Rect1->bottom, Rect2->bottom),
+               min(Rect1->right, Rect2->right));
 
   return TRUE;
 }
@@ -711,10 +760,10 @@ inline BOOLEAN ConioGetUnion(
   else
     {
       ConioInitRect(Union,
-                   RtlRosMin(Rect1->top, Rect2->top),
-                   RtlRosMin(Rect1->left, Rect2->left),
-                   RtlRosMax(Rect1->bottom, Rect2->bottom),
-                   RtlRosMax(Rect1->right, Rect2->right));
+                   min(Rect1->top, Rect2->top),
+                   min(Rect1->left, Rect2->left),
+                   max(Rect1->bottom, Rect2->bottom),
+                   max(Rect1->right, Rect2->right));
     }
 
   return TRUE;
@@ -767,7 +816,7 @@ inline BOOLEAN ConioSubtractRect(
   return TRUE;
 }
 
-STATIC VOID FASTCALL
+static VOID FASTCALL
 ConioCopyRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer,
                 RECT *SrcRegion,
                 RECT *DstRegion)
@@ -776,7 +825,7 @@ ConioCopyRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer,
   DWORD SrcOffset;
   DWORD DstOffset;
   DWORD BytesPerLine;
-  ULONG i;
+  LONG i;
 
   DstY = DstRegion->top;
   BytesPerLine = ConioRectWidth(DstRegion) * 2;
@@ -785,7 +834,7 @@ ConioCopyRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer,
   DstY = (DstRegion->top + ScreenBuffer->ShowY) % ScreenBuffer->MaxY;
   SrcOffset = (SrcY * ScreenBuffer->MaxX + SrcRegion->left + ScreenBuffer->ShowX) * 2;
   DstOffset = (DstY * ScreenBuffer->MaxX + DstRegion->left + ScreenBuffer->ShowX) * 2;
-  
+
   for (i = SrcRegion->top; i <= SrcRegion->bottom; i++)
     {
       RtlCopyMemory(
@@ -815,7 +864,7 @@ ConioCopyRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer,
     }
 }
 
-STATIC VOID FASTCALL
+static VOID FASTCALL
 ConioFillRegion(PCSRSS_CONSOLE Console,
                 PCSRSS_SCREEN_BUFFER ScreenBuffer,
                 RECT *Region,
@@ -825,9 +874,9 @@ ConioFillRegion(PCSRSS_CONSOLE Console,
   SHORT X, Y;
   DWORD Offset;
   DWORD Delta;
-  ULONG i;
+  LONG i;
   CHAR Char;
-  
+
   if(bUnicode)
     ConsoleUnicodeCharToAnsiChar(Console, &Char, &CharInfo->Char.UnicodeChar);
   else
@@ -855,76 +904,100 @@ ConioFillRegion(PCSRSS_CONSOLE Console,
     }
 }
 
-STATIC VOID FASTCALL
+static VOID FASTCALL
 ConioInputEventToAnsi(PCSRSS_CONSOLE Console, PINPUT_RECORD InputEvent)
 {
   if (InputEvent->EventType == KEY_EVENT)
     {
+      WCHAR UnicodeChar = InputEvent->Event.KeyEvent.uChar.UnicodeChar;
+      InputEvent->Event.KeyEvent.uChar.UnicodeChar = 0;
       ConsoleUnicodeCharToAnsiChar(Console,
                                    &InputEvent->Event.KeyEvent.uChar.AsciiChar,
-                                   &InputEvent->Event.KeyEvent.uChar.UnicodeChar);
+                                   &UnicodeChar);
     }
 }
 
 CSR_API(CsrWriteConsole)
 {
   NTSTATUS Status;
-  PCHAR Buffer = (PCHAR)Request->Data.WriteConsoleRequest.Buffer;
+  PCHAR Buffer;
   PCSRSS_SCREEN_BUFFER Buff;
   PCSRSS_CONSOLE Console;
+  DWORD Written = 0;
+  ULONG Length;
   ULONG CharSize = (Request->Data.WriteConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
 
   DPRINT("CsrWriteConsole\n");
-   
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
 
-  if (Request->Header.DataSize
-      < sizeof(CSRSS_WRITE_CONSOLE_REQUEST) - 1
+  if (Request->Header.u1.s1.TotalLength
+      < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) 
         + (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize))
     {
       DPRINT1("Invalid request size\n");
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      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;
     }
   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))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   if(Request->Data.WriteConsoleRequest.Unicode)
-  {
-    ConsoleUnicodeToAnsiN(Console, Buffer, (PWCHAR)Buffer, Request->Data.WriteConsoleRequest.NrCharactersToWrite);
-  }
-
-  Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleRequest.ConsoleHandle, &Buff);
-  if (! NT_SUCCESS(Status))
     {
-      if (NULL != Console)
+      Length = WideCharToMultiByte(Console->CodePage, 0, 
+                                   (PWCHAR)Request->Data.WriteConsoleRequest.Buffer, 
+                                   Request->Data.WriteConsoleRequest.NrCharactersToWrite, 
+                                   NULL, 0, NULL, NULL);
+      Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length);
+      if (Buffer)
         {
-          ConioUnlockConsole(Console);
+          WideCharToMultiByte(Console->CodePage, 0, 
+                              (PWCHAR)Request->Data.WriteConsoleRequest.Buffer, 
+                              Request->Data.WriteConsoleRequest.NrCharactersToWrite, 
+                              Buffer, Length, NULL, NULL);
+        }
+      else
+        {
+          Status = STATUS_NO_MEMORY;
+        }
+    }
+  else
+    {
+      Buffer = (PCHAR)Request->Data.WriteConsoleRequest.Buffer;
+    }
+  
+  if (Buffer)
+    {
+      Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleRequest.ConsoleHandle, &Buff);
+      if (NT_SUCCESS(Status))
+        {
+          Request->Status = ConioWriteConsole(Console, Buff, Buffer,
+                                              Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE);
+          if (NT_SUCCESS(Status))
+            {
+              Written = Request->Data.WriteConsoleRequest.NrCharactersToWrite;
+            }
+          ConioUnlockScreenBuffer(Buff);
+        }
+      if (Request->Data.WriteConsoleRequest.Unicode)
+        {
+          RtlFreeHeap(GetProcessHeap(), 0, Buffer);
         }
-      return Reply->Status = Status;
     }
-
-  Reply->Status = ConioWriteConsole(Console, Buff, Buffer,
-                                    Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE);
-  ConioUnlockScreenBuffer(Buff);
   if (NULL != Console)
     {
       ConioUnlockConsole(Console);
     }
 
-  if(NT_SUCCESS(Reply->Status))
-  {
-    Reply->Data.WriteConsoleReply.NrCharactersWritten = Request->Data.WriteConsoleRequest.NrCharactersToWrite;
-  }
-  else
-  {
-    Reply->Data.WriteConsoleReply.NrCharactersWritten = 0; /* FIXME - return the actual number of characters written! */
-  }
+  Request->Data.WriteConsoleRequest.NrCharactersWritten = Written;
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = Status;
 }
 
 VOID STDCALL
@@ -964,7 +1037,7 @@ ConioDeleteConsole(Object_t *Object)
       HeapFree(Win32CsrApiHeap, 0, Event);
     }
 
-  if (0 == --Console->ActiveBuffer->Header.ReferenceCount)
+  if (0 == InterlockedDecrement(&Console->ActiveBuffer->Header.ReferenceCount))
     {
       ConioDeleteScreenBuffer((Object_t *) Console->ActiveBuffer);
     }
@@ -986,7 +1059,7 @@ CsrInitConsoleSupport(VOID)
   /* Should call LoadKeyboardLayout */
 }
 
-STATIC VOID FASTCALL
+static VOID FASTCALL
 ConioProcessChar(PCSRSS_CONSOLE Console,
                  ConsoleInput *KeyEventRecord)
 {
@@ -997,7 +1070,7 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
   /* process Ctrl-C and Ctrl-Break */
   if (Console->Mode & ENABLE_PROCESSED_INPUT &&
       KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown &&
-      ((KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == VK_PAUSE) || 
+      ((KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == VK_PAUSE) ||
        (KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == 'C')) &&
       (KeyEventRecord->InputEvent.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))
     {
@@ -1043,10 +1116,10 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
          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 != 
+             if (Console->ActiveBuffer->ShowY % Console->ActiveBuffer->MaxY !=
                  Console->ActiveBuffer->CurrentY)
                 {
-                  if (((Console->ActiveBuffer->CurrentY + 1) % Console->ActiveBuffer->MaxY) != 
+                  if (((Console->ActiveBuffer->CurrentY + 1) % Console->ActiveBuffer->MaxY) !=
                       (Console->ActiveBuffer->ShowY + Console->ActiveBuffer->MaxY) %
                       Console->ActiveBuffer->MaxY)
                     {
@@ -1171,7 +1244,7 @@ ConioProcessChar(PCSRSS_CONSOLE Console,
     }
 }
 
-STATIC DWORD FASTCALL
+static DWORD FASTCALL
 ConioGetShiftState(PBYTE KeyState)
 {
   DWORD ssOut = 0;
@@ -1222,7 +1295,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
 
   RepeatCount = 1;
   VirtualScanCode = (msg->lParam >> 16) & 0xff;
-  Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR || 
+  Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR ||
     msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR;
 
   GetKeyboardState(KeyState);
@@ -1232,9 +1305,9 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
     {
       VirtualKeyCode = LastVirtualKey;
       UnicodeChar = msg->wParam;
-    } 
+    }
   else
-    { 
+    {
       WCHAR Chars[2];
       INT RetChars = 0;
 
@@ -1253,7 +1326,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
     {
       AsciiChar = 0;
     }
-  
+
   er.EventType = KEY_EVENT;
   er.Event.KeyEvent.bKeyDown = Down;
   er.Event.KeyEvent.wRepeatCount = RepeatCount;
@@ -1263,7 +1336,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
   er.Event.KeyEvent.wVirtualScanCode = VirtualScanCode;
 
   if (TextMode)
-    {    
+    {
       if (0 != (ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
           && VK_TAB == VirtualKeyCode)
         {
@@ -1283,7 +1356,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
         }
     }
 
-  if (NULL == Console) 
+  if (NULL == Console)
     {
       return;
     }
@@ -1294,9 +1367,9 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
     {
       return;
     }
-    
+
   ConInRec->InputEvent = er;
-  ConInRec->Fake = UnicodeChar && 
+  ConInRec->Fake = UnicodeChar &&
     (msg->message != WM_CHAR && msg->message != WM_SYSCHAR &&
      msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP);
   ConInRec->NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR);
@@ -1314,7 +1387,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
           VirtualKeyCode,
           (AsciiChar >= ' ') ? AsciiChar : '.',
           ShiftState);
-    
+
   if (! ConInRec->Fake || ! ConInRec->NotChar)
     {
       /* FIXME - convert to ascii */
@@ -1339,7 +1412,7 @@ Console_Api (PVOID unused)
   PrivateCsrssRegisterPrimitive();
   /* This call turns on the input system in win32k */
   PrivateCsrssAcquireOrReleaseInputOwnership(FALSE);
-  
+
   while (TRUE)
     {
       GetMessageW(&msg, 0, 0, 0);
@@ -1362,18 +1435,18 @@ CSR_API(CsrGetScreenBufferInfo)
   NTSTATUS Status;
   PCSRSS_SCREEN_BUFFER Buff;
   PCONSOLE_SCREEN_BUFFER_INFO pInfo;
-   
+
   DPRINT("CsrGetScreenBufferInfo\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  pInfo = &Reply->Data.ScreenBufferInfoReply.Info;
+  pInfo = &Request->Data.ScreenBufferInfoRequest.Info;
   pInfo->dwSize.X = Buff->MaxX;
   pInfo->dwSize.Y = Buff->MaxY;
   pInfo->dwCursorPosition.X = Buff->CurrentX - Buff->ShowX;
@@ -1387,9 +1460,9 @@ CSR_API(CsrGetScreenBufferInfo)
   pInfo->dwMaximumWindowSize.Y = Buff->MaxY;
   ConioUnlockScreenBuffer(Buff);
 
-  Reply->Status = STATUS_SUCCESS;
+  Request->Status = STATUS_SUCCESS;
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrSetCursor)
@@ -1399,17 +1472,17 @@ CSR_API(CsrSetCursor)
   PCSRSS_SCREEN_BUFFER Buff;
   LONG OldCursorX, OldCursorY;
   LONG NewCursorX, NewCursorY;
-   
+
   DPRINT("CsrSetCursor\n");
 
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
@@ -1418,7 +1491,7 @@ CSR_API(CsrSetCursor)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   NewCursorX = Request->Data.SetCursorRequest.Position.X;
@@ -1427,7 +1500,11 @@ CSR_API(CsrSetCursor)
       NewCursorY < 0 || NewCursorY >= Buff->MaxY)
     {
       ConioUnlockScreenBuffer(Buff);
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      if (NULL != Console)
+        {
+          ConioUnlockConsole(Console);
+        }
+      return Request->Status = STATUS_INVALID_PARAMETER;
     }
   ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &OldCursorX, &OldCursorY);
   Buff->CurrentX = NewCursorX + Buff->ShowX;
@@ -1437,7 +1514,11 @@ CSR_API(CsrSetCursor)
       if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY))
         {
           ConioUnlockScreenBuffer(Buff);
-          return Reply->Status = STATUS_UNSUCCESSFUL;
+          if (NULL != Console)
+            {
+              ConioUnlockConsole(Console);
+            }
+          return Request->Status = STATUS_UNSUCCESSFUL;
         }
     }
 
@@ -1447,10 +1528,10 @@ CSR_API(CsrSetCursor)
       ConioUnlockConsole(Console);
     }
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
-STATIC FASTCALL VOID
+static FASTCALL VOID
 ConioComputeUpdateRect(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, COORD *Start, UINT Length)
 {
   if (Buff->MaxX <= Start->X + Length)
@@ -1480,7 +1561,7 @@ ConioComputeUpdateRect(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, COORD *Start
 CSR_API(CsrWriteConsoleOutputChar)
 {
   NTSTATUS Status;
-  PCHAR String = (PCHAR)Request->Data.WriteConsoleOutputCharRequest.String;
+  PCHAR String, tmpString = NULL;
   PBYTE Buffer;
   PCSRSS_CONSOLE Console;
   PCSRSS_SCREEN_BUFFER Buff;
@@ -1489,80 +1570,97 @@ CSR_API(CsrWriteConsoleOutputChar)
 
   DPRINT("CsrWriteConsoleOutputChar\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-  
   CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
 
-  if (Request->Header.DataSize
-      < sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST) - 1
+  if (Request->Header.u1.s1.TotalLength
+      < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR) 
         + (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize))
     {
       DPRINT1("Invalid request size\n");
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      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;
     }
 
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
-  if (! NT_SUCCESS(Status))
+  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))
     {
-      return Reply->Status = Status;
-    }
-
-  if(Request->Data.WriteConsoleOutputCharRequest.Unicode)
-  {
-    ConsoleUnicodeToAnsiN(Console, String, (PWCHAR)String, Request->Data.WriteConsoleOutputCharRequest.Length);
-  }
-
-  Status = ConioLockScreenBuffer(ProcessData,
-                                 Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle,
-                                 &Buff);
-  if (! NT_SUCCESS(Status))
-    {
-      if (NULL != Console)
+      if(Request->Data.WriteConsoleOutputCharRequest.Unicode)
         {
-          ConioUnlockConsole(Console);
-        }
-      return Reply->Status = Status;
-    }
-
-  X = Request->Data.WriteConsoleOutputCharRequest.Coord.X + Buff->ShowX;
-  Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
-  Length = Request->Data.WriteConsoleOutputCharRequest.Length;
-  Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
-  while (Length--)
-    {
-      *Buffer = *String++;
-      Written++;
-      Buffer += 2;
-      if (++X == Buff->MaxX)
-        {
-          if (++Y == Buff->MaxY)
+          Length = WideCharToMultiByte(Console->CodePage, 0, 
+                                      (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, 
+                                       Request->Data.WriteConsoleOutputCharRequest.Length, 
+                                       NULL, 0, NULL, NULL);
+          tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length);
+          if (String)
             {
-              Y = 0;
-              Buffer = Buff->Buffer;
+              WideCharToMultiByte(Console->CodePage, 0, 
+                                  (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, 
+                                  Request->Data.WriteConsoleOutputCharRequest.Length, 
+                                  String, Length, NULL, NULL);
+            }
+          else
+            {
+              Status = STATUS_NO_MEMORY;
             }
-          X = 0;
         }
-    }
-
-  if (NULL != Console && Buff == Console->ActiveBuffer)
-    {
-      ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord,
-                             Request->Data.WriteConsoleOutputCharRequest.Length);
-      ConioDrawRegion(Console, &UpdateRect);
-    }
+      else
+        {
+          String = (PCHAR)Request->Data.WriteConsoleOutputCharRequest.String;
+        }
+      
+      if (String)
+        {
+          Status = ConioLockScreenBuffer(ProcessData,
+                                         Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle,
+                                         &Buff);
+          if (NT_SUCCESS(Status))
+            {
+              X = Request->Data.WriteConsoleOutputCharRequest.Coord.X + Buff->ShowX;
+              Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
+              Length = Request->Data.WriteConsoleOutputCharRequest.Length;
+              Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
+              while (Length--)
+                {
+                  *Buffer = *String++;
+                  Written++;
+                  Buffer += 2;
+                  if (++X == Buff->MaxX)
+                    {
+                      if (++Y == Buff->MaxY)
+                        {
+                          Y = 0;
+                          Buffer = Buff->Buffer;
+                        }
+                      X = 0;
+                    }
+                }
+              if (NULL != Console && Buff == Console->ActiveBuffer)
+                {
+                  ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord,
+                                         Request->Data.WriteConsoleOutputCharRequest.Length);
+                  ConioDrawRegion(Console, &UpdateRect);
+                }
 
-  Reply->Data.WriteConsoleOutputCharReply.EndCoord.X = X - Buff->ShowX;
-  Reply->Data.WriteConsoleOutputCharReply.EndCoord.Y = (Y + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
+                Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X - Buff->ShowX;
+                Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
 
-  ConioUnlockScreenBuffer(Buff);
-  if (NULL != Console)
-    {
-      ConioUnlockConsole(Console);
+                ConioUnlockScreenBuffer(Buff);
+            }
+          if (Request->Data.WriteConsoleRequest.Unicode)
+            {
+              RtlFreeHeap(GetProcessHeap(), 0, tmpString);
+            }
+        }
+      if (NULL != Console)
+        {
+          ConioUnlockConsole(Console);
+        }
     }
-
-  Reply->Data.WriteConsoleOutputCharReply.NrCharactersWritten = Written;
-  return Reply->Status = STATUS_SUCCESS;
+  Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written;
+  return Request->Status = Status;
 }
 
 CSR_API(CsrFillOutputChar)
@@ -1576,14 +1674,14 @@ CSR_API(CsrFillOutputChar)
   RECT UpdateRect;
 
   DPRINT("CsrFillOutputChar\n");
-   
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+
+  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 Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff);
@@ -1593,7 +1691,7 @@ CSR_API(CsrFillOutputChar)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX;
@@ -1632,8 +1730,9 @@ CSR_API(CsrFillOutputChar)
     {
       ConioUnlockConsole(Console);
     }
-
-  return Reply->Status;
+  Length = Request->Data.FillOutputRequest.Length;
+  Request->Data.FillOutputRequest.NrCharactersWritten = Length;
+  return Request->Status;
 }
 
 CSR_API(CsrReadInputEvent)
@@ -1643,17 +1742,17 @@ CSR_API(CsrReadInputEvent)
   NTSTATUS Status;
   BOOLEAN Done = FALSE;
   ConsoleInput *Input;
-   
+
   DPRINT("CsrReadInputEvent\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-  Reply->Data.ReadInputReply.Event = ProcessData->ConsoleEvent;
-   
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+  Request->Data.ReadInputRequest.Event = ProcessData->ConsoleEvent;
+
   Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   /* only get input if there is any */
@@ -1665,18 +1764,18 @@ CSR_API(CsrReadInputEvent)
 
       if (Done && !Input->Fake)
         {
-         Reply->Data.ReadInputReply.MoreEvents = TRUE;
+         Request->Data.ReadInputRequest.MoreEvents = TRUE;
          break;
        }
-      
+
       RemoveEntryList(&Input->ListEntry);
 
       if (!Done && !Input->Fake)
         {
-          Reply->Data.ReadInputReply.Input = Input->InputEvent;
+          Request->Data.ReadInputRequest.Input = Input->InputEvent;
           if (Request->Data.ReadInputRequest.Unicode == FALSE)
             {
-              ConioInputEventToAnsi(Console, &Reply->Data.ReadInputReply.Input);
+              ConioInputEventToAnsi(Console, &Request->Data.ReadInputRequest.Input);
             }
          Done = TRUE;
        }
@@ -1693,7 +1792,7 @@ CSR_API(CsrReadInputEvent)
         }
       HeapFree(Win32CsrApiHeap, 0, Input);
     }
-   
+
   if (Done)
     {
       Status = STATUS_SUCCESS;
@@ -1712,35 +1811,37 @@ CSR_API(CsrReadInputEvent)
 
   ConioUnlockConsole(Console);
 
-  return Reply->Status = Status;
+  return Request->Status = Status;
 }
 
 CSR_API(CsrWriteConsoleOutputAttrib)
 {
   PCSRSS_CONSOLE Console;
   PCSRSS_SCREEN_BUFFER Buff;
-  PUCHAR Buffer, Attribute;
+  PUCHAR Buffer;
+  PWORD Attribute;
   int X, Y, Length;
   NTSTATUS Status;
   RECT UpdateRect;
 
   DPRINT("CsrWriteConsoleOutputAttrib\n");
-   
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
 
-  if (Request->Header.DataSize
-      < sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REQUEST) - 1
-        + Request->Data.WriteConsoleOutputAttribRequest.Length)
+  if (Request->Header.u1.s1.TotalLength
+      < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
+        + Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD))
     {
       DPRINT1("Invalid request size\n");
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      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;
     }
 
   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))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData,
@@ -1752,17 +1853,17 @@ CSR_API(CsrWriteConsoleOutputAttrib)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X + Buff->ShowX;
   Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
   Length = Request->Data.WriteConsoleOutputAttribRequest.Length;
   Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1];
-  Attribute = (PUCHAR)Request->Data.WriteConsoleOutputAttribRequest.String;
+  Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute;
   while (Length--)
     {
-      *Buffer = *Attribute++;
+      *Buffer = (UCHAR)(*Attribute++);
       Buffer += 2;
       if (++X == Buff->MaxX)
         {
@@ -1787,12 +1888,12 @@ CSR_API(CsrWriteConsoleOutputAttrib)
       ConioUnlockConsole(Console);
     }
 
-  Reply->Data.WriteConsoleOutputAttribReply.EndCoord.X = Buff->CurrentX - Buff->ShowX;
-  Reply->Data.WriteConsoleOutputAttribReply.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
+  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = Buff->CurrentX - Buff->ShowX;
+  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
 
   ConioUnlockScreenBuffer(Buff);
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrFillOutputAttrib)
@@ -1810,11 +1911,11 @@ CSR_API(CsrFillOutputAttrib)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-   
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
@@ -1822,7 +1923,7 @@ CSR_API(CsrFillOutputAttrib)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   X = Request->Data.FillOutputAttribRequest.Coord.X + Buff->ShowX;
@@ -1858,7 +1959,7 @@ CSR_API(CsrFillOutputAttrib)
       ConioUnlockConsole(Console);
     }
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 
@@ -1866,21 +1967,21 @@ CSR_API(CsrGetCursorInfo)
 {
   PCSRSS_SCREEN_BUFFER Buff;
   NTSTATUS Status;
-   
+
   DPRINT("CsrGetCursorInfo\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Data.GetCursorInfoReply.Info = Buff->CursorInfo;
+  Request->Data.GetCursorInfoRequest.Info = Buff->CursorInfo;
   ConioUnlockScreenBuffer(Buff);
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetCursorInfo)
@@ -1890,16 +1991,16 @@ CSR_API(CsrSetCursorInfo)
   DWORD Size;
   BOOL Visible;
   NTSTATUS Status;
-   
+
   DPRINT("CsrSetCursorInfo\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  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 Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff);
@@ -1909,7 +2010,7 @@ CSR_API(CsrSetCursorInfo)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Size = Request->Data.SetCursorInfoRequest.Info.dwSize;
@@ -1933,7 +2034,7 @@ CSR_API(CsrSetCursorInfo)
         {
           ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
-          return Reply->Status = STATUS_UNSUCCESSFUL;
+          return Request->Status = STATUS_UNSUCCESSFUL;
         }
     }
 
@@ -1943,7 +2044,7 @@ CSR_API(CsrSetCursorInfo)
       ConioUnlockConsole(Console);
     }
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetTextAttrib)
@@ -1951,14 +2052,14 @@ CSR_API(CsrSetTextAttrib)
   NTSTATUS Status;
   PCSRSS_CONSOLE Console;
   PCSRSS_SCREEN_BUFFER Buff;
-  LONG OldCursorX, OldCursorY;   
+  LONG OldCursorX, OldCursorY;
 
   DPRINT("CsrSetTextAttrib\n");
 
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff);
@@ -1968,7 +2069,7 @@ CSR_API(CsrSetTextAttrib)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &OldCursorX, &OldCursorY);
@@ -1980,7 +2081,7 @@ CSR_API(CsrSetTextAttrib)
         {
           ConioUnlockScreenBuffer(Buff);
           ConioUnlockConsole(Console);
-          return Reply->Status = STATUS_UNSUCCESSFUL;
+          return Request->Status = STATUS_UNSUCCESSFUL;
         }
     }
 
@@ -1990,7 +2091,7 @@ CSR_API(CsrSetTextAttrib)
       ConioUnlockConsole(Console);
     }
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleMode)
@@ -2001,14 +2102,14 @@ CSR_API(CsrSetConsoleMode)
 
   DPRINT("CsrSetConsoleMode\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Status = Win32CsrGetObject(ProcessData,
                              Request->Data.SetConsoleModeRequest.ConsoleHandle,
                              (Object_t **) &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Buff = (PCSRSS_SCREEN_BUFFER)Console;
@@ -2022,12 +2123,12 @@ CSR_API(CsrSetConsoleMode)
     }
   else
     {
-      return Reply->Status = STATUS_INVALID_HANDLE;
+      return Request->Status = STATUS_INVALID_HANDLE;
     }
 
-  Reply->Status = STATUS_SUCCESS;
+  Request->Status = STATUS_SUCCESS;
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrGetConsoleMode)
@@ -2038,30 +2139,30 @@ CSR_API(CsrGetConsoleMode)
 
   DPRINT("CsrGetConsoleMode\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Status = Win32CsrGetObject(ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle,
                              (Object_t **) &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Status = STATUS_SUCCESS;
+  Request->Status = STATUS_SUCCESS;
   Buff = (PCSRSS_SCREEN_BUFFER) Console;
   if (CONIO_CONSOLE_MAGIC == Console->Header.Type)
     {
-      Reply->Data.GetConsoleModeReply.ConsoleMode = Console->Mode;
+      Request->Data.GetConsoleModeRequest.ConsoleMode = Console->Mode;
     }
   else if (CONIO_SCREEN_BUFFER_MAGIC == Buff->Header.Type)
     {
-      Reply->Data.GetConsoleModeReply.ConsoleMode = Buff->Mode;
+      Request->Data.GetConsoleModeRequest.ConsoleMode = Buff->Mode;
     }
   else
     {
-      Reply->Status = STATUS_INVALID_HANDLE;
+      Request->Status = STATUS_INVALID_HANDLE;
     }
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrCreateScreenBuffer)
@@ -2069,46 +2170,46 @@ CSR_API(CsrCreateScreenBuffer)
   PCSRSS_CONSOLE Console;
   PCSRSS_SCREEN_BUFFER Buff;
   NTSTATUS Status;
-   
+
   DPRINT("CsrCreateScreenBuffer\n");
 
   if (ProcessData == NULL)
     {
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      return Request->Status = STATUS_INVALID_PARAMETER;
     }
 
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
   if (NULL == Console)
     {
-      return Reply->Status = STATUS_INVALID_HANDLE;
+      return Request->Status = STATUS_INVALID_HANDLE;
     }
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
   Buff = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_SCREEN_BUFFER));
   if (NULL == Buff)
     {
-      Reply->Status = STATUS_INSUFFICIENT_RESOURCES;
+      Request->Status = STATUS_INSUFFICIENT_RESOURCES;
     }
 
   Status = CsrInitConsoleScreenBuffer(Console, Buff);
   if(! NT_SUCCESS(Status))
     {
-      Reply->Status = Status;
+      Request->Status = Status;
     }
   else
     {
-      Reply->Status = Win32CsrInsertObject(ProcessData, &Reply->Data.CreateScreenBufferReply.OutputHandle, &Buff->Header);
+      Request->Status = Win32CsrInsertObject(ProcessData, &Request->Data.CreateScreenBufferRequest.OutputHandle, &Buff->Header);
     }
 
   ConioUnlockConsole(Console);
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrSetScreenBuffer)
@@ -2122,22 +2223,22 @@ CSR_API(CsrSetScreenBuffer)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
   if (NULL == Console)
     {
       DPRINT1("Trying to set screen buffer for app without console\n");
-      return Reply->Status = STATUS_INVALID_HANDLE;
+      return Request->Status = STATUS_INVALID_HANDLE;
     }
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferRequest.OutputHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
       ConioUnlockConsole(Console);
-      return Reply->Status;
+      return Request->Status;
     }
 
   if (Buff == Console->ActiveBuffer)
@@ -2162,81 +2263,100 @@ CSR_API(CsrSetScreenBuffer)
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetTitle)
 {
   NTSTATUS Status;
   PCSRSS_CONSOLE Console;
+  PWCHAR Buffer;
 
   DPRINT("CsrSetTitle\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-
-  if (Request->Header.DataSize
-      < sizeof(CSRSS_SET_TITLE_REQUEST) - 1
+  if (Request->Header.u1.s1.TotalLength
+      < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE)
         + Request->Data.SetTitleRequest.Length)
     {
       DPRINT1("Invalid request size\n");
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      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;
     }
 
   Status = ConioLockConsole(ProcessData, Request->Data.SetTitleRequest.Console, &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))
     {
-      Reply->Status = Status;  
+      Request->Status = Status;
     }
   else
     {
-      /* copy title to console */
-      RtlFreeUnicodeString(&Console->Title);
-      RtlCreateUnicodeString(&Console->Title, Request->Data.SetTitleRequest.Title);
-      if (! ConioChangeTitle(Console))
+      Buffer =  RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length);
+      if (Buffer)
         {
-          Reply->Status = STATUS_UNSUCCESSFUL;
+          /* copy title to console */
+          RtlFreeUnicodeString(&Console->Title);
+          Console->Title.Buffer = Buffer;
+          Console->Title.Length = Console->Title.MaximumLength = Request->Data.SetTitleRequest.Length;
+          memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length);
+          if (! ConioChangeTitle(Console))
+            {
+              Request->Status = STATUS_UNSUCCESSFUL;
+            }
+          else
+            {
+              Request->Status = STATUS_SUCCESS;
+            }
         }
       else
         {
-          Reply->Status = STATUS_SUCCESS;
+          Request->Status = STATUS_NO_MEMORY;
         }
     }
   ConioUnlockConsole(Console);
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrGetTitle)
 {
   NTSTATUS Status;
   PCSRSS_CONSOLE Console;
-  
+  DWORD Length;
+
   DPRINT("CsrGetTitle\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  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);
   if (! NT_SUCCESS(Status))
     {
       DPRINT1("Can't get console\n");
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-               
+
   /* Copy title of the console to the user title buffer */
-  RtlZeroMemory(&Reply->Data.GetTitleReply, sizeof(CSRSS_GET_TITLE_REPLY));
-  Reply->Data.GetTitleReply.ConsoleHandle = Request->Data.GetTitleRequest.ConsoleHandle;
-  Reply->Data.GetTitleReply.Length = Console->Title.Length;
-  wcscpy (Reply->Data.GetTitleReply.Title, Console->Title.Buffer);
-  Reply->Header.MessageSize += Console->Title.Length;
-  Reply->Header.DataSize += Console->Title.Length;
-  Reply->Status = STATUS_SUCCESS;
+  RtlZeroMemory(&Request->Data.GetTitleRequest, sizeof(CSRSS_GET_TITLE));
+  Request->Data.GetTitleRequest.ConsoleHandle = Request->Data.GetTitleRequest.ConsoleHandle;
+  Request->Data.GetTitleRequest.Length = Console->Title.Length;
+  memcpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer,
+          Console->Title.Length);
+  Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + Console->Title.Length;
 
   ConioUnlockConsole(Console);
 
-  return Reply->Status;
+  if (Length > sizeof(CSR_API_MESSAGE))
+    {
+      Request->Header.u1.s1.TotalLength = Length;
+      Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
+    }
+  Request->Status = STATUS_SUCCESS;
+
+  return Request->Status;
 }
 
 CSR_API(CsrWriteConsoleOutput)
@@ -2259,11 +2379,11 @@ CSR_API(CsrWriteConsoleOutput)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Status = ConioLockScreenBuffer(ProcessData,
                                  Request->Data.WriteConsoleOutputRequest.ConsoleHandle,
                                  &Buff);
@@ -2273,7 +2393,7 @@ CSR_API(CsrWriteConsoleOutput)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize;
@@ -2281,20 +2401,20 @@ CSR_API(CsrWriteConsoleOutput)
   BufferCoord = Request->Data.WriteConsoleOutputRequest.BufferCoord;
   CharInfo = Request->Data.WriteConsoleOutputRequest.CharInfo;
   if (((PVOID)CharInfo < ProcessData->CsrSectionViewBase) ||
-      (((PVOID)CharInfo + PSize) > 
-       (ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
+      (((ULONG_PTR)CharInfo + PSize) >
+       ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockScreenBuffer(Buff);
       ConioUnlockConsole(Console);
-      return Reply->Status = STATUS_ACCESS_VIOLATION;
+      return Request->Status = STATUS_ACCESS_VIOLATION;
     }
   WriteRegion.left = Request->Data.WriteConsoleOutputRequest.WriteRegion.Left;
   WriteRegion.top = Request->Data.WriteConsoleOutputRequest.WriteRegion.Top;
   WriteRegion.right = Request->Data.WriteConsoleOutputRequest.WriteRegion.Right;
   WriteRegion.bottom = Request->Data.WriteConsoleOutputRequest.WriteRegion.Bottom;
 
-  SizeY = RtlRosMin(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion));
-  SizeX = RtlRosMin(BufferSize.X - BufferCoord.X, ConioRectWidth(&WriteRegion));
+  SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion));
+  SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&WriteRegion));
   WriteRegion.bottom = WriteRegion.top + SizeY - 1;
   WriteRegion.right = WriteRegion.left + SizeX - 1;
 
@@ -2307,7 +2427,7 @@ CSR_API(CsrWriteConsoleOutput)
 
       /* It is okay to have a WriteRegion completely outside the screen buffer.
          No data is written then. */
-      return Reply->Status = STATUS_SUCCESS;
+      return Request->Status = STATUS_SUCCESS;
     }
 
   for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++)
@@ -2338,12 +2458,12 @@ CSR_API(CsrWriteConsoleOutput)
   ConioUnlockScreenBuffer(Buff);
   ConioUnlockConsole(Console);
 
-  Reply->Data.WriteConsoleOutputReply.WriteRegion.Right = WriteRegion.left + SizeX - 1;
-  Reply->Data.WriteConsoleOutputReply.WriteRegion.Bottom = WriteRegion.top + SizeY - 1;
-  Reply->Data.WriteConsoleOutputReply.WriteRegion.Left = WriteRegion.left;
-  Reply->Data.WriteConsoleOutputReply.WriteRegion.Top = WriteRegion.top;
+  Request->Data.WriteConsoleOutputRequest.WriteRegion.Right = WriteRegion.left + SizeX - 1;
+  Request->Data.WriteConsoleOutputRequest.WriteRegion.Bottom = WriteRegion.top + SizeY - 1;
+  Request->Data.WriteConsoleOutputRequest.WriteRegion.Left = WriteRegion.left;
+  Request->Data.WriteConsoleOutputRequest.WriteRegion.Top = WriteRegion.top;
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrFlushInputBuffer)
@@ -2355,14 +2475,14 @@ CSR_API(CsrFlushInputBuffer)
 
   DPRINT("CsrFlushInputBuffer\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  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.FlushInputBufferRequest.ConsoleInput,
                             &Console);
   if(! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   /* Discard all entries in the input event queue */
@@ -2378,7 +2498,7 @@ CSR_API(CsrFlushInputBuffer)
 
   ConioUnlockConsole(Console);
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrScrollConsoleScreenBuffer)
@@ -2404,11 +2524,11 @@ CSR_API(CsrScrollConsoleScreenBuffer)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
   Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
@@ -2416,7 +2536,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
         {
           ConioUnlockConsole(Console);
         }
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   ScrollRectangle.left = Request->Data.ScrollConsoleScreenBufferRequest.ScrollRectangle.Left;
@@ -2433,13 +2553,13 @@ CSR_API(CsrScrollConsoleScreenBuffer)
   if (! ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle))
     {
       ConioUnlockScreenBuffer(Buff);
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      return Request->Status = STATUS_INVALID_PARAMETER;
     }
 
   if (UseClipRectangle && ! ConioGetIntersection(&SrcRegion, &SrcRegion, &ClipRectangle))
     {
       ConioUnlockScreenBuffer(Buff);
-      return Reply->Status = STATUS_SUCCESS;
+      return Request->Status = STATUS_SUCCESS;
     }
 
 
@@ -2453,7 +2573,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
   if (! ConioGetIntersection(&DstRegion, &DstRegion, &ScreenBuffer))
     {
       ConioUnlockScreenBuffer(Buff);
-      return Reply->Status = STATUS_INVALID_PARAMETER;
+      return Request->Status = STATUS_INVALID_PARAMETER;
     }
 
   ConioCopyRegion(Buff, &SrcRegion, &DstRegion);
@@ -2491,7 +2611,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
       ConioUnlockConsole(Console);
     }
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrReadConsoleOutputChar)
@@ -2507,22 +2627,22 @@ CSR_API(CsrReadConsoleOutputChar)
 
   DPRINT("CsrReadConsoleOutputChar\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE;
-  ReadBuffer = Reply->Data.ReadConsoleOutputCharReply.String;
-  
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
+  ReadBuffer = Request->Data.ReadConsoleOutputCharRequest.String;
+
   CharSize = (Request->Data.ReadConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
-  
+
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X + Buff->ShowX;
@@ -2531,7 +2651,7 @@ CSR_API(CsrReadConsoleOutputChar)
   for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i)
     {
       Char = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX)];
-      
+
       if(Request->Data.ReadConsoleOutputCharRequest.Unicode)
       {
         ConsoleAnsiCharToUnicodeChar(Console, (WCHAR*)ReadBuffer, &Char);
@@ -2555,21 +2675,24 @@ CSR_API(CsrReadConsoleOutputChar)
     }
 
   *ReadBuffer = 0;
-  Reply->Status = STATUS_SUCCESS;
-  Reply->Data.ReadConsoleOutputCharReply.EndCoord.X = Xpos - Buff->ShowX;
-  Reply->Data.ReadConsoleOutputCharReply.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
-  Reply->Header.MessageSize += Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead;
-  Reply->Header.DataSize += Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead;
+  Request->Status = STATUS_SUCCESS;
+  Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos - Buff->ShowX;
+  Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
 
   ConioUnlockScreenBuffer(Buff);
   if (NULL != Console)
     {
       ConioUnlockConsole(Console);
     }
-  
-  Reply->Data.ReadConsoleOutputCharReply.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Reply->Data.ReadConsoleOutputCharReply.String) / CharSize;
 
-  return Reply->Status;
+  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))
+    {
+      Request->Header.u1.s1.TotalLength = Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR);
+      Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
+    }
+
+  return Request->Status;
 }
 
 
@@ -2578,19 +2701,20 @@ CSR_API(CsrReadConsoleOutputAttrib)
   NTSTATUS Status;
   PCSRSS_SCREEN_BUFFER Buff;
   DWORD Xpos, Ypos;
-  CHAR* ReadBuffer;
+  PWORD ReadBuffer;
   DWORD i;
+  DWORD CurrentLength;
 
   DPRINT("CsrReadConsoleOutputAttrib\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE;
-  ReadBuffer = Reply->Data.ReadConsoleOutputAttribReply.String;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
+  ReadBuffer = Request->Data.ReadConsoleOutputAttribRequest.Attribute;
 
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X + Buff->ShowX;
@@ -2617,15 +2741,21 @@ CSR_API(CsrReadConsoleOutputAttrib)
 
   *ReadBuffer = 0;
 
-  Reply->Status = STATUS_SUCCESS;
-  Reply->Data.ReadConsoleOutputAttribReply.EndCoord.X = Xpos - Buff->ShowX;
-  Reply->Data.ReadConsoleOutputAttribReply.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
-  Reply->Header.MessageSize += Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead;
-  Reply->Header.DataSize += Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead;
+  Request->Status = STATUS_SUCCESS;
+  Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos - Buff->ShowX;
+  Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
 
   ConioUnlockScreenBuffer(Buff);
 
-  return Reply->Status;
+  CurrentLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)
+                     + Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead * sizeof(WORD);
+  if (CurrentLength > sizeof(CSR_API_MESSAGE))
+    {
+      Request->Header.u1.s1.TotalLength = CurrentLength;
+      Request->Header.u1.s1.DataLength = CurrentLength - sizeof(PORT_MESSAGE);
+    }
+
+  return Request->Status;
 }
 
 
@@ -2636,21 +2766,21 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
   PLIST_ENTRY CurrentItem;
   DWORD NumEvents;
   ConsoleInput *Input;
-  
+
   DPRINT("CsrGetNumberOfConsoleInputEvents\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
 
   Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  
+
   CurrentItem = Console->InputEvents.Flink;
   NumEvents = 0;
-  
+
   /* If there are any events ... */
   while (CurrentItem != &Console->InputEvents)
     {
@@ -2663,11 +2793,11 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
     }
 
   ConioUnlockConsole(Console);
-  
-  Reply->Status = STATUS_SUCCESS;
-  Reply->Data.GetNumInputEventsReply.NumInputEvents = NumEvents;
-   
-  return Reply->Status;
+
+  Request->Status = STATUS_SUCCESS;
+  Request->Data.GetNumInputEventsRequest.NumInputEvents = NumEvents;
+
+  return Request->Status;
 }
 
 
@@ -2681,36 +2811,36 @@ CSR_API(CsrPeekConsoleInput)
   PINPUT_RECORD InputRecord;
   ConsoleInput* Item;
   UINT NumItems;
-   
+
   DPRINT("CsrPeekConsoleInput\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-   
+  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.GetNumInputEventsRequest.ConsoleHandle, &Console);
   if(! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-   
+
   InputRecord = Request->Data.PeekConsoleInputRequest.InputRecord;
   Length = Request->Data.PeekConsoleInputRequest.Length;
   Size = Length * sizeof(INPUT_RECORD);
-   
+
   if (((PVOID)InputRecord < ProcessData->CsrSectionViewBase)
-      || (((PVOID)InputRecord + Size) > (ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
+      || (((ULONG_PTR)InputRecord + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockConsole(Console);
-      Reply->Status = STATUS_ACCESS_VIOLATION;
-      return Reply->Status ;
+      Request->Status = STATUS_ACCESS_VIOLATION;
+      return Request->Status ;
     }
-   
+
   NumItems = 0;
-   
+
   if (! IsListEmpty(&Console->InputEvents))
     {
       CurrentItem = Console->InputEvents.Flink;
-   
+
       while (CurrentItem != &Console->InputEvents && NumItems < Length)
         {
           Item = CONTAINING_RECORD(CurrentItem, ConsoleInput, ListEntry);
@@ -2720,7 +2850,7 @@ CSR_API(CsrPeekConsoleInput)
               CurrentItem = CurrentItem->Flink;
               continue;
             }
-          
+
           ++NumItems;
           *InputRecord = Item->InputEvent;
 
@@ -2728,7 +2858,7 @@ CSR_API(CsrPeekConsoleInput)
             {
               ConioInputEventToAnsi(Console, InputRecord);
             }
-         
+
           InputRecord++;
           CurrentItem = CurrentItem->Flink;
         }
@@ -2736,10 +2866,10 @@ CSR_API(CsrPeekConsoleInput)
 
   ConioUnlockConsole(Console);
 
-  Reply->Status = STATUS_SUCCESS;
-  Reply->Data.PeekConsoleInputReply.Length = NumItems;
+  Request->Status = STATUS_SUCCESS;
+  Request->Data.PeekConsoleInputRequest.Length = NumItems;
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 
@@ -2756,20 +2886,21 @@ CSR_API(CsrReadConsoleOutput)
   COORD BufferCoord;
   RECT ReadRegion;
   RECT ScreenRect;
-  DWORD i, Y, X, Offset;
+  DWORD i, Offset;
+  LONG X, Y;
   UINT CodePage;
-      
+
   DPRINT("CsrReadConsoleOutput\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-  
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
   Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-   
+
   CharInfo = Request->Data.ReadConsoleOutputRequest.CharInfo;
   ReadRegion.left = Request->Data.ReadConsoleOutputRequest.ReadRegion.Left;
   ReadRegion.top = Request->Data.ReadConsoleOutputRequest.ReadRegion.Top;
@@ -2782,17 +2913,17 @@ CSR_API(CsrReadConsoleOutput)
 
   /* FIXME: Is this correct? */
   CodePage = ProcessData->Console->OutputCodePage;
-   
+
   if (((PVOID)CharInfo < ProcessData->CsrSectionViewBase)
-      || (((PVOID)CharInfo + Size) > (ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
+      || (((ULONG_PTR)CharInfo + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockScreenBuffer(Buff);
-      Reply->Status = STATUS_ACCESS_VIOLATION;
-      return Reply->Status ;
+      Request->Status = STATUS_ACCESS_VIOLATION;
+      return Request->Status ;
     }
-   
-  SizeY = RtlRosMin(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&ReadRegion));
-  SizeX = RtlRosMin(BufferSize.X - BufferCoord.X, ConioRectWidth(&ReadRegion));
+
+  SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&ReadRegion));
+  SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&ReadRegion));
   ReadRegion.bottom = ReadRegion.top + SizeY;
   ReadRegion.right = ReadRegion.left + SizeX;
 
@@ -2800,14 +2931,14 @@ CSR_API(CsrReadConsoleOutput)
   if (! ConioGetIntersection(&ReadRegion, &ScreenRect, &ReadRegion))
     {
       ConioUnlockScreenBuffer(Buff);
-      Reply->Status = STATUS_SUCCESS;
-      return Reply->Status;
+      Request->Status = STATUS_SUCCESS;
+      return Request->Status;
     }
 
   for (i = 0, Y = ReadRegion.top; Y < ReadRegion.bottom; ++i, ++Y)
     {
       CurCharInfo = CharInfo + (i * BufferSize.X);
-     
+
       Offset = (((Y + Buff->ShowY) % Buff->MaxY) * Buff->MaxX + ReadRegion.left) * 2;
       for (X = ReadRegion.left; X < ReadRegion.right; ++X)
         {
@@ -2827,14 +2958,14 @@ CSR_API(CsrReadConsoleOutput)
     }
 
   ConioUnlockScreenBuffer(Buff);
-  
-  Reply->Status = STATUS_SUCCESS;
-  Reply->Data.ReadConsoleOutputReply.ReadRegion.Right = ReadRegion.left + SizeX - 1;
-  Reply->Data.ReadConsoleOutputReply.ReadRegion.Bottom = ReadRegion.top + SizeY - 1;
-  Reply->Data.ReadConsoleOutputReply.ReadRegion.Left = ReadRegion.left;
-  Reply->Data.ReadConsoleOutputReply.ReadRegion.Top = ReadRegion.top;
-   
-  return Reply->Status;
+
+  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;
 }
 
 
@@ -2847,38 +2978,38 @@ CSR_API(CsrWriteConsoleInput)
   DWORD Size;
   DWORD i;
   ConsoleInput* Record;
-   
+
   DPRINT("CsrWriteConsoleInput\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-   
+  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.WriteConsoleInputRequest.ConsoleHandle, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-   
+
   InputRecord = Request->Data.WriteConsoleInputRequest.InputRecord;
   Length = Request->Data.WriteConsoleInputRequest.Length;
   Size = Length * sizeof(INPUT_RECORD);
-   
+
   if (((PVOID)InputRecord < ProcessData->CsrSectionViewBase)
-      || (((PVOID)InputRecord + Size) > (ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
+      || (((ULONG_PTR)InputRecord + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
     {
       ConioUnlockConsole(Console);
-      Reply->Status = STATUS_ACCESS_VIOLATION;
-      return Reply->Status ;
+      Request->Status = STATUS_ACCESS_VIOLATION;
+      return Request->Status ;
     }
-   
+
   for (i = 0; i < Length; i++)
     {
       Record = HeapAlloc(Win32CsrApiHeap, 0, sizeof(ConsoleInput));
       if (NULL == Record)
         {
           ConioUnlockConsole(Console);
-          Reply->Status = STATUS_INSUFFICIENT_RESOURCES;
-          return Reply->Status;
+          Request->Status = STATUS_INSUFFICIENT_RESOURCES;
+          return Request->Status;
         }
 
       Record->Echoed = FALSE;
@@ -2892,11 +3023,11 @@ CSR_API(CsrWriteConsoleInput)
     }
 
   ConioUnlockConsole(Console);
-   
-  Reply->Status = STATUS_SUCCESS;
-  Reply->Data.WriteConsoleInputReply.Length = i;
 
-  return Reply->Status;
+  Request->Status = STATUS_SUCCESS;
+  Request->Data.WriteConsoleInputRequest.Length = i;
+
+  return Request->Status;
 }
 
 /**********************************************************************
@@ -2908,12 +3039,12 @@ CSR_API(CsrWriteConsoleInput)
  *             output.
  *     ARGUMENTS
  *             Client hands us a CSRSS_CONSOLE_HARDWARE_STATE
- *             object. We use the same object to reply.
+ *             object. We use the same object to Request.
  *     NOTE
  *             ConsoleHwState has the correct size to be compatible
  *             with NT's, but values are not.
  */
-STATIC NTSTATUS FASTCALL
+static NTSTATUS FASTCALL
 SetConsoleHardwareState (PCSRSS_CONSOLE Console, DWORD ConsoleHwState)
 {
   DPRINT1("Console Hardware State: %d\n", ConsoleHwState);
@@ -2928,7 +3059,7 @@ SetConsoleHardwareState (PCSRSS_CONSOLE Console, DWORD ConsoleHwState)
           Console->HardwareState = ConsoleHwState;
         }
 
-      return STATUS_SUCCESS;   
+      return STATUS_SUCCESS;
     }
 
   return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */
@@ -2938,40 +3069,40 @@ CSR_API(CsrHardwareStateProperty)
 {
   PCSRSS_CONSOLE Console;
   NTSTATUS Status;
+
   DPRINT("CsrHardwareStateProperty\n");
 
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-   
+  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.ConsoleHardwareStateRequest.ConsoleHandle,
                             &Console);
   if (! NT_SUCCESS(Status))
     {
       DPRINT1("Failed to get console handle in SetConsoleHardwareState\n");
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   switch (Request->Data.ConsoleHardwareStateRequest.SetGet)
     {
       case CONSOLE_HARDWARE_STATE_GET:
-        Reply->Data.ConsoleHardwareStateReply.State = Console->HardwareState;
+        Request->Data.ConsoleHardwareStateRequest.State = Console->HardwareState;
         break;
-      
+
       case CONSOLE_HARDWARE_STATE_SET:
         DPRINT("Setting console hardware state.\n");
-        Reply->Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State);
+        Request->Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State);
         break;
 
       default:
-        Reply->Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */
+        Request->Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */
         break;
     }
 
   ConioUnlockConsole(Console);
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrGetConsoleWindow)
@@ -2980,20 +3111,20 @@ CSR_API(CsrGetConsoleWindow)
   NTSTATUS Status;
 
   DPRINT("CsrGetConsoleWindow\n");
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-   
+
+  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 Reply->Status = Status;
+      return Request->Status = Status;
     }
 
-  Reply->Data.GetConsoleWindowReply.WindowHandle = Console->hWindow;
+  Request->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow;
   ConioUnlockConsole(Console);
 
-  return Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleIcon)
@@ -3002,21 +3133,21 @@ CSR_API(CsrSetConsoleIcon)
   NTSTATUS Status;
 
   DPRINT("CsrSetConsoleIcon\n");
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-   
+
+  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 Reply->Status = Status;
+      return Request->Status = Status;
     }
 
   Console->hWindowIcon = Request->Data.SetConsoleIconRequest.WindowIcon;
-  Reply->Status = (ConioChangeIcon(Console) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
+  Request->Status = (ConioChangeIcon(Console) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
   ConioUnlockConsole(Console);
 
-  return Reply->Status;
+  return Request->Status;
 }
 
 CSR_API(CsrGetConsoleCodePage)
@@ -3029,14 +3160,14 @@ CSR_API(CsrGetConsoleCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-  Reply->Data.GetConsoleCodePage.CodePage = Console->CodePage;
+
+  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 Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleCodePage)
@@ -3049,19 +3180,19 @@ CSR_API(CsrSetConsoleCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+
+  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 Reply->Status = STATUS_SUCCESS;
+      return Request->Status = STATUS_SUCCESS;
     }
   ConioUnlockConsole(Console);
-  return Reply->Status = STATUS_UNSUCCESSFUL;
+  return Request->Status = STATUS_UNSUCCESSFUL;
 }
 
 CSR_API(CsrGetConsoleOutputCodePage)
@@ -3074,14 +3205,14 @@ CSR_API(CsrGetConsoleOutputCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
-  Reply->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage;
+
+  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 Reply->Status = STATUS_SUCCESS;
+  return Request->Status = STATUS_SUCCESS;
 }
 
 CSR_API(CsrSetConsoleOutputCodePage)
@@ -3094,19 +3225,19 @@ CSR_API(CsrSetConsoleOutputCodePage)
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
     {
-      return Reply->Status = Status;
+      return Request->Status = Status;
     }
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
+
+  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 Reply->Status = STATUS_SUCCESS;
+      return Request->Status = STATUS_SUCCESS;
     }
   ConioUnlockConsole(Console);
-  return Reply->Status = STATUS_UNSUCCESSFUL;
+  return Request->Status = STATUS_UNSUCCESSFUL;
 }
 
 CSR_API(CsrGetProcessList)
@@ -3115,23 +3246,23 @@ CSR_API(CsrGetProcessList)
   PCSRSS_CONSOLE Console;
   PCSRSS_PROCESS_DATA current;
   PLIST_ENTRY current_entry;
-  ULONG nItems, nCopied;
+  ULONG nItems, nCopied, Length;
   NTSTATUS Status;
 
   DPRINT("CsrGetProcessList\n");
-  
-  Buffer = Reply->Data.GetProcessListReply.ProcessId;
-  Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
-  Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE;
-  
+
+  Buffer = Request->Data.GetProcessListRequest.ProcessId;
+  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
   nItems = nCopied = 0;
-  Reply->Data.GetProcessListReply.nProcessIdsCopied = 0;
-  Reply->Data.GetProcessListReply.nProcessIdsTotal = 0;
-  
+  Request->Data.GetProcessListRequest.nProcessIdsCopied = 0;
+  Request->Data.GetProcessListRequest.nProcessIdsTotal = 0;
+
   Status = ConioConsoleFromProcessData(ProcessData, &Console);
   if (! NT_SUCCESS(Status))
   {
-    return Reply->Status = Status;
+    return Request->Status = Status;
   }
 
   DPRINT1("Console_Api Ctrl-C\n");
@@ -3149,11 +3280,17 @@ CSR_API(CsrGetProcessList)
   }
 
   ConioUnlockConsole(Console);
-  
-  Reply->Data.GetProcessListReply.nProcessIdsCopied = nCopied;
-  Reply->Data.GetProcessListReply.nProcessIdsTotal = nItems;
-  
-  return Reply->Status = STATUS_SUCCESS;
+
+  Request->Data.GetProcessListRequest.nProcessIdsCopied = nCopied;
+  Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
+
+  Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST) + nCopied * sizeof(HANDLE);
+  if (Length > sizeof(CSR_API_MESSAGE))
+  {
+     Request->Header.u1.s1.TotalLength = Length;
+     Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
+  }
+  return Request->Status = STATUS_SUCCESS;
 }
 
 /* EOF */