[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

@ -2741,55 +2741,38 @@ BOOLEAN co_UserDestroyWindow(PVOID Object)
} }
/* Recursively destroy owned windows */ /* Recursively destroy owned windows */
if (!(Window->style & WS_CHILD)) if (!(Window->style & WS_CHILD))
{ {
for (;;) HWND* List;
{ HWND* phWnd;
BOOL GotOne = FALSE; PWND pWnd;
HWND *Children;
HWND *ChildHandle;
PWND Child, Desktop;
Desktop = IntIsDesktopWindow(Window) ? Window : List = IntWinListOwnedPopups(Window);
UserGetWindowObject(IntGetDesktopWindow()); if (List)
Children = IntWinListChildren(Desktop);
if (Children)
{ {
for (ChildHandle = Children; *ChildHandle; ++ChildHandle) for (phWnd = List; *phWnd; ++phWnd)
{ {
Child = UserGetWindowObject(*ChildHandle); pWnd = ValidateHwndNoErr(*phWnd);
if (Child == NULL) if (pWnd == NULL)
continue; continue;
if (Child->spwndOwner != Window) ASSERT(pWnd->spwndOwner == Window);
ASSERT(pWnd != Window);
pWnd->spwndOwner = NULL;
if (IntWndBelongsToThread(pWnd, PsGetCurrentThreadWin32Thread()))
{ {
continue; 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);
}
} }
if (IntWndBelongsToThread(Child, PsGetCurrentThreadWin32Thread())) ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
{
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;
}
}
ExFreePoolWithTag(Children, USERTAG_WINDOWLIST);
}
if (! GotOne)
{
break;
}
} }
} }