From: Rémi Bernon rbernon@codeweavers.com
This should be more reliable than mouse moves and it exhibits more issues with the rawinput buffer struct sizes on new WoW64. --- dlls/user32/tests/input.c | 466 ++++++++++++++++++++------------------ 1 file changed, 241 insertions(+), 225 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c index 7179ed93bf0..3b2d31c14bd 100644 --- a/dlls/user32/tests/input.c +++ b/dlls/user32/tests/input.c @@ -1897,334 +1897,350 @@ typedef struct } RAWINPUT64; #endif
-static int rawinput_buffer_mouse_x(void *buffer, size_t index) -{ - if (is_wow64) return ((RAWINPUT64 *)buffer)[index].data.mouse.lLastX; - return ((RAWINPUT *)buffer)[index].data.mouse.lLastX; -} - 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)]; - MSG message; - - if (is_wow64) rawinput_size = sizeof(RAWINPUT64); - else rawinput_size = sizeof(RAWINPUT); - 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()); + UINT i, size, rawinput_size, iteration = rawinputbuffer_wndproc_count++; + char buffer[16 * sizeof(RAWINPUT64)]; + RAWINPUT64 *rawbuffer64 = (RAWINPUT64 *)buffer; + RAWINPUT *rawbuffer = (RAWINPUT *)buffer; + HRAWINPUT handle = (HRAWINPUT)lparam; + RAWINPUT rawinput = {{0}};
- size = sizeof(buffer); - count = GetRawInputBuffer(NULL, &size, sizeof(RAWINPUTHEADER)); - ok(count == 0, "GetRawInputBuffer returned %u\n", count); - ok(size == rawinput_size, "GetRawInputBuffer returned unexpected size: %u\n", size); + winetest_push_context( "%u", iteration ); + + if (is_wow64) rawinput_size = sizeof(RAWINPUTHEADER64) + sizeof(RAWKEYBOARD); + else rawinput_size = sizeof(RAWINPUTHEADER) + sizeof(RAWKEYBOARD);
size = sizeof(buffer); - memset(buffer, 0, sizeof(buffer)); - 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); + memset( buffer, 0, sizeof(buffer) ); + todo_wine_if(is_wow64 && iteration == 1) + ok_ret( 3, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER)) ); + ok_eq( sizeof(buffer), size, UINT, "%u" );
for (i = 0; i < 3; ++i) { + winetest_push_context( "%u", 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); + RAWINPUT64 *rawinput = (RAWINPUT64 *)(buffer + i * rawinput_size); + flaky_wine_if(is_wow64) + ok_eq( RIM_TYPEKEYBOARD, rawinput->header.dwType, UINT, "%u" ); + flaky_wine_if(is_wow64) + ok_eq( rawinput_size, rawinput->header.dwSize, UINT, "%u" ); + ok_eq( wparam, rawinput->header.wParam, WPARAM, "%Iu" ); + flaky_wine_if(is_wow64) + ok_eq( i + 2, rawinput->data.keyboard.MakeCode, WPARAM, "%Iu" ); } 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); + RAWINPUT *rawinput = (RAWINPUT *)(buffer + i * rawinput_size); + ok_eq( RIM_TYPEKEYBOARD, rawinput->header.dwType, UINT, "%u" ); + ok_eq( rawinput_size, rawinput->header.dwSize, UINT, "%u" ); + ok_eq( wparam, rawinput->header.wParam, WPARAM, "%Iu" ); + ok_eq( i + 2, rawinput->data.keyboard.MakeCode, WPARAM, "%Iu" ); } + winetest_pop_context(); }
- 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)); - /* the first event should be removed by the next GetRawInputBuffer call * and the others should do another round through the message loop but not more */ if (iteration == 0) { - mouse_event(MOUSEEVENTF_MOVE, 5, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 6, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 2, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 3, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 4, 0, 0, 0); + keybd_event( 'X', 5, 0, 0 ); + keybd_event( 'X', 6, KEYEVENTF_KEYUP, 0 ); + keybd_event( 'X', 2, KEYEVENTF_KEYUP, 0 ); + keybd_event( 'X', 3, 0, 0 ); + keybd_event( 'X', 4, KEYEVENTF_KEYUP, 0 );
/* even though rawinput_size is the minimum required size, * it needs one more byte to return success */ - size = rawinput_size + 1; - memset(buffer, 0, sizeof(buffer)); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == 1, "GetRawInputBuffer returned %u\n", count); - ok(rawinput_buffer_mouse_x(buffer, 0) == 5, "Unexpected rawinput data: %d\n", rawinput_buffer_mouse_x(buffer, 0)); + size = sizeof(rawinput) + 1; + memset( buffer, 0, sizeof(buffer) ); + todo_wine_if(is_wow64) + ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + if (is_wow64) todo_wine ok_eq( 5, rawbuffer64->data.keyboard.MakeCode, WPARAM, "%Iu" ); + else ok_eq( 5, rawbuffer->data.keyboard.MakeCode, WPARAM, "%Iu" );
/* peek the messages now, they should still arrive in the correct order */ - while (PeekMessageA(&message, 0, WM_INPUT, WM_INPUT, PM_REMOVE)) DispatchMessageA(&message); + winetest_pop_context(); + wait_messages( 0, FALSE ); + winetest_push_context( "%u", iteration ); + + /* reading the message data now should fail, the data + * from the first message has been overwritten. */ + SetLastError( 0xdeadbeef ); + size = sizeof(rawinput); + ok_ret( (UINT)-1, GetRawInputData( handle, RID_HEADER, &rawinput, &size, sizeof(RAWINPUTHEADER) ) ); + ok_ret( ERROR_INVALID_HANDLE, GetLastError() ); } - - /* reading the message data now should fail on the second iteration, the data - * from the first message has been overwritten. */ - size = sizeof(ri); - memset(&ri, 0, sizeof(ri)); - SetLastError(0xdeadbeef); - count = GetRawInputData((HRAWINPUT)lparam, RID_HEADER, &ri, &size, sizeof(RAWINPUTHEADER)); - if (iteration == 1) + else { - SetLastError(0xdeadbeef); - count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, 0); - ok(count == ~0u, "GetRawInputData returned %d\n", count); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok_ret( (UINT)-1, GetRawInputData( handle, RID_INPUT, &rawinput, &size, 0) ); + ok_ret( ERROR_INVALID_PARAMETER, 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 ); + ok_ret( (UINT)-1, GetRawInputData(handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER) + 1) ); + ok_ret( ERROR_INVALID_PARAMETER, GetLastError() );
- SetLastError(0xdeadbeef); + SetLastError( 0xdeadbeef ); size = 0; - count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER)); - ok(count == ~0U, "GetRawInputData succeeded\n"); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetRawInputData returned %08lx\n", GetLastError()); - - SetLastError(0xdeadbeef); - size = sizeof(ri); - count = GetRawInputData((HRAWINPUT)lparam, 0, &ri, &size, sizeof(RAWINPUTHEADER)); - ok(count == ~0U, "GetRawInputData succeeded\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError()); - - SetLastError(0xdeadbeef); - size = sizeof(ri); - count = GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &ri, &size, sizeof(RAWINPUTHEADER)); - 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); + ok_ret( (UINT)-1, GetRawInputData(handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER)) ); + ok_ret( ERROR_INSUFFICIENT_BUFFER, GetLastError() ); + + SetLastError( 0xdeadbeef ); + size = sizeof(rawinput); + ok_ret( (UINT)-1, GetRawInputData(handle, 0, &rawinput, &size, sizeof(RAWINPUTHEADER)) ); + ok_ret( ERROR_INVALID_PARAMETER, GetLastError() ); + + SetLastError( 0xdeadbeef ); + size = sizeof(rawinput); + rawinput_size = sizeof(RAWINPUTHEADER) + sizeof(RAWKEYBOARD); + ok_ret( rawinput_size, GetRawInputData( handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER) ) ); + todo_wine_if(is_wow64) + ok_eq( 6, rawinput.data.keyboard.MakeCode, UINT, "%u" ); + + 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_ret( (UINT)-1, GetRawInputData( handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER32) ) ); ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError()); } + else if (is_wow64) + { + todo_wine + ok_ret( rawinput_size, GetRawInputData( handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER64) ) ); + todo_wine + ok_eq( 6, rawinput.data.keyboard.MakeCode, UINT, "%u" ); + todo_wine + ok_ret( 0xdeadbeef, 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()); - } + ok_ret( (UINT)-1, GetRawInputData( handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER64) ) ); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputData returned %08lx\n", GetLastError()); } } - else - { - ok(count == ~0U, "GetRawInputData succeeded\n"); - ok(GetLastError() == ERROR_INVALID_HANDLE, "GetRawInputData returned %08lx\n", GetLastError()); - }
+ winetest_pop_context(); return 0; }
- return DefWindowProcA(hwnd, msg, wparam, lparam); + return DefWindowProcW( hwnd, msg, wparam, lparam ); }
static void test_GetRawInputBuffer(void) { - unsigned int size, count, rawinput_size, header_size, scan_code; + unsigned int size, rawinput_size, header_size; RAWINPUTDEVICE raw_devices[1]; char buffer[16 * sizeof(RAWINPUT64)]; + RAWINPUT64 *rawbuffer64 = (RAWINPUT64 *)buffer; + RAWINPUT *rawbuffer = (RAWINPUT *)buffer; HWND hwnd; - BOOL ret; - POINT pt; - -#define HEADER_FIELD(field) (is_wow64 ? ((RAWINPUT64 *)buffer)->header.field : ((RAWINPUT *)buffer)->header.field)
- if (is_wow64) rawinput_size = sizeof(RAWINPUT64); - else rawinput_size = sizeof(RAWINPUT); + if (is_wow64) rawinput_size = sizeof(RAWINPUTHEADER64) + sizeof(RAWMOUSE); + else rawinput_size = sizeof(RAWINPUTHEADER) + sizeof(RAWMOUSE);
- SetCursorPos(300, 300); - GetCursorPos(&pt); - ok(pt.x == 300 && pt.y == 300, "Unexpected cursor position pos %ldx%ld\n", pt.x, pt.y); + hwnd = create_foreground_window( TRUE ); + SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)rawinputbuffer_wndproc );
- hwnd = CreateWindowA("static", "static", WS_VISIBLE | WS_POPUP, - 100, 100, 100, 100, 0, NULL, NULL, NULL); - SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)rawinputbuffer_wndproc); - ok(hwnd != 0, "CreateWindow failed\n"); - empty_message_queue(); - - raw_devices[0].usUsagePage = 0x01; - raw_devices[0].usUsage = 0x02; + raw_devices[0].usUsagePage = HID_USAGE_PAGE_GENERIC; + raw_devices[0].usUsage = HID_USAGE_GENERIC_MOUSE; raw_devices[0].dwFlags = RIDEV_INPUTSINK; raw_devices[0].hwndTarget = hwnd; + ok_ret( 1, RegisterRawInputDevices( raw_devices, ARRAY_SIZE( raw_devices ), sizeof(RAWINPUTDEVICE) ) );
- SetLastError(0xdeadbeef); - ret = RegisterRawInputDevices(raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE)); - ok(ret, "RegisterRawInputDevices failed\n"); - ok(GetLastError() == 0xdeadbeef, "RegisterRawInputDevices returned %08lx\n", GetLastError()); - - SetLastError(0xdeadbeef); - count = GetRawInputBuffer(NULL, NULL, sizeof(RAWINPUTHEADER)); - ok(count == ~0U, "GetRawInputBuffer succeeded\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputBuffer returned %08lx\n", GetLastError()); + /* check basic error cases */
+ SetLastError( 0xdeadbeef ); + ok_ret( (UINT)-1, GetRawInputBuffer( NULL, NULL, sizeof(RAWINPUTHEADER) ) ); + ok_ret( ERROR_INVALID_PARAMETER, GetLastError() ); + SetLastError( 0xdeadbeef ); size = sizeof(buffer); - count = GetRawInputBuffer(NULL, &size, sizeof(RAWINPUTHEADER)); - ok(count == 0U, "GetRawInputBuffer returned %u\n", count); - ok(size == 0U, "GetRawInputBuffer returned unexpected size: %u\n", size); + ok_ret( (UINT)-1, GetRawInputBuffer( rawbuffer, &size, 0 ) ); + ok_ret( ERROR_INVALID_PARAMETER, GetLastError() );
- size = 0; - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == 0U, "GetRawInputBuffer returned %u\n", count); - ok(size == 0U, "GetRawInputBuffer returned unexpected size: %u\n", size); + /* valid calls, but no input */
- SetLastError(0xdeadbeef); size = sizeof(buffer); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, 0); - ok(count == ~0U, "GetRawInputBuffer succeeded\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputBuffer returned %08lx\n", GetLastError()); - + ok_ret( 0, GetRawInputBuffer( NULL, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( 0, size, UINT, "%u" ); + size = 0; + ok_ret( 0, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( 0, size, UINT, "%u" ); size = sizeof(buffer); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == 0U, "GetRawInputBuffer returned %u\n", count); - ok(size == 0U, "GetRawInputBuffer returned unexpected size: %u\n", size); + ok_ret( 0, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( 0, size, UINT, "%u" );
- mouse_event(MOUSEEVENTF_MOVE, 5, 0, 0, 0);
- SetLastError(0xdeadbeef); - size = 0; - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == ~0U, "GetRawInputBuffer succeeded\n"); - ok(size == rawinput_size, "GetRawInputBuffer returned unexpected size: %u\n", size); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetRawInputBuffer returned %08lx\n", GetLastError()); + mouse_event( MOUSEEVENTF_MOVE, 5, 0, 0, 0 );
- size = 0; - count = GetRawInputBuffer(NULL, &size, sizeof(RAWINPUTHEADER)); - ok(count == 0, "GetRawInputBuffer returned %u\n", count); - ok(size == rawinput_size, "GetRawInputBuffer returned unexpected size: %u\n", size); + /* invalid calls with input */
- SetLastError(0xdeadbeef); + SetLastError( 0xdeadbeef ); + size = 0; + ok_ret( (UINT)-1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( rawinput_size, size, UINT, "%u" ); + ok_ret( ERROR_INSUFFICIENT_BUFFER, GetLastError() ); + SetLastError( 0xdeadbeef ); size = sizeof(buffer); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, 0); - ok(count == ~0U, "GetRawInputBuffer succeeded\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputBuffer returned %08lx\n", GetLastError()); - - SetLastError(0xdeadbeef); + ok_ret( (UINT)-1, GetRawInputBuffer( rawbuffer, &size, 0 ) ); + ok_ret( ERROR_INVALID_PARAMETER, 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()); + ok_ret( (UINT)-1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) + 1 ) ); + ok_ret( ERROR_INVALID_PARAMETER, GetLastError() );
/* the function returns 64-bit RAWINPUT structures on WoW64, but still * forbids sizeof(RAWINPUTHEADER) from the wrong architecture */ - SetLastError(0xdeadbeef); + 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)); - ok(count == 1U, "GetRawInputBuffer returned %u\n", count); - ok(size == sizeof(buffer), "GetRawInputBuffer returned unexpected size: %u\n", size); - ok(HEADER_FIELD(dwType) == RIM_TYPEMOUSE, "Unexpected rawinput dwType: %ld\n", HEADER_FIELD(dwType)); - ok(HEADER_FIELD(wParam) == 0 || HEADER_FIELD(wParam) == 1, "Expected wparam 0 or 1, got %Iu\n", (WPARAM)HEADER_FIELD(wParam)); - ok(rawinput_buffer_mouse_x(buffer, 0) == 5, "Unexpected rawinput data: %d\n", rawinput_buffer_mouse_x(buffer, 0)); + ok_ret( (UINT)-1, GetRawInputBuffer( rawbuffer, &size, header_size ) ); + ok_ret( ERROR_INVALID_PARAMETER, GetLastError() );
/* NOTE: calling with size == rawinput_size returns an error, */ /* BUT it fills the buffer nonetheless and empties the internal buffer (!!) */ - mouse_event(MOUSEEVENTF_MOVE, 5, 0, 0, 0);
- SetLastError(0xdeadbeef); + size = 0; + ok_ret( 0, GetRawInputBuffer( NULL, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( rawinput_size, size, UINT, "%u" ); + + SetLastError( 0xdeadbeef ); size = rawinput_size; - memset(buffer, 0, sizeof(buffer)); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == ~0U, "GetRawInputBuffer succeeded\n"); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetRawInputBuffer returned %08lx\n", GetLastError()); - ok(rawinput_buffer_mouse_x(buffer, 0) == 5, "Unexpected rawinput data: %d\n", rawinput_buffer_mouse_x(buffer, 0)); + memset( buffer, 0, sizeof(buffer) ); + ok_ret( (UINT)-1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_ret( ERROR_INSUFFICIENT_BUFFER, GetLastError() ); + if (is_wow64) ok_eq( 5, rawbuffer64->data.mouse.lLastX, UINT, "%u" ); + else ok_eq( 5, rawbuffer->data.mouse.lLastX, UINT, "%u" ); + + /* no more data to read */
size = sizeof(buffer); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == 0U, "GetRawInputBuffer returned %u\n", count); + ok_ret( 0, GetRawInputBuffer( NULL, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( 0, size, UINT, "%u" );
- rawinputbuffer_wndproc_count = 0; - mouse_event(MOUSEEVENTF_MOVE, 1, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 2, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 3, 0, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, 4, 0, 0, 0); - empty_message_queue(); - ok(rawinputbuffer_wndproc_count == 2, "Spurious WM_INPUT messages\n"); + /* rawinput_size + 1 succeeds */ + + mouse_event( MOUSEEVENTF_MOVE, 5, 0, 0, 0 ); + + size = rawinput_size + 1; + memset( buffer, 0, sizeof(buffer) ); + ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( rawinput_size + 1, size, UINT, "%u" ); + if (is_wow64) + { + ok_eq( RIM_TYPEMOUSE, rawbuffer64->header.dwType, UINT, "%#x" ); + ok_eq( 0, rawbuffer64->header.wParam, WPARAM, "%Iu" ); + ok_eq( 5, rawbuffer64->data.mouse.lLastX, UINT, "%u" ); + } + else + { + ok_eq( RIM_TYPEMOUSE, rawbuffer->header.dwType, UINT, "%#x" ); + ok_eq( 0, rawbuffer->header.wParam, WPARAM, "%Iu" ); + ok_eq( 5, rawbuffer->data.mouse.lLastX, UINT, "%u" ); + } + + size = sizeof(buffer); + ok_ret( 0, GetRawInputBuffer( NULL, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( 0, size, UINT, "%u" );
raw_devices[0].dwFlags = RIDEV_REMOVE; raw_devices[0].hwndTarget = 0; - - SetLastError(0xdeadbeef); - ret = RegisterRawInputDevices(raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE)); - ok(ret, "RegisterRawInputDevices failed\n"); - ok(GetLastError() == 0xdeadbeef, "RegisterRawInputDevices returned %08lx\n", GetLastError()); + ok_ret( 1, RegisterRawInputDevices( raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE) ) );
/* some keyboard tests to better check fields under wow64 */ - raw_devices[0].usUsagePage = 0x01; - raw_devices[0].usUsage = 0x06; + raw_devices[0].usUsagePage = HID_USAGE_PAGE_GENERIC; + raw_devices[0].usUsage = HID_USAGE_GENERIC_KEYBOARD; raw_devices[0].dwFlags = RIDEV_INPUTSINK; raw_devices[0].hwndTarget = hwnd; + ok_ret( 1, RegisterRawInputDevices( raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE) ) );
- SetLastError(0xdeadbeef); - ret = RegisterRawInputDevices(raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE)); - ok(ret, "RegisterRawInputDevices failed\n"); - ok(GetLastError() == 0xdeadbeef, "RegisterRawInputDevices returned %08lx\n", GetLastError()); + keybd_event( 'X', 0x2d, 0, 0 ); + keybd_event( 'X', 0x2d, KEYEVENTF_KEYUP, 0 );
- keybd_event('X', 0x2d, 0, 0); - keybd_event('X', 0x2d, KEYEVENTF_KEYUP, 0); + if (is_wow64) rawinput_size = sizeof(RAWINPUTHEADER64) + sizeof(RAWKEYBOARD); + else rawinput_size = sizeof(RAWINPUTHEADER) + sizeof(RAWKEYBOARD); + + size = 0; + ok_ret( 0, GetRawInputBuffer( NULL, &size, sizeof(RAWINPUTHEADER) ) ); + todo_wine + ok_eq( rawinput_size, size, UINT, "%u" );
size = sizeof(buffer); - memset(buffer, 0, sizeof(buffer)); - count = GetRawInputBuffer((RAWINPUT*)buffer, &size, sizeof(RAWINPUTHEADER)); - ok(count == 2U, "GetRawInputBuffer returned %u\n", count); - ok(size == sizeof(buffer), "GetRawInputBuffer returned unexpected size: %u\n", size); + memset( buffer, 0, sizeof(buffer) ); + ok_ret( 2, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( sizeof(buffer), size, UINT, "%u" ); + if (is_wow64) + { + ok_eq( RIM_TYPEKEYBOARD, rawbuffer64->header.dwType, UINT, "%u" ); + ok_eq( 0, rawbuffer64->header.wParam, UINT, "%u" ); + ok_eq( 0x2d, rawbuffer64->data.keyboard.MakeCode, UINT, "%#x" ); + } + else + { + ok_eq( RIM_TYPEKEYBOARD, rawbuffer->header.dwType, UINT, "%u" ); + ok_eq( 0, rawbuffer->header.wParam, UINT, "%u" ); + ok_eq( 0x2d, rawbuffer->data.keyboard.MakeCode, UINT, "%#x" ); + }
- ok(HEADER_FIELD(dwType) == RIM_TYPEKEYBOARD, "Unexpected rawinput dwType: %ld\n", HEADER_FIELD(dwType)); - ok(HEADER_FIELD(wParam) == 0 || HEADER_FIELD(wParam) == 1, "Expected wparam 0 or 1, got %Iu\n", (WPARAM)HEADER_FIELD(wParam)); - scan_code = is_wow64 ? ((RAWINPUT64 *)buffer)->data.keyboard.MakeCode : ((RAWINPUT *)buffer)->data.keyboard.MakeCode; - ok(scan_code == 0x2d, "Unexpected rawinput keyboard scan code: %x\n", scan_code); + + /* test GetRawInputBuffer interaction with WM_INPUT messages */ + + rawinputbuffer_wndproc_count = 0; + keybd_event( 'X', 1, 0, 0 ); + keybd_event( 'X', 2, KEYEVENTF_KEYUP, 0 ); + keybd_event( 'X', 3, 0, 0 ); + keybd_event( 'X', 4, KEYEVENTF_KEYUP, 0 ); + wait_messages( 100, FALSE ); + ok_eq( 2, rawinputbuffer_wndproc_count, UINT, "%u" ); + + keybd_event( 'X', 3, 0, 0 ); + keybd_event( 'X', 4, KEYEVENTF_KEYUP, 0 );
raw_devices[0].dwFlags = RIDEV_REMOVE; raw_devices[0].hwndTarget = 0; + ok_ret( 1, RegisterRawInputDevices( raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE) ) );
- SetLastError(0xdeadbeef); - ret = RegisterRawInputDevices(raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE)); - ok(ret, "RegisterRawInputDevices failed\n"); - ok(GetLastError() == 0xdeadbeef, "RegisterRawInputDevices returned %08lx\n", GetLastError());
- DestroyWindow(hwnd); + /* rawinput buffer survives registered device changes */ + + size = rawinput_size + 1; + todo_wine + ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + todo_wine + ok_eq( rawinput_size + 1, size, UINT, "%u" ); + + raw_devices[0].usUsagePage = HID_USAGE_PAGE_GENERIC; + raw_devices[0].usUsage = HID_USAGE_GENERIC_MOUSE; + raw_devices[0].dwFlags = RIDEV_INPUTSINK; + raw_devices[0].hwndTarget = hwnd; + ok_ret( 1, RegisterRawInputDevices( raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE) ) ); + + if (is_wow64) rawinput_size = sizeof(RAWINPUTHEADER64) + sizeof(RAWMOUSE); + else rawinput_size = sizeof(RAWINPUTHEADER) + sizeof(RAWMOUSE); + + size = rawinput_size + 1; + ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + ok_eq( rawinput_size + 1, size, UINT, "%u" ); + size = sizeof(buffer); + todo_wine + ok_ret( 0, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) ); + todo_wine + ok_eq( 0, size, UINT, "%u" );
-#undef HEADER_FIELD + raw_devices[0].dwFlags = RIDEV_REMOVE; + raw_devices[0].hwndTarget = 0; + ok_ret( 1, RegisterRawInputDevices( raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE) ) ); + + + ok_ret( 1, DestroyWindow( hwnd ) ); }
static BOOL rawinput_test_received_legacy; @@ -5534,6 +5550,7 @@ static void test_input_desktop( char **argv )
test_RegisterRawInputDevices(); test_GetRawInputData(); + test_GetRawInputBuffer();
ok_ret( 1, SetCursorPos( pos.x, pos.y ) ); } @@ -5601,7 +5618,6 @@ START_TEST(input) test_attach_input(); test_GetKeyState(); test_OemKeyScan(); - test_GetRawInputBuffer(); test_rawinput(argv[0]); test_DefRawInputProc();