[PATCH] user32/tests: Don't kill explorer to test shell window.
Esme Povirk
esme at codeweavers.com
Mon Dec 28 15:14:45 CST 2020
Killing explorer breaks later tests. We can create a new desktop
without a shell instead.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48142
Signed-off-by: Esme Povirk <esme at codeweavers.com>
---
dlls/user32/tests/win.c | 96 +++++++++++------------------------------
1 file changed, 24 insertions(+), 72 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 843da8900f1..c9d2819e1a9 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -1288,87 +1288,24 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam)
return CallNextHookEx(hhook, nCode, wParam, lParam);
}
-static const WCHAR winlogonW[] =
- {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
- 'W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
- 'W','i','n','l','o','g','o','n',0};
-static const WCHAR autorestartshellW[] =
- {'A','u','t','o','R','e','s','t','a','r','t','S','h','e','l','l',0};
-
-static DWORD get_autorestart(void)
-{
- DWORD type, val, len = sizeof(val);
- REGSAM access = KEY_ALL_ACCESS|KEY_WOW64_64KEY;
- HKEY hkey;
- LONG res;
-
- if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, winlogonW, 0, 0, 0, access, NULL, &hkey, 0 )) return 0;
- res = RegQueryValueExW( hkey, autorestartshellW, NULL, &type, (BYTE *)&val, &len );
- RegCloseKey( hkey );
- return (!res && type == REG_DWORD) ? val : 0;
-}
-
-static BOOL set_autorestart( DWORD val )
-{
- REGSAM access = KEY_ALL_ACCESS|KEY_WOW64_64KEY;
- HKEY hkey;
- LONG res;
-
- if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, winlogonW, 0, 0, 0, access, NULL, &hkey, 0 )) return FALSE;
- res = RegSetValueExW( hkey, autorestartshellW, 0, REG_DWORD, (BYTE *)&val, sizeof(val) );
- RegCloseKey( hkey );
- return !res;
-}
-
-static void test_shell_window(void)
+static DWORD WINAPI test_shell_window_thread(LPVOID param)
{
BOOL ret;
- DWORD error, restart = get_autorestart();
HMODULE hinst, hUser32;
BOOL (WINAPI*SetShellWindow)(HWND);
HWND hwnd1, hwnd2, hwnd3, hwnd4, hwnd5;
HWND shellWindow, nextWnd;
+ HDESK testDesktop = (HDESK)param;
- if (restart && !set_autorestart(0))
- {
- skip("cannot disable automatic shell restart (needs admin rights\n");
- return;
- }
+ SetThreadDesktop(testDesktop);
shellWindow = GetShellWindow();
hinst = GetModuleHandleA(NULL);
hUser32 = GetModuleHandleA("user32");
- SetShellWindow = (void *)GetProcAddress(hUser32, "SetShellWindow");
-
- if (shellWindow) {
- DWORD pid;
- HANDLE hProcess;
-
- GetWindowThreadProcessId(shellWindow, &pid);
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
- if (!hProcess)
- {
- skip( "cannot get access to shell process\n" );
- set_autorestart(restart);
- return;
- }
-
- SetLastError(0xdeadbeef);
- ret = DestroyWindow(shellWindow);
- error = GetLastError();
+ ok(shellWindow == NULL, "Newly created desktop has a shell window %p\n", shellWindow);
- ok(!ret, "DestroyWindow(shellWindow)\n");
- /* passes on Win XP, but not on Win98 */
- ok(error==ERROR_ACCESS_DENIED || error == 0xdeadbeef,
- "got %u after DestroyWindow(shellWindow)\n", error);
-
- /* close old shell instance */
- ret = TerminateProcess(hProcess, 0);
- ok(ret, "termination of previous shell process failed: GetLastError()=%d\n", GetLastError());
- WaitForSingleObject(hProcess, INFINITE); /* wait for termination */
- CloseHandle(hProcess);
- }
+ SetShellWindow = (void *)GetProcAddress(hUser32, "SetShellWindow");
hwnd1 = CreateWindowExA(0, "#32770", "TEST1", WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/, 100, 100, 300, 200, 0, 0, hinst, 0);
@@ -1381,8 +1318,8 @@ static void test_shell_window(void)
ok(!ret, "second call to SetShellWindow(hwnd1)\n");
ret = SetShellWindow(0);
- error = GetLastError();
/* passes on Win XP, but not on Win98
+ DWORD error = GetLastError();
ok(!ret, "reset shell window by SetShellWindow(0)\n");
ok(error==ERROR_INVALID_WINDOW_HANDLE, "ERROR_INVALID_WINDOW_HANDLE after SetShellWindow(0)\n"); */
@@ -1442,7 +1379,24 @@ static void test_shell_window(void)
DestroyWindow(hwnd3);
DestroyWindow(hwnd4);
DestroyWindow(hwnd5);
- set_autorestart(restart);
+
+ return 0;
+}
+
+static void test_shell_window(void)
+{
+ HDESK hdesk;
+ HANDLE hthread;
+
+ hdesk = CreateDesktopA("winetest", NULL, NULL, 0, GENERIC_ALL, NULL);
+
+ hthread = CreateThread(NULL, 0, test_shell_window_thread, (LPVOID)hdesk, 0, NULL);
+
+ WaitForSingleObject(hthread, INFINITE);
+
+ DeleteObject(hthread);
+
+ CloseDesktop(hdesk);
}
/************** MDI test ****************/
@@ -12075,7 +12029,5 @@ START_TEST(win)
*/
test_topmost();
- /* Execute the SetShellWindow() test last, since it kills explorer and that
- * breaks a lot of things. */
test_shell_window();
}
--
2.25.1
More information about the wine-devel
mailing list