Pretty much the same as https://gitlab.winehq.org/wine/wine/-/merge_requests/1843, but on win32u side, to figure and validate the syscall entry signatures.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/tests/win32u.c | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+)
diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index bcfafbf13b3..3b528b526a4 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "ntuser.h"
+static BOOL (WINAPI *pNtUserEnableMouseInPointer)( BOOL );
static void test_NtUserEnumDisplayDevices(void) { @@ -694,11 +695,68 @@ static void test_NtUserDisplayConfigGetDeviceInfo(void) ok(status == STATUS_UNSUCCESSFUL || status == STATUS_NOT_SUPPORTED, "got %#lx.\n", status); }
+static void test_NtUserEnableMouseInPointer_process( const char *arg ) +{ + BOOL ret, is_wine = !strcmp( winetest_platform, "wine" ); + HANDLE win32u = GetModuleHandleW( L"win32u" ); + DWORD enable = strtoul( arg, 0, 10 ); + + /* FIXME: avoid crashing on stub call */ + if (is_wine) pNtUserEnableMouseInPointer = NULL; + else pNtUserEnableMouseInPointer = (void *)GetProcAddress( win32u, "NtUserEnableMouseInPointer" ); + + if (!pNtUserEnableMouseInPointer) ret = FALSE; + else ret = pNtUserEnableMouseInPointer( enable ); + todo_wine_if(!pNtUserEnableMouseInPointer) + ok( ret, "NtUserEnableMouseInPointer failed, error %lu\n", GetLastError() ); + + SetLastError( 0xdeadbeef ); + if (!pNtUserEnableMouseInPointer) ret = TRUE; + else ret = pNtUserEnableMouseInPointer( !enable ); + todo_wine_if(!pNtUserEnableMouseInPointer) + ok( !ret, "NtUserEnableMouseInPointer succeeded\n" ); + todo_wine_if(!pNtUserEnableMouseInPointer) + ok( GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError() ); + + if (!pNtUserEnableMouseInPointer) ret = FALSE; + else ret = pNtUserEnableMouseInPointer( enable ); + todo_wine_if(!pNtUserEnableMouseInPointer) + ok( ret, "NtUserEnableMouseInPointer failed, error %lu\n", GetLastError() ); +} + +static void test_NtUserEnableMouseInPointer( char **argv, BOOL enable ) +{ + STARTUPINFOA startup = {.cb = sizeof(STARTUPINFOA)}; + PROCESS_INFORMATION info = {0}; + char cmdline[MAX_PATH * 2]; + BOOL ret; + + sprintf( cmdline, "%s %s NtUserEnableMouseInPointer %u", argv[0], argv[1], enable ); + ret = CreateProcessA( NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info ); + ok( ret, "CreateProcessA failed, error %lu\n", GetLastError() ); + if (!ret) return; + + wait_child_process( info.hProcess ); + CloseHandle( info.hThread ); + CloseHandle( info.hProcess ); +} + START_TEST(win32u) { + char **argv; + int argc = winetest_get_mainargs( &argv ); + /* native win32u.dll fails if user32 is not loaded, so make sure it's fully initialized */ GetDesktopWindow();
+ if (argc >= 4 && strcmp(argv[2], "NtUserEnableMouseInPointer") == 0) + { + winetest_push_context( "enable %s", argv[3] ); + test_NtUserEnableMouseInPointer_process( argv[3] ); + winetest_pop_context(); + return; + } + test_NtUserEnumDisplayDevices(); test_window_props(); test_class(); @@ -712,4 +770,7 @@ START_TEST(win32u)
test_NtUserCloseWindowStation(); test_NtUserDisplayConfigGetDeviceInfo(); + + test_NtUserEnableMouseInPointer( argv, FALSE ); + test_NtUserEnableMouseInPointer( argv, TRUE ); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/tests/win32u.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 3b528b526a4..f0c53020959 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "ntuser.h"
+static BOOL (WINAPI *pNtUserIsMouseInPointerEnabled)(void); static BOOL (WINAPI *pNtUserEnableMouseInPointer)( BOOL );
static void test_NtUserEnumDisplayDevices(void) @@ -705,10 +706,23 @@ static void test_NtUserEnableMouseInPointer_process( const char *arg ) if (is_wine) pNtUserEnableMouseInPointer = NULL; else pNtUserEnableMouseInPointer = (void *)GetProcAddress( win32u, "NtUserEnableMouseInPointer" );
+ /* FIXME: avoid crashing on stub call */ + if (is_wine) pNtUserIsMouseInPointerEnabled = NULL; + else pNtUserIsMouseInPointerEnabled = (void *)GetProcAddress( win32u, "NtUserIsMouseInPointerEnabled" ); + + if (!pNtUserIsMouseInPointerEnabled) ret = TRUE; + else ret = pNtUserIsMouseInPointerEnabled(); + todo_wine_if(!pNtUserIsMouseInPointerEnabled) + ok( ret == FALSE, "NtUserIsMouseInPointerEnabled returned %u, error %lu\n", ret, GetLastError() ); + if (!pNtUserEnableMouseInPointer) ret = FALSE; else ret = pNtUserEnableMouseInPointer( enable ); todo_wine_if(!pNtUserEnableMouseInPointer) ok( ret, "NtUserEnableMouseInPointer failed, error %lu\n", GetLastError() ); + if (!pNtUserIsMouseInPointerEnabled) ret = !enable; + else ret = pNtUserIsMouseInPointerEnabled(); + todo_wine_if(!pNtUserIsMouseInPointerEnabled) + ok( ret == enable, "NtUserIsMouseInPointerEnabled returned %u, error %lu\n", ret, GetLastError() );
SetLastError( 0xdeadbeef ); if (!pNtUserEnableMouseInPointer) ret = TRUE; @@ -717,11 +731,19 @@ static void test_NtUserEnableMouseInPointer_process( const char *arg ) ok( !ret, "NtUserEnableMouseInPointer succeeded\n" ); todo_wine_if(!pNtUserEnableMouseInPointer) ok( GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError() ); + if (!pNtUserIsMouseInPointerEnabled) ret = !enable; + else ret = pNtUserIsMouseInPointerEnabled(); + todo_wine_if(!pNtUserIsMouseInPointerEnabled) + ok( ret == enable, "NtUserIsMouseInPointerEnabled returned %u, error %lu\n", ret, GetLastError() );
if (!pNtUserEnableMouseInPointer) ret = FALSE; else ret = pNtUserEnableMouseInPointer( enable ); todo_wine_if(!pNtUserEnableMouseInPointer) ok( ret, "NtUserEnableMouseInPointer failed, error %lu\n", GetLastError() ); + if (!pNtUserIsMouseInPointerEnabled) ret = !enable; + else ret = pNtUserIsMouseInPointerEnabled(); + todo_wine_if(!pNtUserIsMouseInPointerEnabled) + ok( ret == enable, "NtUserIsMouseInPointerEnabled returned %u, error %lu\n", ret, GetLastError() ); }
static void test_NtUserEnableMouseInPointer( char **argv, BOOL enable )
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/tests/win32u.c | 256 +++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+)
diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index f0c53020959..43f6049460e 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -24,9 +24,33 @@ #include "winbase.h" #include "ntuser.h"
+static BOOL (WINAPI *pNtUserGetPointerInfoList)( UINT32, POINTER_INPUT_TYPE, UINT_PTR, UINT_PTR, SIZE_T, UINT32 *, UINT32 *, void * ); static BOOL (WINAPI *pNtUserIsMouseInPointerEnabled)(void); static BOOL (WINAPI *pNtUserEnableMouseInPointer)( BOOL );
+#define check_member_( file, line, val, exp, fmt, member ) \ + ok_(file, line)( (val).member == (exp).member, "got " #member " " fmt "\n", (val).member ) +#define check_member( val, exp, fmt, member ) \ + check_member_( __FILE__, __LINE__, val, exp, fmt, member ) + +static void flush_events(void) +{ + int min_timeout = 100, diff = 200; + DWORD time = GetTickCount() + diff; + MSG msg; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break; + while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) + { + TranslateMessage( &msg ); + DispatchMessageA( &msg ); + } + diff = time - GetTickCount(); + } +} + static void test_NtUserEnumDisplayDevices(void) { NTSTATUS ret; @@ -696,6 +720,232 @@ static void test_NtUserDisplayConfigGetDeviceInfo(void) ok(status == STATUS_UNSUCCESSFUL || status == STATUS_NOT_SUPPORTED, "got %#lx.\n", status); }
+static DWORD CALLBACK test_NtUserGetPointerInfoList_thread( void *arg ) +{ + POINTER_INFO pointer_info[4] = {0}; + UINT32 entry_count, pointer_count; + HWND hwnd; + BOOL ret; + + hwnd = CreateWindowW( L"test", L"test name", WS_OVERLAPPEDWINDOW | WS_VISIBLE, + 100, 100, 200, 200, 0, 0, NULL, 0 ); + flush_events(); + + memset( &pointer_info, 0xcd, sizeof(pointer_info) ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + ok( pointer_count == 2, "got pointer_count %u\n", pointer_count ); + ok( entry_count == 2, "got entry_count %u\n", entry_count ); + + DestroyWindow( hwnd ); + + return 0; +} + +#define check_pointer_info( a, b ) check_pointer_info_( __LINE__, a, b ) +static void check_pointer_info_( int line, const POINTER_INFO *actual, const POINTER_INFO *expected ) +{ + check_member( *actual, *expected, "%#lx", pointerType ); + check_member( *actual, *expected, "%#x", pointerId ); + check_member( *actual, *expected, "%#x", frameId ); + check_member( *actual, *expected, "%#x", pointerFlags ); + check_member( *actual, *expected, "%p", sourceDevice ); + check_member( *actual, *expected, "%p", hwndTarget ); + check_member( *actual, *expected, "%+ld", ptPixelLocation.x ); + check_member( *actual, *expected, "%+ld", ptPixelLocation.y ); + check_member( *actual, *expected, "%+ld", ptHimetricLocation.x ); + check_member( *actual, *expected, "%+ld", ptHimetricLocation.y ); + check_member( *actual, *expected, "%+ld", ptPixelLocationRaw.x ); + check_member( *actual, *expected, "%+ld", ptPixelLocationRaw.y ); + check_member( *actual, *expected, "%+ld", ptHimetricLocationRaw.x ); + check_member( *actual, *expected, "%+ld", ptHimetricLocationRaw.y ); + check_member( *actual, *expected, "%lu", dwTime ); + check_member( *actual, *expected, "%u", historyCount ); + check_member( *actual, *expected, "%#x", InputData ); + check_member( *actual, *expected, "%#lx", dwKeyStates ); + check_member( *actual, *expected, "%I64u", PerformanceCount ); + check_member( *actual, *expected, "%#x", ButtonChangeType ); +} + +static void test_NtUserGetPointerInfoList( BOOL mouse_in_pointer_enabled ) +{ + void *invalid_ptr = (void *)0xdeadbeef; + POINTER_TOUCH_INFO touch_info[4] = {0}; + POINTER_PEN_INFO pen_info[4] = {0}; + POINTER_INFO pointer_info[4] = {0}; + UINT32 entry_count, pointer_count; + WNDCLASSW cls = + { + .lpfnWndProc = DefWindowProcW, + .hInstance = GetModuleHandleW( NULL ), + .hbrBackground = GetStockObject( WHITE_BRUSH ), + .lpszClassName = L"test", + }; + HANDLE thread; + SIZE_T size; + ATOM class; + DWORD res; + HWND hwnd; + BOOL ret; + + if (!pNtUserGetPointerInfoList) + { + todo_wine + win_skip( "NtUserGetPointerInfoList not found, skipping tests\n" ); + return; + } + + class = RegisterClassW( &cls ); + ok( class, "RegisterClassW failed: %lu\n", GetLastError() ); + + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), invalid_ptr, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, invalid_ptr, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, invalid_ptr ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || broken(GetLastError() == ERROR_INVALID_PARAMETER) /* w10 32bit */, "got error %lu\n", GetLastError() ); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + ok( pointer_count == 2, "got pointer_count %u\n", pointer_count ); + ok( entry_count == 2, "got entry_count %u\n", entry_count ); + + SetCursorPos( 500, 500 ); /* avoid generating mouse message on window creation */ + + hwnd = CreateWindowW( L"test", L"test name", WS_OVERLAPPEDWINDOW | WS_VISIBLE, + 100, 100, 200, 200, 0, 0, NULL, 0 ); + flush_events(); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + ok( pointer_count == 2, "got pointer_count %u\n", pointer_count ); + ok( entry_count == 2, "got entry_count %u\n", entry_count ); + + SetCursorPos( 200, 200 ); + flush_events(); + mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); + flush_events(); + mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); + flush_events(); + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + flush_events(); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, pointer_info ); + ok( ret == mouse_in_pointer_enabled, "NtUserGetPointerInfoList failed, error %lu\n", GetLastError() ); + if (!mouse_in_pointer_enabled) + { + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + return; + } + + ok( pointer_count == 1, "got pointer_count %u\n", pointer_count ); + ok( entry_count == 1, "got entry_count %u\n", entry_count ); + ok( pointer_info[0].pointerType == PT_MOUSE, "got pointerType %lu\n", pointer_info[0].pointerType ); + ok( pointer_info[0].pointerId == 1, "got pointerId %u\n", pointer_info[0].pointerId ); + ok( !!pointer_info[0].frameId, "got frameId %u\n", pointer_info[0].frameId ); + ok( pointer_info[0].pointerFlags == (0x20000 | POINTER_MESSAGE_FLAG_INRANGE | POINTER_MESSAGE_FLAG_PRIMARY), + "got pointerFlags %#x\n", pointer_info[0].pointerFlags ); + ok( pointer_info[0].sourceDevice == INVALID_HANDLE_VALUE || broken(!!pointer_info[0].sourceDevice) /* w1064v1809 32bit */, + "got sourceDevice %p\n", pointer_info[0].sourceDevice ); + ok( pointer_info[0].hwndTarget == hwnd, "got hwndTarget %p\n", pointer_info[0].hwndTarget ); + ok( !!pointer_info[0].ptPixelLocation.x, "got ptPixelLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocation ) ); + ok( !!pointer_info[0].ptPixelLocation.y, "got ptPixelLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocation ) ); + ok( !!pointer_info[0].ptHimetricLocation.x, "got ptHimetricLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocation ) ); + ok( !!pointer_info[0].ptHimetricLocation.y, "got ptHimetricLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocation ) ); + ok( !!pointer_info[0].ptPixelLocationRaw.x, "got ptPixelLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocationRaw ) ); + ok( !!pointer_info[0].ptPixelLocationRaw.y, "got ptPixelLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocationRaw ) ); + ok( !!pointer_info[0].ptHimetricLocationRaw.x, "got ptHimetricLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocationRaw ) ); + ok( !!pointer_info[0].ptHimetricLocationRaw.y, "got ptHimetricLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocationRaw ) ); + ok( !!pointer_info[0].dwTime, "got dwTime %lu\n", pointer_info[0].dwTime ); + ok( pointer_info[0].historyCount == 1, "got historyCount %u\n", pointer_info[0].historyCount ); + ok( pointer_info[0].InputData == 0, "got InputData %u\n", pointer_info[0].InputData ); + ok( pointer_info[0].dwKeyStates == 0, "got dwKeyStates %lu\n", pointer_info[0].dwKeyStates ); + ok( !!pointer_info[0].PerformanceCount, "got PerformanceCount %I64u\n", pointer_info[0].PerformanceCount ); + ok( pointer_info[0].ButtonChangeType == 0, "got ButtonChangeType %u\n", pointer_info[0].ButtonChangeType ); + + thread = CreateThread( NULL, 0, test_NtUserGetPointerInfoList_thread, NULL, 0, NULL ); + res = WaitForSingleObject( thread, 5000 ); + ok( !res, "WaitForSingleObject returned %#lx, error %lu\n", res, GetLastError() ); + + memset( pen_info, 0xa5, sizeof(pen_info) ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_PEN, 0, 0, sizeof(POINTER_PEN_INFO), &entry_count, &pointer_count, pen_info ); + ok( ret, "NtUserGetPointerInfoList failed, error %lu\n", GetLastError() ); + ok( pointer_count == 1, "got pointer_count %u\n", pointer_count ); + ok( entry_count == 1, "got entry_count %u\n", entry_count ); + check_pointer_info( &pen_info[0].pointerInfo, &pointer_info[0] ); + memset( touch_info, 0xa5, sizeof(touch_info) ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_TOUCH, 0, 0, sizeof(POINTER_TOUCH_INFO), &entry_count, &pointer_count, touch_info ); + ok( ret, "NtUserGetPointerInfoList failed, error %lu\n", GetLastError() ); + ok( pointer_count == 1, "got pointer_count %u\n", pointer_count ); + ok( entry_count == 1, "got entry_count %u\n", entry_count ); + check_pointer_info( &touch_info[0].pointerInfo, &pointer_info[0] ); + + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO) - 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_PEN, 0, 0, sizeof(POINTER_PEN_INFO) - 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_TOUCH, 0, 0, sizeof(POINTER_TOUCH_INFO) - 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_TOUCHPAD, 0, 0, sizeof(POINTER_TOUCH_INFO) - 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO) + 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_PEN, 0, 0, sizeof(POINTER_PEN_INFO) + 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_TOUCH, 0, 0, sizeof(POINTER_TOUCH_INFO) + 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_TOUCHPAD, 0, 0, sizeof(POINTER_TOUCH_INFO) + 1, &entry_count, &pointer_count, pointer_info ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + + for (size = 0; size < 0xfff; ++size) + { + char buffer[0x1000]; + entry_count = pointer_count = 2; + ret = pNtUserGetPointerInfoList( 1, PT_MOUSE, 0, 0, size, &entry_count, &pointer_count, buffer ); + ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + } + + DestroyWindow( hwnd ); + + ret = UnregisterClassW( L"test", GetModuleHandleW(NULL) ); + ok( ret, "UnregisterClassW failed: %lu\n", GetLastError() ); +} + static void test_NtUserEnableMouseInPointer_process( const char *arg ) { BOOL ret, is_wine = !strcmp( winetest_platform, "wine" ); @@ -710,6 +960,10 @@ static void test_NtUserEnableMouseInPointer_process( const char *arg ) if (is_wine) pNtUserIsMouseInPointerEnabled = NULL; else pNtUserIsMouseInPointerEnabled = (void *)GetProcAddress( win32u, "NtUserIsMouseInPointerEnabled" );
+ /* FIXME: avoid crashing on stub call */ + if (is_wine) pNtUserGetPointerInfoList = NULL; + else pNtUserGetPointerInfoList = (void *)GetProcAddress( win32u, "NtUserGetPointerInfoList" ); + if (!pNtUserIsMouseInPointerEnabled) ret = TRUE; else ret = pNtUserIsMouseInPointerEnabled(); todo_wine_if(!pNtUserIsMouseInPointerEnabled) @@ -744,6 +998,8 @@ static void test_NtUserEnableMouseInPointer_process( const char *arg ) else ret = pNtUserIsMouseInPointerEnabled(); todo_wine_if(!pNtUserIsMouseInPointerEnabled) ok( ret == enable, "NtUserIsMouseInPointerEnabled returned %u, error %lu\n", ret, GetLastError() ); + + test_NtUserGetPointerInfoList( enable ); }
static void test_NtUserEnableMouseInPointer( char **argv, BOOL enable )