Rebase against 092c7a09a5afde3f11b71b1816388e80d062e8ec.

This commit is contained in:
Zebediah Figura
2021-04-14 19:17:15 -05:00
parent d805441f46
commit 425f75f839
7 changed files with 18 additions and 311 deletions

View File

@@ -1,185 +0,0 @@
From ce4894689736dc2e49b2b7550802ab1f2a4eb462 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Tue, 9 Mar 2021 12:02:18 +0100
Subject: [PATCH] user32/tests: Add more SendInput tests.
Validating that SendInput with INPUT_HARDWARE type should be no-op.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
---
dlls/user32/input.c | 18 ++++++
dlls/user32/tests/input.c | 122 ++++++++++++++++++++++++++++++++++++++
2 files changed, 140 insertions(+)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 8992c463c48..22e53585f00 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -182,6 +182,24 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
UINT i;
NTSTATUS status;
+ if (size != sizeof(INPUT))
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return 0;
+ }
+
+ if (!count)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return 0;
+ }
+
+ if (!inputs)
+ {
+ SetLastError( ERROR_NOACCESS );
+ return 0;
+ }
+
for (i = 0; i < count; i++)
{
if (inputs[i].type == INPUT_MOUSE)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 06f90291fd1..0584f89f55a 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -4246,6 +4246,127 @@ static void test_GetKeyboardLayoutList(void)
}
}
+static void test_SendInput(void)
+{
+ INPUT input[16];
+ UINT res, i;
+ HWND hwnd;
+ MSG msg;
+
+ hwnd = CreateWindowW( L"static", L"test", WS_OVERLAPPED, 0, 0, 100, 100, 0, 0, 0, 0 );
+ ok( hwnd != 0, "CreateWindowW failed\n" );
+
+ ShowWindow( hwnd, SW_SHOWNORMAL );
+ UpdateWindow( hwnd );
+ SetForegroundWindow( hwnd );
+ SetFocus( hwnd );
+ empty_message_queue();
+
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 0, NULL, 0 );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 1, NULL, 0 );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 1, NULL, sizeof(*input) );
+ ok( res == 0 && (GetLastError() == ERROR_NOACCESS || GetLastError() == ERROR_INVALID_PARAMETER),
+ "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 0, input, sizeof(*input) );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 0, NULL, sizeof(*input) );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+
+ memset( input, 0, sizeof(input) );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 1, input, sizeof(*input) );
+ ok( res == 1 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, sizeof(*input) );
+ ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 1, input, 0 );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 1, input, sizeof(*input) + 1 );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 1, input, sizeof(*input) - 1 );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+
+ for (i = 0; i < ARRAY_SIZE(input); ++i) input[i].type = INPUT_KEYBOARD;
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, offsetof( INPUT, ki ) + sizeof(KEYBDINPUT) );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, sizeof(*input) );
+ ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ empty_message_queue();
+
+ for (i = 0; i < ARRAY_SIZE(input); ++i) input[i].type = INPUT_HARDWARE;
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, offsetof( INPUT, hi ) + sizeof(HARDWAREINPUT) );
+ ok( res == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "SendInput returned %u, error %#x\n", res, GetLastError() );
+
+ input[0].hi.uMsg = WM_KEYDOWN;
+ input[0].hi.wParamL = 0;
+ input[0].hi.wParamH = 'A';
+ input[1].hi.uMsg = WM_KEYUP;
+ input[1].hi.wParamL = 0;
+ input[1].hi.wParamH = 'A' | 0xc000;
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, sizeof(*input) );
+#ifdef _WIN64
+ todo_wine
+ ok( res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError() );
+#else
+ ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+#endif
+ while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
+ todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+ empty_message_queue();
+
+ memset( input, 0, sizeof(input) );
+ input[0].type = INPUT_HARDWARE;
+ input[1].type = INPUT_KEYBOARD;
+ input[1].ki.wVk = 'A';
+ input[1].ki.dwFlags = 0;
+ input[2].type = INPUT_KEYBOARD;
+ input[2].ki.wVk = 'A';
+ input[2].ki.dwFlags = KEYEVENTF_KEYUP;
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, sizeof(*input) );
+#ifdef _WIN64
+ todo_wine ok( res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
+ todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+ empty_message_queue();
+#else
+ ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
+ ok( !!res, "SendInput did not trigger any message\n" );
+ todo_wine ok( msg.message == WM_KEYDOWN, "SendInput triggered unexpected message %#x\n", msg.message );
+ while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
+ ok( !!res, "SendInput did not trigger any message\n" );
+ todo_wine ok( msg.message == WM_KEYUP, "SendInput triggered unexpected message %#x\n", msg.message );
+ empty_message_queue();
+#endif
+
+ for (i = 0; i < ARRAY_SIZE(input); ++i) input[i].type = INPUT_HARDWARE + 1;
+ SetLastError( 0xdeadbeef );
+ res = SendInput( 16, input, sizeof(*input) );
+ todo_wine ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
+ todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+ empty_message_queue();
+
+ trace( "done\n" );
+ DestroyWindow( hwnd );
+}
+
START_TEST(input)
{
char **argv;
@@ -4268,6 +4389,7 @@ START_TEST(input)
return;
}
+ test_SendInput();
test_Input_blackbox();
test_Input_whitebox();
test_Input_unicode();
--
2.30.2

