[ros-diffs] [jimtabor] 44575: [Win32k] - Michael Martin found a create window and crash exit issue by testing programs from http://www.magma.ca/~wjr/ PEview. Fixed by replacing UserFreeWindowInfo with co_UserDestroyWindow at cleanup exit. - Added more window death and thread checks. - Started the morphing into WND structure from window object. - Tested: wine user32 tests, AbiWord 2.6.8, Seamonkey 2.0, FF 3.5 and OOo 2.4.3.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Mon Dec 14 06:02:56 CET 2009


Author: jimtabor
Date: Mon Dec 14 06:02:56 2009
New Revision: 44575

URL: http://svn.reactos.org/svn/reactos?rev=44575&view=rev
Log:
[Win32k]
- Michael Martin found a create window and crash exit issue by testing programs from http://www.magma.ca/~wjr/ PEview. Fixed by replacing UserFreeWindowInfo with co_UserDestroyWindow at cleanup exit.
- Added more window death and thread checks.
- Started the morphing into WND structure from window object.
- Tested: wine user32 tests, AbiWord 2.6.8, Seamonkey 2.0, FF 3.5 and OOo 2.4.3.

Modified:
    trunk/reactos/subsystems/win32/win32k/include/input.h
    trunk/reactos/subsystems/win32/win32k/include/window.h
    trunk/reactos/subsystems/win32/win32k/ntuser/class.c
    trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
    trunk/reactos/subsystems/win32/win32k/ntuser/message.c
    trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c
    trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
    trunk/reactos/subsystems/win32/win32k/ntuser/vis.c
    trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
    trunk/reactos/subsystems/win32/win32k/ntuser/window.c
    trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c

Modified: trunk/reactos/subsystems/win32/win32k/include/input.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/input.h?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/input.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/input.h [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -43,6 +43,7 @@
 BOOL UserInitDefaultKeyboardLayout();
 PKBL UserHklToKbl(HKL hKl);
 BOOL FASTCALL UserAttachThreadInput(PTHREADINFO,PTHREADINFO,BOOL);
+BOOL FASTCALL IntConnectThreadInput(PTHREADINFO,PTHREADINFO*,PUSER_MESSAGE_QUEUE*);
 
 #define ThreadHasInputAccess(W32Thread) \
   (TRUE)

Modified: trunk/reactos/subsystems/win32/win32k/include/window.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/window.h?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -26,7 +26,7 @@
   PWND Wnd;
 
   /* Pointer to the thread information */
-  PTHREADINFO ti;
+  PTHREADINFO pti; // Use Wnd->head.pti
   /* Pointer to the desktop */
   PDESKTOPINFO Desktop;
   /* system menu handle. */
@@ -43,21 +43,21 @@
   HANDLE WindowRegion;
   /* Pointer to the owning thread's message queue. */
   PUSER_MESSAGE_QUEUE MessageQueue;
-  struct _WINDOW_OBJECT* FirstChild;
+  struct _WINDOW_OBJECT* spwndChild;
   struct _WINDOW_OBJECT* LastChild;
-  struct _WINDOW_OBJECT* NextSibling;
-  struct _WINDOW_OBJECT* PrevSibling;
+  struct _WINDOW_OBJECT* spwndNext;
+  struct _WINDOW_OBJECT* spwndPrev;
   /* Entry in the list of thread windows. */
   LIST_ENTRY ThreadListEntry;
   /* Handle to the parent window. */
-  struct _WINDOW_OBJECT* Parent;
+  struct _WINDOW_OBJECT* spwndParent;
   /* Handle to the owner window. */
-  HWND hOwner;
+  HWND hOwner; // Use spwndOwner
   /* DC Entries (DCE) */
   PDCE Dce;
   /* Scrollbar info */
   PWINDOW_SCROLLINFO Scroll;
-  PETHREAD OwnerThread;
+  PETHREAD OwnerThread; // Use Wnd->head.pti
   HWND hWndLastPopup; /* handle to last active popup window (wine doesn't use pointer, for unk. reason)*/
   ULONG Status;
   /* counter for tiled child windows */
@@ -71,7 +71,7 @@
 #define WINDOWOBJECT_NEED_ERASEBKGND      (0x00000002) // WNDS_ERASEBACKGROUND
 #define WINDOWOBJECT_NEED_NCPAINT         (0x00000004) // WNDS_SENDNCPAINT
 #define WINDOWOBJECT_NEED_INTERNALPAINT   (0x00000008) // WNDS_INTERNALPAINT
-#define WINDOWOBJECT_RESTOREMAX           (0x00000020)
+#define WINDOWOBJECT_RESTOREMAX           (0x00000020) // Set/Clr WS_MAXIMIZE && Clr/Set WS_EX2_VERTICALLYMAXIMIZEDLEFT/RIGHT
 
 #define WINDOWSTATUS_DESTROYING         (0x1) // WNDS2_INDESTROY
 #define WINDOWSTATUS_DESTROYED          (0x2) // WNDS_DESTROYED
@@ -88,7 +88,7 @@
             (((Style) & WS_BORDER) || (!((Style) & (WS_CHILD | WS_POPUP))))
 
 #define IntIsDesktopWindow(WndObj) \
-  (WndObj->Parent == NULL)
+  (WndObj->spwndParent == NULL)
 
 #define IntIsBroadcastHwnd(hWnd) \
   (hWnd == HWND_BROADCAST || hWnd == HWND_TOPMOST)

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/class.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/class.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/class.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/class.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -2195,7 +2195,7 @@
     Window = UserGetWindowObject(hWnd);
     if (Window != NULL)
     {
-        if (Window->ti->ppi != pi)
+        if (Window->pti->ppi != pi)
         {
             SetLastWin32Error(ERROR_ACCESS_DENIED);
             goto Cleanup;

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=44575&r1=44574&r2=44575&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] Mon Dec 14 06:02:56 2009
@@ -178,7 +178,7 @@
    HWND Ret;
    PWINDOW_OBJECT Child, OwnerWnd;
 
-   for(Child = Root->FirstChild; Child; Child = Child->NextSibling)
+   for(Child = Root->spwndChild; Child; Child = Child->spwndNext)
    {
       OwnerWnd = UserGetWindowObject(Child->hOwner);
       if(!OwnerWnd)

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/message.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/message.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -291,10 +291,10 @@
 {
    BOOL SameThread = FALSE;
 
-   if (Window->ti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread()))
+   if (Window->pti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread()))
       SameThread = TRUE;
 
-   if ((!SameThread && (Window->ti->fsHooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) ||
+   if ((!SameThread && (Window->pti->fsHooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) ||
         (SameThread && ISITHOOKED(WH_CALLWNDPROC)) )
    {
       CWPSTRUCT CWP;
@@ -314,10 +314,10 @@
 {
    BOOL SameThread = FALSE;
 
-   if (Window->ti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread()))
+   if (Window->pti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread()))
       SameThread = TRUE;
 
-   if ((!SameThread && (Window->ti->fsHooks & HOOKID_TO_FLAG(WH_CALLWNDPROCRET))) ||
+   if ((!SameThread && (Window->pti->fsHooks & HOOKID_TO_FLAG(WH_CALLWNDPROCRET))) ||
         (SameThread && ISITHOOKED(WH_CALLWNDPROCRET)) )
    {
       CWPRETSTRUCT CWPR;

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -77,9 +77,9 @@
 
   Window = UserGetWindowObject(hWnd);
 
-  if (Window && Window->ti)
+  if (Window && Window->pti)
   {
-     if (Window->ti->fsHooks & HOOKID_TO_FLAG(WH_FOREGROUNDIDLE))
+     if (Window->pti->fsHooks & HOOKID_TO_FLAG(WH_FOREGROUNDIDLE))
      {
         co_HOOK_CallHooks(WH_FOREGROUNDIDLE,HC_ACTION,0,0);
      }
@@ -582,7 +582,7 @@
    if (DesktopWindow)
    {
        UserRefObjectCo(DesktopWindow, &Ref);//can DesktopWindow be NULL?
-       Desk = DesktopWindow->ti->pDeskInfo;
+       Desk = DesktopWindow->pti->pDeskInfo;
    }
 
    /* Process messages in the message queue itself. */

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/painting.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/painting.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/painting.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -41,7 +41,7 @@
    PWINDOW_OBJECT ParentWindow;
    PWND ParentWnd;
 
-   ParentWindow = Child->Parent;
+   ParentWindow = Child->spwndParent;
    while (ParentWindow != NULL)
    {
       ParentWnd = ParentWindow->Wnd;
@@ -58,7 +58,7 @@
 
       /* FIXME: Layered windows. */
 
-      ParentWindow = ParentWindow->Parent;
+      ParentWindow = ParentWindow->spwndParent;
    }
 
    return TRUE;
@@ -67,7 +67,7 @@
 BOOL FASTCALL
 IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse)
 {
-   PWINDOW_OBJECT ParentWindow = Child->Parent;
+   PWINDOW_OBJECT ParentWindow = Child->spwndParent;
    PWND ParentWnd;
 
    while (ParentWindow)
@@ -85,7 +85,7 @@
                               RDW_VALIDATE | RDW_NOCHILDREN);
       }
 
-      ParentWindow = ParentWindow->Parent;
+      ParentWindow = ParentWindow->spwndParent;
    }
 
    return TRUE;
@@ -438,7 +438,7 @@
    {
       PWINDOW_OBJECT Child;
 
-      for (Child = Window->FirstChild; Child; Child = Child->NextSibling)
+      for (Child = Window->spwndChild; Child; Child = Child->spwndNext)
       {
          if (Child->Wnd->style & WS_VISIBLE)
          {
@@ -494,7 +494,7 @@
    PWINDOW_OBJECT WndObject;
    PWND Wnd;
 
-   for (WndObject = Window; WndObject != NULL; WndObject = WndObject->Parent)
+   for (WndObject = Window; WndObject != NULL; WndObject = WndObject->spwndParent)
    {
       Wnd = WndObject->Wnd;
       if (!(Wnd->style & WS_VISIBLE) ||
@@ -623,7 +623,7 @@
    PWINDOW_OBJECT TempWindow;
    PWND Wnd, TempWnd;
 
-   for (; Window != NULL; Window = Window->NextSibling)
+   for (; Window != NULL; Window = Window->spwndNext)
    {
       Wnd = Window->Wnd;
       if (IntWndBelongsToThread(Window, Thread) &&
@@ -632,8 +632,8 @@
          /* Make sure all non-transparent siblings are already drawn. */
          if (Wnd->ExStyle & WS_EX_TRANSPARENT)
          {
-            for (TempWindow = Window->NextSibling; TempWindow != NULL;
-                 TempWindow = TempWindow->NextSibling)
+            for (TempWindow = Window->spwndNext; TempWindow != NULL;
+                 TempWindow = TempWindow->spwndNext)
             {
                TempWnd = TempWindow->Wnd;
                if (!(TempWnd->ExStyle & WS_EX_TRANSPARENT) &&
@@ -648,9 +648,9 @@
          return Window->hSelf;
       }
 
-      if (Window->FirstChild)
-      {
-         hChild = IntFindWindowToRepaint(Window->FirstChild, Thread);
+      if (Window->spwndChild)
+      {
+         hChild = IntFindWindowToRepaint(Window->spwndChild, Thread);
          if (hChild != NULL)
             return hChild;
       }
@@ -825,7 +825,7 @@
       if (!(Wnd->style & WS_CLIPCHILDREN))
       {
          PWINDOW_OBJECT Child;
-         for (Child = Window->FirstChild; Child; Child = Child->NextSibling)
+         for (Child = Window->spwndChild; Child; Child = Child->spwndNext)
          {
             IntInvalidateWindows(Child, Window->UpdateRegion, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
          }
@@ -1406,7 +1406,7 @@
       RECTL rcDummy;
 
       IntGetClientOrigin(Window, &ClientOrigin);
-      for (Child = Window->FirstChild; Child; Child = Child->NextSibling)
+      for (Child = Window->spwndChild; Child; Child = Child->spwndNext)
       {
          rcChild = Child->Wnd->rcWindow;
          rcChild.left -= ClientOrigin.x;

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/vis.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/vis.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/vis.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/vis.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -65,11 +65,18 @@
 
    PreviousWindow = Window;
    PreviousWnd = PreviousWindow->Wnd;
-   CurrentWindow = Window->Parent;
+   CurrentWindow = Window->spwndParent;
    while (CurrentWindow)
    {
+      if ( CurrentWindow->Status & WINDOWSTATUS_DESTROYING ||
+           CurrentWindow->Status & WINDOWSTATUS_DESTROYED )
+      {
+         DPRINT1("ATM the Current Window or Parent is dead!\n");
+         return NULL;
+      }
+
       CurrentWnd = CurrentWindow->Wnd;
-      if (!(CurrentWnd) || !(CurrentWnd->style & WS_VISIBLE))
+      if (!CurrentWnd || !(CurrentWnd->style & WS_VISIBLE))
       {
          GreDeleteObject(VisRgn);
          return NULL;
@@ -82,7 +89,7 @@
       if ((PreviousWnd->style & WS_CLIPSIBLINGS) ||
           (PreviousWnd == Wnd && ClipSiblings))
       {
-         CurrentSibling = CurrentWindow->FirstChild;
+         CurrentSibling = CurrentWindow->spwndChild;
          while (CurrentSibling != NULL && CurrentSibling != PreviousWindow)
          {
             CurrentSiblingWnd = CurrentSibling->Wnd;
@@ -100,18 +107,18 @@
                NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF);
                GreDeleteObject(ClipRgn);
             }
-            CurrentSibling = CurrentSibling->NextSibling;
+            CurrentSibling = CurrentSibling->spwndNext;
          }
       }
 
       PreviousWindow = CurrentWindow;
       PreviousWnd = PreviousWindow->Wnd;
-      CurrentWindow = CurrentWindow->Parent;
+      CurrentWindow = CurrentWindow->spwndParent;
    }
 
    if (ClipChildren)
    {
-      CurrentWindow = Window->FirstChild;
+      CurrentWindow = Window->spwndChild;
       while (CurrentWindow)
       {
          CurrentWnd = CurrentWindow->Wnd;
@@ -129,7 +136,7 @@
             NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF);
             GreDeleteObject(ClipRgn);
          }
-         CurrentWindow = CurrentWindow->NextSibling;
+         CurrentWindow = CurrentWindow->spwndNext;
       }
    }
 
@@ -160,7 +167,7 @@
    Temp = NtGdiCreateRectRgn(0, 0, 0, 0);
    NtGdiCombineRgn(Temp, NewlyExposed, NULL, RGN_COPY);
 
-   Parent = Window->Parent;
+   Parent = Window->spwndParent;
    if(Parent)
    {
       ParentWnd = Parent->Wnd;

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/windc.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -242,7 +242,7 @@
       PWINDOW_OBJECT Parent;
       PWND ParentWnd;
 
-      Parent = Window->Parent;
+      Parent = Window->spwndParent;
       if(!Parent)
       {
          hRgnVisible = NULL;
@@ -391,7 +391,7 @@
       Flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN);
    }
 
-   Parent = (Window ? Window->Parent : NULL);
+   Parent = (Window ? Window->spwndParent : NULL);
 
    if (NULL == Window || !(Wnd->style & WS_CHILD) || NULL == Parent)
    {

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/window.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -180,7 +180,7 @@
    }
    else if (Wnd->Wnd->style & WS_CHILD)
    {
-      return Wnd->Parent;
+      return Wnd->spwndParent;
    }
 
    return NULL;
@@ -220,7 +220,7 @@
 
    if (!Window) return NULL;
 
-   for (Child = Window->FirstChild; Child; Child = Child->NextSibling)
+   for (Child = Window->spwndChild; Child; Child = Child->spwndNext)
       ++NumChildren;
 
    List = ExAllocatePoolWithTag(PagedPool, (NumChildren + 1) * sizeof(HWND), TAG_WINLIST);
@@ -230,9 +230,9 @@
       SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
       return NULL;
    }
-   for (Child = Window->FirstChild, Index = 0;
+   for (Child = Window->spwndChild, Index = 0;
          Child != NULL;
-         Child = Child->NextSibling, ++Index)
+         Child = Child->spwndNext, ++Index)
       List[Index] = Child->hSelf;
    List[Index] = NULL;
 
@@ -494,8 +494,8 @@
 
    /* dereference the class */
    IntDereferenceClass(Wnd->pcls,
-                       Window->ti->pDeskInfo,
-                       Window->ti->ppi);
+                       Window->pti->pDeskInfo,
+                       Window->pti->ppi);
    Wnd->pcls = NULL;
 
    if(Window->WindowRegion)
@@ -504,7 +504,7 @@
    }
 
    ASSERT(Window->Wnd != NULL);
-   UserFreeWindowInfo(Window->ti, Window);
+   UserFreeWindowInfo(Window->pti, Window);
 
    UserDereferenceObject(Window);
 
@@ -978,7 +978,7 @@
          break;
       }
 
-      Window = Window->Parent;
+      Window = Window->spwndParent;
    }
 
    return(FALSE);
@@ -1003,7 +1003,7 @@
          return FALSE;
       }
 
-      Window = Window->Parent;
+      Window = Window->spwndParent;
    }
 
    if(Window && Wnd->style & WS_VISIBLE)
@@ -1054,34 +1054,34 @@
               WndParent->Wnd, 
               WndPrevSibling ? WndPrevSibling->Wnd : NULL);
 
-   Wnd->Parent = WndParent;
-   if ((Wnd->PrevSibling = WndPrevSibling))
+   Wnd->spwndParent = WndParent;
+   if ((Wnd->spwndPrev = WndPrevSibling))
    {
       /* link after WndPrevSibling */
-      if ((Wnd->NextSibling = WndPrevSibling->NextSibling))
-         Wnd->NextSibling->PrevSibling = Wnd;
-      else if ((Parent = Wnd->Parent))
+      if ((Wnd->spwndNext = WndPrevSibling->spwndNext))
+         Wnd->spwndNext->spwndPrev = Wnd;
+      else if ((Parent = Wnd->spwndParent))
       {
          if(Parent->LastChild == WndPrevSibling)
             Parent->LastChild = Wnd;
       }
-      Wnd->PrevSibling->NextSibling = Wnd;
+      Wnd->spwndPrev->spwndNext = Wnd;
    }
    else
    {
       /* link at top */
-      Parent = Wnd->Parent;
-      if ((Wnd->NextSibling = WndParent->FirstChild))
-         Wnd->NextSibling->PrevSibling = Wnd;
+      Parent = Wnd->spwndParent;
+      if ((Wnd->spwndNext = WndParent->spwndChild))
+         Wnd->spwndNext->spwndPrev = Wnd;
       else if (Parent)
       {
          Parent->LastChild = Wnd;
-         Parent->FirstChild = Wnd;
+         Parent->spwndChild = Wnd;
          return;
       }
       if(Parent)
       {
-         Parent->FirstChild = Wnd;
+         Parent->spwndChild = Wnd;
       }
    }
 
@@ -1159,7 +1159,7 @@
    if (Wnd->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
       return NULL;
 
-   WndOldParent = Wnd->Parent;
+   WndOldParent = Wnd->spwndParent;
 
    if (WndOldParent) UserReferenceObject(WndOldParent); /* caller must deref */
 
@@ -1170,11 +1170,11 @@
       if (0 == (Wnd->Wnd->ExStyle & WS_EX_TOPMOST))
       {
          /* Not a TOPMOST window, put after TOPMOSTs of new parent */
-         Sibling = WndNewParent->FirstChild;
+         Sibling = WndNewParent->spwndChild;
          while (NULL != Sibling && 0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST))
          {
             InsertAfter = Sibling;
-            Sibling = Sibling->NextSibling;
+            Sibling = Sibling->spwndNext;
          }
       }
       if (NULL == InsertAfter)
@@ -1270,21 +1270,21 @@
 VOID FASTCALL
 IntUnlinkWindow(PWINDOW_OBJECT Wnd)
 {
-   PWINDOW_OBJECT WndParent = Wnd->Parent;
+   PWINDOW_OBJECT WndParent = Wnd->spwndParent;
 
    IntUnlinkWnd(Wnd->Wnd);
 
-   if (Wnd->NextSibling)
-      Wnd->NextSibling->PrevSibling = Wnd->PrevSibling;
+   if (Wnd->spwndNext)
+      Wnd->spwndNext->spwndPrev = Wnd->spwndPrev;
    else if (WndParent && WndParent->LastChild == Wnd)
-      WndParent->LastChild = Wnd->PrevSibling;
-
-   if (Wnd->PrevSibling)
-      Wnd->PrevSibling->NextSibling = Wnd->NextSibling;
-   else if (WndParent && WndParent->FirstChild == Wnd)
-      WndParent->FirstChild = Wnd->NextSibling;
-
-   Wnd->PrevSibling = Wnd->NextSibling = Wnd->Parent = NULL;
+      WndParent->LastChild = Wnd->spwndPrev;
+
+   if (Wnd->spwndPrev)
+      Wnd->spwndPrev->spwndNext = Wnd->spwndNext;
+   else if (WndParent && WndParent->spwndChild == Wnd)
+      WndParent->spwndChild = Wnd->spwndNext;
+
+   Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL;
 }
 
 BOOL FASTCALL
@@ -1297,7 +1297,7 @@
       return FALSE;
    }
 
-   for(Child = Window->FirstChild; Child; Child = Child->NextSibling)
+   for(Child = Window->spwndChild; Child; Child = Child->spwndNext)
    {
       if(Child->hOwner && Child->Wnd->style & WS_VISIBLE)
       {
@@ -1440,7 +1440,7 @@
       }
 
       if((Parent = UserGetWindowObject(hwndParent)) &&
-         (Window = Parent->FirstChild))
+         (Window = Parent->spwndChild))
       {
          BOOL bGoDown = TRUE;
 
@@ -1468,20 +1468,20 @@
                      break;
                   }
                }
-               if (Window->FirstChild && bChildren)
+               if (Window->spwndChild && bChildren)
                {
-                  Window = Window->FirstChild;
+                  Window = Window->spwndChild;
                   continue;
                }
                bGoDown = FALSE;
             }
-            if (Window->NextSibling)
+            if (Window->spwndNext)
             {
-               Window = Window->NextSibling;
+               Window = Window->spwndNext;
                bGoDown = TRUE;
                continue;
             }
-            Window = Window->Parent;
+            Window = Window->spwndParent;
             if (Window == Parent)
             {
                break;
@@ -1856,7 +1856,7 @@
    /*
     * Fill out the structure describing it.
     */
-   Window->ti = ti;
+   Window->pti = ti;
    Wnd->pcls = Class;
    Class = NULL;
 
@@ -1867,7 +1867,7 @@
 
    Window->MessageQueue = pti->MessageQueue;
    IntReferenceMessageQueue(Window->MessageQueue);
-   Window->Parent = ParentWindow;
+   Window->spwndParent = ParentWindow;
    Wnd->spwndParent = ParentWindow ? ParentWindow->Wnd : NULL;
    if (Wnd->spwndParent != NULL && hWndParent != 0)
    {
@@ -1955,10 +1955,10 @@
    }
 
    Window->OwnerThread = PsGetCurrentThread();
-   Window->FirstChild = NULL;
+   Window->spwndChild = NULL;
    Window->LastChild = NULL;
-   Window->PrevSibling = NULL;
-   Window->NextSibling = NULL;
+   Window->spwndPrev = NULL;
+   Window->spwndNext = NULL;
 
    Wnd->spwndNext = NULL;
    Wnd->spwndPrev = NULL;
@@ -2302,11 +2302,11 @@
          if (!(dwExStyle & WS_EX_TOPMOST))
          {
             InsertAfter = NULL;
-            Sibling = ParentWindow->FirstChild;
+            Sibling = ParentWindow->spwndChild;
             while (Sibling && (Sibling->Wnd->ExStyle & WS_EX_TOPMOST))
             {
                InsertAfter = Sibling;
-               Sibling = Sibling->NextSibling;
+               Sibling = Sibling->spwndNext;
             }
          }
          else
@@ -2468,7 +2468,8 @@
 
 CLEANUP:
    if (!_ret_ && Window && Window->Wnd && ti)
-       UserFreeWindowInfo(ti, Window);
+      co_UserDestroyWindow(Window);
+//      UserFreeWindowInfo(ti, Window);
    if (Window)
    {
       UserDerefObjectCo(Window);
@@ -2625,7 +2626,8 @@
    DPRINT("co_UserDestroyWindow \n");
 
    /* Check for owner thread */
-   if ((Window->OwnerThread != PsGetCurrentThread()))
+   if ( (Window->OwnerThread != PsGetCurrentThread()) ||
+        Wnd->head.pti != PsGetCurrentThreadWin32Thread() )
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return FALSE;
@@ -3121,7 +3123,7 @@
    {
       case GA_PARENT:
          {
-            WndAncestor = Wnd->Parent;
+            WndAncestor = Wnd->spwndParent;
             break;
          }
 
@@ -3132,7 +3134,7 @@
 
             for(;;)
             {
-               if(!(Parent = WndAncestor->Parent))
+               if(!(Parent = WndAncestor->spwndParent))
                {
                   break;
                }
@@ -3686,15 +3688,15 @@
    switch (Relationship)
    {
       case GW_HWNDFIRST:
-         if((Parent = Window->Parent))
+         if((Parent = Window->spwndParent))
          {
-            if (Parent->FirstChild)
-               hWndResult = Parent->FirstChild->hSelf;
+            if (Parent->spwndChild)
+               hWndResult = Parent->spwndChild->hSelf;
          }
          break;
 
       case GW_HWNDLAST:
-         if((Parent = Window->Parent))
+         if((Parent = Window->spwndParent))
          {
             if (Parent->LastChild)
                hWndResult = Parent->LastChild->hSelf;
@@ -3702,13 +3704,13 @@
          break;
 
       case GW_HWNDNEXT:
-         if (Window->NextSibling)
-            hWndResult = Window->NextSibling->hSelf;
+         if (Window->spwndNext)
+            hWndResult = Window->spwndNext->hSelf;
          break;
 
       case GW_HWNDPREV:
-         if (Window->PrevSibling)
-            hWndResult = Window->PrevSibling->hSelf;
+         if (Window->spwndPrev)
+            hWndResult = Window->spwndPrev->hSelf;
          break;
 
       case GW_OWNER:
@@ -3718,8 +3720,8 @@
          }
          break;
       case GW_CHILD:
-         if (Window->FirstChild)
-            hWndResult = Window->FirstChild->hSelf;
+         if (Window->spwndChild)
+            hWndResult = Window->spwndChild->hSelf;
          break;
    }
 
@@ -3793,7 +3795,7 @@
             break;
 
          case GWL_HWNDPARENT:
-            Parent = Window->Parent;
+            Parent = Window->spwndParent;
             if(Parent)
             {
                if (Parent && Parent->hSelf == IntGetDesktopWindow())
@@ -3919,7 +3921,7 @@
             break;
 
          case GWL_HWNDPARENT:
-            Parent = Window->Parent;
+            Parent = Window->spwndParent;
             if (Parent && (Parent->hSelf == IntGetDesktopWindow()))
                OldValue = (LONG) IntSetOwner(Window->hSelf, (HWND) NewValue);
             else

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c?rev=44575&r1=44574&r2=44575&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] Mon Dec 14 06:02:56 2009
@@ -161,7 +161,7 @@
    WndTo = Window;
    for (;;)
    {
-      if (!(WndTo = WndTo->NextSibling)) break;
+      if (!(WndTo = WndTo->spwndNext)) break;
       if (can_activate_window( WndTo )) break;
    }
 
@@ -260,7 +260,7 @@
       PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
       PDESKTOP Desktop = pti->Desktop; /* Or rather get it from the window? */
 
-      Parent = Window->Parent;
+      Parent = Window->spwndParent;
       if(Parent)
       {
          if(IntIsDesktopWindow(Parent))
@@ -519,7 +519,7 @@
       params.rgrc[0] = *WindowRect;
       params.rgrc[1] = Window->Wnd->rcWindow;
       params.rgrc[2] = Window->Wnd->rcClient;
-      Parent = Window->Parent;
+      Parent = Window->spwndParent;
       if (0 != (Wnd->style & WS_CHILD) && Parent)
       {
          RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->Wnd->rcClient.left,
@@ -608,7 +608,7 @@
       PWINDOW_OBJECT Parent;
       X = WinPos->x;
       Y = WinPos->y;
-      Parent = Window->Parent;
+      Parent = Window->spwndParent;
       if ((0 != (Wnd->style & WS_CHILD)) && Parent)
       {
          X += Parent->Wnd->rcClient.left;
@@ -733,7 +733,7 @@
 {
    PWINDOW_OBJECT Child;
 
-   ASSERT(Window != Window->FirstChild);
+   ASSERT(Window != Window->spwndChild);
 
    Window->Wnd->rcWindow.left += MoveX;
    Window->Wnd->rcWindow.right += MoveX;
@@ -745,7 +745,7 @@
    Window->Wnd->rcClient.top += MoveY;
    Window->Wnd->rcClient.bottom += MoveY;
 
-   for(Child = Window->FirstChild; Child; Child = Child->NextSibling)
+   for(Child = Window->spwndChild; Child; Child = Child->spwndNext)
    {
       WinPosInternalMoveWindow(Child, MoveX, MoveY);
    }
@@ -839,7 +839,7 @@
             && HWND_NOTOPMOST != WinPos->hwndInsertAfter
             && HWND_BOTTOM != WinPos->hwndInsertAfter)
       {
-         PWINDOW_OBJECT InsAfterWnd, Parent = Window->Parent;
+         PWINDOW_OBJECT InsAfterWnd, Parent = Window->spwndParent;
 
          InsAfterWnd = UserGetWindowObject(WinPos->hwndInsertAfter);
 
@@ -979,7 +979,7 @@
       PWINDOW_OBJECT Sibling;
       PWINDOW_OBJECT InsertAfterWindow;
 
-      if ((ParentWindow = Window->Parent))
+      if ((ParentWindow = Window->spwndParent))
       {
          if (HWND_TOPMOST == WinPos.hwndInsertAfter)
          {
@@ -989,11 +989,11 @@
                   || HWND_NOTOPMOST == WinPos.hwndInsertAfter)
          {
             InsertAfterWindow = NULL;
-            Sibling = ParentWindow->FirstChild;
+            Sibling = ParentWindow->spwndChild;
             while (NULL != Sibling && 0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST))
             {
                InsertAfterWindow = Sibling;
-               Sibling = Sibling->NextSibling;
+               Sibling = Sibling->spwndNext;
             }
             if (NULL != InsertAfterWindow)
             {
@@ -1023,10 +1023,10 @@
             UserDereferenceObject(InsertAfterWindow);
          if ((HWND_TOPMOST == WinPos.hwndInsertAfter)
                || (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST)
-                   && NULL != Window->PrevSibling
-                   && 0 != (Window->PrevSibling->Wnd->ExStyle & WS_EX_TOPMOST))
-               || (NULL != Window->NextSibling
-                   && 0 != (Window->NextSibling->Wnd->ExStyle & WS_EX_TOPMOST)))
+                   && NULL != Window->spwndPrev
+                   && 0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST))
+               || (NULL != Window->spwndNext
+                   && 0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)))
          {
             Window->Wnd->ExStyle |= WS_EX_TOPMOST;
          }
@@ -1074,7 +1074,7 @@
       co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOFRAME |
                           RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN);
       if ((Window->Wnd->style & WS_VISIBLE) &&
-          Window->Parent == UserGetDesktopWindow())
+          Window->spwndParent == UserGetDesktopWindow())
       {
          co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM)Window->hSelf);
       }
@@ -1083,7 +1083,7 @@
    else if (WinPos.flags & SWP_SHOWWINDOW)
    {
       if (!(Window->Wnd->style & WS_VISIBLE) &&
-          Window->Parent == UserGetDesktopWindow())
+          Window->spwndParent == UserGetDesktopWindow())
       {
          co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)Window->hSelf);
       }
@@ -1237,7 +1237,7 @@
          GreDeleteObject(DirtyRgn);
          */
 
-            PWINDOW_OBJECT Parent = Window->Parent;
+            PWINDOW_OBJECT Parent = Window->spwndParent;
 
             NtGdiOffsetRgn(DirtyRgn,
                            Window->Wnd->rcWindow.left,
@@ -1472,7 +1472,7 @@
             IntIsChildWindow(Window, ThreadFocusWindow)))
       {
          //faxme: as long as we have ref on Window, we also, indirectly, have ref on parent...
-         co_UserSetFocus(Window->Parent);
+         co_UserSetFocus(Window->spwndParent);
       }
    }
 
@@ -1521,10 +1521,10 @@
 /* find child of 'parent' that contains the given point (in parent-relative coords) */
 PWINDOW_OBJECT child_window_from_point(PWINDOW_OBJECT parent, int x, int y )
 {
-    PWINDOW_OBJECT Wnd;// = parent->FirstChild;
+    PWINDOW_OBJECT Wnd;// = parent->spwndChild;
 
 //    LIST_FOR_EACH_ENTRY( Wnd, &parent->children, struct window, entry )
-    for (Wnd = parent->FirstChild; Wnd; Wnd = Wnd->NextSibling)
+    for (Wnd = parent->spwndChild; Wnd; Wnd = Wnd->spwndNext)
     {
         if (!IntPtInWindow( Wnd, x, y )) continue;  /* skip it */
 




More information about the Ros-diffs mailing list