[CONSRV] Use NtClearEvent() and NtClose() instead of the Win32 functions.
[reactos.git] / win32ss / user / winsrv / consrv / condrv / coninput.c
index a28a207..63549ec 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
-/* GLOBALS ********************************************************************/
-
-typedef struct ConsoleInput_t
-{
-    LIST_ENTRY ListEntry;
-    INPUT_RECORD InputEvent;
-} ConsoleInput;
-
-
 /* PRIVATE FUNCTIONS **********************************************************/
 
 // ConDrvAddInputEvents
@@ -165,12 +156,13 @@ 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;
     }
 
-    if (SetWaitEvent) SetEvent(Console->InputBuffer.ActiveEvent);
+    if (SetWaitEvent) NtSetEvent(Console->InputBuffer.ActiveEvent, NULL);
 
 Done:
     if (NumEventsWritten) *NumEventsWritten = i;
@@ -178,20 +170,58 @@ Done:
     return Status;
 }
 
-VOID
-PurgeInputBuffer(PCONSOLE Console)
+static VOID
+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
+ConDrvInitInputBuffer(IN PCONSOLE Console,
+                      IN ULONG InputBufferSize)
+{
+    NTSTATUS Status;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+
+    ConSrvInitObject(&Console->InputBuffer.Header, INPUT_BUFFER, Console);
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               NULL,
+                               OBJ_INHERIT,
+                               NULL,
+                               NULL);
+
+    Status = NtCreateEvent(&Console->InputBuffer.ActiveEvent, EVENT_ALL_ACCESS,
+                           &ObjectAttributes, NotificationEvent, FALSE);
+    if (!NT_SUCCESS(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;
+
+    return STATUS_SUCCESS;
+}
+
+VOID NTAPI
+ConDrvDeinitInputBuffer(IN PCONSOLE Console)
+{
+    PurgeInputBuffer(&Console->InputBuffer);
+    NtClose(Console->InputBuffer.ActiveEvent);
 }
 
 
@@ -200,10 +230,10 @@ PurgeInputBuffer(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)
 {
@@ -222,10 +252,10 @@ ConDrvReadConsole(IN PCONSOLE Console,
 
     /* Call the line-discipline */
     return TermReadStream(Console,
-                          ExeName,
                           Unicode,
                           Buffer,
                           ReadControl,
+                          Parameter,
                           NumCharsToRead,
                           NumCharsRead);
 }
@@ -277,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);
         }
@@ -286,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.
@@ -326,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;
 
@@ -336,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;
 }
@@ -352,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;
 }