[CONSRV] Use NtClearEvent() and NtClose() instead of the Win32 functions.
[reactos.git] / win32ss / user / winsrv / consrv / condrv / coninput.c
index a3f3841..63549ec 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
-/* GLOBALS ********************************************************************/
-
-typedef struct ConsoleInput_t
-{
-    LIST_ENTRY ListEntry;
-    INPUT_RECORD InputEvent;
-} ConsoleInput;
-
-
 /* PRIVATE FUNCTIONS **********************************************************/
 
 // ConDrvAddInputEvents
@@ -165,6 +156,7 @@ AddInputEvents(PCONSOLE Console,
             /* 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;
@@ -179,19 +171,21 @@ Done:
 }
 
 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
@@ -212,12 +206,10 @@ ConDrvInitInputBuffer(IN PCONSOLE Console,
     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;
@@ -228,8 +220,8 @@ ConDrvInitInputBuffer(IN PCONSOLE Console,
 VOID NTAPI
 ConDrvDeinitInputBuffer(IN PCONSOLE Console)
 {
-    PurgeInputBuffer(Console);
-    CloseHandle(Console->InputBuffer.ActiveEvent);
+    PurgeInputBuffer(&Console->InputBuffer);
+    NtClose(Console->InputBuffer.ActiveEvent);
 }
 
 
@@ -238,10 +230,10 @@ ConDrvDeinitInputBuffer(IN PCONSOLE Console)
 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)
 {
@@ -260,10 +252,10 @@ ConDrvReadConsole(IN PCONSOLE Console,
 
     /* Call the line-discipline */
     return TermReadStream(Console,
-                          ExeName,
                           Unicode,
                           Buffer,
                           ReadControl,
+                          Parameter,
                           NumCharsToRead,
                           NumCharsRead);
 }
@@ -315,6 +307,7 @@ ConDrvGetConsoleInput(IN PCONSOLE Console,
         /* Remove the events from the queue if needed */
         if (!KeepEvents)
         {
+            _InterlockedDecrement((PLONG)&InputBuffer->NumberOfEvents);
             RemoveEntryList(&Input->ListEntry);
             ConsoleFreeHeap(Input);
         }
@@ -324,7 +317,7 @@ ConDrvGetConsoleInput(IN PCONSOLE Console,
 
     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.
@@ -364,9 +357,6 @@ NTSTATUS NTAPI
 ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
                               IN PCONSOLE_INPUT_BUFFER InputBuffer)
 {
-    PLIST_ENTRY CurrentEntry;
-    ConsoleInput* Event;
-
     if (Console == NULL || InputBuffer == NULL)
         return STATUS_INVALID_PARAMETER;
 
@@ -374,13 +364,8 @@ ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
     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;
 }
@@ -390,24 +375,13 @@ ConDrvGetConsoleNumberOfInputEvents(IN PCONSOLE Console,
                                     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;
 }