From 196ba3d61836f23ca4cbff07d9ab2bfacb448e50 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 10 Oct 2013 12:40:30 +0000 Subject: [PATCH] [Win32k] - Fix applications exit before the release of class atoms. svn path=/trunk/; revision=60599 --- reactos/win32ss/user/ntuser/class.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/reactos/win32ss/user/ntuser/class.c b/reactos/win32ss/user/ntuser/class.c index c9504946993..6bf41a6217d 100644 --- a/reactos/win32ss/user/ntuser/class.c +++ b/reactos/win32ss/user/ntuser/class.c @@ -9,6 +9,9 @@ #include DBG_DEFAULT_CHANNEL(UserClass); +BOOL FASTCALL IntClassDestroyIcon(HANDLE hCurIcon); +static NTSTATUS IntDeregisterClassAtom(IN RTL_ATOM Atom); + REGISTER_SYSCLASS DefaultServerClasses[] = { { ((PWSTR)((ULONG_PTR)(WORD)(0x8001))), @@ -227,6 +230,13 @@ IntDestroyClass(IN OUT PCLS Class) CallProc = NextCallProc; } + // Fixes running the static test then run class test issue. + // Some applications do not use UnregisterClass before exiting. + // Keep from reusing the same atom with case insensitive + // comparisons, remove registration of the atom if not zeroed. + if (Class->atomClassName) + IntDeregisterClassAtom(Class->atomClassName); + if (Class->pdce) { DceFreeClassDCE(((PDCE)Class->pdce)->hDC); @@ -236,6 +246,9 @@ IntDestroyClass(IN OUT PCLS Class) IntFreeClassMenuName(Class); } + if (Class->hIconSmIntern) + IntClassDestroyIcon(Class->hIconSmIntern); + pDesk = Class->rpdeskParent; Class->rpdeskParent = NULL; @@ -1481,6 +1494,7 @@ UserUnregisterClass(IN PUNICODE_STRING ClassName, { TRACE("Class 0x%p\n", Class); TRACE("UserUnregisterClass: Good Exit!\n"); + Class->atomClassName = 0; // Don't let it linger... /* Finally free the resources */ IntDestroyClass(Class); return TRUE;