VOID FASTCALL DC_UnlockDisplay(HDC);
VOID FASTCALL IntGdiCopyFromSaveState(PDC, PDC, HDC);
VOID FASTCALL IntGdiCopyToSaveState(PDC, PDC);
+BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
VOID FASTCALL DC_UpdateXforms(PDC dc);
BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
+VOID FASTCALL DCU_SetDcUndeletable(HDC);
VOID FASTCALL IntGetViewportExtEx(PDC dc, LPSIZE pt);
VOID FASTCALL IntGetViewportOrgEx(PDC dc, LPPOINT pt);
#define DCX_DCEEMPTY 0x00000800
#define DCX_DCEBUSY 0x00001000
#define DCX_DCEDIRTY 0x00002000
+#define DCX_DCOWNED 0x00008000
#define DCX_USESTYLE 0x00010000
#define DCX_KEEPCLIPRGN 0x00040000
#define DCX_NOCLIPCHILDREN 0x00080000
FirstDce = pDce;
KeLeaveCriticalRegion();
+ DCU_SetDcUndeletable(pDce->hDC);
+
if (Type == DCE_WINDOW_DC) //Window DCE have ownership.
{ // Process should already own it.
pDce->pProcess = PsGetCurrentProcess();
PWINDOW Wnd = NULL;
if (NULL == Window)
- {
- Flags &= ~DCX_USESTYLE;
+ { // Do the same as GetDC with a NULL.
+ Window = UserGetWindowObject(IntGetDesktopWindow());
+ if (Window) Wnd = Window->Wnd;
+ else
+ Flags &= ~DCX_USESTYLE;
}
else
Wnd = Window->Wnd;
}
}
- NtGdiDeleteObjectApp(pdce->hDC);
+ IntGdiDeleteDC(pdce->hDC, TRUE);
+
if (pdce->hClipRgn && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
{
NtGdiDeleteObject(pdce->hClipRgn);
}
+//
+//
+//
BOOL
-STDCALL
-NtGdiDeleteObjectApp(HANDLE DCHandle)
+FASTCALL
+IntGdiDeleteDC(HDC hDC, BOOL Force)
{
- PDC DCToDelete;
+ BOOL Ret = FALSE;
+ PDC DCToDelete = DC_LockDc(hDC);
- if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC)
- return NtGdiDeleteObject((HGDIOBJ) DCHandle);
-
- if(IsObjectDead((HGDIOBJ)DCHandle)) return TRUE;
-
- if (!GDIOBJ_OwnedByCurrentProcess(GdiHandleTable, DCHandle))
+ if (DCToDelete == NULL)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
return FALSE;
}
- DCToDelete = DC_LockDc(DCHandle);
- if (DCToDelete == NULL)
+ if(!Force)
+ {
+ if (DCToDelete->DC_Flags & DC_FLAG_PERMANENT)
{
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return FALSE;
+ DPRINT1("No! You Naughty Application!\n");
+// if(!UserReleaseDC(NULL, hDC, FALSE)) Ret = FALSE;
}
+ DC_UnlockDc( DCToDelete );
+ return Ret;
+ }
/* First delete all saved DCs */
while (DCToDelete->saveLevel)
}
DC_UnlockDc( DCToDelete );
- DC_FreeDC ( DCHandle );
+ DC_FreeDC ( hDC );
return TRUE;
}
+BOOL
+STDCALL
+NtGdiDeleteObjectApp(HANDLE DCHandle)
+{
+
+ if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE;
+
+ if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC)
+ return NtGdiDeleteObject((HGDIOBJ) DCHandle);
+
+ if(IsObjectDead((HGDIOBJ)DCHandle)) return TRUE;
+
+ if (!GDIOBJ_OwnedByCurrentProcess(GdiHandleTable, DCHandle))
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+
+ return IntGdiDeleteDC(DCHandle, FALSE);
+}
+
INT
APIENTRY
NtGdiDrawEscape(
NtGdiSelectBrush(hDC, hBrush);
return oldColor;
}
+
+VOID
+FASTCALL
+DCU_SetDcUndeletable(HDC hDC)
+{
+ PDC dc = DC_LockDc(hDC);
+ if (!dc)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return;
+ }
+
+ dc->DC_Flags |= DC_FLAG_PERMANENT;
+ DC_UnlockDc( dc );
+ return;
+}