update for HEAD-2003021201
[reactos.git] / lib / kernel32 / misc / console.c
index ab75193..bb2a5c0 100644 (file)
 
 /* INCLUDES ******************************************************************/
 
-#include <ddk/ntddk.h>
-#include <ddk/ntddblue.h>
-#include <windows.h>
-#include <assert.h>
-#include <wchar.h>
-
-#include <csrss/csrss.h>
-#include <ntdll/csr.h>
+#include <k32.h>
 
 #define NDEBUG
 #include <kernel32/kernel32.h>
-#include <kernel32/error.h>
 
 /* GLOBALS *******************************************************************/
 
@@ -937,7 +929,7 @@ PeekConsoleInputA(
        LPDWORD                 lpNumberOfEventsRead
        )
 {
- PCSRSS_API_REQUEST Request;
 PCSRSS_API_REQUEST Request;
   CSRSS_API_REPLY Reply;
   NTSTATUS Status;
   PVOID BufferBase;
@@ -1118,8 +1110,55 @@ WriteConsoleInputA(
        LPDWORD                  lpNumberOfEventsWritten
        )
 {
-/* TO DO */
-       return FALSE;
+  PCSRSS_API_REQUEST Request;
+  CSRSS_API_REPLY Reply;
+  PVOID BufferBase, BufferTargetBase;
+  NTSTATUS Status;
+  DWORD Size;
+  
+  if(lpBuffer == NULL)
+  {
+    SetLastError(ERROR_INVALID_PARAMETER);
+    return FALSE;
+  }
+  
+  Size = nLength * sizeof(INPUT_RECORD);
+
+  Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
+  if(!NT_SUCCESS(Status))
+  {
+    SetLastErrorByStatus(Status);
+    return FALSE;
+  }
+  
+  Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
+  if(Request == NULL)
+  {
+    SetLastError(ERROR_OUTOFMEMORY);
+    CsrReleaseParameterBuffer(BufferBase);
+    return FALSE;
+  }
+
+  Request->Type = CSRSS_WRITE_CONSOLE_INPUT;
+  Request->Data.WriteConsoleInputRequest.ConsoleHandle = hConsoleInput;
+  Request->Data.WriteConsoleInputRequest.Length = nLength;
+  Request->Data.WriteConsoleInputRequest.InputRecord = (PINPUT_RECORD)BufferTargetBase;
+  
+  Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
+  if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
+  {
+    RtlFreeHeap(GetProcessHeap(), 0, Request);
+    CsrReleaseParameterBuffer(BufferBase);
+    return FALSE;
+  }
+  
+  if(lpNumberOfEventsWritten != NULL)
+    *lpNumberOfEventsWritten = Reply.Data.WriteConsoleInputReply.Length;
+  
+  RtlFreeHeap(GetProcessHeap(), 0, Request);
+  CsrReleaseParameterBuffer(BufferBase);
+  
+  return TRUE;
 }
 
 
@@ -1155,8 +1194,62 @@ ReadConsoleOutputA(
        PSMALL_RECT     lpReadRegion
        )
 {
-/* TO DO */
-       return FALSE;
+  PCSRSS_API_REQUEST Request;
+  CSRSS_API_REPLY Reply;
+  PVOID BufferBase;
+  PVOID BufferTargetBase;
+  NTSTATUS Status;
+  DWORD Size, SizeX, SizeY;
+  
+  if(lpBuffer == NULL)
+  {
+    SetLastError(ERROR_INVALID_PARAMETER);
+    return FALSE;
+  }
+  
+  Size = dwBufferSize.X * dwBufferSize.Y * sizeof(CHAR_INFO);
+
+  Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
+  if(!NT_SUCCESS(Status))
+  {
+    SetLastErrorByStatus(Status);
+    return FALSE;
+  }
+  
+  Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
+  if(Request == NULL)
+  {
+    SetLastError(ERROR_OUTOFMEMORY);
+    CsrReleaseParameterBuffer(BufferBase);
+    return FALSE;
+  }
+   
+  Request->Type = CSRSS_READ_CONSOLE_OUTPUT;
+  Request->Data.ReadConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
+  Request->Data.ReadConsoleOutputRequest.BufferSize = dwBufferSize;
+  Request->Data.ReadConsoleOutputRequest.BufferCoord = dwBufferCoord;
+  Request->Data.ReadConsoleOutputRequest.ReadRegion = *lpReadRegion;
+  Request->Data.ReadConsoleOutputRequest.CharInfo = (PCHAR_INFO)BufferTargetBase;
+  
+  Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
+  if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
+  {
+    SetLastErrorByStatus(Status);
+    RtlFreeHeap(GetProcessHeap(), 0, Request);
+    CsrReleaseParameterBuffer(BufferBase);
+    return FALSE;
+  }
+  
+  SizeX = Reply.Data.ReadConsoleOutputReply.ReadRegion.Right - Reply.Data.ReadConsoleOutputReply.ReadRegion.Left + 1;
+  SizeY = Reply.Data.ReadConsoleOutputReply.ReadRegion.Bottom - Reply.Data.ReadConsoleOutputReply.ReadRegion.Top + 1;
+  
+  memcpy(lpBuffer, BufferBase, sizeof(CHAR_INFO) * SizeX * SizeY);
+  *lpReadRegion = Reply.Data.ReadConsoleOutputReply.ReadRegion;
+  
+  RtlFreeHeap(GetProcessHeap(), 0, Request);
+  CsrReleaseParameterBuffer(BufferBase);
+  
+  return TRUE;
 }
 
 
@@ -1213,6 +1306,7 @@ WriteConsoleOutputA(HANDLE                 hConsoleOutput,
                            sizeof(CSRSS_API_REQUEST));
   if (Request == NULL)
     {
+      CsrReleaseParameterBuffer(BufferBase);
       SetLastError(ERROR_OUTOFMEMORY);
       return FALSE;
     }
@@ -1229,6 +1323,7 @@ WriteConsoleOutputA(HANDLE                 hConsoleOutput,
                               sizeof(CSRSS_API_REPLY));
   if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
     {
+      CsrReleaseParameterBuffer(BufferBase);
       RtlFreeHeap(GetProcessHeap(), 0, Request);
       SetLastErrorByStatus(Status);
       return FALSE;
@@ -1461,6 +1556,8 @@ WriteConsoleOutputCharacterA(HANDLE               hConsoleOutput,
       lpCharacter += Size;
       Request->Data.WriteConsoleOutputCharRequest.Coord = Reply.Data.WriteConsoleOutputCharReply.EndCoord;
     }
+  
+  RtlFreeHeap( GetProcessHeap(), 0, Request ); 
   return TRUE;
 }
 
@@ -1527,7 +1624,7 @@ WriteConsoleOutputAttribute(
         Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + (Size * 2), sizeof( CSRSS_API_REPLY ) );
         if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
            {
-         RtlFreeHeap( GetProcessHeap(), 0, Request );
+              RtlFreeHeap( GetProcessHeap(), 0, Request );
               SetLastErrorByStatus ( Status );
               return FALSE;
            }
@@ -1535,6 +1632,8 @@ WriteConsoleOutputAttribute(
         lpAttribute += Size;
         Request->Data.WriteConsoleOutputAttribRequest.Coord = Reply.Data.WriteConsoleOutputAttribReply.EndCoord;
       }
+   
+   RtlFreeHeap( GetProcessHeap(), 0, Request );
    return TRUE;
 }
 
@@ -1626,9 +1725,9 @@ GetNumberOfConsoleInputEvents(
    Request.Type = CSRSS_GET_NUM_INPUT_EVENTS;
    Request.Data.GetNumInputEventsRequest.ConsoleHandle = hConsoleInput;
    Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
-   if(!NT_SUCCESS(Status) || !NT_SUCCESS(Reply.Status))
+   if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
    {
-      SetLastErrorByStatus(Reply.Status);
+      SetLastErrorByStatus(Status);
       return FALSE;
    }
    
@@ -1913,7 +2012,7 @@ WINBASEAPI
 BOOL
 WINAPI
 SetConsoleTextAttribute(
-       HANDLE          hConsoleOutput,
+        HANDLE         hConsoleOutput,
         WORD            wAttributes
         )
 {