From: Deep Agrawal <de-ep@outlook.in> Wine Bug: https://bugs.winehq.org/show_bug.cgi?id=58252 --- dlls/kernel32/kernel32.spec | 4 +- dlls/kernelbase/console.c | 96 +++++++++++++++++++++++++++++++++ dlls/kernelbase/kernelbase.spec | 4 +- include/consoleapi.h | 5 ++ 4 files changed, 105 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 87eb83a225d..0f20c49f76a 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -1223,8 +1223,8 @@ @ stdcall -import RaiseFailFastException(ptr ptr long) @ stdcall -import ReadConsoleA(long ptr long ptr ptr) @ stdcall -import ReadConsoleInputA(long ptr long ptr) -@ stub ReadConsoleInputExA -@ stub ReadConsoleInputExW +@ stdcall -import ReadConsoleInputExA(long ptr long ptr long) +@ stdcall -import ReadConsoleInputExW(long ptr long ptr long) @ stdcall -import ReadConsoleInputW(long ptr long ptr) @ stdcall -import ReadConsoleOutputA(long ptr long long ptr) @ stdcall -import ReadConsoleOutputAttribute(long ptr long long ptr) diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index f980597bd64..46c50796b23 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -1834,6 +1834,102 @@ BOOL WINAPI ReadConsoleInputW( HANDLE handle, INPUT_RECORD *buffer, DWORD length } +/*********************************************************************** + * ReadConsoleInputExA (kernelbase.@) + */ +BOOL WINAPI ReadConsoleInputExA( HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, DWORD *lpNumberOfEventsRead, USHORT wFlags ) +{ + + switch (wFlags & (CONSOLE_READ_NOREMOVE | CONSOLE_READ_NOWAIT)) + { + case CONSOLE_READ_NOWAIT | CONSOLE_READ_NOREMOVE: + return PeekConsoleInputA(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); + + case CONSOLE_READ_NOWAIT: + { + DWORD number_of_events = 0; + if (!GetNumberOfConsoleInputEvents(hConsoleInput, &number_of_events) ) + return FALSE; + + if (!number_of_events) + { + *lpNumberOfEventsRead = 0; + return TRUE; + } + + return ReadConsoleInputA(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); + } + + case CONSOLE_READ_NOREMOVE: + { + DWORD number_of_events = 0; + for (;;) + { + if (!GetNumberOfConsoleInputEvents(hConsoleInput, &number_of_events) ) + return FALSE; + + if (number_of_events > 0) + break; + + WaitForSingleObject(hConsoleInput, INFINITE ); + } + + return PeekConsoleInputA( hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead ); + } + } + + return ReadConsoleInputA( hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead ); +} + + +/*********************************************************************** + * ReadConsoleInputW (kernelbase.@) + */ +BOOL WINAPI ReadConsoleInputExW( HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, DWORD *lpNumberOfEventsRead, USHORT wFlags ) +{ + + switch (wFlags & (CONSOLE_READ_NOREMOVE | CONSOLE_READ_NOWAIT)) + { + case CONSOLE_READ_NOWAIT | CONSOLE_READ_NOREMOVE: + return PeekConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); + + case CONSOLE_READ_NOWAIT: + { + DWORD number_of_events = 0; + if (!GetNumberOfConsoleInputEvents(hConsoleInput, &number_of_events) ) + return FALSE; + + if (!number_of_events) + { + *lpNumberOfEventsRead = 0; + return TRUE; + } + + return ReadConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); + } + + case CONSOLE_READ_NOREMOVE: + { + DWORD number_of_events = 0; + for (;;) + { + if (!GetNumberOfConsoleInputEvents(hConsoleInput, &number_of_events) ) + return FALSE; + + if (number_of_events > 0) + break; + + WaitForSingleObject(hConsoleInput, INFINITE ); + } + + return PeekConsoleInputW( hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead ); + } + } + + return ReadConsoleInputW( hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead ); +} + + /****************************************************************************** * WriteConsoleInputA (kernelbase.@) */ diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 6c1d14e7dca..254f63af020 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1282,8 +1282,8 @@ @ stdcall ReOpenFile(ptr long long long) @ stdcall ReadConsoleA(long ptr long ptr ptr) @ stdcall ReadConsoleInputA(long ptr long ptr) -@ stub ReadConsoleInputExA -@ stub ReadConsoleInputExW +@ stdcall ReadConsoleInputExA(long ptr long ptr long) +@ stdcall ReadConsoleInputExW(long ptr long ptr long) @ stdcall ReadConsoleInputW(long ptr long ptr) @ stdcall ReadConsoleOutputA(long ptr long long ptr) @ stdcall ReadConsoleOutputAttribute(long ptr long long ptr) diff --git a/include/consoleapi.h b/include/consoleapi.h index e78b1a12880..c30417dbf70 100644 --- a/include/consoleapi.h +++ b/include/consoleapi.h @@ -48,6 +48,9 @@ #define CTRL_LOGOFF_EVENT 5 #define CTRL_SHUTDOWN_EVENT 6 +#define CONSOLE_READ_NOREMOVE 0x0001 +#define CONSOLE_READ_NOWAIT 0x0002 + typedef BOOL (WINAPI *PHANDLER_ROUTINE)(DWORD dwCtrlType); typedef struct _CONSOLE_READCONSOLE_CONTROL @@ -80,6 +83,8 @@ WINBASEAPI BOOL WINAPI ReadConsoleW(HANDLE,void *,DWORD,DWORD *,void *); WINBASEAPI BOOL WINAPI ReadConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,DWORD *); WINBASEAPI BOOL WINAPI ReadConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,DWORD *); #define ReadConsoleInput WINELIB_NAME_AW(ReadConsoleInput) +WINBASEAPI BOOL WINAPI ReadConsoleInputExA(HANDLE,INPUT_RECORD *,DWORD,DWORD *,USHORT); +WINBASEAPI BOOL WINAPI ReadConsoleInputExW(HANDLE,INPUT_RECORD *,DWORD,DWORD *,USHORT); WINBASEAPI HRESULT WINAPI ResizePseudoConsole(HPCON,COORD); WINBASEAPI BOOL WINAPI SetConsoleCtrlHandler( PHANDLER_ROUTINE,BOOL); WINBASEAPI BOOL WINAPI SetConsoleMode( HANDLE,DWORD); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11269