/* INCLUDES *******************************************************************/
#include "consrv.h"
-#include "console.h"
-#include "include/conio.h"
-#include "include/term.h"
-#include "conoutput.h"
-#include "handle.h"
#define NDEBUG
#include <debug.h>
-
-/* PRIVATE FUNCTIONS **********************************************************/
-
-
/* PUBLIC SERVER APIS *********************************************************/
NTSTATUS NTAPI
/* Get infos from the graphics buffer information structure */
if (!CsrValidateMessageBuffer(ApiMessage,
(PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo,
- 1,
- CreateScreenBufferRequest->GraphicsBufferInfo.dwBitMapInfoLength))
+ CreateScreenBufferRequest->GraphicsBufferInfo.dwBitMapInfoLength,
+ sizeof(BYTE)))
{
Status = STATUS_INVALID_PARAMETER;
goto Quit;
ScreenBufferInfo = &GraphicsInfo;
/* Initialize shared variables */
- CreateScreenBufferRequest->GraphicsBufferInfo.hMutex = GraphicsInfo.Info.hMutex = INVALID_HANDLE_VALUE;
- CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap = GraphicsInfo.Info.lpBitMap = NULL;
+ // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex
+ CreateScreenBufferRequest->hMutex = GraphicsInfo.Info.hMutex = INVALID_HANDLE_VALUE;
+ // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap
+ CreateScreenBufferRequest->lpBitMap = GraphicsInfo.Info.lpBitMap = NULL;
/* A graphics screen buffer is never inheritable */
- CreateScreenBufferRequest->Inheritable = FALSE;
+ CreateScreenBufferRequest->InheritHandle = FALSE;
}
Status = ConDrvCreateScreenBuffer(&Buff,
Status = ConSrvInsertObject(ProcessData,
&CreateScreenBufferRequest->OutputHandle,
&Buff->Header,
- CreateScreenBufferRequest->Access,
- CreateScreenBufferRequest->Inheritable,
+ CreateScreenBufferRequest->DesiredAccess,
+ CreateScreenBufferRequest->InheritHandle,
CreateScreenBufferRequest->ShareMode);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
* Initialize the graphics buffer information structure
* and give it back to the client.
*/
- CreateScreenBufferRequest->GraphicsBufferInfo.hMutex = Buffer->ClientMutex;
- CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap = Buffer->ClientBitMap;
+ // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex
+ CreateScreenBufferRequest->hMutex = Buffer->ClientMutex;
+ // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap
+ CreateScreenBufferRequest->lpBitMap = Buffer->ClientBitMap;
}
Quit:
static NTSTATUS
DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage,
IN PCSR_THREAD ClientThread,
- IN BOOL CreateWaitBlock OPTIONAL);
+ IN BOOLEAN CreateWaitBlock OPTIONAL);
// Wait function CSR_WAIT_FUNCTION
static BOOLEAN
goto Quit;
}
- Status = DoWriteConsole(WaitApiMessage,
- WaitThread,
- FALSE);
+ Status = DoWriteConsole(WaitApiMessage, WaitThread, FALSE);
Quit:
if (Status != STATUS_PENDING)
static NTSTATUS
DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage,
IN PCSR_THREAD ClientThread,
- IN BOOL CreateWaitBlock OPTIONAL)
+ IN BOOLEAN CreateWaitBlock OPTIONAL)
{
NTSTATUS Status;
PCONSOLE_WRITECONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest;
return STATUS_INVALID_PARAMETER;
}
- Status = DoWriteConsole(ApiMessage,
- CsrGetClientThread(),
- TRUE);
+ Status = DoWriteConsole(ApiMessage, CsrGetClientThread(), TRUE);
if (Status == STATUS_PENDING) *ReplyCode = CsrReplyPending;
OUT PVOID StringBuffer,
IN ULONG NumCodesToRead,
IN PCOORD ReadCoord,
- OUT PCOORD EndCoord,
+ // OUT PCOORD EndCoord,
OUT PULONG CodesRead);
CSR_API(SrvReadConsoleOutputString)
{
PTEXTMODE_SCREEN_BUFFER Buffer;
ULONG CodeSize;
+ PVOID pCode;
+
DPRINT("SrvReadConsoleOutputString\n");
switch (ReadOutputCodeRequest->CodeType)
{
case CODE_ASCII:
- CodeSize = sizeof(CHAR);
+ CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar);
break;
case CODE_UNICODE:
- CodeSize = sizeof(WCHAR);
+ CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar);
break;
case CODE_ATTRIBUTE:
- CodeSize = sizeof(WORD);
+ CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute);
break;
default:
return STATUS_INVALID_PARAMETER;
}
- if (!CsrValidateMessageBuffer(ApiMessage,
- (PVOID*)&ReadOutputCodeRequest->pCode.pCode,
- ReadOutputCodeRequest->NumCodesToRead,
- CodeSize))
+ /*
+ * For optimization purposes, Windows (and hence ReactOS, too, for
+ * compatibility reasons) uses a static buffer if no more than eighty
+ * bytes are read. Otherwise a new buffer is used.
+ * The client-side expects that we know this behaviour.
+ */
+ if (ReadOutputCodeRequest->NumCodes * CodeSize <= sizeof(ReadOutputCodeRequest->CodeStaticBuffer))
{
- return STATUS_INVALID_PARAMETER;
+ /*
+ * Adjust the internal pointer, because its old value points to
+ * the static buffer in the original ApiMessage structure.
+ */
+ // ReadOutputCodeRequest->pCode = ReadOutputCodeRequest->CodeStaticBuffer;
+ pCode = ReadOutputCodeRequest->CodeStaticBuffer;
+ }
+ else
+ {
+ if (!CsrValidateMessageBuffer(ApiMessage,
+ (PVOID*)&ReadOutputCodeRequest->pCode,
+ ReadOutputCodeRequest->NumCodes,
+ CodeSize))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ pCode = ReadOutputCodeRequest->pCode;
}
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
Status = ConDrvReadConsoleOutputString(Buffer->Header.Console,
Buffer,
ReadOutputCodeRequest->CodeType,
- ReadOutputCodeRequest->pCode.pCode,
- ReadOutputCodeRequest->NumCodesToRead,
- &ReadOutputCodeRequest->ReadCoord,
- &ReadOutputCodeRequest->EndCoord,
- &ReadOutputCodeRequest->CodesRead);
+ pCode,
+ ReadOutputCodeRequest->NumCodes,
+ &ReadOutputCodeRequest->Coord,
+ // &ReadOutputCodeRequest->EndCoord,
+ &ReadOutputCodeRequest->NumCodes);
ConSrvReleaseScreenBuffer(Buffer, TRUE);
return Status;
PTEXTMODE_SCREEN_BUFFER Buffer;
ULONG CodeSize;
+ PVOID pCode;
+
DPRINT("SrvWriteConsoleOutputString\n");
switch (WriteOutputCodeRequest->CodeType)
{
case CODE_ASCII:
- CodeSize = sizeof(CHAR);
+ CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar);
break;
case CODE_UNICODE:
- CodeSize = sizeof(WCHAR);
+ CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar);
break;
case CODE_ATTRIBUTE:
- CodeSize = sizeof(WORD);
+ CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute);
break;
default:
return STATUS_INVALID_PARAMETER;
}
- if (!CsrValidateMessageBuffer(ApiMessage,
- (PVOID*)&WriteOutputCodeRequest->pCode.pCode,
- WriteOutputCodeRequest->Length,
- CodeSize))
+ /*
+ * For optimization purposes, Windows (and hence ReactOS, too, for
+ * compatibility reasons) uses a static buffer if no more than eighty
+ * bytes are written. Otherwise a new buffer is used.
+ * The client-side expects that we know this behaviour.
+ */
+ if (WriteOutputCodeRequest->NumCodes * CodeSize <= sizeof(WriteOutputCodeRequest->CodeStaticBuffer))
{
- return STATUS_INVALID_PARAMETER;
+ /*
+ * Adjust the internal pointer, because its old value points to
+ * the static buffer in the original ApiMessage structure.
+ */
+ // WriteOutputCodeRequest->pCode = WriteOutputCodeRequest->CodeStaticBuffer;
+ pCode = WriteOutputCodeRequest->CodeStaticBuffer;
+ }
+ else
+ {
+ if (!CsrValidateMessageBuffer(ApiMessage,
+ (PVOID*)&WriteOutputCodeRequest->pCode,
+ WriteOutputCodeRequest->NumCodes,
+ CodeSize))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ pCode = WriteOutputCodeRequest->pCode;
}
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
Status = ConDrvWriteConsoleOutputString(Buffer->Header.Console,
Buffer,
WriteOutputCodeRequest->CodeType,
- WriteOutputCodeRequest->pCode.pCode,
- WriteOutputCodeRequest->Length, // NumCodesToWrite,
- &WriteOutputCodeRequest->Coord /*, // WriteCoord,
+ pCode,
+ WriteOutputCodeRequest->NumCodes,
+ &WriteOutputCodeRequest->Coord /*,
&WriteOutputCodeRequest->EndCoord,
&WriteOutputCodeRequest->NrCharactersWritten */);
ConDrvFillConsoleOutput(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN CODE_TYPE CodeType,
- IN PVOID Code,
+ IN CODE_ELEMENT Code,
IN ULONG NumCodesToWrite,
IN PCOORD WriteCoord /*,
OUT PULONG CodesWritten */);
NTSTATUS Status;
PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest;
PTEXTMODE_SCREEN_BUFFER Buffer;
- USHORT CodeType = FillOutputRequest->CodeType;
+ CODE_TYPE CodeType = FillOutputRequest->CodeType;
DPRINT("SrvFillConsoleOutput\n");
Status = ConDrvFillConsoleOutput(Buffer->Header.Console,
Buffer,
CodeType,
- &FillOutputRequest->Code,
- FillOutputRequest->Length, // NumCodesToWrite,
- &FillOutputRequest->Coord /*, // WriteCoord,
+ FillOutputRequest->Code,
+ FillOutputRequest->NumCodes,
+ &FillOutputRequest->WriteCoord /*,
&FillOutputRequest->NrCharactersWritten */);
// FillOutputRequest->NrCharactersWritten = Written;
}
NTSTATUS NTAPI
-ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
- IN PTEXTMODE_SCREEN_BUFFER Buffer,
- OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo);
+ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
+ IN PTEXTMODE_SCREEN_BUFFER Buffer,
+ OUT PCOORD ScreenBufferSize,
+ OUT PCOORD CursorPosition,
+ OUT PCOORD ViewOrigin,
+ OUT PCOORD ViewSize,
+ OUT PCOORD MaximumViewSize,
+ OUT PWORD Attributes);
CSR_API(SrvGetConsoleScreenBufferInfo)
{
NTSTATUS Status;
Status = ConDrvGetConsoleScreenBufferInfo(Buffer->Header.Console,
Buffer,
- &ScreenBufferInfoRequest->Info);
+ &ScreenBufferInfoRequest->ScreenBufferSize,
+ &ScreenBufferInfoRequest->CursorPosition,
+ &ScreenBufferInfoRequest->ViewOrigin,
+ &ScreenBufferInfoRequest->ViewSize,
+ &ScreenBufferInfoRequest->MaximumViewSize,
+ &ScreenBufferInfoRequest->Attributes);
ConSrvReleaseScreenBuffer(Buffer, TRUE);
return Status;
NTSTATUS NTAPI
ConDrvSetConsoleTextAttribute(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
- IN WORD Attribute);
+ IN WORD Attributes);
CSR_API(SrvSetConsoleTextAttribute)
{
NTSTATUS Status;
Status = ConDrvSetConsoleTextAttribute(Buffer->Header.Console,
Buffer,
- SetTextAttribRequest->Attrib);
+ SetTextAttribRequest->Attributes);
ConSrvReleaseScreenBuffer(Buffer, TRUE);
return Status;