Please note my comment talked about NtUserGetCPD which must be used for some requests.
On 2009-12-13, at 3:01 PM, [email protected] wrote: > Author: gadamopoulos > Date: Sun Dec 13 21:01:21 2009 > New Revision: 44571 > > URL: http://svn.reactos.org/svn/reactos?rev=44571&view=rev > Log: > [user32] > Optimize GetWindow by moving it completely to user mode > > [win32k] > Remove reactos only syscall NtUserGetWindow > > Modified: > trunk/reactos/dll/win32/user32/windows/window.c > trunk/reactos/include/reactos/win32k/ntuser.h > trunk/reactos/subsystems/win32/win32k/ntuser/window.c > trunk/reactos/subsystems/win32/win32k/w32ksvc.db > > Modified: trunk/reactos/dll/win32/user32/windows/window.c > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/window.c?rev=44571&r1=44570&r2=44571&view=diff > ============================================================================== > --- trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] (original) > +++ trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] Sun Dec 13 > 21:01:21 2009 > @@ -1024,8 +1024,36 @@ > FoundWnd = DesktopPtrToUser(Wnd->spwndOwner); > break; > > + case GW_HWNDFIRST: > + if(Wnd->spwndParent != NULL) > + { > + FoundWnd = DesktopPtrToUser(Wnd->spwndParent); > + if (FoundWnd->spwndChild != NULL) > + FoundWnd = DesktopPtrToUser(FoundWnd->spwndChild); > + } > + break; > + case GW_HWNDNEXT: > + if (Wnd->spwndNext != NULL) > + FoundWnd = DesktopPtrToUser(Wnd->spwndNext); > + break; > + > + case GW_HWNDPREV: > + if (Wnd->spwndPrev != NULL) > + FoundWnd = DesktopPtrToUser(Wnd->spwndPrev); > + break; > + > + case GW_CHILD: > + if (Wnd->spwndChild != NULL) > + FoundWnd = DesktopPtrToUser(Wnd->spwndChild); > + break; > + > + case GW_HWNDLAST: > + FoundWnd = Wnd; > + while ( FoundWnd->spwndNext != NULL) > + FoundWnd = DesktopPtrToUser(FoundWnd->spwndNext); > + break; > + > default: > - /* FIXME: Optimize! Fall back to NtUserGetWindow for now... > */ > Wnd = NULL; > break; > } > @@ -1038,9 +1066,6 @@ > /* Do nothing */ > } > _SEH2_END; > - > - if (!Wnd) /* Fall back to win32k... */ > - Ret = NtUserGetWindow(hWnd, uCmd); > > return Ret; > } > > Modified: trunk/reactos/include/reactos/win32k/ntuser.h > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntuser.h?rev=44571&r1=44570&r2=44571&view=diff > ============================================================================== > --- trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] (original) > +++ trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] Sun Dec 13 > 21:01:21 2009 > @@ -3136,10 +3136,6 @@ > int fnBar, > LPSCROLLINFO lpsi); > > -HWND > -NTAPI > -NtUserGetWindow(HWND hWnd, UINT Relationship); > - > /* Should be done in usermode and use NtUserGetCPD. */ > LONG > NTAPI > > 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=44571&r1=44570&r2=44571&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] Sun > Dec 13 21:01:21 2009 > @@ -1014,6 +1014,31 @@ > return FALSE; > } > > +VOID FASTCALL > +IntLinkWnd( > + PWND Wnd, > + PWND WndParent, > + PWND WndPrevSibling) /* set to NULL if top sibling */ > +{ > + Wnd->spwndParent = WndParent; > + if ((Wnd->spwndPrev = WndPrevSibling)) > + { > + /* link after WndPrevSibling */ > + if ((Wnd->spwndNext = WndPrevSibling->spwndNext)) > + Wnd->spwndNext->spwndPrev = Wnd; > + > + Wnd->spwndPrev->spwndNext = Wnd; > + } > + else > + { > + /* link at top */ > + if ((Wnd->spwndNext = WndParent->spwndChild)) > + Wnd->spwndNext->spwndPrev = Wnd; > + > + WndParent->spwndChild = Wnd; > + } > + > +} > > /* link the window into siblings and parent. children are kept in place. */ > VOID FASTCALL > @@ -1025,8 +1050,11 @@ > { > PWINDOW_OBJECT Parent; > > + IntLinkWnd(Wnd->Wnd, > + WndParent->Wnd, > + WndPrevSibling ? WndPrevSibling->Wnd : NULL); > + > Wnd->Parent = WndParent; > - Wnd->Wnd->spwndParent = WndParent ? WndParent->Wnd : NULL; > if ((Wnd->PrevSibling = WndPrevSibling)) > { > /* link after WndPrevSibling */ > @@ -1221,12 +1249,30 @@ > return TRUE; > } > > +/* unlink the window from siblings and parent. children are kept in place. */ > +VOID FASTCALL > +IntUnlinkWnd(PWND Wnd) > +{ > + if (Wnd->spwndNext) > + Wnd->spwndNext->spwndPrev = Wnd->spwndPrev; > + > + if (Wnd->spwndPrev) > + Wnd->spwndPrev->spwndNext = Wnd->spwndNext; > + > + if (Wnd->spwndParent && Wnd->spwndParent->spwndChild == Wnd) > + Wnd->spwndParent->spwndChild = Wnd->spwndNext; > + > + Wnd->spwndParent = Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = > NULL; > +} > + > > /* unlink the window from siblings and parent. children are kept in place. */ > VOID FASTCALL > IntUnlinkWindow(PWINDOW_OBJECT Wnd) > { > PWINDOW_OBJECT WndParent = Wnd->Parent; > + > + IntUnlinkWnd(Wnd->Wnd); > > if (Wnd->NextSibling) > Wnd->NextSibling->PrevSibling = Wnd->PrevSibling; > @@ -1239,8 +1285,6 @@ > WndParent->FirstChild = Wnd->NextSibling; > > Wnd->PrevSibling = Wnd->NextSibling = Wnd->Parent = NULL; > - if (Wnd->Wnd) > - Wnd->Wnd->spwndParent = NULL; > } > > BOOL FASTCALL > @@ -1915,6 +1959,11 @@ > Window->LastChild = NULL; > Window->PrevSibling = NULL; > Window->NextSibling = NULL; > + > + Wnd->spwndNext = NULL; > + Wnd->spwndPrev = NULL; > + Wnd->spwndChild = NULL; > + > Wnd->cbwndExtra = Wnd->pcls->cbwndExtra; > > InitializeListHead(&Wnd->PropListHead); > @@ -3675,32 +3724,6 @@ > } > > return hWndResult; > -} > - > -/* > - * NtUserGetWindow > - * > - * The NtUserGetWindow function retrieves a handle to a window that has the > - * specified relationship (Z order or owner) to the specified window. > - * > - * Status > - * @implemented > - */ > - > -HWND APIENTRY > -NtUserGetWindow(HWND hWnd, UINT Relationship) > -{ > - DECLARE_RETURN(HWND); > - > - DPRINT("Enter NtUserGetWindow\n"); > - UserEnterShared(); > - > - RETURN(UserGetWindow(hWnd, Relationship)); > - > -CLEANUP: > - DPRINT("Leave NtUserGetWindow, ret=%i\n",_ret_); > - UserLeave(); > - END_CLEANUP; > } > > /* > > Modified: trunk/reactos/subsystems/win32/win32k/w32ksvc.db > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/w32ksvc.db?rev=44571&r1=44570&r2=44571&view=diff > ============================================================================== > --- trunk/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] (original) > +++ trunk/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] Sun Dec 13 > 21:01:21 2009 > @@ -690,7 +690,6 @@ > NtUserGetMinMaxInfo 3 > NtUserGetMonitorInfo 2 > NtUserGetScrollInfo 3 > -NtUserGetWindow 2 > NtUserGetWindowLong 3 > NtUserMenuInfo 3 > NtUserMenuItemInfo 5 > > Best regards, Alex Ionescu _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
