[KERNEL32/CONSRV]

- Merge IntFillConsoleOutputCharacter and FillConsoleOutputAttribute functions into IntFillConsoleOutputCode helper and make it used by FillConsoleOutputAttribute/CharacterW/A.
- In server-side, CsrFillOutputChar and CsrFillOutputAttrib are merged into SrvFillConsoleOutput.
- Merge CSRSS_FILL_OUTPUT and CSRSS_FILL_OUTPUT_ATTRIB structures into CSRSS_FILL_OUTPUT.

svn path=/branches/ros-csrss/; revision=57734
This commit is contained in:
Hermès Bélusca-Maïto 2012-11-18 17:06:48 +00:00
parent e505499a2c
commit e71f1dd200
3 changed files with 116 additions and 157 deletions

View file

@ -328,7 +328,7 @@ IntReadConsoleOutput(HANDLE hConsoleOutput,
static static
BOOL BOOL
IntReadConsoleOutputCode(HANDLE hConsoleOutput, IntReadConsoleOutputCode(HANDLE hConsoleOutput,
USHORT CodeType, CODE_TYPE CodeType,
PVOID pCode, PVOID pCode,
DWORD nLength, DWORD nLength,
COORD dwReadCoord, COORD dwReadCoord,
@ -721,42 +721,55 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
static static
BOOL BOOL
IntFillConsoleOutputCharacter(HANDLE hConsoleOutput, IntFillConsoleOutputCode(HANDLE hConsoleOutput,
PVOID cCharacter, CODE_TYPE CodeType,
PVOID pCode,
DWORD nLength, DWORD nLength,
COORD dwWriteCoord, COORD dwWriteCoord,
LPDWORD lpNumberOfCharsWritten, LPDWORD lpNumberOfCodesWritten)
BOOL bUnicode)
{ {
CSR_API_MESSAGE Request;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCSRSS_FILL_OUTPUT FillOutputRequest = &ApiMessage.Data.FillOutputRequest;
Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput; FillOutputRequest->ConsoleHandle = hConsoleOutput;
Request.Data.FillOutputRequest.Unicode = bUnicode; FillOutputRequest->CodeType = CodeType;
if(bUnicode) switch (CodeType)
Request.Data.FillOutputRequest.Char.UnicodeChar = *((WCHAR*)cCharacter); {
else case CODE_ASCII:
Request.Data.FillOutputRequest.Char.AsciiChar = *((CHAR*)cCharacter); FillOutputRequest->Code.AsciiChar = *(PCHAR)pCode;
break;
Request.Data.FillOutputRequest.Position = dwWriteCoord; case CODE_UNICODE:
Request.Data.FillOutputRequest.Length = (WORD)nLength; FillOutputRequest->Code.UnicodeChar = *(PWCHAR)pCode;
break;
Status = CsrClientCallServer(&Request, case CODE_ATTRIBUTE:
FillOutputRequest->Code.Attribute = *(PWORD)pCode;
break;
default:
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
FillOutputRequest->Coord = dwWriteCoord;
FillOutputRequest->Length = nLength;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL, NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, FILL_OUTPUT), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFillConsoleOutput),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_FILL_OUTPUT));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
} }
if(lpNumberOfCharsWritten != NULL) if (lpNumberOfCodesWritten)
{ *lpNumberOfCodesWritten = FillOutputRequest->Length;
*lpNumberOfCharsWritten = Request.Data.FillOutputRequest.NrCharactersWritten; // *lpNumberOfCharsWritten = Request.Data.FillOutputRequest.NrCharactersWritten;
}
return TRUE; return TRUE;
} }
@ -1277,12 +1290,12 @@ FillConsoleOutputCharacterW(HANDLE hConsoleOutput,
COORD dwWriteCoord, COORD dwWriteCoord,
LPDWORD lpNumberOfCharsWritten) LPDWORD lpNumberOfCharsWritten)
{ {
return IntFillConsoleOutputCharacter(hConsoleOutput, return IntFillConsoleOutputCode(hConsoleOutput,
CODE_UNICODE,
&cCharacter, &cCharacter,
nLength, nLength,
dwWriteCoord, dwWriteCoord,
lpNumberOfCharsWritten, lpNumberOfCharsWritten);
TRUE);
} }
@ -1299,12 +1312,12 @@ FillConsoleOutputCharacterA(HANDLE hConsoleOutput,
COORD dwWriteCoord, COORD dwWriteCoord,
LPDWORD lpNumberOfCharsWritten) LPDWORD lpNumberOfCharsWritten)
{ {
return IntFillConsoleOutputCharacter(hConsoleOutput, return IntFillConsoleOutputCode(hConsoleOutput,
CODE_ASCII,
&cCharacter, &cCharacter,
nLength, nLength,
dwWriteCoord, dwWriteCoord,
lpNumberOfCharsWritten, lpNumberOfCharsWritten);
FALSE);
} }
@ -1321,28 +1334,12 @@ FillConsoleOutputAttribute(HANDLE hConsoleOutput,
COORD dwWriteCoord, COORD dwWriteCoord,
LPDWORD lpNumberOfAttrsWritten) LPDWORD lpNumberOfAttrsWritten)
{ {
CSR_API_MESSAGE Request; return IntFillConsoleOutputCode(hConsoleOutput,
NTSTATUS Status; CODE_ATTRIBUTE,
&wAttribute,
Request.Data.FillOutputAttribRequest.ConsoleHandle = hConsoleOutput; nLength,
Request.Data.FillOutputAttribRequest.Attribute = (CHAR)wAttribute; dwWriteCoord,
Request.Data.FillOutputAttribRequest.Coord = dwWriteCoord; lpNumberOfAttrsWritten);
Request.Data.FillOutputAttribRequest.Length = (WORD)nLength;
Status = CsrClientCallServer(&Request,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, FILL_OUTPUT_ATTRIB),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
BaseSetLastNTError ( Status );
return FALSE;
}
if (lpNumberOfAttrsWritten)
*lpNumberOfAttrsWritten = nLength;
return TRUE;
} }
/* EOF */ /* EOF */

