From aa58676ae0cb1c5c48d772dadd1aa9c0e119fb76 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 1 Jul 2019 17:44:38 +0200 Subject: [PATCH] kernel32: Move wait functions to kernelbase. Signed-off-by: Alexandre Julliard --- dlls/kernel32/kernel32.spec | 18 ++-- dlls/kernel32/kernel_private.h | 5 - dlls/kernel32/process.c | 2 + dlls/kernel32/sync.c | 145 +---------------------------- dlls/kernelbase/kernelbase.h | 5 + dlls/kernelbase/kernelbase.spec | 18 ++-- dlls/kernelbase/sync.c | 157 ++++++++++++++++++++++++++++++++ include/wincon.h | 9 +- 8 files changed, 191 insertions(+), 168 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 6163f1a0828..416cdf39399 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -1251,7 +1251,7 @@ @ stub RegisterSysMsgHandler @ stub RegisterWaitForInputIdle @ stdcall RegisterWaitForSingleObject(ptr long ptr ptr long long) -@ stdcall RegisterWaitForSingleObjectEx(long ptr ptr long long) +@ stdcall -import RegisterWaitForSingleObjectEx(long ptr ptr long long) @ stub RegisterWowBaseHandlers @ stub RegisterWowExec @ stdcall ReinitializeCriticalSection(ptr) @@ -1479,12 +1479,12 @@ # @ stub SetXStateFeaturesMask @ stdcall SetupComm(long long long) @ stub ShowConsoleCursor -@ stdcall SignalObjectAndWait(long long long long) +@ stdcall -import SignalObjectAndWait(long long long long) @ stdcall SizeofResource(long long) -@ stdcall Sleep(long) +@ stdcall -import Sleep(long) @ stdcall -import SleepConditionVariableCS(ptr ptr long) @ stdcall -import SleepConditionVariableSRW(ptr ptr long long) -@ stdcall SleepEx(long long) +@ stdcall -import SleepEx(long long) # @ stub SortCloseHandle # @ stub SortGetHandle # @ stub StartThreadpoolIo @@ -1541,7 +1541,7 @@ @ stdcall UnregisterApplicationRestart() # @ stub UnregisterConsoleIME @ stdcall UnregisterWait(long) -@ stdcall UnregisterWaitEx(long long) +@ stdcall -import UnregisterWaitEx(long long) # @ stub UpdateCalendarDayOfWeek @ stdcall UpdateProcThreadAttribute(ptr long long ptr long ptr ptr) @ stdcall UpdateResourceA(long str str long ptr long) @@ -1572,10 +1572,10 @@ @ stdcall WTSGetActiveConsoleSessionId() @ stdcall WaitCommEvent(long ptr ptr) @ stdcall WaitForDebugEvent(ptr long) -@ stdcall WaitForMultipleObjects(long ptr long long) -@ stdcall WaitForMultipleObjectsEx(long ptr long long long) -@ stdcall WaitForSingleObject(long long) -@ stdcall WaitForSingleObjectEx(long long long) +@ stdcall -import WaitForMultipleObjects(long ptr long long) +@ stdcall -import WaitForMultipleObjectsEx(long ptr long long long) +@ stdcall -import WaitForSingleObject(long long) +@ stdcall -import WaitForSingleObjectEx(long long long) # @ stub WaitForThreadpoolIoCallbacks @ stdcall WaitForThreadpoolTimerCallbacks(ptr long) ntdll.TpWaitForTimer @ stdcall WaitForThreadpoolWaitCallbacks(ptr long) ntdll.TpWaitForWait diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h index c4e0501331d..1761e9f7691 100644 --- a/dlls/kernel32/kernel_private.h +++ b/dlls/kernel32/kernel_private.h @@ -24,11 +24,6 @@ #include "wine/server.h" NTSTATUS WINAPI BaseGetNamedObjectDirectory( HANDLE *dir ); -HANDLE WINAPI OpenConsoleW(LPCWSTR, DWORD, BOOL, DWORD); -BOOL WINAPI VerifyConsoleIoHandle(HANDLE); -HANDLE WINAPI DuplicateConsoleHandle(HANDLE, DWORD, BOOL, DWORD); -BOOL WINAPI CloseConsoleHandle(HANDLE handle); -HANDLE WINAPI GetConsoleInputWaitHandle(void); BOOL CONSOLE_Init(RTL_USER_PROCESS_PARAMETERS *params) DECLSPEC_HIDDEN; BOOL CONSOLE_Exit(void) DECLSPEC_HIDDEN; diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 0d0de93eee8..dffc59ae845 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -55,6 +55,8 @@ #include "ntstatus.h" #define WIN32_NO_STATUS #include "winternl.h" +#include "winbase.h" +#include "wincon.h" #include "kernel_private.h" #include "psapi.h" #include "wine/exception.h" diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c index 962fdb4e070..49374ccd626 100644 --- a/dlls/kernel32/sync.c +++ b/dlls/kernel32/sync.c @@ -34,6 +34,7 @@ #define NONAMELESSUNION #include "windef.h" #include "winbase.h" +#include "wincon.h" #include "winerror.h" #include "winnls.h" #include "winternl.h" @@ -96,28 +97,6 @@ static inline PLARGE_INTEGER get_nt_timeout( PLARGE_INTEGER pTime, DWORD timeout return pTime; } -/*********************************************************************** - * Sleep (KERNEL32.@) - */ -VOID WINAPI DECLSPEC_HOTPATCH Sleep( DWORD timeout ) -{ - SleepEx( timeout, FALSE ); -} - -/****************************************************************************** - * SleepEx (KERNEL32.@) - */ -DWORD WINAPI SleepEx( DWORD timeout, BOOL alertable ) -{ - NTSTATUS status; - LARGE_INTEGER time; - - status = NtDelayExecution( alertable, get_nt_timeout( &time, timeout ) ); - if (status == STATUS_USER_APC) return WAIT_IO_COMPLETION; - return 0; -} - - /*********************************************************************** * SwitchToThread (KERNEL32.@) */ @@ -127,34 +106,6 @@ BOOL WINAPI SwitchToThread(void) } -/*********************************************************************** - * WaitForSingleObject (KERNEL32.@) - */ -DWORD WINAPI WaitForSingleObject( HANDLE handle, DWORD timeout ) -{ - return WaitForMultipleObjectsEx( 1, &handle, FALSE, timeout, FALSE ); -} - - -/*********************************************************************** - * WaitForSingleObjectEx (KERNEL32.@) - */ -DWORD WINAPI WaitForSingleObjectEx( HANDLE handle, DWORD timeout, - BOOL alertable ) -{ - return WaitForMultipleObjectsEx( 1, &handle, FALSE, timeout, alertable ); -} - - -/*********************************************************************** - * WaitForMultipleObjects (KERNEL32.@) - */ -DWORD WINAPI WaitForMultipleObjects( DWORD count, const HANDLE *handles, - BOOL wait_all, DWORD timeout ) -{ - return WaitForMultipleObjectsEx( count, handles, wait_all, timeout, FALSE ); -} - static HANDLE normalize_handle_if_console(HANDLE handle) { if ((handle == (HANDLE)STD_INPUT_HANDLE) || @@ -173,38 +124,6 @@ static HANDLE normalize_handle_if_console(HANDLE handle) return handle; } -/*********************************************************************** - * WaitForMultipleObjectsEx (KERNEL32.@) - */ -DWORD WINAPI WaitForMultipleObjectsEx( DWORD count, const HANDLE *handles, - BOOL wait_all, DWORD timeout, - BOOL alertable ) -{ - NTSTATUS status; - HANDLE hloc[MAXIMUM_WAIT_OBJECTS]; - LARGE_INTEGER time; - unsigned int i; - - if (count > MAXIMUM_WAIT_OBJECTS) - { - SetLastError(ERROR_INVALID_PARAMETER); - return WAIT_FAILED; - } - for (i = 0; i < count; i++) - hloc[i] = normalize_handle_if_console(handles[i]); - - status = NtWaitForMultipleObjects( count, hloc, !wait_all, alertable, - get_nt_timeout( &time, timeout ) ); - - if (HIWORD(status)) /* is it an error code? */ - { - SetLastError( RtlNtStatusToDosError(status) ); - status = WAIT_FAILED; - } - return status; -} - - /*********************************************************************** * RegisterWaitForSingleObject (KERNEL32.@) */ @@ -227,29 +146,6 @@ BOOL WINAPI RegisterWaitForSingleObject(PHANDLE phNewWaitObject, HANDLE hObject, return TRUE; } -/*********************************************************************** - * RegisterWaitForSingleObjectEx (KERNEL32.@) - */ -HANDLE WINAPI RegisterWaitForSingleObjectEx( HANDLE hObject, - WAITORTIMERCALLBACK Callback, PVOID Context, - ULONG dwMilliseconds, ULONG dwFlags ) -{ - NTSTATUS status; - HANDLE hNewWaitObject; - - TRACE("%p %p %p %d %d\n", - hObject,Callback,Context,dwMilliseconds,dwFlags); - - hObject = normalize_handle_if_console(hObject); - status = RtlRegisterWait( &hNewWaitObject, hObject, Callback, Context, dwMilliseconds, dwFlags ); - if (status != STATUS_SUCCESS) - { - SetLastError( RtlNtStatusToDosError(status) ); - return NULL; - } - return hNewWaitObject; -} - /*********************************************************************** * UnregisterWait (KERNEL32.@) */ @@ -268,45 +164,6 @@ BOOL WINAPI UnregisterWait( HANDLE WaitHandle ) return TRUE; } -/*********************************************************************** - * UnregisterWaitEx (KERNEL32.@) - */ -BOOL WINAPI UnregisterWaitEx( HANDLE WaitHandle, HANDLE CompletionEvent ) -{ - NTSTATUS status; - - TRACE("%p %p\n",WaitHandle, CompletionEvent); - - status = RtlDeregisterWaitEx( WaitHandle, CompletionEvent ); - if (status != STATUS_SUCCESS) SetLastError( RtlNtStatusToDosError(status) ); - return !status; -} - -/*********************************************************************** - * SignalObjectAndWait (KERNEL32.@) - * - * Makes it possible to atomically signal any of the synchronization - * objects (semaphore, mutex, event) and wait on another. - */ -DWORD WINAPI SignalObjectAndWait( HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, - DWORD dwMilliseconds, BOOL bAlertable ) -{ - NTSTATUS status; - LARGE_INTEGER timeout; - - TRACE("%p %p %d %d\n", hObjectToSignal, - hObjectToWaitOn, dwMilliseconds, bAlertable); - - status = NtSignalAndWaitForSingleObject( hObjectToSignal, hObjectToWaitOn, bAlertable, - get_nt_timeout( &timeout, dwMilliseconds ) ); - if (HIWORD(status)) - { - SetLastError( RtlNtStatusToDosError(status) ); - status = WAIT_FAILED; - } - return status; -} - /*********************************************************************** * MakeCriticalSectionGlobal (KERNEL32.@) */ diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h index 0a285c206f8..0d7243eaec0 100644 --- a/dlls/kernelbase/kernelbase.h +++ b/dlls/kernelbase/kernelbase.h @@ -24,6 +24,11 @@ #include "windef.h" #include "winbase.h" +static inline BOOL is_console_handle(HANDLE h) +{ + return h != INVALID_HANDLE_VALUE && ((UINT_PTR)h & 3) == 3; +} + static inline BOOL set_ntstatus( NTSTATUS status ) { if (status) SetLastError( RtlNtStatusToDosError( status )); diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 96c20497f4a..d3d8d17a9a9 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1322,7 +1322,7 @@ # @ stub RegisterStateChangeNotification # @ stub RegisterStateLock @ stdcall RegisterTraceGuidsW(ptr ptr ptr long ptr wstr wstr ptr) ntdll.EtwRegisterTraceGuidsW -@ stdcall RegisterWaitForSingleObjectEx(long ptr ptr long long) kernel32.RegisterWaitForSingleObjectEx +@ stdcall RegisterWaitForSingleObjectEx(long ptr ptr long long) @ stdcall ReleaseActCtx(ptr) kernel32.ReleaseActCtx @ stdcall ReleaseMutex(long) @ stdcall ReleaseMutexWhenCallbackReturns(ptr long) kernel32.ReleaseMutexWhenCallbackReturns @@ -1509,12 +1509,12 @@ # @ stub SetXStateFeaturesMask @ stdcall SetupComm(long long long) kernel32.SetupComm # @ stub SharedLocalIsEnabled -@ stdcall SignalObjectAndWait(long long long long) kernel32.SignalObjectAndWait +@ stdcall SignalObjectAndWait(long long long long) @ stdcall SizeofResource(long long) kernel32.SizeofResource -@ stdcall Sleep(long) kernel32.Sleep +@ stdcall Sleep(long) @ stdcall SleepConditionVariableCS(ptr ptr long) @ stdcall SleepConditionVariableSRW(ptr ptr long long) -@ stdcall SleepEx(long long) kernel32.SleepEx +@ stdcall SleepEx(long long) @ stub SpecialMBToWC @ stub StartThreadpoolIo # @ stub StmAlignSize @@ -1622,7 +1622,7 @@ # @ stub UnregisterStateChangeNotification # @ stub UnregisterStateLock @ stdcall UnregisterTraceGuids(int64) ntdll.EtwUnregisterTraceGuids -@ stdcall UnregisterWaitEx(long long) kernel32.UnregisterWaitEx +@ stdcall UnregisterWaitEx(long long) # @ stub UnsubscribeEdpEnabledStateChange # @ stub UnsubscribeStateChangeNotification # @ stub UpdatePackageStatus @@ -1687,10 +1687,10 @@ @ stdcall WaitForDebugEvent(ptr long) kernel32.WaitForDebugEvent # @ stub WaitForDebugEventEx # @ stub WaitForMachinePolicyForegroundProcessingInternal -@ stdcall WaitForMultipleObjects(long ptr long long) kernel32.WaitForMultipleObjects -@ stdcall WaitForMultipleObjectsEx(long ptr long long long) kernel32.WaitForMultipleObjectsEx -@ stdcall WaitForSingleObject(long long) kernel32.WaitForSingleObject -@ stdcall WaitForSingleObjectEx(long long long) kernel32.WaitForSingleObjectEx +@ stdcall WaitForMultipleObjects(long ptr long long) +@ stdcall WaitForMultipleObjectsEx(long ptr long long long) +@ stdcall WaitForSingleObject(long long) +@ stdcall WaitForSingleObjectEx(long long long) @ stub WaitForThreadpoolIoCallbacks @ stdcall WaitForThreadpoolTimerCallbacks(ptr long) kernel32.WaitForThreadpoolTimerCallbacks @ stdcall WaitForThreadpoolWaitCallbacks(ptr long) kernel32.WaitForThreadpoolWaitCallbacks diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 4dac6d9fcc4..31df6c7be80 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -27,6 +27,7 @@ #define NONAMELESSUNION #include "windef.h" #include "winbase.h" +#include "wincon.h" #include "winerror.h" #include "winnls.h" #include "winternl.h" @@ -119,6 +120,162 @@ static BOOL get_open_object_attributes( OBJECT_ATTRIBUTES *attr, UNICODE_STRING } +/*********************************************************************** + * Waits + ***********************************************************************/ + + +static HANDLE normalize_handle_if_console( HANDLE handle ) +{ + if ((handle == (HANDLE)STD_INPUT_HANDLE) || + (handle == (HANDLE)STD_OUTPUT_HANDLE) || + (handle == (HANDLE)STD_ERROR_HANDLE)) + handle = GetStdHandle( HandleToULong(handle) ); + + /* even screen buffer console handles are waitable, and are + * handled as a handle to the console itself + */ + if (is_console_handle( handle ) && VerifyConsoleIoHandle( handle )) + handle = GetConsoleInputWaitHandle(); + + return handle; +} + + +/*********************************************************************** + * RegisterWaitForSingleObjectEx (kernelbase.@) + */ +HANDLE WINAPI DECLSPEC_HOTPATCH RegisterWaitForSingleObjectEx( HANDLE handle, WAITORTIMERCALLBACK callback, + PVOID context, ULONG timeout, ULONG flags ) +{ + NTSTATUS status; + HANDLE ret; + + TRACE( "%p %p %p %d %d\n", handle, callback, context, timeout, flags ); + + handle = normalize_handle_if_console( handle ); + status = RtlRegisterWait( &ret, handle, callback, context, timeout, flags ); + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError(status) ); + return NULL; + } + return ret; +} + + +/*********************************************************************** + * SignalObjectAndWait (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH SignalObjectAndWait( HANDLE signal, HANDLE wait, + DWORD timeout, BOOL alertable ) +{ + NTSTATUS status; + LARGE_INTEGER time; + + TRACE( "%p %p %d %d\n", signal, wait, timeout, alertable ); + + status = NtSignalAndWaitForSingleObject( signal, wait, alertable, get_nt_timeout( &time, timeout ) ); + if (HIWORD(status)) + { + SetLastError( RtlNtStatusToDosError(status) ); + status = WAIT_FAILED; + } + return status; +} + + +/*********************************************************************** + * Sleep (kernelbase.@) + */ +void WINAPI DECLSPEC_HOTPATCH Sleep( DWORD timeout ) +{ + LARGE_INTEGER time; + + NtDelayExecution( FALSE, get_nt_timeout( &time, timeout ) ); +} + + +/****************************************************************************** + * SleepEx (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH SleepEx( DWORD timeout, BOOL alertable ) +{ + NTSTATUS status; + LARGE_INTEGER time; + + status = NtDelayExecution( alertable, get_nt_timeout( &time, timeout ) ); + if (status == STATUS_USER_APC) return WAIT_IO_COMPLETION; + return 0; +} + + +/*********************************************************************** + * UnregisterWaitEx (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH UnregisterWaitEx( HANDLE handle, HANDLE event ) +{ + return set_ntstatus( RtlDeregisterWaitEx( handle, event )); +} + + +/*********************************************************************** + * WaitForSingleObject (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH WaitForSingleObject( HANDLE handle, DWORD timeout ) +{ + return WaitForMultipleObjectsEx( 1, &handle, FALSE, timeout, FALSE ); +} + + +/*********************************************************************** + * WaitForSingleObjectEx (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH WaitForSingleObjectEx( HANDLE handle, DWORD timeout, BOOL alertable ) +{ + return WaitForMultipleObjectsEx( 1, &handle, FALSE, timeout, alertable ); +} + + +/*********************************************************************** + * WaitForMultipleObjects (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH WaitForMultipleObjects( DWORD count, const HANDLE *handles, + BOOL wait_all, DWORD timeout ) +{ + return WaitForMultipleObjectsEx( count, handles, wait_all, timeout, FALSE ); +} + + +/*********************************************************************** + * WaitForMultipleObjectsEx (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH WaitForMultipleObjectsEx( DWORD count, const HANDLE *handles, + BOOL wait_all, DWORD timeout, BOOL alertable ) +{ + NTSTATUS status; + HANDLE hloc[MAXIMUM_WAIT_OBJECTS]; + LARGE_INTEGER time; + unsigned int i; + + if (count > MAXIMUM_WAIT_OBJECTS) + { + SetLastError(ERROR_INVALID_PARAMETER); + return WAIT_FAILED; + } + for (i = 0; i < count; i++) hloc[i] = normalize_handle_if_console( handles[i] ); + + status = NtWaitForMultipleObjects( count, hloc, !wait_all, alertable, + get_nt_timeout( &time, timeout ) ); + if (HIWORD(status)) /* is it an error code? */ + { + SetLastError( RtlNtStatusToDosError(status) ); + status = WAIT_FAILED; + } + return status; +} + + /*********************************************************************** * Events ***********************************************************************/ diff --git a/include/wincon.h b/include/wincon.h index 8f4d54cc0e3..88d2f47352f 100644 --- a/include/wincon.h +++ b/include/wincon.h @@ -307,7 +307,9 @@ WINBASEAPI BOOL WINAPI AddConsoleAliasW(LPWSTR,LPWSTR,LPWSTR); #define AddConsoleAlias WINELIB_NAME_AW(AddConsoleAlias) WINBASEAPI BOOL WINAPI AllocConsole(VOID); WINBASEAPI BOOL WINAPI AttachConsole(DWORD); -WINBASEAPI HANDLE WINAPI CreateConsoleScreenBuffer( DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,LPVOID); +WINBASEAPI BOOL WINAPI CloseConsoleHandle(HANDLE); +WINBASEAPI HANDLE WINAPI CreateConsoleScreenBuffer(DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,LPVOID); +WINBASEAPI HANDLE WINAPI DuplicateConsoleHandle(HANDLE,DWORD,BOOL,DWORD); WINBASEAPI BOOL WINAPI FillConsoleOutputAttribute( HANDLE,WORD,DWORD,COORD,LPDWORD); WINBASEAPI BOOL WINAPI FillConsoleOutputCharacterA(HANDLE,CHAR,DWORD,COORD,LPDWORD); WINBASEAPI BOOL WINAPI FillConsoleOutputCharacterW(HANDLE,WCHAR,DWORD,COORD,LPDWORD); @@ -337,6 +339,7 @@ WINBASEAPI BOOL WINAPI GetConsoleHistoryInfo(LPCONSOLE_HISTORY_INFO); WINBASEAPI BOOL WINAPI GetConsoleInputExeNameA(DWORD,LPSTR); WINBASEAPI BOOL WINAPI GetConsoleInputExeNameW(DWORD,LPWSTR); #define GetConsoleInputExeName WINELIB_NAME_AW(GetConsoleInputExeName) +WINBASEAPI HANDLE WINAPI GetConsoleInputWaitHandle(void); WINBASEAPI BOOL WINAPI GetConsoleMode( HANDLE,LPDWORD); WINBASEAPI DWORD WINAPI GetConsoleOriginalTitleA(LPSTR,DWORD); WINBASEAPI DWORD WINAPI GetConsoleOriginalTitleW(LPWSTR,DWORD); @@ -352,6 +355,9 @@ WINBASEAPI HWND WINAPI GetConsoleWindow(void); WINBASEAPI BOOL WINAPI GetCurrentConsoleFont(HANDLE,BOOL,LPCONSOLE_FONT_INFO); WINBASEAPI BOOL WINAPI GetNumberOfConsoleInputEvents( HANDLE,LPDWORD); WINBASEAPI BOOL WINAPI GetNumberOfConsoleMouseButtons(LPDWORD); +WINBASEAPI HANDLE WINAPI OpenConsoleA(LPCSTR,DWORD,BOOL,DWORD); +WINBASEAPI HANDLE WINAPI OpenConsoleW(LPCWSTR,DWORD,BOOL,DWORD); +#define OpenConsole WINELIB_NAME_AW(OpenConsole) WINBASEAPI BOOL WINAPI PeekConsoleInputA( HANDLE,PINPUT_RECORD,DWORD,LPDWORD); WINBASEAPI BOOL WINAPI PeekConsoleInputW( HANDLE,PINPUT_RECORD,DWORD,LPDWORD); #define PeekConsoleInput WINELIB_NAME_AW(PeekConsoleInput) @@ -387,6 +393,7 @@ WINBASEAPI BOOL WINAPI SetConsoleTitleA(LPCSTR); WINBASEAPI BOOL WINAPI SetConsoleTitleW(LPCWSTR); #define SetConsoleTitle WINELIB_NAME_AW(SetConsoleTitle) WINBASEAPI BOOL WINAPI SetConsoleWindowInfo( HANDLE,BOOL,LPSMALL_RECT); +WINBASEAPI BOOL WINAPI VerifyConsoleIoHandle(HANDLE); WINBASEAPI BOOL WINAPI WriteConsoleA(HANDLE,const void *,DWORD,LPDWORD,void *); WINBASEAPI BOOL WINAPI WriteConsoleW(HANDLE,const void *,DWORD,LPDWORD,void *); #define WriteConsole WINELIB_NAME_AW(WriteConsole)