diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index ab808bec9b4..05d48dc6ded 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -73,7 +73,6 @@ typedef struct _WINDOWCLASS struct _WINDOWCLASS *Next; struct _WINDOWCLASS *Clone; struct _WINDOWCLASS *Base; - PDESKTOPINFO Desktop; struct _DESKTOP *rpdeskParent; RTL_ATOM Atom; ULONG Windows; diff --git a/reactos/subsystems/win32/win32k/include/class.h b/reactos/subsystems/win32/win32k/include/class.h index 188115c2913..8eb95ea4d89 100644 --- a/reactos/subsystems/win32/win32k/include/class.h +++ b/reactos/subsystems/win32/win32k/include/class.h @@ -2,6 +2,7 @@ #define _WIN32K_CLASS_H #include +#include #define IS_ATOM(x) \ (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000)) @@ -46,7 +47,7 @@ DestroyProcessClasses(PW32PROCESS Process ); PWINDOWCLASS IntReferenceClass(IN OUT PWINDOWCLASS BaseClass, IN OUT PWINDOWCLASS *ClassLink, - IN PDESKTOPINFO Desktop); + IN PDESKTOP Desktop); VOID IntDereferenceClass(IN OUT PWINDOWCLASS Class, @@ -95,7 +96,7 @@ IntGetAtomFromStringOrAtom(IN PUNICODE_STRING ClassName, OUT RTL_ATOM *Atom); BOOL -IntCheckProcessDesktopClasses(IN PDESKTOPINFO Desktop, +IntCheckProcessDesktopClasses(IN PDESKTOP Desktop, IN BOOL FreeOnFailure); #endif /* _WIN32K_CLASS_H */ diff --git a/reactos/subsystems/win32/win32k/include/desktop.h b/reactos/subsystems/win32/win32k/include/desktop.h index 2eac22e2409..fad37d29b35 100644 --- a/reactos/subsystems/win32/win32k/include/desktop.h +++ b/reactos/subsystems/win32/win32k/include/desktop.h @@ -136,31 +136,31 @@ VOID co_IntShellHookNotify(WPARAM Message, LPARAM lParam); static __inline PVOID -DesktopHeapAlloc(IN PDESKTOPINFO Desktop, +DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes) { - return RtlAllocateHeap(Desktop->hKernelHeap, + return RtlAllocateHeap(Desktop->DesktopInfo->hKernelHeap, HEAP_NO_SERIALIZE, Bytes); } static __inline BOOL -DesktopHeapFree(IN PDESKTOPINFO Desktop, +DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem) { - return RtlFreeHeap(Desktop->hKernelHeap, + return RtlFreeHeap(Desktop->DesktopInfo->hKernelHeap, HEAP_NO_SERIALIZE, lpMem); } static __inline PVOID -DesktopHeapReAlloc(IN PDESKTOPINFO Desktop, +DesktopHeapReAlloc(IN PDESKTOP Desktop, IN PVOID lpMem, IN SIZE_T Bytes) { #if 0 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */ - return RtlReAllocateHeap(Desktop->hKernelHeap, + return RtlReAllocateHeap(Desktop->DesktopInfo->hKernelHeap, HEAP_NO_SERIALIZE, lpMem, Bytes); @@ -168,14 +168,14 @@ DesktopHeapReAlloc(IN PDESKTOPINFO Desktop, SIZE_T PrevSize; PVOID pNew; - PrevSize = RtlSizeHeap(Desktop->hKernelHeap, + PrevSize = RtlSizeHeap(Desktop->DesktopInfo->hKernelHeap, HEAP_NO_SERIALIZE, lpMem); if (PrevSize == Bytes) return lpMem; - pNew = RtlAllocateHeap(Desktop->hKernelHeap, + pNew = RtlAllocateHeap(Desktop->DesktopInfo->hKernelHeap, HEAP_NO_SERIALIZE, Bytes); if (pNew != NULL) @@ -187,7 +187,7 @@ DesktopHeapReAlloc(IN PDESKTOPINFO Desktop, lpMem, Bytes); - RtlFreeHeap(Desktop->hKernelHeap, + RtlFreeHeap(Desktop->DesktopInfo->hKernelHeap, HEAP_NO_SERIALIZE, lpMem); } diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index 97bd1a9a2e1..31f06042a34 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -85,9 +85,9 @@ IntDestroyClass(IN OUT PWINDOWCLASS Class) } /* free the structure */ - if (Class->Desktop != NULL) + if (Class->rpdeskParent != NULL) { - DesktopHeapFree(Class->Desktop, + DesktopHeapFree(Class->rpdeskParent, Class); } else @@ -395,7 +395,7 @@ IntSetClassWndProc(IN OUT PWINDOWCLASS Class, static PWINDOWCLASS IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, IN OUT PWINDOWCLASS *ClassLink, - IN PDESKTOPINFO Desktop) + IN PDESKTOP Desktop) { SIZE_T ClassSize; PWINDOWCLASS Class; @@ -403,7 +403,7 @@ IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, ASSERT(Desktop != NULL); ASSERT(BaseClass->Base == BaseClass); - if (BaseClass->Desktop == Desktop) + if (BaseClass->rpdeskParent == Desktop) { /* it is most likely that a window is created on the same desktop as the window class. */ @@ -411,7 +411,7 @@ IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, return BaseClass; } - if (BaseClass->Desktop == NULL) + if (BaseClass->rpdeskParent == NULL) { ASSERT(BaseClass->Windows == 0); ASSERT(BaseClass->Clone == NULL); @@ -430,7 +430,7 @@ IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, Class = BaseClass->Clone; while (Class != NULL) { - if (Class->Desktop == Desktop) + if (Class->rpdeskParent == Desktop) { ASSERT(Class->Base == BaseClass); ASSERT(Class->Clone == NULL); @@ -457,10 +457,10 @@ IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, ClassSize); /* update some pointers and link the class */ - Class->Desktop = Desktop; + Class->rpdeskParent = Desktop; Class->Windows = 0; - if (BaseClass->Desktop == NULL) + if (BaseClass->rpdeskParent == NULL) { /* we don't really need the base class on the shared heap anymore, delete it so the only class left is @@ -502,7 +502,7 @@ IntGetClassForDesktop(IN OUT PWINDOWCLASS BaseClass, PWINDOWCLASS IntReferenceClass(IN OUT PWINDOWCLASS BaseClass, IN OUT PWINDOWCLASS *ClassLink, - IN PDESKTOPINFO Desktop) + IN PDESKTOP Desktop) { PWINDOWCLASS Class; @@ -528,9 +528,9 @@ IntMakeCloneBaseClass(IN OUT PWINDOWCLASS Class, ASSERT(Class->Base != Class); ASSERT(Class->Base->Clone != NULL); - ASSERT(Class->Desktop != NULL); + ASSERT(Class->rpdeskParent != NULL); ASSERT(Class->Windows != 0); - ASSERT(Class->Base->Desktop != NULL); + ASSERT(Class->Base->rpdeskParent != NULL); ASSERT(Class->Base->Windows == 0); /* unlink the clone */ @@ -648,7 +648,7 @@ IntMoveClassToSharedHeap(IN OUT PWINDOWCLASS Class, SIZE_T ClassSize; ASSERT(Class->Base == Class); - ASSERT(Class->Desktop != NULL); + ASSERT(Class->rpdeskParent != NULL); ASSERT(Class->Windows == 0); ASSERT(Class->Clone == NULL); @@ -662,7 +662,7 @@ IntMoveClassToSharedHeap(IN OUT PWINDOWCLASS Class, Class, ClassSize); - NewClass->Desktop = NULL; + NewClass->rpdeskParent = NULL; NewClass->Base = NewClass; /* replace the class in the list */ @@ -680,7 +680,7 @@ IntMoveClassToSharedHeap(IN OUT PWINDOWCLASS Class, } static VOID -IntCheckDesktopClasses(IN PDESKTOPINFO Desktop, +IntCheckDesktopClasses(IN PDESKTOP Desktop, IN OUT PWINDOWCLASS *ClassList, IN BOOL FreeOnFailure, OUT BOOL *Ret) @@ -704,7 +704,7 @@ IntCheckDesktopClasses(IN PDESKTOPINFO Desktop, ASSERT(Class->Base == Class); - if (Class->Desktop == Desktop && + if (Class->rpdeskParent == Desktop && Class->Windows == 0) { /* there shouldn't be any clones around anymore! */ @@ -749,7 +749,7 @@ IntCheckDesktopClasses(IN PDESKTOPINFO Desktop, } BOOL -IntCheckProcessDesktopClasses(IN PDESKTOPINFO Desktop, +IntCheckProcessDesktopClasses(IN PDESKTOP Desktop, IN BOOL FreeOnFailure) { PW32PROCESSINFO pi; @@ -792,7 +792,7 @@ IntCreateClass(IN CONST WNDCLASSEXW* lpwcx, IN PUNICODE_STRING MenuName, IN WNDPROC wpExtra, IN DWORD dwFlags, - IN PDESKTOPINFO Desktop, + IN PDESKTOP Desktop, IN PW32PROCESSINFO pi) { SIZE_T ClassSize; @@ -838,7 +838,7 @@ IntCreateClass(IN CONST WNDCLASSEXW* lpwcx, RtlZeroMemory(Class, ClassSize); - Class->Desktop = Desktop; + Class->rpdeskParent = Desktop; Class->Base = Class; Class->Atom = Atom; @@ -1131,6 +1131,7 @@ UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, IN WNDPROC wpExtra, IN DWORD dwFlags) { + PTHREADINFO pti; PW32THREADINFO ti; PW32PROCESSINFO pi; PWINDOWCLASS Class; @@ -1139,6 +1140,7 @@ UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, /* NOTE: Accessing the buffers in ClassName and MenuName may raise exceptions! */ + pti = PsGetCurrentThreadWin32Thread(); ti = GetW32ThreadInfo(); if (ti == NULL || !ti->kpi->RegisteredSysClasses) { @@ -1180,7 +1182,7 @@ UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, MenuName, wpExtra, dwFlags, - ti->Desktop, + pti->Desktop, pi); if (Class != NULL) diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 0ebe8252815..6f62a185c44 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -1914,7 +1914,7 @@ IntSetThreadDesktop(IN PDESKTOP DesktopObject, } if (OldDesktop != NULL && - !IntCheckProcessDesktopClasses(OldDesktop->DesktopInfo, + !IntCheckProcessDesktopClasses(OldDesktop, FreeOnFailure)) { DPRINT1("Failed to move process classes to shared heap!\n"); diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 98405a2253a..2fc3504d2f3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -343,12 +343,12 @@ UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject) { Wnd->WindowName.Length = 0; Wnd->WindowName.MaximumLength = 0; - DesktopHeapFree(Wnd->pdesktop->DesktopInfo, + DesktopHeapFree(Wnd->pdesktop, Wnd->WindowName.Buffer); Wnd->WindowName.Buffer = NULL; } - DesktopHeapFree(Wnd->pdesktop->DesktopInfo, Wnd); + DesktopHeapFree(Wnd->pdesktop, Wnd); WindowObject->Wnd = NULL; } @@ -1601,7 +1601,7 @@ co_IntCreateWindowEx(DWORD dwExStyle, Class = IntReferenceClass(Class, ClassLink, - pti->Desktop->DesktopInfo); + pti->Desktop); if (Class == NULL) { DPRINT1("Failed to reference window class!\n"); @@ -1619,7 +1619,7 @@ co_IntCreateWindowEx(DWORD dwExStyle, otWindow, sizeof(WINDOW_OBJECT)); if (Window) { - Window->Wnd = DesktopHeapAlloc(pti->Desktop->DesktopInfo, + Window->Wnd = DesktopHeapAlloc(pti->Desktop, sizeof(WINDOW) + Class->WndExtra); if (!Window->Wnd) goto AllocErr; @@ -1719,7 +1719,7 @@ AllocErr: if (NULL != WindowName->Buffer && WindowName->Length > 0) { - Wnd->WindowName.Buffer = DesktopHeapAlloc(Wnd->pdesktop->DesktopInfo, + Wnd->WindowName.Buffer = DesktopHeapAlloc(Wnd->pdesktop, WindowName->Length + sizeof(UNICODE_NULL)); if (Wnd->WindowName.Buffer == NULL) { @@ -4592,11 +4592,11 @@ NtUserDefSetText(HWND hWnd, PUNICODE_STRING WindowText) Wnd->WindowName.Buffer = NULL; if (buf != NULL) { - DesktopHeapFree(Wnd->pdesktop->DesktopInfo, + DesktopHeapFree(Wnd->pdesktop, buf); } - Wnd->WindowName.Buffer = DesktopHeapAlloc(Wnd->pdesktop->DesktopInfo, + Wnd->WindowName.Buffer = DesktopHeapAlloc(Wnd->pdesktop, SafeText.Length + sizeof(UNICODE_NULL)); if (Wnd->WindowName.Buffer != NULL) {