View File

@@ -1,106 +0,0 @@
From d9554c180611116398e700ed7f2d8f021bd06924 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Wed, 7 Apr 2021 10:34:23 +0200
Subject: [PATCH] user32: Implement SendInput INPUT_HARDWARE check.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
---
dlls/user32/input.c | 16 ++++++++++++----
dlls/user32/tests/input.c | 15 +++++++--------
2 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 22e53585f00..e97264960ea 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -180,7 +180,7 @@ static void update_mouse_coords( INPUT *input )
UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
{
UINT i;
- NTSTATUS status;
+ NTSTATUS status = STATUS_SUCCESS;
if (size != sizeof(INPUT))
{
@@ -202,14 +202,22 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
for (i = 0; i < count; i++)
{
- if (inputs[i].type == INPUT_MOUSE)
+ INPUT input = inputs[i];
+ switch (input.type)
{
+ case INPUT_MOUSE:
/* we need to update the coordinates to what the server expects */
- INPUT input = inputs[i];
update_mouse_coords( &input );
+ /* fallthrough */
+ case INPUT_KEYBOARD:
status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED );
+ break;
+#ifdef _WIN64
+ case INPUT_HARDWARE:
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return 0;
+#endif
}
- else status = send_hardware_message( 0, &inputs[i], SEND_HWMSG_INJECTED );
if (status)
{
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index f48807a27a0..564ab2e1ba0 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -4286,13 +4286,12 @@ static void test_SendInput(void)
SetLastError( 0xdeadbeef );
res = SendInput( 16, input, sizeof(*input) );
#ifdef _WIN64
- todo_wine
ok( res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError() );
#else
ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
#endif
while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
- todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+ ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
empty_message_queue();
memset( input, 0, sizeof(input) );
@@ -4306,27 +4305,27 @@ static void test_SendInput(void)
SetLastError( 0xdeadbeef );
res = SendInput( 16, input, sizeof(*input) );
#ifdef _WIN64
- todo_wine ok( res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ ok( res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError() );
while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
- todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+ ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
empty_message_queue();
#else
ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
ok( !!res, "SendInput did not trigger any message\n" );
- todo_wine ok( msg.message == WM_KEYDOWN, "SendInput triggered unexpected message %#x\n", msg.message );
+ ok( msg.message == WM_KEYDOWN, "SendInput triggered unexpected message %#x\n", msg.message );
while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
ok( !!res, "SendInput did not trigger any message\n" );
- todo_wine ok( msg.message == WM_KEYUP, "SendInput triggered unexpected message %#x\n", msg.message );
+ ok( msg.message == WM_KEYUP, "SendInput triggered unexpected message %#x\n", msg.message );
empty_message_queue();
#endif
for (i = 0; i < ARRAY_SIZE(input); ++i) input[i].type = INPUT_HARDWARE + 1;
SetLastError( 0xdeadbeef );
res = SendInput( 16, input, sizeof(*input) );
- todo_wine ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+ ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
- todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+ ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
empty_message_queue();
trace( "done\n" );
--
2.30.2

View File

@@ -1,4 +1,4 @@
From 1d4f802b393ca552ec262f359794277c9ecf2c7f Mon Sep 17 00:00:00 2001
From e37a301a9492b6f9ea418556c7df703899a8be58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Wed, 7 Apr 2021 14:52:00 +0200
Subject: [PATCH] user32: Add RAWINPUT parameter to __wine_send_input.
@@ -26,7 +26,7 @@ Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
12 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index e97264960ea..3fc818a2510 100644
index 7cf7e53a6c8..805bfe3e9de 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -119,9 +119,9 @@ BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret )
@@ -48,8 +48,8 @@ index e97264960ea..3fc818a2510 100644
- status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED );
+ status = send_hardware_message( 0, &input, NULL, SEND_HWMSG_INJECTED );
break;
#ifdef _WIN64
case INPUT_HARDWARE:
SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index def59998a52..f87ef9fb3af 100644
--- a/dlls/user32/message.c