/* 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 *******************************************************************/
LPDWORD lpNumberOfEventsRead
)
{
- PCSRSS_API_REQUEST Request;
+ PCSRSS_API_REQUEST Request;
CSRSS_API_REPLY Reply;
NTSTATUS Status;
PVOID BufferBase;
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;
}
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;
}
sizeof(CSRSS_API_REQUEST));
if (Request == NULL)
{
+ CsrReleaseParameterBuffer(BufferBase);
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
sizeof(CSRSS_API_REPLY));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
{
+ CsrReleaseParameterBuffer(BufferBase);
RtlFreeHeap(GetProcessHeap(), 0, Request);
SetLastErrorByStatus(Status);
return FALSE;
lpCharacter += Size;
Request->Data.WriteConsoleOutputCharRequest.Coord = Reply.Data.WriteConsoleOutputCharReply.EndCoord;
}
+
+ RtlFreeHeap( GetProcessHeap(), 0, Request );
return TRUE;
}
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;
}
lpAttribute += Size;
Request->Data.WriteConsoleOutputAttribRequest.Coord = Reply.Data.WriteConsoleOutputAttribReply.EndCoord;
}
+
+ RtlFreeHeap( GetProcessHeap(), 0, Request );
return TRUE;
}
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;
}
BOOL
WINAPI
SetConsoleTextAttribute(
- HANDLE hConsoleOutput,
+ HANDLE hConsoleOutput,
WORD wAttributes
)
{