mirror of
https://github.com/reactos/reactos.git
synced 2024-10-21 21:34:17 +00:00
Use synchronous IO for screen and keyboard and get rid of the input event object.
svn path=/trunk/; revision=6477
This commit is contained in:
parent
888ca1574d
commit
c3b4b58a78
|
@ -32,12 +32,14 @@
|
||||||
#include "usetup.h"
|
#include "usetup.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
/* GLOBALS ******************************************************************/
|
||||||
|
|
||||||
static HANDLE StdInput = INVALID_HANDLE_VALUE;
|
static HANDLE StdInput = INVALID_HANDLE_VALUE;
|
||||||
static HANDLE StdOutput = INVALID_HANDLE_VALUE;
|
static HANDLE StdOutput = INVALID_HANDLE_VALUE;
|
||||||
static HANDLE InputEvent = INVALID_HANDLE_VALUE;
|
|
||||||
|
|
||||||
static SHORT xScreen = 0;
|
static SHORT xScreen = 0;
|
||||||
static SHORT yScreen = 0;
|
static SHORT yScreen = 0;
|
||||||
|
@ -68,26 +70,12 @@ AllocConsole(VOID)
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
Status = NtCreateFile(&StdOutput,
|
Status = NtOpenFile (&StdOutput,
|
||||||
FILE_ALL_ACCESS,
|
FILE_ALL_ACCESS,
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
&IoStatusBlock,
|
&IoStatusBlock,
|
||||||
NULL,
|
0,
|
||||||
0,
|
FILE_SYNCHRONOUS_IO_ALERT);
|
||||||
0,
|
|
||||||
FILE_OPEN,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
/* Create input event */
|
|
||||||
Status = NtCreateEvent(&InputEvent,
|
|
||||||
STANDARD_RIGHTS_ALL,
|
|
||||||
NULL,
|
|
||||||
FALSE,
|
|
||||||
FALSE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
return(Status);
|
return(Status);
|
||||||
|
|
||||||
|
@ -99,17 +87,14 @@ AllocConsole(VOID)
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
Status = NtCreateFile(&StdInput,
|
Status = NtOpenFile (&StdInput,
|
||||||
FILE_ALL_ACCESS,
|
FILE_ALL_ACCESS,
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
&IoStatusBlock,
|
&IoStatusBlock,
|
||||||
NULL,
|
0,
|
||||||
0,
|
FILE_SYNCHRONOUS_IO_ALERT);
|
||||||
0,
|
if (!NT_SUCCESS(Status))
|
||||||
FILE_OPEN,
|
return(Status);
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
|
|
||||||
GetConsoleScreenBufferInfo(&csbi);
|
GetConsoleScreenBufferInfo(&csbi);
|
||||||
|
|
||||||
|
@ -123,14 +108,15 @@ AllocConsole(VOID)
|
||||||
VOID
|
VOID
|
||||||
FreeConsole(VOID)
|
FreeConsole(VOID)
|
||||||
{
|
{
|
||||||
|
DPRINT1("FreeConsole() called\n");
|
||||||
|
|
||||||
if (StdInput != INVALID_HANDLE_VALUE)
|
if (StdInput != INVALID_HANDLE_VALUE)
|
||||||
NtClose(StdInput);
|
NtClose(StdInput);
|
||||||
|
|
||||||
if (StdOutput != INVALID_HANDLE_VALUE)
|
if (StdOutput != INVALID_HANDLE_VALUE)
|
||||||
NtClose(StdOutput);
|
NtClose(StdOutput);
|
||||||
|
|
||||||
if (InputEvent != INVALID_HANDLE_VALUE)
|
DPRINT1("FreeConsole() done\n");
|
||||||
NtClose(InputEvent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -154,15 +140,8 @@ WriteConsole(PCHAR Buffer,
|
||||||
NumberOfCharsToWrite,
|
NumberOfCharsToWrite,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NumberOfCharsWritten != NULL)
|
if (NT_SUCCESS(Status) && NumberOfCharsWritten != NULL)
|
||||||
{
|
{
|
||||||
*NumberOfCharsWritten = IoStatusBlock.Information;
|
*NumberOfCharsWritten = IoStatusBlock.Information;
|
||||||
}
|
}
|
||||||
|
@ -219,23 +198,15 @@ ReadConsoleInput(PINPUT_RECORD Buffer)
|
||||||
|
|
||||||
Buffer->EventType = KEY_EVENT;
|
Buffer->EventType = KEY_EVENT;
|
||||||
Status = NtReadFile(StdInput,
|
Status = NtReadFile(StdInput,
|
||||||
InputEvent,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
&Iosb,
|
&Iosb,
|
||||||
&Buffer->Event.KeyEvent, //&KeyEventRecord->InputEvent.Event.KeyEvent,
|
&Buffer->Event.KeyEvent,
|
||||||
sizeof(KEY_EVENT_RECORD),
|
sizeof(KEY_EVENT_RECORD),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if( Status == STATUS_PENDING )
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(InputEvent,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = Iosb.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,13 +234,6 @@ ReadConsoleOutputCharacters(LPSTR lpCharacter,
|
||||||
sizeof(OUTPUT_CHARACTER),
|
sizeof(OUTPUT_CHARACTER),
|
||||||
(PVOID)lpCharacter,
|
(PVOID)lpCharacter,
|
||||||
nLength);
|
nLength);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NT_SUCCESS(Status) && lpNumberOfCharsRead != NULL)
|
if (NT_SUCCESS(Status) && lpNumberOfCharsRead != NULL)
|
||||||
{
|
{
|
||||||
|
@ -303,13 +267,6 @@ ReadConsoleOutputAttributes(PUSHORT lpAttribute,
|
||||||
sizeof(OUTPUT_ATTRIBUTE),
|
sizeof(OUTPUT_ATTRIBUTE),
|
||||||
(PVOID)lpAttribute,
|
(PVOID)lpAttribute,
|
||||||
nLength);
|
nLength);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NT_SUCCESS(Status) && lpNumberOfAttrsRead != NULL)
|
if (NT_SUCCESS(Status) && lpNumberOfAttrsRead != NULL)
|
||||||
{
|
{
|
||||||
|
@ -350,13 +307,6 @@ WriteConsoleOutputCharacters(LPCSTR lpCharacter,
|
||||||
nLength + sizeof(COORD),
|
nLength + sizeof(COORD),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlFreeHeap(ProcessHeap,
|
RtlFreeHeap(ProcessHeap,
|
||||||
0,
|
0,
|
||||||
|
@ -401,13 +351,6 @@ WriteConsoleOutputCharactersW(LPCWSTR lpCharacter,
|
||||||
nLength + sizeof(COORD),
|
nLength + sizeof(COORD),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlFreeHeap(ProcessHeap,
|
RtlFreeHeap(ProcessHeap,
|
||||||
0,
|
0,
|
||||||
|
@ -448,13 +391,6 @@ WriteConsoleOutputAttributes(CONST USHORT *lpAttribute,
|
||||||
nLength * sizeof(USHORT) + sizeof(COORD),
|
nLength * sizeof(USHORT) + sizeof(COORD),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlFreeHeap(ProcessHeap,
|
RtlFreeHeap(ProcessHeap,
|
||||||
0,
|
0,
|
||||||
|
@ -489,13 +425,7 @@ FillConsoleOutputAttribute(USHORT wAttribute,
|
||||||
sizeof(OUTPUT_ATTRIBUTE),
|
sizeof(OUTPUT_ATTRIBUTE),
|
||||||
&Buffer,
|
&Buffer,
|
||||||
sizeof(OUTPUT_ATTRIBUTE));
|
sizeof(OUTPUT_ATTRIBUTE));
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
*lpNumberOfAttrsWritten = Buffer.dwTransfered;
|
*lpNumberOfAttrsWritten = Buffer.dwTransfered;
|
||||||
|
@ -530,13 +460,7 @@ FillConsoleOutputCharacter(CHAR Character,
|
||||||
sizeof(OUTPUT_CHARACTER),
|
sizeof(OUTPUT_CHARACTER),
|
||||||
&Buffer,
|
&Buffer,
|
||||||
sizeof(OUTPUT_CHARACTER));
|
sizeof(OUTPUT_CHARACTER));
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
*NumberOfCharsWritten = Buffer.dwTransfered;
|
*NumberOfCharsWritten = Buffer.dwTransfered;
|
||||||
|
@ -627,13 +551,7 @@ SetConsoleMode(HANDLE hConsoleHandle,
|
||||||
sizeof(CONSOLE_MODE),
|
sizeof(CONSOLE_MODE),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(hConsoleHandle,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -655,13 +573,6 @@ GetConsoleScreenBufferInfo(PCONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo)
|
||||||
0,
|
0,
|
||||||
ConsoleScreenBufferInfo,
|
ConsoleScreenBufferInfo,
|
||||||
sizeof(CONSOLE_SCREEN_BUFFER_INFO));
|
sizeof(CONSOLE_SCREEN_BUFFER_INFO));
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
@ -683,13 +594,7 @@ SetConsoleCursorInfo(PCONSOLE_CURSOR_INFO lpConsoleCursorInfo)
|
||||||
sizeof(CONSOLE_CURSOR_INFO),
|
sizeof(CONSOLE_CURSOR_INFO),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -718,19 +623,13 @@ SetConsoleCursorPosition(COORD dwCursorPosition)
|
||||||
sizeof(CONSOLE_SCREEN_BUFFER_INFO),
|
sizeof(CONSOLE_SCREEN_BUFFER_INFO),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SetConsoleTextAttribute(WORD wAttributes)
|
SetConsoleTextAttribute(USHORT wAttributes)
|
||||||
{
|
{
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -742,16 +641,10 @@ SetConsoleTextAttribute(WORD wAttributes)
|
||||||
&IoStatusBlock,
|
&IoStatusBlock,
|
||||||
IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE,
|
IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE,
|
||||||
&wAttributes,
|
&wAttributes,
|
||||||
sizeof(WORD),
|
sizeof(USHORT),
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
NtWaitForSingleObject(StdOutput,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue