From 59caa89d8358bdc7a2f80b0ade550e136093d46f Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 2 Aug 2003 16:32:18 +0000 Subject: [PATCH] -W32k/NtUser separation -Introduce new WinSta lock to replace most others svn path=/trunk/; revision=5380 --- reactos/subsys/win32k/include/prop.h | 14 ++++ reactos/subsys/win32k/include/window.h | 4 ++ reactos/subsys/win32k/include/winsta.h | 4 ++ reactos/subsys/win32k/ntuser/prop.c | 92 +++++++++++++++----------- reactos/subsys/win32k/ntuser/winpos.c | 12 ++-- reactos/subsys/win32k/ntuser/winsta.c | 22 +++++- 6 files changed, 103 insertions(+), 45 deletions(-) create mode 100644 reactos/subsys/win32k/include/prop.h diff --git a/reactos/subsys/win32k/include/prop.h b/reactos/subsys/win32k/include/prop.h new file mode 100644 index 00000000000..c3af2a738ff --- /dev/null +++ b/reactos/subsys/win32k/include/prop.h @@ -0,0 +1,14 @@ +#ifndef _WIN32K_PROP_H +#define _WIN32K_PROP_H + +BOOL FASTCALL +W32kSetProp(struct _WINDOW_OBJECT* Wnd, ATOM Atom, HANDLE Data); + +struct _PROPERTY* FASTCALL +W32kGetProp(struct _WINDOW_OBJECT* WindowObject, ATOM Atom); + + +#endif /* _WIN32K_PROP_H */ + +/* EOF */ + diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index be5a2ecfcef..ede2c4c0589 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -1,12 +1,16 @@ #ifndef __WIN32K_WINDOW_H #define __WIN32K_WINDOW_H +struct _PROPERTY; +struct _WINDOW_OBJECT; + #include #include #include #include #include #include +#include typedef struct _PROPERTY { diff --git a/reactos/subsys/win32k/include/winsta.h b/reactos/subsys/win32k/include/winsta.h index cececefa75e..6695c72460c 100644 --- a/reactos/subsys/win32k/include/winsta.h +++ b/reactos/subsys/win32k/include/winsta.h @@ -52,6 +52,10 @@ W32kGetCaptureWindow(VOID); VOID STDCALL W32kSetCaptureWindow(struct _WINDOW_OBJECT* Window); +inline VOID W32kAcquireWinStaLockShared(); +inline VOID W32kAcquireWinStaLockExclusive(); +inline VOID W32kReleaseWinStaLock(); + #endif /* __WIN32K_WINSTA_H */ /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/prop.c b/reactos/subsys/win32k/ntuser/prop.c index ef0891be4fc..6aca2ea483b 100644 --- a/reactos/subsys/win32k/ntuser/prop.c +++ b/reactos/subsys/win32k/ntuser/prop.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: prop.c,v 1.2 2003/05/18 17:16:17 ea Exp $ +/* $Id: prop.c,v 1.3 2003/08/02 16:32:18 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -83,11 +83,11 @@ NtUserRemoveProp(HWND hWnd, ATOM Atom) PPROPERTY Prop; HANDLE Data; - WindowObject = W32kGetWindowObject(hWnd); - if (WindowObject == NULL) - { - return(NULL); - } + if (!(WindowObject = W32kGetWindowObject(hWnd))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return NULL; + } Prop = W32kGetProp(WindowObject, Atom); if (Prop == NULL) @@ -109,47 +109,65 @@ NtUserGetProp(HWND hWnd, ATOM Atom) PPROPERTY Prop; HANDLE Data = NULL; - WindowObject = W32kGetWindowObject(hWnd); - if (WindowObject == NULL) - { - return(FALSE); - } + W32kAcquireWinStaLockShared(); + + if (!(WindowObject = W32kGetWindowObject(hWnd))) + { + W32kReleaseWinStaLock(); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } Prop = W32kGetProp(WindowObject, Atom); if (Prop != NULL) - { - Data = Prop->Data; - } - W32kReleaseWindowObject(WindowObject); + { + Data = Prop->Data; + } + + W32kReleaseWinStaLock(); + return(Data); } +BOOL FASTCALL +W32kSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data) +{ + PPROPERTY Prop; + + Prop = W32kGetProp(Wnd, Atom); + + if (Prop == NULL) + { + Prop = ExAllocatePool(PagedPool, sizeof(PROPERTY)); + if (Prop == NULL) return FALSE; + Prop->Atom = Atom; + InsertTailList(&Wnd->PropListHead, &Prop->PropListEntry); + } + + Prop->Data = Data; + return TRUE; +} + + BOOL STDCALL NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data) { - PWINDOW_OBJECT WindowObject; - PPROPERTY Prop; + PWINDOW_OBJECT Wnd; + BOOL ret; - WindowObject = W32kGetWindowObject(hWnd); - if (WindowObject == NULL) - { - return(FALSE); - } + W32kAcquireWinStaLockExclusive(); - Prop = W32kGetProp(WindowObject, Atom); - if (Prop == NULL) - { - Prop = ExAllocatePool(PagedPool, sizeof(PROPERTY)); - if (Prop == NULL) - { - W32kReleaseWindowObject(WindowObject); - return(FALSE); - } - Prop->Atom = Atom; - InsertTailList(&WindowObject->PropListHead, &Prop->PropListEntry); - } - Prop->Data = Data; - W32kReleaseWindowObject(WindowObject); - return(TRUE); + if (!(Wnd = W32kGetWindowObject(hWnd))) + { + W32kReleaseWinStaLock(); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + + ret = W32kSetProp(Wnd, Atom, Data); + + W32kReleaseWinStaLock(); + return ret; } + /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 92d8381a8dd..59d696db844 100644 --- a/reactos/subsys/win32k/ntuser/winpos.c +++ b/reactos/subsys/win32k/ntuser/winpos.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: winpos.c,v 1.18 2003/08/01 14:38:51 dwelch Exp $ +/* $Id: winpos.c,v 1.19 2003/08/02 16:32:18 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -117,8 +117,7 @@ WinPosCreateIconTitle(PWINDOW_OBJECT WindowObject) BOOL STATIC FASTCALL WinPosShowIconTitle(PWINDOW_OBJECT WindowObject, BOOL Show) { - PINTERNALPOS InternalPos = NtUserGetProp(WindowObject->Self, - AtomInternalPos); + PINTERNALPOS InternalPos = W32kGetProp(WindowObject, AtomInternalPos); PWINDOW_OBJECT IconWindow; NTSTATUS Status; @@ -161,13 +160,12 @@ WinPosShowIconTitle(PWINDOW_OBJECT WindowObject, BOOL Show) PINTERNALPOS STATIC STDCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT pt, PRECT RestoreRect) { - PINTERNALPOS InternalPos = NtUserGetProp(WindowObject->Self, - AtomInternalPos); + PINTERNALPOS InternalPos = W32kGetProp(WindowObject, AtomInternalPos); if (InternalPos == NULL) { InternalPos = ExAllocatePool(NonPagedPool, sizeof(INTERNALPOS)); - NtUserSetProp(WindowObject->Self, AtomInternalPos, InternalPos); + W32kSetProp(WindowObject, AtomInternalPos, InternalPos); InternalPos->IconTitle = 0; InternalPos->NormalRect = WindowObject->WindowRect; InternalPos->IconPos.x = InternalPos->MaxPos.x = 0xFFFFFFFF; @@ -327,7 +325,7 @@ WinPosGetMinMaxInfo(PWINDOW_OBJECT Window, POINT* MaxSize, POINT* MaxPos, MinMax.ptMaxSize.x += 2 * XInc; MinMax.ptMaxSize.y += 2 * YInc; - Pos = NtUserGetProp(Window->Self, AtomInternalPos); + Pos = W32kGetProp(Window, AtomInternalPos); if (Pos != NULL) { MinMax.ptMaxPosition = Pos->MaxPos; diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 4d991ec5c84..cd3289b0e06 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: winsta.c,v 1.20 2003/07/27 21:35:50 dwelch Exp $ +/* $Id: winsta.c,v 1.21 2003/08/02 16:32:18 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -68,6 +68,25 @@ static HDC ScreenDeviceContext = NULL; /* FUNCTIONS *****************************************************************/ +inline VOID W32kAcquireWinStaLockShared() +{ + ExAcquireResourceExclusiveLite(&(PsGetWin32Process()->WindowStation->Resource), + TRUE /*Wait*/ + ); +} + +inline VOID W32kAcquireWinStaLockExclusive() +{ + ExAcquireResourceSharedLite(&(PsGetWin32Process()->WindowStation->Resource), + TRUE /*Wait*/ + ); +} + +inline VOID W32kReleaseWinStaLock() +{ + ExReleaseResourceLite( &(PsGetWin32Process()->WindowStation->Resource) ); +} + PDESKTOP_OBJECT FASTCALL W32kGetActiveDesktop(VOID) { @@ -340,6 +359,7 @@ NtUserCreateWindowStation(PUNICODE_STRING lpszWindowStationName, return (HWINSTA)0; } + ExInitializeResourceLite(&WinStaObject->Resource); WinStaObject->HandleTable = ObmCreateHandleTable(); if (!WinStaObject->HandleTable) {