[ros-dev] [ros-diffs] [gadamopoulos] 44571: [user32] Optimize GetWindow by moving it completely to user mode [win32k] Remove reactos only syscall NtUserGetWindow
Alex Ionescu
ionucu at videotron.ca
Mon Dec 14 02:04:10 CET 2009
Please note my comment talked about NtUserGetCPD which must be used for some requests.
On 2009-12-13, at 3:01 PM, gadamopoulos at svn.reactos.org 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
More information about the Ros-dev
mailing list