[ros-diffs] [jimtabor] 34408: - Needed to reference the previous window handle. This prevents the window object from becoming zero during it's own demise when posting send messages. - See bug 3490.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Thu Jul 10 13:27:53 CEST 2008


Author: jimtabor
Date: Thu Jul 10 06:27:53 2008
New Revision: 34408

URL: http://svn.reactos.org/svn/reactos?rev=34408&view=rev
Log:
- Needed to reference the previous window handle. This prevents the window object from becoming zero during it's own demise when posting send messages.
- See bug 3490.

Modified:
    trunk/reactos/subsystems/win32/win32k/ntuser/focus.c

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/focus.c?rev=34408&r1=34407&r2=34408&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] Thu Jul 10 06:27:53 2008
@@ -60,13 +60,16 @@
 VOID FASTCALL
 co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate)
 {
-   USER_REFERENCE_ENTRY Ref;
-   PWINDOW_OBJECT Window;
+   USER_REFERENCE_ENTRY Ref, RefPrev;
+   PWINDOW_OBJECT Window, WindowPrev = NULL;
 
    if ((Window = UserGetWindowObject(hWnd)))
-   {
-
+   { 
       UserRefObjectCo(Window, &Ref);
+
+      WindowPrev = UserGetWindowObject(hWndPrev);
+
+      if (WindowPrev) UserRefObjectCo(WindowPrev, &RefPrev);
 
       /* Send palette messages */
       if (co_IntPostOrSendMessage(hWnd, WM_QUERYNEWPALETTE, 0, 0))
@@ -91,11 +94,11 @@
             Window->Wnd->Owner->hWndLastActive = hWnd;
       }
 
-      if (Window && hWndPrev)
+      if (Window && WindowPrev)
       {
          PWINDOW_OBJECT cWindow;
          HWND *List, *phWnd;
-         HANDLE OldTID = IntGetWndThreadId(UserGetWindowObject(hWndPrev));
+         HANDLE OldTID = IntGetWndThreadId(WindowPrev);
          HANDLE NewTID = IntGetWndThreadId(Window);
 
  DPRINT("SendActiveMessage Old -> %x, New -> %x\n", OldTID, NewTID);
@@ -126,6 +129,7 @@
                ExFreePool(List);
             }
          }
+         UserDerefObjectCo(WindowPrev); // Now allow the previous window to die.
       }
 
       UserDerefObjectCo(Window);



More information about the Ros-diffs mailing list