Author: amunger Date: Wed May 3 08:17:50 2006 New Revision: 21779
URL: http://svn.reactos.ru/svn/reactos?rev=21779&view=rev Log: Move callproc code into own file and reduce unneccessary system calls to dereference them. It doesn't fix any bugs but improves performance a bit. Patch from w3seek, bug 1445.
Added: trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c Modified: trunk/reactos/dll/win32/user32/windows/message.c trunk/reactos/subsystems/win32/win32k/include/class.h trunk/reactos/subsystems/win32/win32k/main/dllmain.c trunk/reactos/subsystems/win32/win32k/ntuser/class.c trunk/reactos/subsystems/win32/win32k/ntuser/window.c trunk/reactos/subsystems/win32/win32k/win32k.rbuild
Modified: trunk/reactos/dll/win32/user32/windows/message.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/win32/user32/windows/mes... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/message.c (original) +++ trunk/reactos/dll/win32/user32/windows/message.c Wed May 3 08:17:50 2006 @@ -1001,6 +1001,13 @@ } }
+static BOOL __inline +IsCallProcHandle(IN WNDPROC lpWndProc) +{ + /* FIXME - check for 64 bit architectures... */ + return ((ULONG_PTR)lpWndProc & 0xFFFF0000) == 0xFFFF0000; +} +
/* * @implemented @@ -1018,7 +1025,8 @@ if (lpPrevWndFunc == NULL) lpPrevWndFunc = (WNDPROC)NtUserGetWindowLong(hWnd, GWLP_WNDPROC, TRUE);
- if (!NtUserDereferenceWndProcHandle((HANDLE)lpPrevWndFunc, + if (!IsCallProcHandle(lpPrevWndFunc) || + !NtUserDereferenceWndProcHandle((HANDLE)lpPrevWndFunc, &wpInfo)) { return IntCallWindowProcA(TRUE, lpPrevWndFunc, hWnd, Msg, wParam, lParam); @@ -1047,7 +1055,8 @@ if (lpPrevWndFunc == NULL) lpPrevWndFunc = (WNDPROC)NtUserGetWindowLong(hWnd, GWLP_WNDPROC, FALSE);
- if (!NtUserDereferenceWndProcHandle((HANDLE)lpPrevWndFunc, + if (!IsCallProcHandle(lpPrevWndFunc) || + !NtUserDereferenceWndProcHandle((HANDLE)lpPrevWndFunc, &wpInfo)) { return IntCallWindowProcW(FALSE, lpPrevWndFunc, hWnd, Msg, wParam, lParam);
Modified: trunk/reactos/subsystems/win32/win32k/include/class.h URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/subsystems/win32/win32k/incl... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/class.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/class.h Wed May 3 08:17:50 2006 @@ -3,6 +3,9 @@
#define IS_ATOM(x) \ (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000)) + +WNDPROC +GetCallProcHandle(IN PCALLPROC CallProc);
VOID DestroyCallProc(IN PDESKTOP Desktop, @@ -17,12 +20,6 @@ IN WNDPROC WndProc, IN BOOL Unicode, IN PW32PROCESSINFO pi); - -NTSTATUS FASTCALL -InitClassImpl(VOID); - -NTSTATUS FASTCALL -CleanupClassImpl(VOID);
BOOL UserGetCallProcInfo(IN HANDLE hCallProc,
Modified: trunk/reactos/subsystems/win32/win32k/main/dllmain.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/subsystems/win32/win32k/main... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/main/dllmain.c (original) +++ trunk/reactos/subsystems/win32/win32k/main/dllmain.c Wed May 3 08:17:50 2006 @@ -425,13 +425,6 @@ return STATUS_UNSUCCESSFUL; }
- Status = InitClassImpl(); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to initialize window class implementation!\n"); - return STATUS_UNSUCCESSFUL; - } - Status = InitDesktopImpl(); if (!NT_SUCCESS(Status)) {
Added: trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntus... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c (added) +++ trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c Wed May 3 08:17:50 2006 @@ -1,0 +1,156 @@ +/* + * ReactOS W32 Subsystem + * Copyright (C) 1998 - 2006 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* $Id: class.c 21596 2006-04-15 10:41:58Z greatlrd $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Window classes + * FILE: subsys/win32k/ntuser/class.c + * PROGRAMER: Thomas Weidenmueller w3seek@reactos.com + * REVISION HISTORY: + * 06-06-2001 CSH Created + */ +/* INCLUDES ******************************************************************/ + +#include <w32k.h> + +#define NDEBUG +#include <debug.h> + +/* CALLPROC ******************************************************************/ + +WNDPROC +GetCallProcHandle(IN PCALLPROC CallProc) +{ + /* FIXME - check for 64 bit architectures... */ + return (WNDPROC)((ULONG_PTR)ObmObjectToHandle(CallProc) | 0xFFFF0000); +} + +VOID +DestroyCallProc(IN PDESKTOP Desktop, + IN OUT PCALLPROC CallProc) +{ + /* FIXME - use new object manager! */ + HANDLE Handle = ObmObjectToHandle(CallProc); + + ObmDeleteObject(Handle, + otCallProc); +} + +PCALLPROC +CloneCallProc(IN PDESKTOP Desktop, + IN PCALLPROC CallProc) +{ + PCALLPROC NewCallProc; + HANDLE Handle; + + /* FIXME - use new object manager! */ + NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable, + &Handle, + otCallProc, + sizeof(CALLPROC)); + if (NewCallProc != NULL) + { + NewCallProc->pi = CallProc->pi; + NewCallProc->WndProc = CallProc->WndProc; + NewCallProc->Unicode = CallProc->Unicode; + } + + return NewCallProc; +} + +PCALLPROC +CreateCallProc(IN PDESKTOP Desktop, + IN WNDPROC WndProc, + IN BOOL Unicode, + IN PW32PROCESSINFO pi) +{ + PCALLPROC NewCallProc; + HANDLE Handle; + + /* FIXME - use new object manager! */ + NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable, + &Handle, + otCallProc, + sizeof(CALLPROC)); + if (NewCallProc != NULL) + { + NewCallProc->pi = pi; + NewCallProc->WndProc = WndProc; + NewCallProc->Unicode = Unicode; + } + + return NewCallProc; +} + +BOOL +UserGetCallProcInfo(IN HANDLE hCallProc, + OUT PWNDPROC_INFO wpInfo) +{ + PCALLPROC CallProc; + + /* NOTE: Accessing the WNDPROC_INFO structure may raise an exception! */ + + /* FIXME - use new object manager! */ + CallProc = UserGetObject(gHandleTable, + hCallProc, + otCallProc); + if (CallProc == NULL) + { + return FALSE; + } + + if (CallProc->pi != GetW32ProcessInfo()) + { + return FALSE; + } + + wpInfo->WindowProc = CallProc->WndProc; + wpInfo->IsUnicode = CallProc->Unicode; + + return TRUE; +} + +BOOL NTAPI +NtUserDereferenceWndProcHandle(IN HANDLE wpHandle, + OUT PWNDPROC_INFO wpInfo) +{ + BOOL Ret = FALSE; + + UserEnterShared(); + + _SEH_TRY + { + ProbeForWrite(wpInfo, + sizeof(WNDPROC_INFO), + sizeof(ULONG)); + + Ret = UserGetCallProcInfo(wpHandle, + wpInfo); + } + _SEH_HANDLE + { + SetLastWin32Error(_SEH_GetExceptionCode()); + } + _SEH_END; + + UserLeave(); + + return Ret; +}
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/class.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntus... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/class.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/class.c Wed May 3 08:17:50 2006 @@ -33,106 +33,7 @@ #define NDEBUG #include <debug.h>
-/* CALLPROC ******************************************************************/ - -VOID -DestroyCallProc(IN PDESKTOP Desktop, - IN OUT PCALLPROC CallProc) -{ - /* FIXME - use new object manager! */ - HANDLE Handle = ObmObjectToHandle(CallProc); - - ObmDeleteObject(Handle, - otCallProc); -} - -PCALLPROC -CloneCallProc(IN PDESKTOP Desktop, - IN PCALLPROC CallProc) -{ - PCALLPROC NewCallProc; - HANDLE Handle; - - /* FIXME - use new object manager! */ - NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable, - &Handle, - otCallProc, - sizeof(CALLPROC)); - if (NewCallProc != NULL) - { - NewCallProc->pi = CallProc->pi; - NewCallProc->WndProc = CallProc->WndProc; - NewCallProc->Unicode = CallProc->Unicode; - } - - return NewCallProc; -} - -PCALLPROC -CreateCallProc(IN PDESKTOP Desktop, - IN WNDPROC WndProc, - IN BOOL Unicode, - IN PW32PROCESSINFO pi) -{ - PCALLPROC NewCallProc; - HANDLE Handle; - - /* FIXME - use new object manager! */ - NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable, - &Handle, - otCallProc, - sizeof(CALLPROC)); - if (NewCallProc != NULL) - { - NewCallProc->pi = pi; - NewCallProc->WndProc = WndProc; - NewCallProc->Unicode = Unicode; - } - - return NewCallProc; -} - -BOOL -UserGetCallProcInfo(IN HANDLE hCallProc, - OUT PWNDPROC_INFO wpInfo) -{ - PCALLPROC CallProc; - - /* NOTE: Accessing the WNDPROC_INFO structure may raise an exception! */ - - /* FIXME - use new object manager! */ - CallProc = UserGetObject(gHandleTable, - hCallProc, - otCallProc); - if (CallProc == NULL) - { - return FALSE; - } - - if (CallProc->pi != GetW32ProcessInfo()) - { - return FALSE; - } - - wpInfo->WindowProc = CallProc->WndProc; - wpInfo->IsUnicode = CallProc->Unicode; - - return TRUE; -} - /* WINDOWCLASS ***************************************************************/ - -NTSTATUS FASTCALL -InitClassImpl(VOID) -{ - return(STATUS_SUCCESS); -} - -NTSTATUS FASTCALL -CleanupClassImpl(VOID) -{ - return(STATUS_SUCCESS); -}
static VOID IntFreeClassMenuName(IN OUT PWINDOWCLASS Class) @@ -345,7 +246,7 @@
if (*CallProcPtr != NULL) { - return (WNDPROC)ObmObjectToHandle(*CallProcPtr); + return GetCallProcHandle(*CallProcPtr); } else { @@ -392,7 +293,7 @@ Class = Class->Next; }
- return (WNDPROC)ObmObjectToHandle(NewCallProc); + return GetCallProcHandle(NewCallProc); } } } @@ -2510,33 +2411,4 @@ return(0); }
- -BOOL NTAPI -NtUserDereferenceWndProcHandle(IN HANDLE wpHandle, - OUT PWNDPROC_INFO wpInfo) -{ - BOOL Ret = FALSE; - - UserEnterShared(); - - _SEH_TRY - { - ProbeForWrite(wpInfo, - sizeof(WNDPROC_INFO), - sizeof(ULONG)); - - Ret = UserGetCallProcInfo(wpHandle, - wpInfo); - } - _SEH_HANDLE - { - SetLastWin32Error(_SEH_GetExceptionCode()); - } - _SEH_END; - - UserLeave(); - - return Ret; -} - /* EOF */
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntus... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/window.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c Wed May 3 08:17:50 2006 @@ -509,7 +509,7 @@ { if (Window->CallProc != NULL) { - return (WNDPROC)ObmObjectToHandle(Window->CallProc); + return GetCallProcHandle(Window->CallProc); } else { @@ -536,7 +536,7 @@ NewCallProc); }
- return (WNDPROC)ObmObjectToHandle((CallProc == NULL ? NewCallProc : CallProc)); + return GetCallProcHandle((CallProc == NULL ? NewCallProc : CallProc)); } } } @@ -3464,7 +3464,7 @@ } }
- Ret = (WNDPROC)ObmObjectToHandle(Window->CallProc2); + Ret = GetCallProcHandle(Window->CallProc2); } }
Modified: trunk/reactos/subsystems/win32/win32k/win32k.rbuild URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/subsystems/win32/win32k/win3... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/win32k.rbuild (original) +++ trunk/reactos/subsystems/win32/win32k/win32k.rbuild Wed May 3 08:17:50 2006 @@ -84,6 +84,7 @@ <compilationunit name="ntuser.c"> <file>accelerator.c</file> <file>callback.c</file> + <file>callproc.c</file> <file>caret.c</file> <file>class.c</file> <file>clipboard.c</file>