- Fix API GetDCEx tests! Dedicated to the great work by Timo Kreuzer.
- This uncovered a loop flaw, witch passed on any DCE last accessed.

svn path=/trunk/; revision=66452
This commit is contained in:
James Tabor 2015-02-25 13:25:57 +00:00
parent d733548fb4
commit 4a69037878

View file

@ -366,7 +366,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
Flags |= DCX_CACHE; Flags |= DCX_CACHE;
} }
if (Flags & (DCX_WINDOW | DCX_PARENTCLIP)) Flags |= DCX_CACHE; if (Flags & DCX_PARENTCLIP) Flags |= DCX_CACHE;
// When GetDC is called with hWnd nz, DCX_CACHE & _WINDOW are clear w _USESTYLE set. // When GetDC is called with hWnd nz, DCX_CACHE & _WINDOW are clear w _USESTYLE set.
if (Flags & DCX_USESTYLE) if (Flags & DCX_USESTYLE)
@ -488,6 +488,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
break; break;
} }
} }
Dce = NULL; // Loop issue?
} }
KeLeaveCriticalRegion(); KeLeaveCriticalRegion();
@ -497,7 +498,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
{ {
Dce = DceAllocDCE(NULL, DCE_CACHE_DC); Dce = DceAllocDCE(NULL, DCE_CACHE_DC);
} }
if (!Dce) return NULL; if (Dce == NULL) return NULL;
Dce->hwndCurrent = (Wnd ? Wnd->head.h : NULL); Dce->hwndCurrent = (Wnd ? Wnd->head.h : NULL);
Dce->pwndOrg = Dce->pwndClip = Wnd; Dce->pwndOrg = Dce->pwndClip = Wnd;
@ -510,20 +511,31 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
{ {
Dce = CONTAINING_RECORD(ListEntry, DCE, List); Dce = CONTAINING_RECORD(ListEntry, DCE, List);
ListEntry = ListEntry->Flink; ListEntry = ListEntry->Flink;
// Check for Window handle than HDC match for CLASS.
if (Dce->hwndCurrent == Wnd->head.h) // Skip Cache DCE entries.
if (!(Dce->DCXFlags & DCX_CACHE))
{ {
bUpdateVisRgn = FALSE; // Check for Window handle than HDC match for CLASS.
break; if (Dce->hwndCurrent == Wnd->head.h)
{
bUpdateVisRgn = FALSE;
break;
}
else if (Dce->hDC == hDC) break;
} }
if (Dce->hDC == hDC) break; Dce = NULL; // Loop issue?
} }
KeLeaveCriticalRegion(); KeLeaveCriticalRegion();
if (Dce == NULL)
{
return(NULL);
}
if ( (Flags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) && if ( (Flags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) &&
(Dce->DCXFlags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) ) (Dce->DCXFlags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) )
{ {
DceDeleteClipRgn(Dce); DceDeleteClipRgn(Dce);
} }
} }
// First time use hax, need to use DceAllocDCE during window display init. // First time use hax, need to use DceAllocDCE during window display init.