mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Little CsrpWriteConsole() cleanup.
(WIP) Restoring a non active screen buffer is bugged: control characters are NOT processed. svn path=/trunk/; revision=2126
This commit is contained in:
parent
e439100646
commit
a44f8b0d7a
1 changed files with 120 additions and 108 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: conio.c,v 1.19 2001/06/22 02:11:44 phreak Exp $
|
||||
/* $Id: conio.c,v 1.20 2001/07/30 11:56:54 ea Exp $
|
||||
*
|
||||
* reactos/subsys/csrss/api/conio.c
|
||||
*
|
||||
|
@ -17,6 +17,9 @@
|
|||
#include <ddk/ntddblue.h>
|
||||
#include <debug.h>
|
||||
|
||||
#define LOCK RtlEnterCriticalSection(&ActiveConsoleLock)
|
||||
#define UNLOCK RtlLeaveCriticalSection(&ActiveConsoleLock)
|
||||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
static HANDLE ConsoleDeviceHandle;
|
||||
|
@ -134,18 +137,18 @@ NTSTATUS CsrReadConsole(PCSRSS_PROCESS_DATA ProcessData,
|
|||
sizeof(LPC_MESSAGE_HEADER);
|
||||
Buffer = LpcReply->Data.ReadConsoleReply.Buffer;
|
||||
LpcReply->Data.ReadConsoleReply.EventHandle = ProcessData->ConsoleEvent;
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, LpcMessage->Data.ReadConsoleRequest.ConsoleHandle, (Object_t **)&Console );
|
||||
if( !NT_SUCCESS( Status ) )
|
||||
{
|
||||
LpcReply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
if( Console->Header.Type != CSRSS_CONSOLE_MAGIC )
|
||||
{
|
||||
LpcReply->Status = STATUS_INVALID_HANDLE;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return STATUS_INVALID_HANDLE;
|
||||
}
|
||||
for (; i<nNumberOfCharsToRead && Console->InputEvents.Flink != &Console->InputEvents; i++ )
|
||||
|
@ -174,7 +177,7 @@ NTSTATUS CsrReadConsole(PCSRSS_PROCESS_DATA ProcessData,
|
|||
LpcReply->Status = STATUS_NOTIFY_CLEANUP;
|
||||
Console->WaitingChars--;
|
||||
RtlFreeHeap( CsrssApiHeap, 0, Input );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return STATUS_NOTIFY_CLEANUP;
|
||||
}
|
||||
LpcMessage->Data.ReadConsoleRequest.nCharsCanBeDeleted--;
|
||||
|
@ -213,22 +216,55 @@ NTSTATUS CsrReadConsole(PCSRSS_PROCESS_DATA ProcessData,
|
|||
Console->EchoCount = 0; // if the client is no longer waiting on input, do not echo
|
||||
}
|
||||
LpcReply->Header.MessageSize += i;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return LpcReply->Status;
|
||||
}
|
||||
|
||||
#define SET_CELL_BUFFER(b,o,c,a)\
|
||||
(b)->Buffer[(o)++]=(c);\
|
||||
(b)->Buffer[(o)++]=(a);
|
||||
|
||||
static DWORD FASTCALL
|
||||
ComputeOffsetBuffer (
|
||||
PCSRSS_SCREEN_BUFFER Buff,
|
||||
DWORD LogicalX,
|
||||
DWORD LogicalY
|
||||
)
|
||||
{
|
||||
/* 2 == sizeof (cell) */
|
||||
return (2 * ((LogicalY * Buff->MaxX) + LogicalX));
|
||||
}
|
||||
|
||||
static VOID FASTCALL
|
||||
ClearLineBuffer (
|
||||
PCSRSS_SCREEN_BUFFER Buff,
|
||||
DWORD StartX,
|
||||
DWORD StopX
|
||||
)
|
||||
{
|
||||
DWORD LogicalX = StartX;
|
||||
DWORD Offset = ComputeOffsetBuffer (Buff, LogicalX, Buff->CurrentY);
|
||||
|
||||
for ( ; LogicalX < StopX; LogicalX ++ )
|
||||
{
|
||||
/* Fill the cell: Offset is incremented by the macro */
|
||||
SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib)
|
||||
}
|
||||
}
|
||||
|
||||
NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length, BOOL Attrib )
|
||||
{
|
||||
IO_STATUS_BLOCK Iosb;
|
||||
NTSTATUS Status;
|
||||
int i;
|
||||
DWORD Offset;
|
||||
|
||||
for( i = 0; i < Length; i++ )
|
||||
{
|
||||
switch( Buffer[ i ] )
|
||||
{
|
||||
case '\n': {
|
||||
int c;
|
||||
/* --- LF --- */
|
||||
case '\n':
|
||||
Buff->CurrentX = 0;
|
||||
/* slide the viewable screen */
|
||||
if( ((PhysicalConsoleSize.Y + Buff->ShowY) % Buff->MaxY) == (Buff->CurrentY + 1) % Buff->MaxY)
|
||||
|
@ -237,21 +273,10 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length
|
|||
if( ++Buff->CurrentY == Buff->MaxY )
|
||||
{
|
||||
Buff->CurrentY = 0;
|
||||
for( c = 0; c < Buff->MaxX; c++ )
|
||||
{
|
||||
/* clear new line */
|
||||
Buff->Buffer[ c * 2 ] = ' ';
|
||||
Buff->Buffer[ (c * 2) + 1 ] = Buff->DefaultAttrib;
|
||||
}
|
||||
}
|
||||
else for( c = 0; c < Buff->MaxX; c++ )
|
||||
{
|
||||
/* clear new line */
|
||||
Buff->Buffer[ 2 * ((Buff->CurrentY * Buff->MaxX) + c) ] = ' ';
|
||||
Buff->Buffer[ (2 * ((Buff->CurrentY * Buff->MaxX) + c)) + 1 ] = Buff->DefaultAttrib;
|
||||
}
|
||||
ClearLineBuffer (Buff, 0, Buff->MaxX);
|
||||
break;
|
||||
}
|
||||
/* --- BS --- */
|
||||
case '\b': {
|
||||
if( Buff->CurrentX == 0 )
|
||||
{
|
||||
|
@ -272,15 +297,16 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length
|
|||
}
|
||||
else
|
||||
Buff->CurrentX--;
|
||||
Buff->Buffer[ 2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX) ] = ' ';
|
||||
Buff->Buffer[ (2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX)) + 1 ] = Buff->DefaultAttrib;
|
||||
Offset = ComputeOffsetBuffer (Buff, Buff->CurrentX, Buff->CurrentY);
|
||||
SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
int c;
|
||||
Buff->Buffer[ 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX) ] = Buffer[ i ];
|
||||
/* --- */
|
||||
default:
|
||||
Offset = ComputeOffsetBuffer (Buff, Buff->CurrentX, Buff->CurrentY);
|
||||
Buff->Buffer[Offset ++] = Buffer[ i ];
|
||||
if( Attrib )
|
||||
Buff->Buffer[ (2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX)) + 1 ] = Buff->DefaultAttrib;
|
||||
Buff->Buffer[Offset] = Buff->DefaultAttrib;
|
||||
Buff->CurrentX++;
|
||||
if( Buff->CurrentX == Buff->MaxX )
|
||||
{
|
||||
|
@ -291,19 +317,11 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length
|
|||
/* if end of buffer, wrap back to beginning */
|
||||
Buff->CurrentY = 0;
|
||||
/* clear new line */
|
||||
for( c = 0; c < Buff->MaxX; c++ )
|
||||
{
|
||||
Buff->Buffer[ 2 * ((Buff->CurrentY * Buff->MaxX) + c) ] = ' ';
|
||||
Buff->Buffer[ (2 * ((Buff->CurrentY * Buff->MaxX) + c)) + 1 ] = Buff->DefaultAttrib;
|
||||
}
|
||||
ClearLineBuffer (Buff, 0, Buff->MaxX);
|
||||
}
|
||||
else {
|
||||
/* clear new line */
|
||||
for( c = 0; c < Buff->MaxX; c += 2 )
|
||||
{
|
||||
Buff->Buffer[ 2 * ((Buff->CurrentY * Buff->MaxX) + c) ] = ' ';
|
||||
Buff->Buffer[ (2 * ((Buff->CurrentY * Buff->MaxX) + c)) + 1 ] = Buff->DefaultAttrib;
|
||||
}
|
||||
ClearLineBuffer (Buff, 0, Buff->MaxX);
|
||||
}
|
||||
/* slide the viewable screen */
|
||||
if( (Buff->CurrentY - Buff->ShowY) == PhysicalConsoleSize.Y )
|
||||
|
@ -311,7 +329,6 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length
|
|||
Buff->ShowY = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if( Buff == ActiveConsole->ActiveBuffer )
|
||||
{ /* only write to screen if Console is Active, and not scrolled up */
|
||||
|
@ -336,14 +353,14 @@ NTSTATUS CsrWriteConsole(PCSRSS_PROCESS_DATA ProcessData,
|
|||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( !NT_SUCCESS( CsrGetObject( ProcessData, LpcMessage->Data.WriteConsoleRequest.ConsoleHandle, (Object_t **)&Buff ) ) || Buff->Header.Type != CSRSS_SCREEN_BUFFER_MAGIC )
|
||||
{
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_INVALID_HANDLE;
|
||||
}
|
||||
CsrpWriteConsole( Buff, Buffer, LpcMessage->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -365,12 +382,7 @@ NTSTATUS CsrInitConsoleScreenBuffer( PCSRSS_SCREEN_BUFFER Console )
|
|||
/* initialize buffer to be empty with default attributes */
|
||||
for( ; Console->CurrentY < Console->MaxY; Console->CurrentY++ )
|
||||
{
|
||||
for( ; Console->CurrentX < Console->MaxX; Console->CurrentX++ )
|
||||
{
|
||||
Console->Buffer[ (Console->CurrentX * 2) + (Console->CurrentY * Console->MaxX * 2) ] = ' ';
|
||||
Console->Buffer[ (Console->CurrentX * 2) + (Console->CurrentY * Console->MaxX * 2)+ 1 ] = Console->DefaultAttrib;
|
||||
}
|
||||
Console->CurrentX = 0;
|
||||
ClearLineBuffer (Console, 0, Console->MaxX);
|
||||
}
|
||||
Console->CursorInfo.bVisible = TRUE;
|
||||
Console->CursorInfo.dwSize = 5;
|
||||
|
@ -423,7 +435,7 @@ NTSTATUS CsrInitConsole(PCSRSS_CONSOLE Console)
|
|||
/* add a reference count because the buffer is tied to the console */
|
||||
Console->ActiveBuffer->Header.ReferenceCount++;
|
||||
/* make console active, and insert into console list */
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( ActiveConsole )
|
||||
{
|
||||
Console->Prev = ActiveConsole;
|
||||
|
@ -438,7 +450,7 @@ NTSTATUS CsrInitConsole(PCSRSS_CONSOLE Console)
|
|||
ActiveConsole = Console;
|
||||
/* copy buffer contents to screen */
|
||||
CsrDrawConsole( Console->ActiveBuffer );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -512,7 +524,7 @@ VOID CsrDeleteConsole( PCSRSS_CONSOLE Console )
|
|||
{
|
||||
ConsoleInput *Event;
|
||||
DPRINT1( "CsrDeleteConsole\n" );
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
/* Drain input event queue */
|
||||
while( Console->InputEvents.Flink != &Console->InputEvents )
|
||||
{
|
||||
|
@ -534,7 +546,7 @@ VOID CsrDeleteConsole( PCSRSS_CONSOLE Console )
|
|||
}
|
||||
if( ActiveConsole )
|
||||
CsrDrawConsole( ActiveConsole->ActiveBuffer );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
if( !--Console->ActiveBuffer->Header.ReferenceCount )
|
||||
CsrDeleteScreenBuffer( Console->ActiveBuffer );
|
||||
NtClose( Console->ActiveEvent );
|
||||
|
@ -644,9 +656,9 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
Status = NtWaitForMultipleObjects( 2, Events, WaitAny, FALSE, NULL );
|
||||
if( Status == STATUS_WAIT_0 + 1 )
|
||||
{
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
CsrDrawConsole( ActiveConsole->ActiveBuffer );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
continue;
|
||||
}
|
||||
else if( Status != STATUS_WAIT_0 )
|
||||
|
@ -667,7 +679,7 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
|
||||
/* alt-tab, swap consoles */
|
||||
// move SwapConsole to next console, and print its title
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( !SwapConsole )
|
||||
SwapConsole = ActiveConsole;
|
||||
|
||||
|
@ -708,7 +720,7 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
}
|
||||
RtlFreeHeap( CsrssApiHeap, 0, Buffer );
|
||||
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
RtlFreeHeap( CsrssApiHeap, 0, KeyEventRecord );
|
||||
continue;
|
||||
}
|
||||
|
@ -723,7 +735,7 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
// alt key released, swap consoles
|
||||
PCSRSS_CONSOLE tmp;
|
||||
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( SwapConsole != ActiveConsole )
|
||||
{
|
||||
// first remove swapconsole from the list
|
||||
|
@ -739,18 +751,18 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
SwapConsole = 0;
|
||||
CsrDrawConsole( ActiveConsole->ActiveBuffer );
|
||||
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
}
|
||||
if( KeyEventRecord->InputEvent.Event.KeyEvent.dwControlKeyState & ( RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED ) && (KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == VK_UP || KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == VK_DOWN) )
|
||||
{
|
||||
if( KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown == TRUE )
|
||||
{
|
||||
/* scroll up or down */
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( ActiveConsole == 0 )
|
||||
{
|
||||
DbgPrint( "CSR: No Active Console!\n" );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
RtlFreeHeap( CsrssApiHeap, 0, KeyEventRecord );
|
||||
continue;
|
||||
}
|
||||
|
@ -766,16 +778,16 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
if( ((ActiveConsole->ActiveBuffer->CurrentY + 1) % ActiveConsole->ActiveBuffer->MaxY) != (ActiveConsole->ActiveBuffer->ShowY + PhysicalConsoleSize.Y) % ActiveConsole->ActiveBuffer->MaxY )
|
||||
ActiveConsole->ActiveBuffer->ShowY = (ActiveConsole->ActiveBuffer->ShowY + 1) % ActiveConsole->ActiveBuffer->MaxY;
|
||||
CsrDrawConsole( ActiveConsole->ActiveBuffer );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
}
|
||||
RtlFreeHeap( CsrssApiHeap, 0, KeyEventRecord );
|
||||
continue;
|
||||
}
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( ActiveConsole == 0 )
|
||||
{
|
||||
DbgPrint( "CSR: No Active Console!\n" );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
RtlFreeHeap( CsrssApiHeap, 0, KeyEventRecord );
|
||||
continue;
|
||||
}
|
||||
|
@ -798,7 +810,7 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
if( !KeyEventRecord )
|
||||
{
|
||||
DbgPrint( "CSR: Failed to allocate KeyEventRecord\n" );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
continue;
|
||||
}
|
||||
KeyEventRecord->InputEvent.EventType = KEY_EVENT;
|
||||
|
@ -865,7 +877,7 @@ VOID Console_Api( DWORD RefreshEvent )
|
|||
ActiveConsole->WaitingChars++;
|
||||
if( !(ActiveConsole->Mode & ENABLE_LINE_INPUT) )
|
||||
NtSetEvent( ActiveConsole->ActiveEvent, 0 );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -880,10 +892,10 @@ NTSTATUS CsrGetScreenBufferInfo( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQ
|
|||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( !NT_SUCCESS( CsrGetObject( ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, (Object_t **)&Buff ) ) || Buff->Header.Type != CSRSS_SCREEN_BUFFER_MAGIC )
|
||||
{
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_INVALID_HANDLE;
|
||||
}
|
||||
pInfo = &Reply->Data.ScreenBufferInfoReply.Info;
|
||||
|
@ -906,7 +918,7 @@ NTSTATUS CsrGetScreenBufferInfo( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQ
|
|||
pInfo->srWindow.Bottom = PhysicalConsoleSize.Y - 1;
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
|
@ -921,10 +933,10 @@ NTSTATUS CsrSetCursor( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST Reque
|
|||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( !NT_SUCCESS( CsrGetObject( ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, (Object_t **)&Buff ) ) || Buff->Header.Type != CSRSS_SCREEN_BUFFER_MAGIC )
|
||||
{
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_INVALID_HANDLE;
|
||||
}
|
||||
Info.dwCursorPosition = Request->Data.SetCursorRequest.Position;
|
||||
|
@ -937,7 +949,7 @@ NTSTATUS CsrSetCursor( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST Reque
|
|||
}
|
||||
Buff->CurrentX = Info.dwCursorPosition.X + Buff->ShowX;
|
||||
Buff->CurrentY = (Info.dwCursorPosition.Y + Buff->ShowY) % Buff->MaxY;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = Status;
|
||||
}
|
||||
|
||||
|
@ -952,10 +964,10 @@ NTSTATUS CsrWriteConsoleOutputChar( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_
|
|||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( !NT_SUCCESS( CsrGetObject( ProcessData, Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle, (Object_t **)&Buff ) ) || Buff->Header.Type != CSRSS_SCREEN_BUFFER_MAGIC )
|
||||
{
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_INVALID_HANDLE;
|
||||
}
|
||||
X = Buff->CurrentX;
|
||||
|
@ -983,7 +995,7 @@ NTSTATUS CsrWriteConsoleOutputChar( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_
|
|||
Reply->Data.WriteConsoleOutputCharReply.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
|
||||
Buff->CurrentY = Y;
|
||||
Buff->CurrentX = X;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -996,10 +1008,10 @@ NTSTATUS CsrFillOutputChar( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
if( !NT_SUCCESS( CsrGetObject( ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, (Object_t **)&Buff ) ) || Buff->Header.Type != CSRSS_SCREEN_BUFFER_MAGIC )
|
||||
{
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_INVALID_HANDLE;
|
||||
}
|
||||
X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX;
|
||||
|
@ -1017,7 +1029,7 @@ NTSTATUS CsrFillOutputChar( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
}
|
||||
if( Buff == ActiveConsole->ActiveBuffer )
|
||||
CsrDrawConsole( Buff );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
|
@ -1032,12 +1044,12 @@ NTSTATUS CsrReadInputEvent( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
sizeof(LPC_MESSAGE_HEADER);
|
||||
Reply->Data.ReadInputReply.Event = ProcessData->ConsoleEvent;
|
||||
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, (Object_t **)&Console );
|
||||
if( !NT_SUCCESS( Status ) || (Status = Console->Header.Type == CSRSS_CONSOLE_MAGIC ? 0 : STATUS_INVALID_HANDLE))
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
// only get input if there is input, and we are not in line input mode, or if we are, if we have a whole line
|
||||
|
@ -1058,7 +1070,7 @@ NTSTATUS CsrReadInputEvent( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
else Status = STATUS_PENDING;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = Status;
|
||||
}
|
||||
|
||||
|
@ -1073,12 +1085,12 @@ NTSTATUS CsrWriteConsoleOutputAttrib( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_AP
|
|||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle, (Object_t **)&Buff );
|
||||
if( !NT_SUCCESS( Status ) || (Status = Buff->Header.Type == CSRSS_SCREEN_BUFFER_MAGIC ? 0 : STATUS_INVALID_HANDLE ))
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
X = Buff->CurrentX;
|
||||
|
@ -1115,7 +1127,7 @@ NTSTATUS CsrWriteConsoleOutputAttrib( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_AP
|
|||
Reply->Data.WriteConsoleOutputAttribReply.EndCoord.Y = ( Buff->CurrentY + Buff->MaxY - Buff->ShowY ) % Buff->MaxY;
|
||||
Buff->CurrentX = X;
|
||||
Buff->CurrentY = Y;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1131,12 +1143,12 @@ NTSTATUS CsrFillOutputAttrib( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUES
|
|||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, (Object_t **)&Buff );
|
||||
if( !NT_SUCCESS( Status ) || (Status = Buff->Header.Type == CSRSS_SCREEN_BUFFER_MAGIC ? 0 : STATUS_INVALID_HANDLE ))
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
X = Buff->CurrentX;
|
||||
|
@ -1173,7 +1185,7 @@ NTSTATUS CsrFillOutputAttrib( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUES
|
|||
}
|
||||
Buff->CurrentX = X;
|
||||
Buff->CurrentY = Y;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1186,16 +1198,16 @@ NTSTATUS CsrGetCursorInfo( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST R
|
|||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, (Object_t **)&Buff );
|
||||
if( !NT_SUCCESS( Status ) || (Status = Buff->Header.Type == CSRSS_SCREEN_BUFFER_MAGIC ? 0 : STATUS_INVALID_HANDLE ))
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
Reply->Data.GetCursorInfoReply.Info = Buff->CursorInfo;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1208,12 +1220,12 @@ NTSTATUS CsrSetCursorInfo( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST R
|
|||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, (Object_t **)&Buff );
|
||||
if( !NT_SUCCESS( Status ) || (Status = Buff->Header.Type == CSRSS_SCREEN_BUFFER_MAGIC ? 0 : STATUS_INVALID_HANDLE ))
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
Buff->CursorInfo = Request->Data.SetCursorInfoRequest.Info;
|
||||
|
@ -1226,7 +1238,7 @@ NTSTATUS CsrSetCursorInfo( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST R
|
|||
return Reply->Status = Status;
|
||||
}
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1240,12 +1252,12 @@ NTSTATUS CsrSetTextAttrib( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST R
|
|||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
||||
sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.SetAttribRequest.ConsoleHandle, (Object_t **)&Buff );
|
||||
if( !NT_SUCCESS( Status ) || (Status = Buff->Header.Type == CSRSS_SCREEN_BUFFER_MAGIC ? 0 : STATUS_INVALID_HANDLE ))
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib;
|
||||
|
@ -1258,11 +1270,11 @@ NTSTATUS CsrSetTextAttrib( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST R
|
|||
if( !NT_SUCCESS( Status ) )
|
||||
{
|
||||
DbgPrint( "CSR: Failed to set console info\n" );
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = Status;
|
||||
}
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1274,12 +1286,12 @@ NTSTATUS CsrSetConsoleMode( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
|
||||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.SetConsoleModeRequest.ConsoleHandle, (Object_t **)&Console );
|
||||
if( !NT_SUCCESS( Status ) )
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
Buff = (PCSRSS_SCREEN_BUFFER)Console;
|
||||
|
@ -1289,10 +1301,10 @@ NTSTATUS CsrSetConsoleMode( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
Buff->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_OUTPUT_MODE_VALID;
|
||||
else {
|
||||
Reply->Status = STATUS_INVALID_HANDLE;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
@ -1305,12 +1317,12 @@ NTSTATUS CsrGetConsoleMode( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
|
||||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle, (Object_t **)&Console );
|
||||
if( !NT_SUCCESS( Status ) )
|
||||
{
|
||||
Reply->Status = Status;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Status;
|
||||
}
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
|
@ -1320,7 +1332,7 @@ NTSTATUS CsrGetConsoleMode( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
else if( Buff->Header.Type = CSRSS_SCREEN_BUFFER_MAGIC )
|
||||
Reply->Data.GetConsoleModeReply.ConsoleMode = Buff->Mode;
|
||||
else Status = STATUS_INVALID_HANDLE;
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
|
@ -1333,7 +1345,7 @@ NTSTATUS CsrCreateScreenBuffer( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQU
|
|||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE_HEADER);
|
||||
if( !Buff )
|
||||
Reply->Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrInitConsoleScreenBuffer( Buff );
|
||||
if( !NT_SUCCESS( Status ) )
|
||||
Reply->Status = Status;
|
||||
|
@ -1343,7 +1355,7 @@ NTSTATUS CsrCreateScreenBuffer( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQU
|
|||
Reply->Status = Status;
|
||||
else Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
|
@ -1354,7 +1366,7 @@ NTSTATUS CsrSetScreenBuffer( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
|
||||
Reply->Header.MessageSize = sizeof( CSRSS_API_REPLY );
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.SetActiveScreenBufferRequest.OutputHandle, (Object_t **)&Buff );
|
||||
if( !NT_SUCCESS( Status ) )
|
||||
Reply->Status = Status;
|
||||
|
@ -1371,7 +1383,7 @@ NTSTATUS CsrSetScreenBuffer( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST
|
|||
CsrDrawConsole( Buff );
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
|
@ -1382,7 +1394,7 @@ NTSTATUS CsrSetTitle( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST Reques
|
|||
|
||||
Reply->Header.MessageSize = sizeof( CSRSS_API_REPLY );
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE_HEADER);
|
||||
RtlEnterCriticalSection( &ActiveConsoleLock );
|
||||
LOCK;
|
||||
Status = CsrGetObject( ProcessData, Request->Data.SetTitleRequest.Console, (Object_t **)&Console );
|
||||
if( !NT_SUCCESS( Status ) )
|
||||
Reply->Status = Status;
|
||||
|
@ -1392,7 +1404,7 @@ NTSTATUS CsrSetTitle( PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST Reques
|
|||
RtlCreateUnicodeString( &Console->Title, Request->Data.SetTitleRequest.Title );
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
||||
UNLOCK;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue