[KERNEL32][CONSRV]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 26 Oct 2013 20:53:05 +0000 (20:53 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 26 Oct 2013 20:53:05 +0000 (20:53 +0000)
Implement WriteConsoleInputVDMA/W, its only purpose being putting console input events at the beginning of the console input event list instead of putting them at the end, as it is done with WriteConsoleInputA/W .

svn path=/trunk/; revision=60756

reactos/dll/win32/kernel32/client/console/console.c
reactos/dll/win32/kernel32/client/console/readwrite.c
reactos/include/psdk/wincon.h
reactos/include/reactos/subsys/win/conmsg.h
reactos/win32ss/user/winsrv/consrv/condrv/coninput.c
reactos/win32ss/user/winsrv/consrv/coninput.c
reactos/win32ss/user/winsrv/consrv/include/conio.h

index 302a5ce..12d820c 100644 (file)
@@ -804,38 +804,6 @@ VerifyConsoleIoHandle(HANDLE Handle)
 }
 
 
-/*
- * @unimplemented
- */
-DWORD
-WINAPI
-WriteConsoleInputVDMA(DWORD Unknown0,
-                      DWORD Unknown1,
-                      DWORD Unknown2,
-                      DWORD Unknown3)
-{
-    DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-
-/*
- * @unimplemented
- */
-DWORD
-WINAPI
-WriteConsoleInputVDMW(DWORD Unknown0,
-                      DWORD Unknown1,
-                      DWORD Unknown2,
-                      DWORD Unknown3)
-{
-    DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-
 /*
  * @implemented (Undocumented)
  */
index a2c8b9c..e8003a4 100644 (file)
@@ -460,7 +460,8 @@ IntWriteConsoleInput(HANDLE hConsoleInput,
                      PINPUT_RECORD lpBuffer,
                      DWORD nLength,
                      LPDWORD lpNumberOfEventsWritten,
-                     BOOL bUnicode)
+                     BOOL bUnicode,
+                     BOOL bAppendToEnd)
 {
     CONSOLE_API_MESSAGE ApiMessage;
     PCONSOLE_WRITEINPUT WriteInputRequest = &ApiMessage.Data.WriteInputRequest;
@@ -488,8 +489,9 @@ IntWriteConsoleInput(HANDLE hConsoleInput,
 
     /* Set up the data to send to the Console Server */
     WriteInputRequest->InputHandle = hConsoleInput;
-    WriteInputRequest->Unicode = bUnicode;
     WriteInputRequest->Length = nLength;
+    WriteInputRequest->Unicode = bUnicode;
+    WriteInputRequest->AppendToEnd = bAppendToEnd;
 
     /* Call the server */
     CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
@@ -1086,6 +1088,7 @@ WriteConsoleInputW(HANDLE hConsoleInput,
                                 (PINPUT_RECORD)lpBuffer,
                                 nLength,
                                 lpNumberOfEventsWritten,
+                                TRUE,
                                 TRUE);
 }
 
@@ -1106,6 +1109,49 @@ WriteConsoleInputA(HANDLE hConsoleInput,
                                 (PINPUT_RECORD)lpBuffer,
                                 nLength,
                                 lpNumberOfEventsWritten,
+                                FALSE,
+                                TRUE);
+}
+
+
+/*--------------------------------------------------------------
+ *     WriteConsoleInputVDMW
+ *
+ * @implemented
+ */
+BOOL
+WINAPI
+WriteConsoleInputVDMW(HANDLE hConsoleInput,
+                      CONST INPUT_RECORD *lpBuffer,
+                      DWORD nLength,
+                      LPDWORD lpNumberOfEventsWritten)
+{
+    return IntWriteConsoleInput(hConsoleInput,
+                                (PINPUT_RECORD)lpBuffer,
+                                nLength,
+                                lpNumberOfEventsWritten,
+                                TRUE,
+                                FALSE);
+}
+
+
+/*--------------------------------------------------------------
+ *     WriteConsoleInputVDMA
+ *
+ * @implemented
+ */
+BOOL
+WINAPI
+WriteConsoleInputVDMA(HANDLE hConsoleInput,
+                      CONST INPUT_RECORD *lpBuffer,
+                      DWORD nLength,
+                      LPDWORD lpNumberOfEventsWritten)
+{
+    return IntWriteConsoleInput(hConsoleInput,
+                                (PINPUT_RECORD)lpBuffer,
+                                nLength,
+                                lpNumberOfEventsWritten,
+                                FALSE,
                                 FALSE);
 }
 
index 78b8c05..50bc129 100644 (file)
@@ -616,6 +616,22 @@ WriteConsoleInputW(
   _In_ DWORD nLength,
   _Out_ LPDWORD lpNumberOfEventsWritten);
 
+BOOL
+WINAPI
+WriteConsoleInputVDMA(
+  _In_ HANDLE hConsoleInput,
+  _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer,
+  _In_ DWORD nLength,
+  _Out_ LPDWORD lpNumberOfEventsWritten);
+
+BOOL
+WINAPI
+WriteConsoleInputVDMW(
+  _In_ HANDLE hConsoleInput,
+  _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer,
+  _In_ DWORD nLength,
+  _Out_ LPDWORD lpNumberOfEventsWritten);
+
 BOOL
 WINAPI
 WriteConsoleOutputA(
index a118a7d..357e79f 100644 (file)
@@ -492,9 +492,10 @@ typedef struct
 typedef struct
 {
     HANDLE InputHandle;
-    BOOL Unicode;
     DWORD Length;
     INPUT_RECORD* InputRecord;
+    BOOL Unicode;
+    BOOL AppendToEnd;
 } CONSOLE_WRITEINPUT, *PCONSOLE_WRITEINPUT;
 
 typedef struct
index 783daa8..b09e4af 100644 (file)
@@ -60,8 +60,9 @@ ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent)
 }
 
 NTSTATUS FASTCALL
