[PATCH 2/3] user32: Implement SendInput INPUT_HARDWARE check.
Rémi Bernon
rbernon at codeweavers.com
Tue Mar 9 07:58:22 CST 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/user32/input.c | 20 ++++++++++++++------
dlls/user32/tests/input.c | 22 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index e9a74f177b9..dfb6bf7f646 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -179,8 +179,9 @@ static void update_mouse_coords( INPUT *input )
*/
UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
{
+ NTSTATUS status = STATUS_SUCCESS;
+ INPUT tmp;
UINT i;
- NTSTATUS status;
if (size != sizeof(INPUT))
{
@@ -202,14 +203,21 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
for (i = 0; i < count; i++)
{
- if (inputs[i].type == INPUT_MOUSE)
+ tmp = inputs[i];
+
+ switch (tmp.type)
{
+ case INPUT_MOUSE:
/* we need to update the coordinates to what the server expects */
- INPUT input = inputs[i];
- update_mouse_coords( &input );
- status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED );
+ update_mouse_coords( &tmp );
+ /* fallthrough */
+ case INPUT_KEYBOARD:
+ status = send_hardware_message( 0, &tmp, SEND_HWMSG_INJECTED );
+ break;
+ case INPUT_HARDWARE:
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return 0;
}
- 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 57bae6cdcad..514bf2765c6 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -4123,6 +4123,7 @@ 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");
@@ -4176,6 +4177,27 @@ static void test_SendInput(void)
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());
+ SetLastError(0xdeadbeef);
+ res = SendInput(16, input, sizeof(*input));
+ ok(res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError());
+ while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) ok(0, "SendInput triggered unexpected message %#x\n", msg.message);
+
+ memset(input, 0, sizeof(input));
+ input[0].type = INPUT_HARDWARE;
+ SetLastError(0xdeadbeef);
+ res = SendInput(16, input, sizeof(*input));
+ ok(res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, "SendInput returned %u, error %#x\n", res, GetLastError());
+
+ for (i = 0; i < ARRAY_SIZE(input); ++i) input[i].type = INPUT_HARDWARE + 1;
+ SetLastError(0xdeadbeef);
+ res = SendInput(16, input, sizeof(*input));
+ ok(res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError());
+ while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) ok(0, "SendInput triggered unexpected message %#x\n", msg.message);
+
trace("done\n");
DestroyWindow(hwnd);
}
--
2.30.0
More information about the wine-devel
mailing list