From d7e597d60ec06d1495e0c3e93bd708be27a0f23f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Mar 2011 10:25:10 +0000 Subject: [PATCH] [WIN32K] - Move IntGdiSetBrushOwner to brush.c - Move IntGdiSetDCOwnerEx to dclife.c - Move IntGdiSetRegionOwner to region.c svn path=/trunk/; revision=51191 --- .../subsystems/win32/win32k/objects/brush.c | 49 +++++++ .../subsystems/win32/win32k/objects/dclife.c | 44 ++++++- .../subsystems/win32/win32k/objects/gdiobj.c | 120 ------------------ .../subsystems/win32/win32k/objects/region.c | 28 ++++ 4 files changed, 120 insertions(+), 121 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 5ad5f0764bf..f9d773e2e38 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -573,4 +573,53 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) return TRUE; } +BOOL +FASTCALL +IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) +{ + HBRUSH hBR; + PEPROCESS Owner = NULL; + PGDI_TABLE_ENTRY pEntry = NULL; + + if (!pbr) return FALSE; + + hBR = pbr->BaseObject.hHmgr; + + if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) + return FALSE; + else + { + INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); + pEntry = &GdiHandleTable->Entries[Index]; + } + + if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) + { + GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); + return TRUE; + } + + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + // Set this Brush to inaccessible mode and to an Owner of NONE. +// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; + + if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) + return FALSE; + + // Deny user access to User Data. + pEntry->UserData = NULL; // This hBR is inaccessible! + } + + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) + return FALSE; + + // Allow user access to User Data. + pEntry->UserData = pbr->pBrushAttr; + } + return TRUE; +} + /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 7d6d330e708..b83c6f039fd 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -836,7 +836,7 @@ IntGdiDeleteDC(HDC hDC, BOOL Force) { DPRINT1("Attempted to Delete 0x%x currently being destroyed!!!\n", hDC); } - + return TRUE; } @@ -973,3 +973,45 @@ IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC) return hDC; } +BOOL +FASTCALL +IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush) +{ + PDC pDC; + BOOL Ret = FALSE; + + if (!hDC || (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)) return FALSE; + + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + pDC = DC_LockDc ( hDC ); + MmCopyFromCaller(&pDC->dcattr, pDC->pdcattr, sizeof(DC_ATTR)); + DC_vFreeDcAttr(pDC); + DC_UnlockDc( pDC ); + + if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible! + return Ret; + } + + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + pDC = DC_LockDc ( hDC ); + ASSERT(pDC->pdcattr == &pDC->dcattr); + DC_UnlockDc( pDC ); + + if (!DC_SetOwnership( hDC, PsGetCurrentProcess() )) return Ret; + + DC_AllocateDcAttr( hDC ); // Allocate new dcattr + + DCU_SynchDcAttrtoUser( hDC ); // Copy data from dc to dcattr + } + + if ((OwnerMask != GDI_OBJ_HMGR_NONE) && !NoSetBrush) + { + pDC = DC_LockDc ( hDC ); + if (IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrFill, OwnerMask)) + IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrLine, OwnerMask); + DC_UnlockDc( pDC ); + } + return TRUE; +} diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 55f8a1d9b42..6c6be35895c 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -1726,126 +1726,6 @@ GDIOBJ_LockMultipleObjs(ULONG ulCount, /** PUBLIC FUNCTIONS **********************************************************/ -BOOL -FASTCALL -IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) -{ - INT Index; - PGDI_TABLE_ENTRY Entry; -/* - System Regions: - These regions do not use attribute sections and when allocated, use gdiobj - level functions. - */ - // FIXME! HAX!!! Remove this once we get everything right! - Index = GDI_HANDLE_GET_INDEX(hRgn); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - return GDIOBJ_SetOwnership(hRgn, NULL); - } - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); - } - return FALSE; -} - -BOOL -FASTCALL -IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) -{ - HBRUSH hBR; - PEPROCESS Owner = NULL; - PGDI_TABLE_ENTRY pEntry = NULL; - - if (!pbr) return FALSE; - - hBR = pbr->BaseObject.hHmgr; - - if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) - return FALSE; - else - { - INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); - pEntry = &GdiHandleTable->Entries[Index]; - } - - if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) - { - GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); - return TRUE; - } - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - // Set this Brush to inaccessible mode and to an Owner of NONE. -// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; - - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) - return FALSE; - - // Deny user access to User Data. - pEntry->UserData = NULL; // This hBR is inaccessible! - } - - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) - return FALSE; - - // Allow user access to User Data. - pEntry->UserData = pbr->pBrushAttr; - } - return TRUE; -} - -BOOL -FASTCALL -IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush) -{ - PDC pDC; - BOOL Ret = FALSE; - - if (!hDC || (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)) return FALSE; - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - pDC = DC_LockDc ( hDC ); - MmCopyFromCaller(&pDC->dcattr, pDC->pdcattr, sizeof(DC_ATTR)); - DC_vFreeDcAttr(pDC); - DC_UnlockDc( pDC ); - - if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible! - return Ret; - } - - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - pDC = DC_LockDc ( hDC ); - ASSERT(pDC->pdcattr == &pDC->dcattr); - DC_UnlockDc( pDC ); - - if (!DC_SetOwnership( hDC, PsGetCurrentProcess() )) return Ret; - - DC_AllocateDcAttr( hDC ); // Allocate new dcattr - - DCU_SynchDcAttrtoUser( hDC ); // Copy data from dc to dcattr - } - - if ((OwnerMask != GDI_OBJ_HMGR_NONE) && !NoSetBrush) - { - pDC = DC_LockDc ( hDC ); - if (IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrFill, OwnerMask)) - IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrLine, OwnerMask); - DC_UnlockDc( pDC ); - } - return TRUE; -} - INT FASTCALL GreGetObjectOwner(HGDIOBJ Handle, GDIOBJTYPE ObjType) diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 38ad6ae7232..56b6763148e 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -3942,4 +3942,32 @@ NtGdiGetRegionData( return size + sizeof(RGNDATAHEADER); } +BOOL +FASTCALL +IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) +{ + INT Index; + PGDI_TABLE_ENTRY Entry; +/* + System Regions: + These regions do not use attribute sections and when allocated, use gdiobj + level functions. + */ + // FIXME! HAX!!! Remove this once we get everything right! + Index = GDI_HANDLE_GET_INDEX(hRgn); + Entry = &GdiHandleTable->Entries[Index]; + if (Entry->UserData) FreeObjectAttr(Entry->UserData); + Entry->UserData = NULL; + // + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + return GDIOBJ_SetOwnership(hRgn, NULL); + } + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); + } + return FALSE; +} + /* EOF */