From 2c38ab132d0d2e097c0900edfed87d785c01c322 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Wed, 5 Apr 2006 10:33:55 +0000 Subject: [PATCH] patch from w3seek fixing windows handles svn path=/trunk/; revision=21462 --- .../subsystems/win32/win32k/include/class.h | 3 ++- .../subsystems/win32/win32k/ntuser/class.c | 26 +++++++++++++++---- .../subsystems/win32/win32k/ntuser/window.c | 5 ++-- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/class.h b/reactos/subsystems/win32/win32k/include/class.h index f6a33a5febe..27fa37c052d 100644 --- a/reactos/subsystems/win32/win32k/include/class.h +++ b/reactos/subsystems/win32/win32k/include/class.h @@ -32,7 +32,8 @@ void FASTCALL DestroyProcessClasses(PW32PROCESS Process ); PWINDOWCLASS -IntReferenceClass(IN PWINDOWCLASS BaseClass, +IntReferenceClass(IN OUT PWINDOWCLASS BaseClass, + IN OUT PWINDOWCLASS *ClassLink, IN PDESKTOP Desktop); VOID diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index 25ffd83e49f..c5188d29a0b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -361,7 +361,8 @@ IntSetClassWndProc(IN OUT PWINDOWCLASS Class, } static PWINDOWCLASS -IntGetClassForDesktop(IN PWINDOWCLASS BaseClass, +IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, + IN OUT PWINDOWCLASS *ClassLink, IN PDESKTOP Desktop) { SIZE_T ClassSize; @@ -380,6 +381,8 @@ IntGetClassForDesktop(IN PWINDOWCLASS BaseClass, if (BaseClass->Desktop == NULL) { + ASSERT(BaseClass->Windows == 0); + /* Classes are also located in the shared heap when the class was created before the thread attached to a desktop. As soon as a window is created for such a class located on the shared @@ -424,11 +427,22 @@ IntGetClassForDesktop(IN PWINDOWCLASS BaseClass, /* update some pointers and link the class */ Class->Next = BaseClass->Clone; Class->Clone = NULL; - Class->Base = BaseClass; Class->Desktop = Desktop; Class->Windows = 0; - (void)InterlockedExchangePointer(&BaseClass->Clone, - Class); + + if (BaseClass->Desktop == NULL) + { + /* replace the base class */ + Class->Base = BaseClass; + /* FIXME */ + } + else + { + /* link in the clone */ + Class->Base = BaseClass; + (void)InterlockedExchangePointer(&BaseClass->Clone, + Class); + } } else { @@ -440,12 +454,14 @@ IntGetClassForDesktop(IN PWINDOWCLASS BaseClass, } PWINDOWCLASS -IntReferenceClass(IN PWINDOWCLASS BaseClass, +IntReferenceClass(IN OUT PWINDOWCLASS BaseClass, + IN OUT PWINDOWCLASS *ClassLink, IN PDESKTOP Desktop) { PWINDOWCLASS Class; Class = IntGetClassForDesktop(BaseClass, + ClassLink, Desktop); if (Class != NULL) { diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 4bfa88e00d8..63412aa31c5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1394,7 +1394,7 @@ co_IntCreateWindowEx(DWORD dwExStyle, BOOL bUnicodeWindow) { PWINSTATION_OBJECT WinSta; - PWINDOWCLASS Class = NULL; + PWINDOWCLASS *ClassLink, Class = NULL; RTL_ATOM ClassAtom; PWINDOW_OBJECT Window = NULL; PWINDOW_OBJECT ParentWindow = NULL, OwnerWindow; @@ -1475,7 +1475,7 @@ co_IntCreateWindowEx(DWORD dwExStyle, hInstance, ti->kpi, &Class, - NULL); + &ClassLink); if (ClassAtom == (RTL_ATOM)0) { @@ -1493,6 +1493,7 @@ co_IntCreateWindowEx(DWORD dwExStyle, } Class = IntReferenceClass(Class, + ClassLink, ti->Desktop); if (Class == NULL) {