[PATCH 1/4] user32/tests: Add some more tests related to the RAWINPUT structure.
Zebediah Figura
wine at gitlab.winehq.org
Mon Jun 13 02:18:55 CDT 2022
From: Zebediah Figura <zfigura at codeweavers.com>
In order to test the wparam member I removed WS_VISIBLE from the window created
by test_GetRawInputBuffer(). For some reason this caused events injected by that
test not to be received if the test was executed after another test that created
a window. My vague understanding is that we'd need XInput2 support to reliably
receive those events, so as a stopgap solution I moved the tests earlier.
---
dlls/user32/tests/input.c | 104 ++++++++++++++++++++++++++++++++++----
1 file changed, 95 insertions(+), 9 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 6232a7456e8..59039164b6b 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -2101,13 +2101,29 @@ static void test_RegisterRawInputDevices(void)
static int rawinputbuffer_wndproc_count;
+typedef struct
+{
+ DWORD dwType;
+ DWORD dwSize;
+ ULONG hDevice;
+ ULONG wParam;
+} RAWINPUTHEADER32;
+
#ifdef _WIN64
+typedef RAWINPUTHEADER RAWINPUTHEADER64;
typedef RAWINPUT RAWINPUT64;
#else
typedef struct
{
- RAWINPUTHEADER header;
- char pad[8];
+ DWORD dwType;
+ DWORD dwSize;
+ ULONGLONG hDevice;
+ ULONGLONG wParam;
+} RAWINPUTHEADER64;
+
+typedef struct
+{
+ RAWINPUTHEADER64 header;
union {
RAWMOUSE mouse;
RAWKEYBOARD keyboard;
@@ -2124,9 +2140,9 @@ static int rawinput_buffer_mouse_x(void *buffer, size_t index)
static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
+ UINT i, size, count, rawinput_size, iteration = rawinputbuffer_wndproc_count++;
RAWINPUT ri;
char buffer[16 * sizeof(RAWINPUT64)];
- UINT size, count, rawinput_size, iteration = rawinputbuffer_wndproc_count++;
MSG message;
if (is_wow64) rawinput_size = sizeof(RAWINPUT64);
@@ -2134,8 +2150,12 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
if (msg == WM_INPUT)
{
+ ok(wparam == RIM_INPUTSINK, "Unexpected wparam: %#Ix\n", wparam);
+
+ SetLastError(0xdeadbeef);
count = GetRawInputBuffer(NULL, NULL, sizeof(RAWINPUTHEADER));
ok(count == ~0U, "GetRawInputBuffer succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
size = sizeof(buffer);
count = GetRawInputBuffer(NULL, &size, sizeof(RAWINPUTHEADER));
@@ -2147,6 +2167,25 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER));
ok(count == 3, "GetRawInputBuffer returned %u\n", count);
ok(size == sizeof(buffer), "GetRawInputBuffer returned unexpected size: %u\n", size);
+
+ for (i = 0; i < 3; ++i)
+ {
+ if (is_wow64)
+ {
+ const RAWINPUT64 *data = (RAWINPUT64 *)buffer;
+ ok(data->header.dwType == RIM_TYPEMOUSE, "Unexpected rawinput type: %lu\n", data->header.dwType);
+ ok(data->header.dwSize == sizeof(*data), "Unexpected rawinput size: %lu\n", data->header.dwSize);
+ todo_wine ok(data->header.wParam == wparam, "Unexpected wparam: %#I64x\n", data->header.wParam);
+ }
+ else
+ {
+ const RAWINPUT *data = (RAWINPUT *)buffer;
+ ok(data->header.dwType == RIM_TYPEMOUSE, "Unexpected rawinput type: %lu\n", data->header.dwType);
+ ok(data->header.dwSize == sizeof(*data), "Unexpected rawinput size: %lu\n", data->header.dwSize);
+ todo_wine ok(data->header.wParam == wparam, "Unexpected wparam: %#Ix\n", data->header.wParam);
+ }
+ }
+
ok(rawinput_buffer_mouse_x(buffer, 0) == 2, "Unexpected rawinput data: %d\n", rawinput_buffer_mouse_x(buffer, 0));
ok(rawinput_buffer_mouse_x(buffer, 1) == 3, "Unexpected rawinput data: %d\n", rawinput_buffer_mouse_x(buffer, 1));
ok(rawinput_buffer_mouse_x(buffer, 2) == 4, "Unexpected rawinput data: %d\n", rawinput_buffer_mouse_x(buffer, 2));
@@ -2183,7 +2222,12 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
{
SetLastError(0xdeadbeef);
count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, 0);
- ok(count == ~0U, "GetRawInputData succeeded\n");
+ ok(count == ~0u, "GetRawInputData returned %d\n", count);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER) + 1);
+ ok(count == ~0u, "GetRawInputData returned %d\n", count);
ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError());
SetLastError(0xdeadbeef);
@@ -2204,6 +2248,28 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
ok(count == sizeof(ri), "GetRawInputData failed\n");
ok(ri.data.mouse.lLastX == 6, "Unexpected rawinput data: %ld\n", ri.data.mouse.lLastX);
ok(GetLastError() == 0xdeadbeef, "GetRawInputData returned %08lx\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ size = sizeof(buffer);
+ if (sizeof(void *) == 8)
+ {
+ count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER32));
+ ok(count == ~0u, "GetRawInputData returned %d\n", count);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError());
+ }
+ else if (is_wow64)
+ {
+ count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER64));
+ todo_wine ok(count == sizeof(ri), "GetRawInputData returned %d\n", count);
+ ok(ri.data.mouse.lLastX == 6, "Unexpected rawinput data: %ld\n", ri.data.mouse.lLastX);
+ todo_wine ok(GetLastError() == 0xdeadbeef, "GetRawInputData returned %08lx\n", GetLastError());
+ }
+ else
+ {
+ count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER64));
+ ok(count == ~0u, "GetRawInputData returned %d\n", count);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError());
+ }
}
else
{
@@ -2233,7 +2299,7 @@ static void test_GetRawInputBuffer(void)
GetCursorPos(&pt);
ok(pt.x == 300 && pt.y == 300, "Unexpected cursor position pos %ldx%ld\n", pt.x, pt.y);
- hwnd = CreateWindowA("static", "static", WS_VISIBLE | WS_POPUP,
+ hwnd = CreateWindowA("static", "static", WS_POPUP,
100, 100, 100, 100, 0, NULL, NULL, NULL);
SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)rawinputbuffer_wndproc);
ok(hwnd != 0, "CreateWindow failed\n");
@@ -2295,6 +2361,23 @@ static void test_GetRawInputBuffer(void)
ok(count == ~0U, "GetRawInputBuffer succeeded\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputBuffer returned %08lx\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ size = sizeof(buffer);
+ count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER) + 1);
+ ok(count == ~0U, "GetRawInputBuffer succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputBuffer returned %08lx\n", GetLastError());
+
+ /* the function returns 64-bit RAWINPUT structures on WoW64, but still
+ * forbids sizeof(RAWINPUTHEADER) from the wrong architecture */
+ SetLastError(0xdeadbeef);
+ size = sizeof(buffer);
+ if (sizeof(void *) == 8)
+ count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER32));
+ else
+ count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER64));
+ ok(count == ~0U, "GetRawInputBuffer succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputBuffer returned %08lx\n", GetLastError());
+
size = sizeof(buffer);
memset(buffer, 0, sizeof(buffer));
count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER));
@@ -2365,6 +2448,9 @@ static LRESULT CALLBACK rawinput_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPA
ret = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &raw, &raw_size, sizeof(RAWINPUTHEADER));
ok(ret > 0 && ret != (UINT)-1, "GetRawInputData failed\n");
ok(raw.header.dwType == RIM_TYPEMOUSE, "Unexpected rawinput type: %lu\n", raw.header.dwType);
+ ok(raw.header.dwSize == raw_size, "Expected size %u, got %lu\n", raw_size, raw.header.dwSize);
+ todo_wine_if (wparam)
+ ok(raw.header.wParam == wparam, "Expected wparam %Iu, got %Iu\n", wparam, raw.header.wParam);
ok(!(raw.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE), "Unexpected absolute rawinput motion\n");
ok(!(raw.data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP), "Unexpected virtual desktop rawinput motion\n");
@@ -4491,6 +4577,10 @@ START_TEST(input)
return;
}
+ test_GetRawInputData();
+ test_GetRawInputBuffer();
+ test_RegisterRawInputDevices();
+ test_rawinput(argv[0]);
test_SendInput();
test_Input_blackbox();
test_Input_whitebox();
@@ -4507,10 +4597,6 @@ START_TEST(input)
test_attach_input();
test_GetKeyState();
test_OemKeyScan();
- test_GetRawInputData();
- test_GetRawInputBuffer();
- test_RegisterRawInputDevices();
- test_rawinput(argv[0]);
if(pGetMouseMovePointsEx)
test_GetMouseMovePointsEx(argv[0]);
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/233
More information about the wine-devel
mailing list