Removed Dce from the DC handle table. Tested bootcd, Explorer and Taskmgr.

svn path=/trunk/; revision=27804
This commit is contained in:
James Tabor 2007-07-25 03:35:59 +00:00
parent c440e3860d
commit 7705c7b9d4
5 changed files with 123 additions and 103 deletions

View file

@ -50,7 +50,6 @@
/* Following object types made up for ROS */
#define GDI_OBJECT_TYPE_ENHMETADC 0x00740000
#define GDI_OBJECT_TYPE_MEMDC 0x00750000
#define GDI_OBJECT_TYPE_DCE 0x00770000
#define GDI_OBJECT_TYPE_DONTCARE 0x007f0000
/** Not really an object type. Forces GDI_FreeObj to be silent. */
#define GDI_OBJECT_TYPE_SILENT 0x80000000

View file

@ -32,24 +32,21 @@ typedef struct tagDCE
HRGN hClipRgn;
DCE_TYPE type;
DWORD DCXFlags;
PEPROCESS pProcess;
HANDLE Self;
} DCE; /* PDCE already declared at top of file */
/* internal DCX flags */
/* internal DCX flags, see psdk/winuser.h for the rest */
#define DCX_EXCLUDEUPDATE 0x00000100
#define DCX_DCEEMPTY 0x00000800
#define DCX_DCEBUSY 0x00001000
#define DCX_DCEDIRTY 0x00002000
#define DCX_USESTYLE 0x00010000
#define DCX_USESTYLE 0x00010000
#define DCX_KEEPCLIPRGN 0x00040000
#define DCX_NOCLIPCHILDREN 0x00080000
#define DCEOBJ_AllocDCE() \
((HDCE) GDIOBJ_AllocObj (GdiHandleTable, GDI_OBJECT_TYPE_DCE))
#define DCEOBJ_FreeDCE(hDCE) GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ)hDCE, GDI_OBJECT_TYPE_DCE)
#define DCEOBJ_LockDCE(hDCE) ((PDCE)GDIOBJ_LockObj(GdiHandleTable, (HGDIOBJ)hDCE, GDI_OBJECT_TYPE_DCE))
#define DCEOBJ_UnlockDCE(pDCE) GDIOBJ_UnlockObjByPtr(GdiHandleTable, pDCE)
BOOL INTERNAL_CALL DCE_Cleanup(PVOID ObjectBody);
#define DCX_NOCLIPCHILDREN 0x00080000
#define DCX_NORECOMPUTE 0x00100000
BOOL FASTCALL DCE_Cleanup(PDCE pDce);
PDCE FASTCALL DceAllocDCE(PWINDOW_OBJECT Window, DCE_TYPE Type);
PDCE FASTCALL DCE_FreeDCE(PDCE dce);
VOID FASTCALL DCE_FreeWindowDCE(HWND);

View file

@ -24,7 +24,8 @@
#define TAG_TIMERBMP TAG('T', 'I', 'M', 'B') /* timers bitmap */
#define TAG_CALLBACK TAG('C', 'B', 'C', 'K') /* callback memory */
#define TAG_WINSTA TAG('W', 'S', 'T', 'A') /* window station */
#define TAG_PDCE TAG('U', 's', 'd', 'c') /* dce */
/* objects */
#define TAG_BEZIER TAG('B', 'E', 'Z', 'R') /* bezier */
#define TAG_BITMAP TAG('B', 'T', 'M', 'P') /* bitmap */

View file

