From ccdf36a380fbc2cff57cf4f34e8a9452adbf812b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 26 Oct 2013 20:53:05 +0000 Subject: [PATCH] [KERNEL32][CONSRV] 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 --- .../win32/kernel32/client/console/console.c | 32 ------------ .../win32/kernel32/client/console/readwrite.c | 50 ++++++++++++++++++- reactos/include/psdk/wincon.h | 16 ++++++ reactos/include/reactos/subsys/win/conmsg.h | 3 +- .../user/winsrv/consrv/condrv/coninput.c | 27 ++++++++-- reactos/win32ss/user/winsrv/consrv/coninput.c | 2 + .../user/winsrv/consrv/include/conio.h | 3 ++ 7 files changed, 94 insertions(+), 39 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/console/console.c b/reactos/dll/win32/kernel32/client/console/console.c index 302a5ce1435..12d820cf18a 100644 --- a/reactos/dll/win32/kernel32/client/console/console.c +++ b/reactos/dll/win32/kernel32/client/console/console.c @@ -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) */ diff --git a/reactos/dll/win32/kernel32/client/console/readwrite.c b/reactos/dll/win32/kernel32/client/console/readwrite.c index a2c8b9c1561..e8003a4f1ad 100644 --- a/reactos/dll/win32/kernel32/client/console/readwrite.c +++ b/reactos/dll/win32/kernel32/client/console/readwrite.c @@ -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); } diff --git a/reactos/include/psdk/wincon.h b/reactos/include/psdk/wincon.h index 78b8c05472b..50bc129f317 100644 --- a/reactos/include/psdk/wincon.h +++ b/reactos/include/psdk/wincon.h @@ -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( diff --git a/reactos/include/reactos/subsys/win/conmsg.h b/reactos/include/reactos/subsys/win/conmsg.h index a118a7df86c..357e79fe8e4 100644 --- a/reactos/include/reactos/subsys/win/conmsg.h +++ b/reactos/include/reactos/subsys/win/conmsg.h @@ -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 diff --git a/reactos/win32ss/user/winsrv/consrv/condrv/coninput.c b/reactos/win32ss/user/winsrv/consrv/condrv/coninput.c index 783daa89a56..b09e4afe637 100644 --- a/reactos/win32ss/user/winsrv/consrv/condrv/coninput.c +++ b/reactos/win32ss/user/winsrv/consrv/condrv/coninput.c @@ -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; diff --git a/reactos/win32ss/user/winsrv/consrv/coninput.c b/reactos/win32ss/user/winsrv/consrv/coninput.c index 3288a885d83..bf1982dda06 100644 --- a/reactos/win32ss/user/winsrv/consrv/coninput.c +++ b/reactos/win32ss/user/winsrv/consrv/coninput.c @@ -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); diff --git a/reactos/win32ss/user/winsrv/consrv/include/conio.h b/reactos/win32ss/user/winsrv/consrv/include/conio.h index 0e8bbc40bc4..c54dab7b9cb 100644 --- a/reactos/win32ss/user/winsrv/consrv/include/conio.h +++ b/reactos/win32ss/user/winsrv/consrv/include/conio.h @@ -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);