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 ); }