@ -39,13 +39,24 @@
/* NOTE - I think we should store this per window station (including gdi objects) */
static PDCE FirstDce = NULL;
static HDC defaultDCstate;
static HDC defaultDCstate = NULL;
//static INT DCECount = 0;
#define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \
DCX_CACHE | DCX_WINDOW | DCX_PARENTCLIP)
/* FUNCTIONS *****************************************************************/
HDC FASTCALL
DceCreateDisplayDC(VOID)
{
HDC hDC;
UNICODE_STRING DriverName;
RtlInitUnicodeString(&DriverName, L"DISPLAY");
hDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE);
return hDC;
}
VOID FASTCALL
DceInit(VOID)
{
@ -103,56 +114,65 @@ NtUserGetDC(HWND hWnd)
PDCE FASTCALL
DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
{
HDCE DceHandle;
DCE* Dce;
UNICODE_STRING DriverName;
DceHandle = DCEOBJ_AllocDCE();
if(!DceHandle)
return NULL;
RtlInitUnicodeString(&DriverName, L"DISPLAY");
Dce = DCEOBJ_LockDCE(DceHandle);
/* No real locking, just get the pointer */
DCEOBJ_UnlockDCE(Dce);
Dce->Self = DceHandle;
Dce->hDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE);
if (NULL == defaultDCstate)
{
defaultDCstate = NtGdiGetDCState(Dce->hDC);
DC_SetOwnership(defaultDCstate, NULL);
}
GDIOBJ_SetOwnership(GdiHandleTable, Dce->Self, NULL);
DC_SetOwnership(Dce->hDC, NULL);
Dce->hwndCurrent = (Window ? Window->hSelf : NULL);
Dce->hClipRgn = NULL;
Dce->next = FirstDce;
FirstDce = Dce;
if (Type != DCE_CACHE_DC)
{
Dce->DCXFlags = DCX_DCEBUSY;
if (Window)
{
if (Window->Style & WS_CLIPCHILDREN)
{
Dce->DCXFlags |= DCX_CLIPCHILDREN;
}
if (Window->Style & WS_CLIPSIBLINGS)
{
Dce->DCXFlags |= DCX_CLIPSIBLINGS;
}
}
}
else
{
Dce->DCXFlags = DCX_CACHE | DCX_DCEEMPTY;
}
return(Dce);
PDCE pDce;
pDce = ExAllocatePoolWithTag(PagedPool, sizeof(DCE), TAG_PDCE);
if(!pDce)
return NULL;
pDce->hDC = DceCreateDisplayDC();
if(!pDce->hDC)
{
ExFreePoolWithTag(pDce, TAG_PDCE);
return NULL;
}
if (NULL == defaultDCstate) // Ultra HAX! Dedicated to GvG!
{ // This is a cheesy way to do this.
// But, due to the right way of creating gdi handles there is no choice.
defaultDCstate = NtGdiGetDCState(pDce->hDC);
DC_SetOwnership( defaultDCstate, NULL);
}
pDce->hwndCurrent = (Window ? Window->hSelf : NULL);
pDce->hClipRgn = NULL;
pDce->pProcess = NULL;
pDce->next = FirstDce;
FirstDce = pDce;
if (Type == DCE_WINDOW_DC) //Window DCE have ownership.
{
DC_SetOwnership(pDce->hDC, PsGetCurrentProcess());
pDce->pProcess = PsGetCurrentProcess();
}
else
{
DC_SetOwnership(pDce->hDC, NULL); // This hDC is inaccessible!
}
if (Type != DCE_CACHE_DC)
{
pDce->DCXFlags = DCX_DCEBUSY;
if (Window)
{
if (Window->Style & WS_CLIPCHILDREN)
{
pDce->DCXFlags |= DCX_CLIPCHILDREN;
}
if (Window->Style & WS_CLIPSIBLINGS)
{
pDce->DCXFlags |= DCX_CLIPSIBLINGS;
}
}
}
else
{
pDce->DCXFlags = DCX_CACHE | DCX_DCEEMPTY;
}
return(pDce);
}
VOID static STDCALL
@ -225,7 +245,15 @@ DceReleaseDC(DCE* dce, BOOL EndPaint)
{
/* make the DC clean so that SetDCState doesn't try to update the vis rgn */
NtGdiSetHookFlags(dce->hDC, DCHF_VALIDATEVISRGN);
if( dce->pProcess ) // Attempt to fix Dc_Attr problem.
DC_SetOwnership( defaultDCstate, dce->pProcess);
else
DC_SetOwnership( defaultDCstate, PsGetCurrentProcess());
NtGdiSetDCState(dce->hDC, defaultDCstate);
DC_SetOwnership( defaultDCstate, NULL); // Return default dc state to inaccessible mode.
dce->DCXFlags &= ~DCX_DCEBUSY;
if (dce->DCXFlags & DCX_DCEDIRTY)
{
@ -237,7 +265,6 @@ DceReleaseDC(DCE* dce, BOOL EndPaint)
dce->DCXFlags |= DCX_DCEEMPTY;
}
}
return 1;
}
@ -535,12 +562,10 @@ CLEANUP:
}
BOOL INTERNAL_CALL
DCE_Cleanup(PVOID ObjectBody)
BOOL FASTCALL
DCE_Cleanup(PDCE pDce)
{
PDCE PrevInList;
PDCE pDce = (PDCE)ObjectBody;
if (pDce == FirstDce)
{
@ -604,7 +629,8 @@ UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint)
}
// Win 3.1 throw back, hWnd should be ignored and not used.
// Replace with NtUserCallOneParam ((DWORD) hDC, ONEPARAM_ROUTINE_RELEASEDC);
INT STDCALL
NtUserReleaseDC(HWND hWnd, HDC hDc)
{
@ -625,40 +651,38 @@ CLEANUP:
* DceFreeDCE
*/
PDCE FASTCALL
DceFreeDCE(PDCE dce, BOOLEAN Force)
{
DCE *ret;
if (NULL == dce)
{
return NULL;
}
ret = dce->next;
#if 0 /* FIXME */
SetDCHook(dce->hDC, NULL, 0L);
#endif
if(Force && !GDIOBJ_OwnedByCurrentProcess(GdiHandleTable, dce->hDC))
{
GDIOBJ_SetOwnership(GdiHandleTable, dce->Self, PsGetCurrentProcess());
DC_SetOwnership(dce->hDC, PsGetCurrentProcess());
}
NtGdiDeleteObjectApp(dce->hDC);
if (dce->hClipRgn && ! (dce->DCXFlags & DCX_KEEPCLIPRGN))
{
NtGdiDeleteObject(dce->hClipRgn);
}
DCEOBJ_FreeDCE(dce->Self);
return ret;
DceFreeDCE(PDCE pdce, BOOLEAN Force)
{
DCE *ret;
if (NULL == pdce)
{
return NULL;
}
ret = pdce->next;
#if 0 /* FIXME */
SetDCHook(pdce->hDC, NULL, 0L);
#endif
if(Force && !GDIOBJ_OwnedByCurrentProcess(GdiHandleTable, pdce->hDC))
{
DC_SetOwnership( pdce->hDC, PsGetCurrentProcess());
}
NtGdiDeleteObjectApp(pdce->hDC);
if (pdce->hClipRgn && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
{
NtGdiDeleteObject(pdce->hClipRgn);
}
DCE_Cleanup(pdce);
ExFreePoolWithTag(pdce, TAG_PDCE);
return ret;
}
/***********************************************************************
* DceFreeWindowDCE
*

View file

@ -77,7 +77,6 @@ GDI_OBJ_INFO ObjInfo[] =
{GDI_OBJECT_TYPE_BRUSH, sizeof(GDIBRUSHOBJ), BRUSH_Cleanup},
{GDI_OBJECT_TYPE_PEN, sizeof(GDIBRUSHOBJ), GDI_CleanupDummy},
{GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ), GDI_CleanupDummy},
{GDI_OBJECT_TYPE_DCE, sizeof(DCE), DCE_Cleanup},
{GDI_OBJECT_TYPE_DIRECTDRAW, sizeof(DD_DIRECTDRAW), DD_Cleanup},
{GDI_OBJECT_TYPE_DD_SURFACE, sizeof(DD_SURFACE), DDSURF_Cleanup},
{GDI_OBJECT_TYPE_EXTPEN, sizeof(GDIBRUSHOBJ), EXTPEN_Cleanup},