[PATCH v2 1/4] user32/tests: Add some more tests related to the RAWINPUT structure.
Zebediah Figura
wine at gitlab.winehq.org
Fri Jun 17 01:06:59 CDT 2022
From: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/user32/tests/input.c | 96 +++++++++++++++++++++++++++++++++++++--
1 file changed, 91 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 6232a7456e8..0d003c6cc21 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,10 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
if (msg == WM_INPUT)
{
+ 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 +2165,27 @@ 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)[i];
+ 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_if (wparam)
+ ok(data->header.wParam == wparam, "Unexpected wparam: %#I64x\n", data->header.wParam);
+ }
+ else
+ {
+ const RAWINPUT *data = &((RAWINPUT *)buffer)[i];
+ 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_if (wparam)
+ 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,30 @@ 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
+ {
+ count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER64));
+ if (is_wow64)
+ {
+ 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
+ {
+ ok(count == ~0u, "GetRawInputData returned %d\n", count);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError());
+ }
+ }
}
else
{
@@ -2219,9 +2287,9 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
static void test_GetRawInputBuffer(void)
{
+ unsigned int size, count, rawinput_size, header_size;
RAWINPUTDEVICE raw_devices[1];
char buffer[16 * sizeof(RAWINPUT64)];
- UINT size, count, rawinput_size;
HWND hwnd;
BOOL ret;
POINT pt;
@@ -2295,6 +2363,21 @@ 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);
+ header_size = (sizeof(void *) == 8 ? sizeof(RAWINPUTHEADER32) : sizeof(RAWINPUTHEADER64));
+ count = GetRawInputBuffer((RAWINPUT*)buffer, &size, header_size);
+ 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");
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/233
More information about the wine-devel
mailing list