#define NDEBUG
#include <debug.h>
-/* GLOBALS ********************************************************************/
-
-typedef struct ConsoleInput_t
-{
- LIST_ENTRY ListEntry;
- INPUT_RECORD InputEvent;
-} ConsoleInput;
-
-
/* PRIVATE FUNCTIONS **********************************************************/
// ConDrvAddInputEvents
/* Append the event to the beginning of the queue */
InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
}
+ _InterlockedIncrement((PLONG)&Console->InputBuffer.NumberOfEvents);
// return STATUS_SUCCESS;
Status = STATUS_SUCCESS;
}
static VOID
-PurgeInputBuffer(PCONSOLE Console)
+PurgeInputBuffer(IN PCONSOLE_INPUT_BUFFER InputBuffer)
{
PLIST_ENTRY CurrentEntry;
ConsoleInput* Event;
- while (!IsListEmpty(&Console->InputBuffer.InputEvents))
+ /* Discard all entries in the input event queue */
+ _InterlockedExchange((PLONG)&InputBuffer->NumberOfEvents, 0);
+ while (!IsListEmpty(&InputBuffer->InputEvents))
{
- CurrentEntry = RemoveHeadList(&Console->InputBuffer.InputEvents);
+ CurrentEntry = RemoveHeadList(&InputBuffer->InputEvents);
Event = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
ConsoleFreeHeap(Event);
}
- // CloseHandle(Console->InputBuffer.ActiveEvent);
+ // NtClose(Console->InputBuffer.ActiveEvent);
}
NTSTATUS NTAPI
Status = NtCreateEvent(&Console->InputBuffer.ActiveEvent, EVENT_ALL_ACCESS,
&ObjectAttributes, NotificationEvent, FALSE);
if (!NT_SUCCESS(Status))
- {
- return STATUS_UNSUCCESSFUL;
- // return Status;
- }
+ return Status;
Console->InputBuffer.InputBufferSize = InputBufferSize;
+ Console->InputBuffer.NumberOfEvents = 0;
InitializeListHead(&Console->InputBuffer.InputEvents);
Console->InputBuffer.Mode = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT |
ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT;
VOID NTAPI
ConDrvDeinitInputBuffer(IN PCONSOLE Console)
{
- PurgeInputBuffer(Console);
- CloseHandle(Console->InputBuffer.ActiveEvent);
+ PurgeInputBuffer(&Console->InputBuffer);
+ NtClose(Console->InputBuffer.ActiveEvent);
}
NTSTATUS NTAPI
ConDrvReadConsole(IN PCONSOLE Console,
IN PCONSOLE_INPUT_BUFFER InputBuffer,
- /**/IN PUNICODE_STRING ExeName /**/OPTIONAL/**/,/**/
IN BOOLEAN Unicode,
OUT PVOID Buffer,
IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl,
+ IN PVOID Parameter OPTIONAL,
IN ULONG NumCharsToRead,
OUT PULONG NumCharsRead OPTIONAL)
{
/* Call the line-discipline */
return TermReadStream(Console,
- ExeName,
Unicode,
Buffer,
ReadControl,
+ Parameter,
NumCharsToRead,
NumCharsRead);
}
/* Remove the events from the queue if needed */
if (!KeepEvents)
{
+ _InterlockedDecrement((PLONG)&InputBuffer->NumberOfEvents);
RemoveEntryList(&Input->ListEntry);
ConsoleFreeHeap(Input);
}
if (IsListEmpty(&InputBuffer->InputEvents))
{
- ResetEvent(InputBuffer->ActiveEvent);
+ NtClearEvent(InputBuffer->ActiveEvent);
}
// FIXME: If we add back UNICODE support, it's here that we need to do the translation.
ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
IN PCONSOLE_INPUT_BUFFER InputBuffer)
{
- PLIST_ENTRY CurrentEntry;
- ConsoleInput* Event;
-
if (Console == NULL || InputBuffer == NULL)
return STATUS_INVALID_PARAMETER;
ASSERT(Console == InputBuffer->Header.Console);
/* Discard all entries in the input event queue */
- while (!IsListEmpty(&InputBuffer->InputEvents))
- {
- CurrentEntry = RemoveHeadList(&InputBuffer->InputEvents);
- Event = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
- ConsoleFreeHeap(Event);
- }
- ResetEvent(InputBuffer->ActiveEvent);
+ PurgeInputBuffer(InputBuffer);
+ NtClearEvent(InputBuffer->ActiveEvent);
return STATUS_SUCCESS;
}
IN PCONSOLE_INPUT_BUFFER InputBuffer,
OUT PULONG NumberOfEvents)
{
- PLIST_ENTRY CurrentInput;
-
if (Console == NULL || InputBuffer == NULL || NumberOfEvents == NULL)
return STATUS_INVALID_PARAMETER;
/* Validity check */
ASSERT(Console == InputBuffer->Header.Console);
- *NumberOfEvents = 0;
-
- /* If there are any events ... */
- CurrentInput = InputBuffer->InputEvents.Flink;
- while (CurrentInput != &InputBuffer->InputEvents)
- {
- CurrentInput = CurrentInput->Flink;
- (*NumberOfEvents)++;
- }
-
+ *NumberOfEvents = InputBuffer->NumberOfEvents;
return STATUS_SUCCESS;
}