-ConioProcessInputEvent(PCONSOLE Console,
-                       PINPUT_RECORD InputEvent)
+ConioAddInputEvent(PCONSOLE Console,
+                   PINPUT_RECORD InputEvent,
+                   BOOLEAN AppendToEnd)
 {
     ConsoleInput *ConInRec;
 
@@ -97,7 +98,17 @@ ConioProcessInputEvent(PCONSOLE Console,
     if (ConInRec == NULL) return STATUS_INSUFFICIENT_RESOURCES;
 
     ConInRec->InputEvent = *InputEvent;
-    InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+
+    if (AppendToEnd)
+    {
+        /* Append the event to the end of the queue */
+        InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+    }
+    else
+    {
+        /* Append the event to the beginning of the queue */
+        InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+    }
 
     SetEvent(Console->InputBuffer.ActiveEvent);
     CsrNotifyWait(&Console->InputBuffer.ReadWaitQueue,
@@ -112,6 +123,13 @@ ConioProcessInputEvent(PCONSOLE Console,
     return STATUS_SUCCESS;
 }
 
+NTSTATUS FASTCALL
+ConioProcessInputEvent(PCONSOLE Console,
+                       PINPUT_RECORD InputEvent)
+{
+    return ConioAddInputEvent(Console, InputEvent, TRUE);
+}
+
 VOID FASTCALL
 PurgeInputBuffer(PCONSOLE Console)
 {
@@ -429,6 +447,7 @@ NTSTATUS NTAPI
 ConDrvWriteConsoleInput(IN PCONSOLE Console,
                         IN PCONSOLE_INPUT_BUFFER InputBuffer,
                         IN BOOLEAN Unicode,
+                        IN BOOLEAN AppendToEnd,
                         IN PINPUT_RECORD InputRecord,
                         IN ULONG NumEventsToWrite,
                         OUT PULONG NumEventsWritten OPTIONAL)
@@ -457,7 +476,7 @@ ConDrvWriteConsoleInput(IN PCONSOLE Console,
                                               &AsciiChar);
         }
 
-        Status = ConioProcessInputEvent(Console, InputRecord++);
+        Status = ConioAddInputEvent(Console, InputRecord++, AppendToEnd);
     }
 
     if (NumEventsWritten) *NumEventsWritten = i;
index 3288a88..bf1982d 100644 (file)
@@ -391,6 +391,7 @@ NTSTATUS NTAPI
 ConDrvWriteConsoleInput(IN PCONSOLE Console,
                         IN PCONSOLE_INPUT_BUFFER InputBuffer,
                         IN BOOLEAN Unicode,
+                        IN BOOLEAN AppendToEnd,
                         IN PINPUT_RECORD InputRecord,
                         IN ULONG NumEventsToWrite,
                         OUT PULONG NumEventsWritten OPTIONAL);
@@ -420,6 +421,7 @@ CSR_API(SrvWriteConsoleInput)
     Status = ConDrvWriteConsoleInput(InputBuffer->Header.Console,
                                      InputBuffer,
                                      WriteInputRequest->Unicode,
+                                     WriteInputRequest->AppendToEnd,
                                      WriteInputRequest->InputRecord,
                                      WriteInputRequest->Length,
                                      &NumEventsWritten);
index 0e8bbc4..c54dab7 100644 (file)
@@ -348,6 +348,9 @@ ConDrvConsoleProcessCtrlEvent(IN PCONSOLE Console,
 
 /* coninput.c */
 VOID NTAPI ConioProcessKey(PCONSOLE Console, MSG* msg);
+NTSTATUS FASTCALL ConioAddInputEvent(PCONSOLE Console,
+                                     PINPUT_RECORD InputEvent,
+                                     BOOLEAN AppendToEnd);
 NTSTATUS FASTCALL ConioProcessInputEvent(PCONSOLE Console,
                                          PINPUT_RECORD InputEvent);