mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 17:12:58 +00:00
[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:
parent
e505499a2c
commit
e71f1dd200
3 changed files with 116 additions and 157 deletions
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue