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/inc... ============================================================================== --- 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/inc... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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/ntu... ============================================================================== --- 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 */