mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 21:44:31 +00:00
Removed Dce from the DC handle table. Tested bootcd, Explorer and Taskmgr.
svn path=/trunk/; revision=27804
This commit is contained in:
parent
c440e3860d
commit
7705c7b9d4
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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},
|
||||
|
|
Loading…
Reference in a new issue