mirror of
https://github.com/reactos/reactos.git
synced 2024-07-11 07:05:12 +00:00
[KERNEL32][CONSRV]
- Use a CODE_ELEMENT structure in order to simplify the code. - Do not do an on-place ansi to unicode conversion. svn path=/branches/condrv_restructure/; revision=63766
This commit is contained in:
parent
6f772ac651
commit
2d9a888371
|
@ -771,7 +771,7 @@ static
|
||||||
BOOL
|
BOOL
|
||||||
IntFillConsoleOutputCode(HANDLE hConsoleOutput,
|
IntFillConsoleOutputCode(HANDLE hConsoleOutput,
|
||||||
CODE_TYPE CodeType,
|
CODE_TYPE CodeType,
|
||||||
PVOID pCode,
|
CODE_ELEMENT Code,
|
||||||
DWORD nLength,
|
DWORD nLength,
|
||||||
COORD dwWriteCoord,
|
COORD dwWriteCoord,
|
||||||
LPDWORD lpNumberOfCodesWritten)
|
LPDWORD lpNumberOfCodesWritten)
|
||||||
|
@ -779,31 +779,21 @@ IntFillConsoleOutputCode(HANDLE hConsoleOutput,
|
||||||
CONSOLE_API_MESSAGE ApiMessage;
|
CONSOLE_API_MESSAGE ApiMessage;
|
||||||
PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &ApiMessage.Data.FillOutputRequest;
|
PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &ApiMessage.Data.FillOutputRequest;
|
||||||
|
|
||||||
|
if ( (CodeType != CODE_ASCII ) &&
|
||||||
|
(CodeType != CODE_UNICODE ) &&
|
||||||
|
(CodeType != CODE_ATTRIBUTE) )
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set up the data to send to the Console Server */
|
/* Set up the data to send to the Console Server */
|
||||||
FillOutputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
|
FillOutputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
|
||||||
FillOutputRequest->OutputHandle = hConsoleOutput;
|
FillOutputRequest->OutputHandle = hConsoleOutput;
|
||||||
FillOutputRequest->WriteCoord = dwWriteCoord;
|
FillOutputRequest->WriteCoord = dwWriteCoord;
|
||||||
FillOutputRequest->NumCodes = nLength;
|
|
||||||
|
|
||||||
FillOutputRequest->CodeType = CodeType;
|
FillOutputRequest->CodeType = CodeType;
|
||||||
switch (CodeType)
|
FillOutputRequest->Code = Code;
|
||||||
{
|
FillOutputRequest->NumCodes = nLength;
|
||||||
case CODE_ASCII:
|
|
||||||
FillOutputRequest->Code.AsciiChar = *(PCHAR)pCode;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CODE_UNICODE:
|
|
||||||
FillOutputRequest->Code.UnicodeChar = *(PWCHAR)pCode;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CODE_ATTRIBUTE:
|
|
||||||
FillOutputRequest->Code.Attribute = *(PWORD)pCode;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the server */
|
/* Call the server */
|
||||||
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
|
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
|
||||||
|
@ -1373,9 +1363,11 @@ FillConsoleOutputCharacterW(HANDLE hConsoleOutput,
|
||||||
COORD dwWriteCoord,
|
COORD dwWriteCoord,
|
||||||
LPDWORD lpNumberOfCharsWritten)
|
LPDWORD lpNumberOfCharsWritten)
|
||||||
{
|
{
|
||||||
|
CODE_ELEMENT Code;
|
||||||
|
Code.UnicodeChar = cCharacter;
|
||||||
return IntFillConsoleOutputCode(hConsoleOutput,
|
return IntFillConsoleOutputCode(hConsoleOutput,
|
||||||
CODE_UNICODE,
|
CODE_UNICODE,
|
||||||
&cCharacter,
|
Code,
|
||||||
nLength,
|
nLength,
|
||||||
dwWriteCoord,
|
dwWriteCoord,
|
||||||
lpNumberOfCharsWritten);
|
lpNumberOfCharsWritten);
|
||||||
|
@ -1395,9 +1387,11 @@ FillConsoleOutputCharacterA(HANDLE hConsoleOutput,
|
||||||
COORD dwWriteCoord,
|
COORD dwWriteCoord,
|
||||||
LPDWORD lpNumberOfCharsWritten)
|
LPDWORD lpNumberOfCharsWritten)
|
||||||
{
|
{
|
||||||
|
CODE_ELEMENT Code;
|
||||||
|
Code.AsciiChar = cCharacter;
|
||||||
return IntFillConsoleOutputCode(hConsoleOutput,
|
return IntFillConsoleOutputCode(hConsoleOutput,
|
||||||
CODE_ASCII,
|
CODE_ASCII,
|
||||||
&cCharacter,
|
Code,
|
||||||
nLength,
|
nLength,
|
||||||
dwWriteCoord,
|
dwWriteCoord,
|
||||||
lpNumberOfCharsWritten);
|
lpNumberOfCharsWritten);
|
||||||
|
@ -1417,9 +1411,11 @@ FillConsoleOutputAttribute(HANDLE hConsoleOutput,
|
||||||
COORD dwWriteCoord,
|
COORD dwWriteCoord,
|
||||||
LPDWORD lpNumberOfAttrsWritten)
|
LPDWORD lpNumberOfAttrsWritten)
|
||||||
{
|
{
|
||||||
|
CODE_ELEMENT Code;
|
||||||
|
Code.Attribute = wAttribute;
|
||||||
return IntFillConsoleOutputCode(hConsoleOutput,
|
return IntFillConsoleOutputCode(hConsoleOutput,
|
||||||
CODE_ATTRIBUTE,
|
CODE_ATTRIBUTE,
|
||||||
&wAttribute,
|
Code,
|
||||||
nLength,
|
nLength,
|
||||||
dwWriteCoord,
|
dwWriteCoord,
|
||||||
lpNumberOfAttrsWritten);
|
lpNumberOfAttrsWritten);
|
||||||
|
|
|
@ -459,6 +459,13 @@ typedef enum _CODE_TYPE
|
||||||
CODE_ATTRIBUTE = 0x03
|
CODE_ATTRIBUTE = 0x03
|
||||||
} CODE_TYPE;
|
} CODE_TYPE;
|
||||||
|
|
||||||
|
typedef union _CODE_ELEMENT
|
||||||
|
{
|
||||||
|
CHAR AsciiChar;
|
||||||
|
WCHAR UnicodeChar;
|
||||||
|
WORD Attribute;
|
||||||
|
} CODE_ELEMENT, *PCODE_ELEMENT;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
HANDLE ConsoleHandle;
|
HANDLE ConsoleHandle;
|
||||||
|
@ -485,13 +492,8 @@ typedef struct
|
||||||
HANDLE OutputHandle;
|
HANDLE OutputHandle;
|
||||||
COORD WriteCoord;
|
COORD WriteCoord;
|
||||||
|
|
||||||
CODE_TYPE CodeType;
|
CODE_TYPE CodeType;
|
||||||
union
|
CODE_ELEMENT Code; // Either a character or an attribute.
|
||||||
{
|
|
||||||
CHAR AsciiChar;
|
|
||||||
WCHAR UnicodeChar;
|
|
||||||
WORD Attribute;
|
|
||||||
} Code; // Either a character or an attribute.
|
|
||||||
|
|
||||||
ULONG NumCodes;
|
ULONG NumCodes;
|
||||||
} CONSOLE_FILLOUTPUTCODE, *PCONSOLE_FILLOUTPUTCODE;
|
} CONSOLE_FILLOUTPUTCODE, *PCONSOLE_FILLOUTPUTCODE;
|
||||||
|
|
|
@ -1137,7 +1137,7 @@ NTSTATUS NTAPI
|
||||||
ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
IN CODE_TYPE CodeType,
|
IN CODE_TYPE CodeType,
|
||||||
IN PVOID Code,
|
IN CODE_ELEMENT Code,
|
||||||
IN ULONG NumCodesToWrite,
|
IN ULONG NumCodesToWrite,
|
||||||
IN PCOORD WriteCoord /*,
|
IN PCOORD WriteCoord /*,
|
||||||
OUT PULONG CodesWritten */)
|
OUT PULONG CodesWritten */)
|
||||||
|
@ -1145,8 +1145,7 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
DWORD X, Y, Length; // , Written = 0;
|
DWORD X, Y, Length; // , Written = 0;
|
||||||
PCHAR_INFO Ptr;
|
PCHAR_INFO Ptr;
|
||||||
|
|
||||||
if (Console == NULL || Buffer == NULL || Code == NULL ||
|
if (Console == NULL || Buffer == NULL || WriteCoord == NULL /* || CodesWritten == NULL */)
|
||||||
WriteCoord == NULL /* || CodesWritten == NULL */)
|
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
@ -1154,29 +1153,13 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
/* Validity check */
|
/* Validity check */
|
||||||
ASSERT(Console == Buffer->Header.Console);
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
#if 0
|
|
||||||
switch (CodeType)
|
|
||||||
{
|
|
||||||
case CODE_ASCII:
|
|
||||||
/* On-place conversion from the ASCII char to the UNICODE char */
|
|
||||||
ConsoleAnsiCharToUnicodeChar(Console, &Code->UnicodeChar, &Code->AsciiChar);
|
|
||||||
/* Fall through */
|
|
||||||
case CODE_UNICODE:
|
|
||||||
Code = &Code->UnicodeChar;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CODE_ATTRIBUTE:
|
|
||||||
Code = &Code->Attribute;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (CodeType == CODE_ASCII)
|
if (CodeType == CODE_ASCII)
|
||||||
{
|
{
|
||||||
/* On-place conversion from the ASCII char to the UNICODE char */
|
/* Conversion from the ASCII char to the UNICODE char */
|
||||||
// FIXME: What if Code points to an invalid memory zone ??
|
CODE_ELEMENT tmp;
|
||||||
ConsoleAnsiCharToUnicodeChar(Console, (PWCHAR)Code, (PCHAR)Code);
|
ConsoleAnsiCharToUnicodeChar(Console, &tmp.UnicodeChar, &Code.AsciiChar);
|
||||||
|
Code = tmp;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
X = WriteCoord->X;
|
X = WriteCoord->X;
|
||||||
Y = (WriteCoord->Y + Buffer->VirtualY) % Buffer->ScreenBufferSize.Y;
|
Y = (WriteCoord->Y + Buffer->VirtualY) % Buffer->ScreenBufferSize.Y;
|
||||||
|
@ -1193,11 +1176,11 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
{
|
{
|
||||||
case CODE_ASCII:
|
case CODE_ASCII:
|
||||||
case CODE_UNICODE:
|
case CODE_UNICODE:
|
||||||
Ptr->Char.UnicodeChar = *(PWCHAR)Code;
|
Ptr->Char.UnicodeChar = Code.UnicodeChar;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CODE_ATTRIBUTE:
|
case CODE_ATTRIBUTE:
|
||||||
Ptr->Attributes = *(PWORD)Code;
|
Ptr->Attributes = Code.Attribute;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// ++Ptr;
|
// ++Ptr;
|
||||||
|
|
|
@ -691,7 +691,7 @@ NTSTATUS NTAPI
|
||||||
ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
IN CODE_TYPE CodeType,
|
IN CODE_TYPE CodeType,
|
||||||
IN PVOID Code,
|
IN CODE_ELEMENT Code,
|
||||||
IN ULONG NumCodesToWrite,
|
IN ULONG NumCodesToWrite,
|
||||||
IN PCOORD WriteCoord /*,
|
IN PCOORD WriteCoord /*,
|
||||||
OUT PULONG CodesWritten */);
|
OUT PULONG CodesWritten */);
|
||||||
|
@ -700,7 +700,7 @@ CSR_API(SrvFillConsoleOutput)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest;
|
PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest;
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
USHORT CodeType = FillOutputRequest->CodeType;
|
CODE_TYPE CodeType = FillOutputRequest->CodeType;
|
||||||
|
|
||||||
DPRINT("SrvFillConsoleOutput\n");
|
DPRINT("SrvFillConsoleOutput\n");
|
||||||
|
|
||||||
|
@ -719,7 +719,7 @@ CSR_API(SrvFillConsoleOutput)
|
||||||
Status = ConDrvFillConsoleOutput(Buffer->Header.Console,
|
Status = ConDrvFillConsoleOutput(Buffer->Header.Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
CodeType,
|
CodeType,
|
||||||
&FillOutputRequest->Code,
|
FillOutputRequest->Code,
|
||||||
FillOutputRequest->NumCodes,
|
FillOutputRequest->NumCodes,
|
||||||
&FillOutputRequest->WriteCoord /*,
|
&FillOutputRequest->WriteCoord /*,
|
||||||
&FillOutputRequest->NrCharactersWritten */);
|
&FillOutputRequest->NrCharactersWritten */);
|
||||||
|
|
Loading…
Reference in a new issue