user32/tests: Don't kill explorer to test shell window.

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@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Esme Povirk 2020-12-28 15:14:45 -06:00 committed by Alexandre Julliard
parent 3e8b27fef3
commit bc2e193d9a
1 changed files with 24 additions and 72 deletions

View File

@ -1288,88 +1288,25 @@ 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");
ok(shellWindow == NULL, "Newly created desktop has a shell window %p\n", shellWindow);
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(!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);
}
hwnd1 = CreateWindowExA(0, "#32770", "TEST1", WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/, 100, 100, 300, 200, 0, 0, hinst, 0);
ret = SetShellWindow(hwnd1);
@ -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();
}