https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4d48b88bfbfcb6845e874…
commit 4d48b88bfbfcb6845e8742f78154156e984f6363
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sat Sep 1 23:45:11 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sat Sep 1 23:46:21 2018 +0200
[WIN32K:NTUSER] co_UserDestroyWindow(): Simplify the destruction of the owned
windows.
---
win32ss/user/ntuser/window.c | 81 +++++++++++++++++---------------------------
1 file changed, 32 insertions(+), 49 deletions(-)
diff --git a/win32ss/user/ntuser/window.c b/win32ss/user/ntuser/window.c
index 4776b8e9d3..7d6ac87155 100644
--- a/win32ss/user/ntuser/window.c
+++ b/win32ss/user/ntuser/window.c
@@ -2740,58 +2740,41 @@ BOOLEAN co_UserDestroyWindow(PVOID Object)
return TRUE;
}
- /* Recursively destroy owned windows */
-
- 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);
+ /* Recursively destroy owned windows */
+ if (!(Window->style & WS_CHILD))
+ {
+ HWND* List;
+ HWND* phWnd;
+ PWND pWnd;
- 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;