[WIN32K:NTUSER] co_UserDestroyWindow(): Simplify the destruction of the owned windows.

This commit is contained in:
Hermès Bélusca-Maïto 2018-09-01 23:45:11 +02:00
parent e286c4c520
commit 4d48b88bfb
No known key found for this signature in database
GPG Key ID: 3B2539C65E7B93D0

View File

@ -2740,58 +2740,41 @@ BOOLEAN co_UserDestroyWindow(PVOID Object)
return TRUE;
}
/* Recursively destroy owned windows */
/* Recursively destroy owned windows */
if (!(Window->style & WS_CHILD))
{
HWND* List;
HWND* phWnd;
PWND pWnd;
if (! (Window->style & WS_CHILD))
{
for (;;)
{
BOOL GotOne = FALSE;
HWND *Children;
HWND *ChildHandle;
PWND Child, Desktop;
Desktop = IntIsDesktopWindow(Window) ? Window :
UserGetWindowObject(IntGetDesktopWindow());
Children = IntWinListChildren(Desktop);
if (Children)
{
for (ChildHandle = Children; *ChildHandle; ++ChildHandle)
List = IntWinListOwnedPopups(Window);
if (List)
{
for (phWnd = List; *phWnd; ++phWnd)
{
Child = UserGetWindowObject(*ChildHandle);
if (Child == NULL)
continue;
if (Child->spwndOwner != Window)
{
continue;
}
if (IntWndBelongsToThread(Child, PsGetCurrentThreadWin32Thread()))
{
USER_REFERENCE_ENTRY ChildRef;
UserRefObjectCo(Child, &ChildRef); // Temp HACK?
co_UserDestroyWindow(Child);
UserDerefObjectCo(Child); // Temp HACK?
GotOne = TRUE;
continue;
}
if (Child->spwndOwner != NULL)
{
Child->spwndOwner = NULL;
}
pWnd = ValidateHwndNoErr(*phWnd);
if (pWnd == NULL)
continue;
ASSERT(pWnd->spwndOwner == Window);
ASSERT(pWnd != Window);
pWnd->spwndOwner = NULL;
if (IntWndBelongsToThread(pWnd, PsGetCurrentThreadWin32Thread()))
{
USER_REFERENCE_ENTRY Ref;
UserRefObjectCo(pWnd, &Ref); // Temp HACK?
co_UserDestroyWindow(pWnd);
UserDerefObjectCo(pWnd); // Temp HACK?
}
else
{
ERR("IntWndBelongsToThread(0x%p) is FALSE, ignoring.\n", pWnd);
}
}
ExFreePoolWithTag(Children, USERTAG_WINDOWLIST);
}
if (! GotOne)
{
break;
}
}
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
}
/* Generate mouse move message for the next window */
msg.message = WM_MOUSEMOVE;