You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Rebase against 092c7a09a5afde3f11b71b1816388e80d062e8ec.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user