[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
This commit is contained in:
Hermès Bélusca-Maïto 2013-10-26 20:53:05 +00:00
parent 077b7ac04d
commit ccdf36a380
7 changed files with 94 additions and 39 deletions

View 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)
*/

View 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);
}

View 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(

View 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

View 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;

View 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);

View 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);