}
static PWINDOWCLASS
-IntGetClassForDesktop(IN PWINDOWCLASS BaseClass,
+IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass,
+ IN OUT PWINDOWCLASS *ClassLink,
IN PDESKTOP Desktop)
{
SIZE_T ClassSize;
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
/* 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
{
}
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)
{
BOOL bUnicodeWindow)
{
PWINSTATION_OBJECT WinSta;
- PWINDOWCLASS Class = NULL;
+ PWINDOWCLASS *ClassLink, Class = NULL;
RTL_ATOM ClassAtom;
PWINDOW_OBJECT Window = NULL;
PWINDOW_OBJECT ParentWindow = NULL, OwnerWindow;
hInstance,
ti->kpi,
&Class,
- NULL);
+ &ClassLink);
if (ClassAtom == (RTL_ATOM)0)
{
}
Class = IntReferenceClass(Class,
+ ClassLink,
ti->Desktop);
if (Class == NULL)
{