View file

@ -27,7 +27,7 @@ typedef enum _CONSRV_API_NUMBER
ConsolepWriteConsoleOutput, ConsolepWriteConsoleOutput,
ConsolepReadConsoleOutputString, ConsolepReadConsoleOutputString,
// ConsolepWriteConsoleOutputString, // ConsolepWriteConsoleOutputString,
// ConsolepFillConsoleOutput, ConsolepFillConsoleOutput,
ConsolepGetMode, ConsolepGetMode,
// ConsolepGetNumberOfFonts, // ConsolepGetNumberOfFonts,
ConsolepGetNumberOfInputEvents, ConsolepGetNumberOfInputEvents,
@ -183,28 +183,6 @@ typedef struct
COORD Position; COORD Position;
} CSRSS_SET_CURSOR_POSITION, *PCSRSS_SET_CURSOR_POSITION; } CSRSS_SET_CURSOR_POSITION, *PCSRSS_SET_CURSOR_POSITION;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
union
{
CHAR AsciiChar;
WCHAR UnicodeChar;
} Char;
COORD Position;
WORD Length;
ULONG NrCharactersWritten;
} CSRSS_FILL_OUTPUT, *PCSRSS_FILL_OUTPUT;
typedef struct
{
HANDLE ConsoleHandle;
CHAR Attribute;
COORD Coord;
WORD Length;
} CSRSS_FILL_OUTPUT_ATTRIB, *PCSRSS_FILL_OUTPUT_ATTRIB;
typedef struct typedef struct
{ {
HANDLE ConsoleHandle; HANDLE ConsoleHandle;
@ -304,7 +282,6 @@ typedef enum _CODE_TYPE
typedef struct typedef struct
{ {
HANDLE ConsoleHandle; HANDLE ConsoleHandle;
CODE_TYPE CodeType;
DWORD NumCodesToRead; DWORD NumCodesToRead;
COORD ReadCoord; COORD ReadCoord;
@ -312,6 +289,7 @@ typedef struct
DWORD CodesRead; DWORD CodesRead;
CODE_TYPE CodeType;
union union
{ {
PVOID pCode; PVOID pCode;
@ -321,6 +299,23 @@ typedef struct
} pCode; // Either a pointer to a character or to an attribute. } pCode; // Either a pointer to a character or to an attribute.
} CSRSS_READ_CONSOLE_OUTPUT_CODE, *PCSRSS_READ_CONSOLE_OUTPUT_CODE; } CSRSS_READ_CONSOLE_OUTPUT_CODE, *PCSRSS_READ_CONSOLE_OUTPUT_CODE;
typedef struct
{
HANDLE ConsoleHandle;
CODE_TYPE CodeType;
union
{
CHAR AsciiChar;
WCHAR UnicodeChar;
WORD Attribute;
} Code; // Either a character or an attribute.
COORD Coord;
ULONG Length;
ULONG NrCharactersWritten; // FIXME: Only for chars, is it removable ?
} CSRSS_FILL_OUTPUT, *PCSRSS_FILL_OUTPUT;
typedef struct typedef struct
{ {
@ -595,7 +590,6 @@ typedef struct _CONSOLE_API_MESSAGE
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest; CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
CSRSS_FILL_OUTPUT FillOutputRequest; CSRSS_FILL_OUTPUT FillOutputRequest;
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
CSRSS_SET_ATTRIB SetAttribRequest; CSRSS_SET_ATTRIB SetAttribRequest;
/* Aliases */ /* Aliases */

View file

@ -991,45 +991,63 @@ CSR_API(CsrWriteConsoleOutputAttrib)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
CSR_API(CsrFillOutputChar) CSR_API(SrvFillConsoleOutput)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSRSS_FILL_OUTPUT FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest; PCSRSS_FILL_OUTPUT FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSRSS_SCREEN_BUFFER Buff; PCSRSS_SCREEN_BUFFER Buff;
DWORD X, Y, Length, Written = 0; DWORD X, Y, Length, Start; // , Written = 0;
CHAR Char; USHORT CodeType;
BYTE Code;
PBYTE Buffer; PBYTE Buffer;
SMALL_RECT UpdateRect; SMALL_RECT UpdateRect;
DPRINT("CsrFillOutputChar\n"); DPRINT("SrvFillConsoleOutput\n");
Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), FillOutputRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
if (!NT_SUCCESS(Status)) return Status;
Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, FillOutputRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status))
{
return Status;
}
Console = Buff->Header.Console; Console = Buff->Header.Console;
X = FillOutputRequest->Position.X; CodeType = FillOutputRequest->CodeType;
Y = (FillOutputRequest->Position.Y + Buff->VirtualY) % Buff->MaxY;
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; X = FillOutputRequest->Coord.X;
if(FillOutputRequest->Unicode) Y = (FillOutputRequest->Coord.Y + Buff->VirtualY) % Buff->MaxY;
ConsoleUnicodeCharToAnsiChar(Console, &Char, &FillOutputRequest->Char.UnicodeChar);
else
Char = FillOutputRequest->Char.AsciiChar;
Length = FillOutputRequest->Length; Length = FillOutputRequest->Length;
Start = 2 * (Y * Buff->MaxX + X) + (CodeType == CODE_ATTRIBUTE ? 1 : 0);
Buffer = &Buff->Buffer[Start];
switch (CodeType)
{
case CODE_ASCII:
Code = (BYTE)FillOutputRequest->Code.AsciiChar;
break;
case CODE_UNICODE:
ConsoleUnicodeCharToAnsiChar(Console, (PCHAR)&Code, &FillOutputRequest->Code.UnicodeChar);
break;
case CODE_ATTRIBUTE:
Code = (BYTE)FillOutputRequest->Code.Attribute;
break;
default:
ConioUnlockScreenBuffer(Buff);
return STATUS_INVALID_PARAMETER;
}
while (Length--) while (Length--)
{ {
*Buffer = Char; *Buffer = Code;
Buffer += 2; Buffer += 2;
Written++; // Written++;
if (++X == Buff->MaxX) if (++X == Buff->MaxX)
{ {
if (++Y == Buff->MaxY) if (++Y == Buff->MaxY)
{ {
Y = 0; Y = 0;
Buffer = Buff->Buffer; Buffer = Buff->Buffer + (CodeType == CODE_ATTRIBUTE ? 1 : 0);
} }
X = 0; X = 0;
} }
@ -1037,66 +1055,16 @@ CSR_API(CsrFillOutputChar)
if (Buff == Console->ActiveBuffer) if (Buff == Console->ActiveBuffer)
{ {
ConioComputeUpdateRect(Buff, &UpdateRect, &FillOutputRequest->Position, ConioComputeUpdateRect(Buff, &UpdateRect, &FillOutputRequest->Coord,
FillOutputRequest->Length); FillOutputRequest->Length);
ConioDrawRegion(Console, &UpdateRect); ConioDrawRegion(Console, &UpdateRect);
} }
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
/*
Length = FillOutputRequest->Length; Length = FillOutputRequest->Length;
FillOutputRequest->NrCharactersWritten = Length; FillOutputRequest->NrCharactersWritten = Length;
return STATUS_SUCCESS; */
}
CSR_API(CsrFillOutputAttrib)
{
PCSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputAttribRequest;
PCSRSS_SCREEN_BUFFER Buff;
PUCHAR Buffer;
NTSTATUS Status;
int X, Y, Length;
UCHAR Attr;
SMALL_RECT UpdateRect;
PCSRSS_CONSOLE Console;
DPRINT("CsrFillOutputAttrib\n");
Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, FillOutputAttribRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status))
{
return Status;
}
Console = Buff->Header.Console;
X = FillOutputAttribRequest->Coord.X;
Y = (FillOutputAttribRequest->Coord.Y + Buff->VirtualY) % Buff->MaxY;
Length = FillOutputAttribRequest->Length;
Attr = FillOutputAttribRequest->Attribute;
Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1];
while (Length--)
{
*Buffer = Attr;
Buffer += 2;
if (++X == Buff->MaxX)
{
if (++Y == Buff->MaxY)
{
Y = 0;
Buffer = Buff->Buffer + 1;
}
X = 0;
}
}
if (Buff == Console->ActiveBuffer)
{
ConioComputeUpdateRect(Buff, &UpdateRect, &FillOutputAttribRequest->Coord,
FillOutputAttribRequest->Length);
ConioDrawRegion(Console, &UpdateRect);
}
ConioUnlockScreenBuffer(Buff);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }