From b47d51c6a3143bdcdc6941116ce00c50e297ad07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 31 Aug 2014 11:07:09 +0000 Subject: [PATCH] [CONSRV][CONDRV] - Move CSR details (pre/post-processing, unicode translation) of reading/writing console inputs to consrv, where they belong. - Add a temporary solution to screenbuffer resizing notifications, to be properly fixed later on. svn path=/branches/condrv_restructure/; revision=64004 --- win32ss/user/winsrv/consrv/condrv/coninput.c | 135 +-------------- win32ss/user/winsrv/consrv/condrv/text.c | 18 +- win32ss/user/winsrv/consrv/coninput.c | 155 ++++++++++++++++-- win32ss/user/winsrv/consrv/include/conio.h | 11 -- .../user/winsrv/consrv/include/conio_winsrv.h | 6 - 5 files changed, 161 insertions(+), 164 deletions(-) diff --git a/win32ss/user/winsrv/consrv/condrv/coninput.c b/win32ss/user/winsrv/consrv/condrv/coninput.c index ab43adcd470..35d2dfcfabb 100644 --- a/win32ss/user/winsrv/consrv/condrv/coninput.c +++ b/win32ss/user/winsrv/consrv/condrv/coninput.c @@ -16,20 +16,6 @@ /* GLOBALS ********************************************************************/ -/* - * From MSDN: - * "The lpMultiByteStr and lpWideCharStr pointers must not be the same. - * If they are the same, the function fails, and GetLastError returns - * ERROR_INVALID_PARAMETER." - */ -#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \ - ASSERT((ULONG_PTR)dChar != (ULONG_PTR)sWChar); \ - WideCharToMultiByte((Console)->InputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) - -#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \ - ASSERT((ULONG_PTR)dWChar != (ULONG_PTR)sChar); \ - MultiByteToWideChar((Console)->InputCodePage, 0, (sChar), 1, (dWChar), 1) - typedef struct ConsoleInput_t { LIST_ENTRY ListEntry; @@ -39,34 +25,7 @@ typedef struct ConsoleInput_t /* PRIVATE FUNCTIONS **********************************************************/ -static VOID -ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent) -{ - if (InputEvent->EventType == KEY_EVENT) - { - WCHAR UnicodeChar = InputEvent->Event.KeyEvent.uChar.UnicodeChar; - InputEvent->Event.KeyEvent.uChar.UnicodeChar = 0; - ConsoleInputUnicodeCharToAnsiChar(Console, - &InputEvent->Event.KeyEvent.uChar.AsciiChar, - &UnicodeChar); - } -} - -static VOID -ConioInputEventToUnicode(PCONSOLE Console, PINPUT_RECORD InputEvent) -{ - if (InputEvent->EventType == KEY_EVENT) - { - CHAR AsciiChar = InputEvent->Event.KeyEvent.uChar.AsciiChar; - InputEvent->Event.KeyEvent.uChar.AsciiChar = 0; - ConsoleInputAnsiCharToUnicodeChar(Console, - &InputEvent->Event.KeyEvent.uChar.UnicodeChar, - &AsciiChar); - } -} - - -NTSTATUS +static NTSTATUS ConDrvAddInputEvents(PCONSOLE Console, PINPUT_RECORD InputRecords, // InputEvent ULONG NumEventsToWrite, @@ -218,60 +177,6 @@ Done: return Status; } - -ULONG -PreprocessInput(PCONSOLE Console, - PINPUT_RECORD InputEvent, - ULONG NumEventsToWrite); -VOID -PostprocessInput(PCONSOLE Console); - -NTSTATUS -ConioAddInputEvents(PCONSOLE Console, - PINPUT_RECORD InputRecords, // InputEvent - ULONG NumEventsToWrite, - PULONG NumEventsWritten, - BOOLEAN AppendToEnd) -{ - NTSTATUS Status = STATUS_SUCCESS; - - if (NumEventsWritten) *NumEventsWritten = 0; - - /* - * This pre-processing code MUST be IN consrv ONLY!! - */ - NumEventsToWrite = PreprocessInput(Console, InputRecords, NumEventsToWrite); - if (NumEventsToWrite == 0) return STATUS_SUCCESS; - - Status = ConDrvAddInputEvents(Console, - InputRecords, - NumEventsToWrite, - NumEventsWritten, - AppendToEnd); - - /* - * This post-processing code MUST be IN consrv ONLY!! - */ - // if (NT_SUCCESS(Status)) - if (Status == STATUS_SUCCESS) PostprocessInput(Console); - - return Status; -} - -/* Move elsewhere...*/ -NTSTATUS -ConioProcessInputEvent(PCONSOLE Console, - PINPUT_RECORD InputEvent) -{ - ULONG NumEventsWritten; - return ConioAddInputEvents(Console, - InputEvent, - 1, - &NumEventsWritten, - TRUE); -} - - VOID PurgeInputBuffer(PCONSOLE Console) { @@ -329,7 +234,6 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, IN PCONSOLE_INPUT_BUFFER InputBuffer, IN BOOLEAN KeepEvents, IN BOOLEAN WaitForMoreEvents, - IN BOOLEAN Unicode, OUT PINPUT_RECORD InputRecord, IN ULONG NumEventsToRead, OUT PULONG NumEventsRead OPTIONAL) @@ -379,15 +283,6 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, if (NumEventsRead) *NumEventsRead = i; - /* Now translate everything to ANSI */ - if (!Unicode) - { - for (; i > 0; --i) - { - ConioInputEventToAnsi(InputBuffer->Header.Console, --InputRecord); - } - } - if (IsListEmpty(&InputBuffer->InputEvents)) { ResetEvent(InputBuffer->ActiveEvent); @@ -400,15 +295,11 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, 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) { - NTSTATUS Status = STATUS_SUCCESS; - ULONG i; - if (Console == NULL || InputBuffer == NULL /* || InputRecord == NULL */) return STATUS_INVALID_PARAMETER; @@ -416,26 +307,14 @@ ConDrvWriteConsoleInput(IN PCONSOLE Console, ASSERT(Console == InputBuffer->Header.Console); ASSERT((InputRecord != NULL) || (InputRecord == NULL && NumEventsToWrite == 0)); - /* First translate everything to UNICODE */ - if (!Unicode) - { - for (i = 0; i < NumEventsToWrite; ++i) - { - ConioInputEventToUnicode(Console, &InputRecord[i]); - } - } - /* Now, add the events */ - // if (NumEventsWritten) *NumEventsWritten = 0; - // ConDrvAddInputEvents - Status = ConioAddInputEvents(Console, - InputRecord, - NumEventsToWrite, - NumEventsWritten, - AppendToEnd); - // if (NumEventsWritten) *NumEventsWritten = i; + if (NumEventsWritten) *NumEventsWritten = 0; - return Status; + return ConDrvAddInputEvents(Console, + InputRecord, + NumEventsToWrite, + NumEventsWritten, + AppendToEnd); } NTSTATUS NTAPI diff --git a/win32ss/user/winsrv/consrv/condrv/text.c b/win32ss/user/winsrv/consrv/condrv/text.c index e41a92b2fe1..179ff1aa25e 100644 --- a/win32ss/user/winsrv/consrv/condrv/text.c +++ b/win32ss/user/winsrv/consrv/condrv/text.c @@ -233,6 +233,15 @@ ConioMoveRegion(PTEXTMODE_SCREEN_BUFFER ScreenBuffer, } } +// FIXME! +NTSTATUS NTAPI +ConDrvWriteConsoleInput(IN PCONSOLE Console, + IN PCONSOLE_INPUT_BUFFER InputBuffer, + IN BOOLEAN AppendToEnd, + IN PINPUT_RECORD InputRecord, + IN ULONG NumEventsToWrite, + OUT PULONG NumEventsWritten OPTIONAL); + NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, @@ -341,12 +350,19 @@ ConioResizeBuffer(PCONSOLE Console, */ if (Console->InputBuffer.Mode & ENABLE_WINDOW_INPUT) { + ULONG NumEventsWritten; INPUT_RECORD er; er.EventType = WINDOW_BUFFER_SIZE_EVENT; er.Event.WindowBufferSizeEvent.dwSize = ScreenBuffer->ScreenBufferSize; - ConioProcessInputEvent(Console, &er); + // ConioProcessInputEvent(Console, &er); + ConDrvWriteConsoleInput(Console, + &Console->InputBuffer, + TRUE, + &er, + 1, + &NumEventsWritten); } return STATUS_SUCCESS; diff --git a/win32ss/user/winsrv/consrv/coninput.c b/win32ss/user/winsrv/consrv/coninput.c index 953451e9f09..247d72abc83 100644 --- a/win32ss/user/winsrv/consrv/coninput.c +++ b/win32ss/user/winsrv/consrv/coninput.c @@ -26,6 +26,25 @@ ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked)) + + +/* + * From MSDN: + * "The lpMultiByteStr and lpWideCharStr pointers must not be the same. + * If they are the same, the function fails, and GetLastError returns + * ERROR_INVALID_PARAMETER." + */ +#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \ + ASSERT((ULONG_PTR)dChar != (ULONG_PTR)sWChar); \ + WideCharToMultiByte((Console)->InputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) + +#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \ + ASSERT((ULONG_PTR)dWChar != (ULONG_PTR)sChar); \ + MultiByteToWideChar((Console)->InputCodePage, 0, (sChar), 1, (dWChar), 1) + + + + typedef struct _GET_INPUT_INFO { PCSR_THREAD CallingThread; // The thread which called the input API. @@ -36,10 +55,33 @@ typedef struct _GET_INPUT_INFO /* PRIVATE FUNCTIONS **********************************************************/ -/* - * This pre-processing code MUST be IN consrv ONLY - */ -/* static */ ULONG +static VOID +ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent) +{ + if (InputEvent->EventType == KEY_EVENT) + { + WCHAR UnicodeChar = InputEvent->Event.KeyEvent.uChar.UnicodeChar; + InputEvent->Event.KeyEvent.uChar.UnicodeChar = 0; + ConsoleInputUnicodeCharToAnsiChar(Console, + &InputEvent->Event.KeyEvent.uChar.AsciiChar, + &UnicodeChar); + } +} + +static VOID +ConioInputEventToUnicode(PCONSOLE Console, PINPUT_RECORD InputEvent) +{ + if (InputEvent->EventType == KEY_EVENT) + { + CHAR AsciiChar = InputEvent->Event.KeyEvent.uChar.AsciiChar; + InputEvent->Event.KeyEvent.uChar.AsciiChar = 0; + ConsoleInputAnsiCharToUnicodeChar(Console, + &InputEvent->Event.KeyEvent.uChar.UnicodeChar, + &AsciiChar); + } +} + +static ULONG PreprocessInput(PCONSRV_CONSOLE Console, PINPUT_RECORD InputEvent, ULONG NumEventsToWrite) @@ -98,10 +140,7 @@ PreprocessInput(PCONSRV_CONSOLE Console, return NumEventsToWrite; } -/* - * This post-processing code MUST be IN consrv ONLY - */ -/* static */ VOID +static VOID PostprocessInput(PCONSRV_CONSOLE Console) { CsrNotifyWait(&Console->ReadWaitQueue, @@ -115,7 +154,58 @@ PostprocessInput(PCONSRV_CONSOLE Console) } +NTSTATUS NTAPI +ConDrvWriteConsoleInput(IN PCONSOLE Console, + IN PCONSOLE_INPUT_BUFFER InputBuffer, + IN BOOLEAN AppendToEnd, + IN PINPUT_RECORD InputRecord, + IN ULONG NumEventsToWrite, + OUT PULONG NumEventsWritten OPTIONAL); +static NTSTATUS +ConioAddInputEvents(PCONSOLE Console, + PINPUT_RECORD InputRecords, // InputEvent + ULONG NumEventsToWrite, + PULONG NumEventsWritten, + BOOLEAN AppendToEnd) +{ + NTSTATUS Status = STATUS_SUCCESS; + if (NumEventsWritten) *NumEventsWritten = 0; + + NumEventsToWrite = PreprocessInput(Console, InputRecords, NumEventsToWrite); + if (NumEventsToWrite == 0) return STATUS_SUCCESS; + + // Status = ConDrvAddInputEvents(Console, + // InputRecords, + // NumEventsToWrite, + // NumEventsWritten, + // AppendToEnd); + + Status = ConDrvWriteConsoleInput(Console, + &Console->InputBuffer, + AppendToEnd, + InputRecords, + NumEventsToWrite, + NumEventsWritten); + + // if (NT_SUCCESS(Status)) + if (Status == STATUS_SUCCESS) PostprocessInput(Console); + + return Status; +} + +/* FIXME: This function can be called by CONDRV, in ConioResizeBuffer() in text.c */ +NTSTATUS +ConioProcessInputEvent(PCONSOLE Console, + PINPUT_RECORD InputEvent) +{ + ULONG NumEventsWritten; + return ConioAddInputEvents(Console, + InputEvent, + 1, + &NumEventsWritten, + TRUE); +} static NTSTATUS @@ -381,7 +471,6 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, IN PCONSOLE_INPUT_BUFFER InputBuffer, IN BOOLEAN KeepEvents, IN BOOLEAN WaitForMoreEvents, - IN BOOLEAN Unicode, OUT PINPUT_RECORD InputRecord, IN ULONG NumEventsToRead, OUT PULONG NumEventsRead OPTIONAL); @@ -422,7 +511,6 @@ ReadInputBuffer(IN PGET_INPUT_INFO InputInfo, InputBuffer, (GetInputRequest->Flags & CONSOLE_READ_KEEPEVENT) != 0, (GetInputRequest->Flags & CONSOLE_READ_CONTINUE ) == 0, - GetInputRequest->Unicode, InputRecord, GetInputRequest->NumRecords, &NumEventsRead); @@ -443,6 +531,18 @@ ReadInputBuffer(IN PGET_INPUT_INFO InputInfo, */ GetInputRequest->NumRecords = NumEventsRead; + if (NT_SUCCESS(Status)) + { + /* Now translate everything to ANSI */ + if (!GetInputRequest->Unicode) + { + for (; NumEventsRead > 0; --NumEventsRead) + { + ConioInputEventToAnsi(InputBuffer->Header.Console, --InputRecord); + } + } + } + return Status; // return STATUS_SUCCESS; } @@ -563,14 +663,15 @@ CSR_API(SrvGetConsoleInput) return Status; } +#if 0 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); +#endif CSR_API(SrvWriteConsoleInput) { NTSTATUS Status; @@ -619,14 +720,32 @@ CSR_API(SrvWriteConsoleInput) return Status; } + /* First translate everything to UNICODE */ + if (!WriteInputRequest->Unicode) + { + ULONG i; + for (i = 0; i < WriteInputRequest->NumRecords; ++i) + { + ConioInputEventToUnicode(InputBuffer->Header.Console, &InputRecord[i]); + } + } + + /* Now, add the events */ NumEventsWritten = 0; - Status = ConDrvWriteConsoleInput(InputBuffer->Header.Console, - InputBuffer, - WriteInputRequest->Unicode, - WriteInputRequest->AppendToEnd, - InputRecord, - WriteInputRequest->NumRecords, - &NumEventsWritten); + Status = ConioAddInputEvents(InputBuffer->Header.Console, + // InputBuffer, + InputRecord, + WriteInputRequest->NumRecords, + &NumEventsWritten, + WriteInputRequest->AppendToEnd); + + // Status = ConDrvWriteConsoleInput(InputBuffer->Header.Console, + // InputBuffer, + // WriteInputRequest->AppendToEnd, + // InputRecord, + // WriteInputRequest->NumRecords, + // &NumEventsWritten); + WriteInputRequest->NumRecords = NumEventsWritten; ConSrvReleaseInputBuffer(InputBuffer, TRUE); diff --git a/win32ss/user/winsrv/consrv/include/conio.h b/win32ss/user/winsrv/consrv/include/conio.h index ee925bd0543..da5554ccef1 100644 --- a/win32ss/user/winsrv/consrv/include/conio.h +++ b/win32ss/user/winsrv/consrv/include/conio.h @@ -326,17 +326,6 @@ NTSTATUS ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, IN PCONSOLE_PROCESS_DATA ProcessData); -/* coninput.c */ -NTSTATUS -ConioAddInputEvents(PCONSOLE Console, - PINPUT_RECORD InputRecords, - ULONG NumEventsToWrite, - PULONG NumEventsWritten, - BOOLEAN AppendToEnd); -NTSTATUS -ConioProcessInputEvent(PCONSOLE Console, - PINPUT_RECORD InputEvent); - /* conoutput.c */ /* diff --git a/win32ss/user/winsrv/consrv/include/conio_winsrv.h b/win32ss/user/winsrv/consrv/include/conio_winsrv.h index c5101321128..4b1904e7a12 100644 --- a/win32ss/user/winsrv/consrv/include/conio_winsrv.h +++ b/win32ss/user/winsrv/consrv/include/conio_winsrv.h @@ -193,12 +193,6 @@ DWORD ConioEffectiveCursorSize(PCONSRV_CONSOLE Console, DWORD Scale); NTSTATUS -ConioAddInputEvents(PCONSRV_CONSOLE Console, - PINPUT_RECORD InputRecords, - ULONG NumEventsToWrite, - PULONG NumEventsWritten, - BOOLEAN AppendToEnd); -NTSTATUS ConioProcessInputEvent(PCONSRV_CONSOLE Console, PINPUT_RECORD InputEvent);