From: Paul Gofman pgofman@codeweavers.com
--- dlls/user32/message.c | 10 ---------- dlls/user32/user32.spec | 2 +- dlls/win32u/main.c | 5 +++++ dlls/win32u/message.c | 16 ++++++++++++++++ dlls/win32u/tests/win32u.c | 28 ++++++++++++++++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/wow64win/user.c | 7 +++++++ include/ntuser.h | 1 + 8 files changed, 59 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index a4a1acd9e9e..8943f1fa09e 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -996,16 +996,6 @@ LPARAM WINAPI SetMessageExtraInfo(LPARAM lParam) }
-/*********************************************************************** - * GetCurrentInputMessageSource (USER32.@) - */ -BOOL WINAPI GetCurrentInputMessageSource( INPUT_MESSAGE_SOURCE *source ) -{ - *source = NtUserGetThreadInfo()->msg_source; - return TRUE; -} - - /*********************************************************************** * MsgWaitForMultipleObjects (USER32.@) */ diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 9d3a8f7bef8..09bf38613c4 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -537,7 +537,7 @@ @ stdcall GetClipboardSequenceNumber() NtUserGetClipboardSequenceNumber @ stdcall GetClipboardViewer() NtUserGetClipboardViewer @ stdcall GetComboBoxInfo(long ptr) -@ stdcall GetCurrentInputMessageSource(ptr) +@ stdcall GetCurrentInputMessageSource(ptr) NtUserGetCurrentInputMessageSource @ stdcall GetCursor() NtUserGetCursor @ stdcall GetCursorFrameInfo(long long long ptr ptr) @ stdcall GetCursorInfo(ptr) NtUserGetCursorInfo diff --git a/dlls/win32u/main.c b/dlls/win32u/main.c index e862e53048f..e23c1b7703a 100644 --- a/dlls/win32u/main.c +++ b/dlls/win32u/main.c @@ -1483,6 +1483,11 @@ HWND SYSCALL_API NtUserGetClipboardViewer(void) SYSCALL_FUNC( NtUserGetClipboardViewer ); }
+BOOL SYSCALL_API NtUserGetCurrentInputMessageSource( INPUT_MESSAGE_SOURCE *source ) +{ + SYSCALL_FUNC( NtUserGetCurrentInputMessageSource ); +} + HCURSOR SYSCALL_API NtUserGetCursor(void) { SYSCALL_FUNC( NtUserGetCursor ); diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 57b5b95ac09..3357876e579 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -4604,3 +4604,19 @@ ULONG_PTR WINAPI NtUserGetThreadState( ULONG request )
return 0; } + +/*********************************************************************** + * NtUserGetCurrentInputMessageSource (win32u.@) + */ +BOOL WINAPI NtUserGetCurrentInputMessageSource( INPUT_MESSAGE_SOURCE *source ) +{ + TRACE( "source %p.\n", source ); + + if (!source) + { + RtlSetLastWin32Error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + *source = NtUserGetThreadInfo()->msg_source; + return TRUE; +} diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index d4d27628124..7d1523197a8 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -2522,10 +2522,12 @@ static LRESULT CALLBACK test_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LP
static void test_message_info(void) { + INPUT_MESSAGE_SOURCE msg_src, msg_src_expected; DWORD_PTR ret, expected; HWND hwnd; WNDCLASSA cls; MSG msg; + BOOL bret;
memset(&cls, 0, sizeof(cls)); cls.lpfnWndProc = test_window_proc; @@ -2535,6 +2537,21 @@ static void test_message_info(void) RegisterClassA( &cls ); hwnd = CreateWindowExA( 0, "Test class", NULL, WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0, 0, NULL ); ShowWindow( hwnd, SW_SHOW ); + + SetLastError( 0xdeadbeef ); + bret = NtUserGetCurrentInputMessageSource( NULL ); + ok( !bret && GetLastError() == ERROR_INVALID_PARAMETER, "got bret %d, error %lu.\n", bret, GetLastError() ); + + SetLastError( 0xdeadbeef ); + memset( &msg_src, 0xcc, sizeof(msg_src_expected) ); + bret = NtUserGetCurrentInputMessageSource( &msg_src ); + ok( bret && GetLastError() == 0xdeadbeef, "got bret %d, error %lu.\n", bret, GetLastError() ); + memset( &msg_src_expected, 0xcc, sizeof(msg_src_expected) ); + bret = GetCurrentInputMessageSource( &msg_src_expected ); + ok( bret, "got error %lu.\n", GetLastError() ); + ok( msg_src.deviceType == msg_src_expected.deviceType, "got %d, expected %d.\n", msg_src.deviceType, msg_src_expected.deviceType ); + ok( msg_src.originId == msg_src_expected.originId, "got %d, expected %d.\n", msg_src.originId, msg_src_expected.originId ); + while (PeekMessageA( &msg, NULL, 0, 0, PM_NOREMOVE )) { GetMessageA( &msg, NULL, 0, 0 ); @@ -2546,6 +2563,17 @@ static void test_message_info(void) ret = NtUserGetThreadState( USER_GET_THREAD_STATE_MSGEXTRAINFO ); ok( expected == 0xdeadbeef, "got %#Ix.\n", expected ); ok( ret == expected || broken( !ret ) /* Before Win10 1709 */, "got %#Ix, expected %#Ix.\n", ret, expected ); + + SetLastError( 0xdeadbeef ); + memset( &msg_src, 0xcc, sizeof(msg_src_expected) ); + bret = NtUserGetCurrentInputMessageSource( &msg_src ); + ok( bret && GetLastError() == 0xdeadbeef, "got bret %d, error %lu.\n", bret, GetLastError() ); + memset( &msg_src_expected, 0xcc, sizeof(msg_src_expected) ); + bret = GetCurrentInputMessageSource( &msg_src_expected ); + ok( bret, "got error %lu.\n", GetLastError() ); + ok( msg_src.deviceType == msg_src_expected.deviceType, "got %d, expected %d.\n", msg_src.deviceType, msg_src_expected.deviceType ); + ok( msg_src.originId == msg_src_expected.originId, "got %d, expected %d.\n", msg_src.originId, msg_src_expected.originId ); + TranslateMessage( &msg ); DispatchMessageA( &msg ); } diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 899b2d815d3..0e71ced3819 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -997,7 +997,7 @@ @ stub NtUserGetControlBrush @ stub NtUserGetControlColor @ stub NtUserGetCurrentDpiInfoForWindow -@ stub NtUserGetCurrentInputMessageSource +@ stdcall -syscall NtUserGetCurrentInputMessageSource(ptr) @ stdcall -syscall NtUserGetCursor() @ stdcall -syscall NtUserGetCursorFrameInfo(long long ptr ptr) @ stdcall -syscall NtUserGetCursorInfo(ptr) diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 487c2e56072..79bc47de17d 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -2416,6 +2416,13 @@ NTSTATUS WINAPI wow64_NtUserGetClipboardViewer( UINT *args ) return HandleToUlong( NtUserGetClipboardViewer() ); }
+NTSTATUS WINAPI wow64_NtUserGetCurrentInputMessageSource( UINT *args ) +{ + INPUT_MESSAGE_SOURCE *source = get_ptr( &args ); + + return NtUserGetCurrentInputMessageSource( source ); +} + NTSTATUS WINAPI wow64_NtUserGetCursor( UINT *args ) { return HandleToUlong( NtUserGetCursor() ); diff --git a/include/ntuser.h b/include/ntuser.h index 565a884afea..f2a8605f92e 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -795,6 +795,7 @@ W32KAPI INT WINAPI NtUserGetClipboardFormatName( UINT format, WCHAR *buffer, W32KAPI HWND WINAPI NtUserGetClipboardOwner(void); W32KAPI DWORD WINAPI NtUserGetClipboardSequenceNumber(void); W32KAPI HWND WINAPI NtUserGetClipboardViewer(void); +W32KAPI BOOL WINAPI NtUserGetCurrentInputMessageSource( INPUT_MESSAGE_SOURCE *source ); W32KAPI HCURSOR WINAPI NtUserGetCursor(void); W32KAPI HCURSOR WINAPI NtUserGetCursorFrameInfo( HCURSOR hCursor, DWORD istep, DWORD *rate_jiffies, DWORD *num_steps );