Author: jimtabor Date: Tue Jun 3 16:13:10 2008 New Revision: 33841
URL: http://svn.reactos.org/svn/reactos?rev=33841&view=rev Log: Attempt to fix bugs 3050 and 3209. DCE list becomes corrupted during shutdown.
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] Tue Jun 3 16:13:10 2008 @@ -575,6 +575,7 @@ { DCE *ret; BOOL Hit = FALSE; + NTSTATUS Status = STATUS_SUCCESS;
if (NULL == pdce) return NULL;
@@ -603,8 +604,23 @@ { NtGdiDeleteObject(pdce->hClipRgn); } - - RemoveEntryList(&pdce->List); + // Temp fix until we know where the problem is, most likely in windc. + _SEH_TRY + { + RemoveEntryList(&pdce->List); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + DPRINT1("CRASHED DCE! -> %x\n" , pdce); + return 0; // Give it up and bail~! + } + ExFreePoolWithTag(pdce, TAG_PDCE);
return ret; @@ -677,10 +693,16 @@ VOID FASTCALL DceEmptyCache() { - while (FirstDce != NULL) - { - FirstDce = DceFreeDCE(FirstDce, TRUE); - } + PDCE pDCE = FirstDce; + KeEnterCriticalRegion(); + do + { + if(!pDCE) break; + pDCE = DceFreeDCE(pDCE, TRUE); + if(!pDCE) break; + } while (pDCE != FirstDce); + KeLeaveCriticalRegion(); + FirstDce = NULL; }
VOID FASTCALL