CHAR_INFO Fill;
} CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST, *PCSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST;
+typedef struct
+{
+ HANDLE ConsoleHandle;
+ DWORD NumCharsToRead;
+ COORD ReadCoord;
+}CSRSS_READ_CONSOLE_OUTPUT_CHAR_REQUEST, *PCSRSS_READ_CONSOLE_OUTPUT_CHAR_REQUEST;
+
+typedef struct
+{
+ COORD EndCoord;
+ CHAR String[1];
+}CSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY, *PCSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY;
+
#define CSRSS_MAX_WRITE_CONSOLE_REQUEST \
(MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST))
#define CSRSS_MAX_READ_CONSOLE_REQUEST (MAX_MESSAGE_DATA - sizeof( ULONG ) - sizeof( CSRSS_READ_CONSOLE_REQUEST ))
+#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(HANDLE) - sizeof(DWORD) - sizeof(CSRSS_READ_CONSOLE_OUTPUT_CHAR_REQUEST))
+
// FIXME: it should be 80. Is this a limit due to LPC msg size?
#define CSRSS_MAX_TITLE_LENGTH 50
#define CSRSS_WRITE_CONSOLE_OUTPUT (0x17)
#define CSRSS_FLUSH_INPUT_BUFFER (0x18)
#define CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER (0x19)
+#define CSRSS_READ_CONSOLE_OUTPUT_CHAR (0x1A)
+
/* Keep in sync with definition below. */
#define CSRSS_REQUEST_HEADER_SIZE (sizeof(LPC_MESSAGE_HEADER) + sizeof(ULONG))
CSRSS_FLUSH_INPUT_BUFFER_REQUEST FlushInputBufferRequest;
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST
ScrollConsoleScreenBufferRequest;
+ CSRSS_READ_CONSOLE_OUTPUT_CHAR_REQUEST ReadConsoleOutputCharRequest;
} Data;
} CSRSS_API_REQUEST, *PCSRSS_API_REQUEST;
CSRSS_CREATE_SCREEN_BUFFER_REPLY CreateScreenBufferReply;
CSRSS_GET_TITLE_REPLY GetTitleReply;
CSRSS_WRITE_CONSOLE_OUTPUT_REPLY WriteConsoleOutputReply;
+ CSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY ReadConsoleOutputCharReply;
} Data;
} CSRSS_API_REPLY, *PCSRSS_API_REPLY;
-/* $Id: console.c,v 1.40 2002/05/07 22:23:17 hbirr Exp $
+/* $Id: console.c,v 1.41 2002/08/22 15:21:06 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
}
DWORD STDCALL
-GetConsoleFontSize (DWORD Unknown0,
- DWORD Unknown1)
- /*
- * Undocumented
- */
+GetConsoleFontSize(HANDLE hConsoleOutput,
+ DWORD nFont)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
DWORD STDCALL
-GetCurrentConsoleFont (DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
- /*
- * Undocumented
- */
+GetCurrentConsoleFont(HANDLE hConsoleOutput,
+ BOOL bMaximumWindow,
+ PCONSOLE_FONT_INFO lpConsoleCurrentFont)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
CSRSS_MAX_WRITE_CONSOLE_REQUEST);
if (Request == NULL)
{
+ SetLastError(ERROR_OUTOFMEMORY);
return(FALSE);
}
sizeof(CSRSS_API_REPLY) + nNumberOfCharsToRead);
if (Reply == NULL)
{
+ SetLastError(ERROR_OUTOFMEMORY);
return(FALSE);
}
*/
WINBOOL STDCALL FreeConsole(VOID)
{
- DbgPrint("FreeConsole() is unimplemented");
+ DbgPrint("FreeConsole() is unimplemented\n");
return FALSE;
}
/*--------------------------------------------------------------
* FillConsoleOutputCharacterA
*/
-WINBOOL
-STDCALL
+WINBOOL STDCALL
FillConsoleOutputCharacterA(
HANDLE hConsoleOutput,
CHAR cCharacter,
LPDWORD lpNumberOfCharsWritten
)
{
- CSRSS_API_REQUEST Request;
- CSRSS_API_REPLY Reply;
- NTSTATUS Status;
+ CSRSS_API_REQUEST Request;
+ CSRSS_API_REPLY Reply;
+ NTSTATUS Status;
- Request.Type = CSRSS_FILL_OUTPUT;
- Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.FillOutputRequest.Char = cCharacter;
- Request.Data.FillOutputRequest.Position = dwWriteCoord;
- Request.Data.FillOutputRequest.Length = nLength;
- Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
- if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
- {
- SetLastErrorByStatus ( Status );
- return FALSE;
- }
- *lpNumberOfCharsWritten = nLength;
- return TRUE;
+ Request.Type = CSRSS_FILL_OUTPUT;
+ Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput;
+ Request.Data.FillOutputRequest.Char = cCharacter;
+ Request.Data.FillOutputRequest.Position = dwWriteCoord;
+ Request.Data.FillOutputRequest.Length = nLength;
+ Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
+ if ( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
+ {
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+ if (lpNumberOfCharsWritten != NULL)
+ *lpNumberOfCharsWritten = nLength;
+ return(TRUE);
}
LPDWORD lpNumberOfCharsRead
)
{
- SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
- return FALSE;
+ CSRSS_API_REQUEST Request;
+ PCSRSS_API_REPLY Reply;
+ NTSTATUS Status;
+ DWORD Size;
+
+ Reply = RtlAllocateHeap(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR);
+ if (Reply == NULL)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return(FALSE);
+ }
+
+ if (lpNumberOfCharsRead != NULL)
+ *lpNumberOfCharsRead = Size;
+
+ Request.Type = CSRSS_READ_CONSOLE_OUTPUT_CHAR;
+ Request.Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
+ Request.Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
+
+ while (nLength != 0)
+ {
+ if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR)
+ Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR;
+ else
+ Size = nLength;
+
+ Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead = Size;
+
+ Status = CsrClientCallServer(&Request,
+ Reply,
+ sizeof(CSRSS_API_REQUEST),
+ sizeof(CSRSS_API_REPLY) + Size);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
+ {
+ RtlFreeHeap(GetProcessHeap(), 0, Reply);
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+
+ memcpy(lpCharacter, &Reply->Data.ReadConsoleOutputCharReply.String[0], Size);
+ lpCharacter += Size;
+ nLength -= Size;
+ Request.Data.ReadConsoleOutputCharRequest.ReadCoord = Reply->Data.ReadConsoleOutputCharReply.EndCoord;
+ }
+
+ RtlFreeHeap(GetProcessHeap(), 0, Reply);
+
+ return(TRUE);
}
if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
{
- SetLastErrorByStatus ( Status );
- return FALSE;
+ SetLastErrorByStatus ( Status );
+ return FALSE;
}
return TRUE;
}
sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
if (Request == NULL)
{
+ SetLastError(ERROR_OUTOFMEMORY);
return(FALSE);
}
sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
if (Request == NULL)
{
+ SetLastError(ERROR_OUTOFMEMORY);
return(FALSE);
}
)
{
#if 0
- PCSRSS_API_REQUEST Request;
- CSRSS_API_REPLY Reply;
- NTSTATUS Status;
-
- Request = RtlAllocateHeap(GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite * sizeof(WCHAR));
- if (Request == NULL)
- {
- return(FALSE);
- }
+ PCSRSS_API_REQUEST Request;
+ CSRSS_API_REPLY Reply;
+ NTSTATUS Status;
- Request->Type = CSRSS_WRITE_CONSOLE;
- Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.WriteConsoleRequest.NrCharactersToWrite =
- nNumberOfCharsToWrite;
-// DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
-// DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
- memcpy(Request->Data.WriteConsoleRequest.Buffer,
- lpBuffer,
- nNumberOfCharsToWrite * sizeof(WCHAR));
-
- Status = CsrClientCallServer(Request,
- &Reply,
- sizeof(CSRSS_API_REQUEST) +
- nNumberOfCharsToWrite,
- sizeof(CSRSS_API_REPLY));
+ Request = RtlAllocateHeap(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite * sizeof(WCHAR));
+ if (Request == NULL)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return(FALSE);
+ }
- RtlFreeHeap(GetProcessHeap(),
- 0,
- Request);
+ Request->Type = CSRSS_WRITE_CONSOLE;
+ Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
+ Request->Data.WriteConsoleRequest.NrCharactersToWrite =
+ nNumberOfCharsToWrite;
+// DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
+// DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
+ memcpy(Request->Data.WriteConsoleRequest.Buffer,
+ lpBuffer,
+ nNumberOfCharsToWrite * sizeof(WCHAR));
- if (!NT_SUCCESS(Status))
- {
- return(FALSE);
- }
+ Status = CsrClientCallServer(Request,
+ &Reply,
+ sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite,
+ sizeof(CSRSS_API_REPLY));
- if (lpNumberOfCharsWritten != NULL)
- {
- *lpNumberOfCharsWritten =
+ RtlFreeHeap(GetProcessHeap(),
+ 0,
+ Request);
+
+ if (!NT_SUCCESS(Status))
+ {
+ return(FALSE);
+ }
+
+ if (lpNumberOfCharsWritten != NULL)
+ {
+ *lpNumberOfCharsWritten =
Reply.Data.WriteConsoleReply.NrCharactersWritten;
- }
+ }
- return(TRUE);
+ return(TRUE);
#endif
- return FALSE;
+ return(FALSE);
}
-/* $Id: conio.c,v 1.31 2002/08/20 20:37:16 hyperion Exp $
+/* $Id: conio.c,v 1.32 2002/08/22 15:21:57 ekohl Exp $
*
* reactos/subsys/csrss/api/conio.c
*
DoFill = TRUE;
}
- if( Buff == ActiveConsole->ActiveBuffer )
+ if (Buff == ActiveConsole->ActiveBuffer)
{
/* Draw destination region */
CsrpDrawRegion(ActiveConsole->ActiveBuffer, DstRegion);
}
}
- UNLOCK;
- return (Reply->Status = STATUS_SUCCESS);
+ UNLOCK;
+ return(Reply->Status = STATUS_SUCCESS);
+}
+
+
+CSR_API(CsrReadConsoleOutputChar)
+{
+ NTSTATUS Status;
+ PCSRSS_SCREEN_BUFFER ScreenBuffer;
+ DWORD Xpos, Ypos;
+ BYTE* ReadBuffer;
+ DWORD i;
+
+ Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
+ Reply->Header.DataSize = Reply->Header.MessageSize - sizeof(LPC_MESSAGE_HEADER);
+ ReadBuffer = Reply->Data.ReadConsoleOutputCharReply.String;
+
+ LOCK;
+
+ Status = CsrGetObject(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, (Object_t**)&ScreenBuffer);
+ if (!NT_SUCCESS(Status))
+ {
+ Reply->Status = Status;
+ UNLOCK;
+ return(Reply->Status);
+ }
+
+ if (ScreenBuffer->Header.Type != CSRSS_SCREEN_BUFFER_MAGIC)
+ {
+ Reply->Status = STATUS_INVALID_HANDLE;
+ UNLOCK;
+ return(Reply->Status);
+ }
+
+ Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X + ScreenBuffer->ShowX;
+ Ypos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + ScreenBuffer->ShowY;
+
+ for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i)
+ {
+ *ReadBuffer = ScreenBuffer->Buffer[(Xpos * 2) + (Ypos * 2 * ScreenBuffer->MaxX)];
+
+ ReadBuffer++;
+ Xpos++;
+
+ if (Xpos == ScreenBuffer->MaxX)
+ {
+ Xpos = 0;
+ Ypos++;
+
+ if (Ypos == ScreenBuffer->MaxY)
+ Ypos = 0;
+ }
+ }
+
+ *ReadBuffer = 0;
+
+ Reply->Status = STATUS_SUCCESS;
+ Reply->Data.ReadConsoleOutputCharReply.EndCoord.X = Xpos - ScreenBuffer->ShowX;
+ Reply->Data.ReadConsoleOutputCharReply.EndCoord.Y = Ypos - ScreenBuffer->ShowY;
+ Reply->Header.MessageSize += Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead;
+ Reply->Header.DataSize += Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead;
+
+ UNLOCK;
+
+ return(Reply->Status);
}
/* EOF */