ReactOS 0.4.16-dev-1946-g52006dd
gdiobj.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _GDI_HANDLE_TABLE
 
struct  _BASEOBJECT
 
struct  _CLIENTOBJ
 

Macros

#define GDI_OBJECT_STACK_LEVELS   20
 

Typedefs

typedef struct _GDI_HANDLE_TABLE GDI_HANDLE_TABLE
 
typedef struct _GDI_HANDLE_TABLEPGDI_HANDLE_TABLE
 
typedef PVOID PGDIOBJ
 
typedef VOID(NTAPIGDICLEANUPPROC) (PVOID ObjectBody)
 
typedef VOID(NTAPIGDIOBJDELETEPROC) (PVOID ObjectBody)
 
typedef struct _BASEOBJECT BASEOBJECT
 
typedef struct _BASEOBJECTPOBJ
 
typedef struct _CLIENTOBJ CLIENTOBJ
 
typedef struct _CLIENTOBJPCLIENTOBJ
 

Enumerations

enum  BASEFLAGS { BASEFLAG_LOOKASIDE = 0x80 , BASEFLAG_READY_TO_DIE = 0x1000 }
 
enum  _GDIOBJLAGS { GDIOBJFLAG_DEFAULT = 0x00 , GDIOBJFLAG_IGNOREPID = 0x01 , GDIOBJFLAG_IGNORELOCK = 0x02 }
 

Functions

NTSTATUS NTAPI InitGdiHandleTable (VOID)
 
BOOL NTAPI GreIsHandleValid (HGDIOBJ hobj)
 
BOOL NTAPI GreDeleteObject (HGDIOBJ hObject)
 
ULONG NTAPI GreGetObjectOwner (HGDIOBJ hobj)
 
BOOL NTAPI GreSetObjectOwner (HGDIOBJ hobj, ULONG ulOwner)
 
BOOL NTAPI GreSetObjectOwnerEx (HGDIOBJ hobj, ULONG ulOwner, ULONG Flags)
 
INT NTAPI GreGetObject (IN HGDIOBJ hobj, IN INT cbCount, OUT PVOID pvBuffer)
 
POBJ NTAPI GDIOBJ_AllocateObject (UCHAR objt, ULONG cjSize, FLONG fl)
 
VOID NTAPI GDIOBJ_vDeleteObject (POBJ pobj)
 
POBJ NTAPI GDIOBJ_ReferenceObjectByHandle (HGDIOBJ hobj, UCHAR objt)
 
VOID NTAPI GDIOBJ_vReferenceObjectByPointer (POBJ pobj)
 
VOID NTAPI GDIOBJ_vDereferenceObject (POBJ pobj)
 
PGDIOBJ NTAPI GDIOBJ_LockObject (HGDIOBJ hobj, UCHAR objt)
 
PGDIOBJ NTAPI GDIOBJ_TryLockObject (HGDIOBJ hobj, UCHAR objt)
 
VOID NTAPI GDIOBJ_vUnlockObject (POBJ pobj)
 
VOID NTAPI GDIOBJ_vSetObjectOwner (POBJ pobj, ULONG ulOwner)
 
BOOL NTAPI GDIOBJ_bLockMultipleObjects (ULONG ulCount, HGDIOBJ *ahObj, PGDIOBJ *apObj, UCHAR objt)
 
HGDIOBJ NTAPI GDIOBJ_hInsertObject (POBJ pobj, ULONG ulOwner)
 
VOID NTAPI GDIOBJ_vFreeObject (POBJ pobj)
 
VOID NTAPI GDIOBJ_vSetObjectAttr (POBJ pobj, PVOID pvObjAttr)
 
PVOID NTAPI GDIOBJ_pvGetObjectAttr (POBJ pobj)
 
BOOL NTAPI GDIOBJ_ConvertToStockObj (HGDIOBJ *hObj)
 
BOOL NTAPI GDIOBJ_ConvertFromStockObj (HGDIOBJ *phObj)
 
POBJ NTAPI GDIOBJ_AllocObjWithHandle (ULONG ObjectType, ULONG cjSize)
 
PGDIOBJ NTAPI GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType)
 
PVOID NTAPI GDI_MapHandleTable (PEPROCESS Process)
 

Variables

static const unsigned RESERVE_ENTRIES_COUNT = 10
 
PGDI_HANDLE_TABLE GdiHandleTable
 

Macro Definition Documentation

◆ GDI_OBJECT_STACK_LEVELS

#define GDI_OBJECT_STACK_LEVELS   20

Definition at line 8 of file gdiobj.h.

Typedef Documentation

◆ BASEOBJECT

◆ CLIENTOBJ

◆ GDI_HANDLE_TABLE

◆ GDICLEANUPPROC

typedef VOID(NTAPI * GDICLEANUPPROC) (PVOID ObjectBody)

Definition at line 33 of file gdiobj.h.

◆ GDIOBJDELETEPROC

typedef VOID(NTAPI * GDIOBJDELETEPROC) (PVOID ObjectBody)

Definition at line 34 of file gdiobj.h.

◆ PCLIENTOBJ

◆ PGDI_HANDLE_TABLE

◆ PGDIOBJ

typedef PVOID PGDIOBJ

Definition at line 31 of file gdiobj.h.

◆ POBJ

typedef struct _BASEOBJECT * POBJ

Enumeration Type Documentation

◆ _GDIOBJLAGS

Enumerator
GDIOBJFLAG_DEFAULT 
GDIOBJFLAG_IGNOREPID 
GDIOBJFLAG_IGNORELOCK 

Definition at line 69 of file gdiobj.h.

70{
71 GDIOBJFLAG_DEFAULT = 0x00,
74};
@ GDIOBJFLAG_DEFAULT
Definition: gdiobj.h:71
@ GDIOBJFLAG_IGNOREPID
Definition: gdiobj.h:72
@ GDIOBJFLAG_IGNORELOCK
Definition: gdiobj.h:73

◆ BASEFLAGS

Enumerator
BASEFLAG_LOOKASIDE 
BASEFLAG_READY_TO_DIE 

Definition at line 56 of file gdiobj.h.

57{
58 BASEFLAG_LOOKASIDE = 0x80,
59
60 /* ReactOS specific: */
62};
@ BASEFLAG_READY_TO_DIE
Definition: gdiobj.h:61
@ BASEFLAG_LOOKASIDE
Definition: gdiobj.h:58

Function Documentation

◆ GDI_MapHandleTable()

PVOID NTAPI GDI_MapHandleTable ( PEPROCESS  Process)

Definition at line 1565 of file gdiobj.c.

1566{
1567 PVOID pvMappedView = NULL;
1569 LARGE_INTEGER liOffset;
1570 SIZE_T cjViewSize = sizeof(GDI_HANDLE_TABLE);
1571
1572 liOffset.QuadPart = 0;
1573
1575 ASSERT(pProcess != NULL);
1576
1578 pProcess,
1579 &pvMappedView,
1580 0,
1581 0,
1582 &liOffset,
1583 &cjViewSize,
1584 ViewUnmap,
1587
1588 if (!NT_SUCCESS(Status))
1589 return NULL;
1590
1591 return pvMappedView;
1592}
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define PAGE_READONLY
Definition: compat.h:138
struct _GDI_HANDLE_TABLE GDI_HANDLE_TABLE
Status
Definition: gdiplustypes.h:25
#define ASSERT(a)
Definition: mode.c:44
#define SEC_NO_CHANGE
Definition: mmtypes.h:95
@ ViewUnmap
Definition: nt_native.h:1282
NTSTATUS NTAPI MmMapViewOfSection(IN PVOID SectionObject, IN PEPROCESS Process, IN OUT PVOID *BaseAddress, IN ULONG_PTR ZeroBits, IN SIZE_T CommitSize, IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, IN OUT PSIZE_T ViewSize, IN SECTION_INHERIT InheritDisposition, IN ULONG AllocationType, IN ULONG Protect)
Definition: section.c:4027
ULONG_PTR SIZE_T
Definition: typedefs.h:80
LONGLONG QuadPart
Definition: typedefs.h:114
static PVOID gpvGdiHdlTblSection
Definition: gdiobj.c:148

Referenced by GdiProcessCreate().

◆ GDIOBJ_AllocateObject()

POBJ NTAPI GDIOBJ_AllocateObject ( UCHAR  objt,
ULONG  cjSize,
FLONG  fl 
)

Definition at line 569 of file gdiobj.c.

570{
571 POBJ pobj;
572
574 {
575 /* Allocate the object from a lookaside list */
576 pobj = ExAllocateFromPagedLookasideList(&gpaLookasideList[objt & 0x1f]);
577 }
578 else
579 {
580 /* Allocate the object from paged pool */
582 }
583
584 if (!pobj) return NULL;
585
586 /* Initialize the object */
587 RtlZeroMemory(pobj, cjSize);
588 pobj->hHmgr = (HGDIOBJ)((ULONG_PTR)objt << 16);
589 pobj->cExclusiveLock = 0;
590 pobj->ulShareCount = 1;
591 pobj->BaseFlags = fl & 0xffff;
592 DBG_INITLOG(&pobj->slhLog);
593 DBG_LOGEVENT(&pobj->slhLog, EVENT_ALLOCATE, 0);
594#if DBG_ENABLE_GDIOBJ_BACKTRACES
595 DbgCaptureStackBackTace(pobj->apvBackTrace, 1, GDI_OBJECT_STACK_LEVELS);
596#endif /* GDI_DEBUG */
597
598 return pobj;
599}
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
#define DBG_LOGEVENT(pslh, type, val)
Definition: gdidebug.h:109
#define DBG_INITLOG(pslh)
Definition: gdidebug.h:110
ULONG NTAPI DbgCaptureStackBackTace(_Out_writes_(cFramesToCapture) PVOID *ppvFrames, _In_ ULONG cFramesToSkip, _In_ ULONG cFramesToCapture)
#define GDI_OBJECT_STACK_LEVELS
Definition: gdiobj.h:8
HGDIOBJ hHmgr
Definition: gdiobj.h:40
USHORT BaseFlags
Definition: gdiobj.h:46
USHORT cExclusiveLock
Definition: gdiobj.h:45
ULONG ulShareCount
Definition: gdiobj.h:42
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
static PPAGED_LOOKASIDE_LIST gpaLookasideList
Definition: gdiobj.c:153
#define GDIOBJ_POOL_TAG(type)
Definition: gdiobj.c:134
_In_ FLONG fl
Definition: winddi.h:1279
_In_ ULONG cjSize
Definition: winddi.h:3634
void * HGDIOBJ
Definition: windef.h:59

Referenced by DC_AllocDcWithHandle(), GDIOBJ_AllocObjWithHandle(), IntSysCreateRectpRgn(), NtGdiCreateClientObj(), PALETTE_AllocPalette(), and REGION_AllocRgnWithHandle().

◆ GDIOBJ_AllocObjWithHandle()

POBJ NTAPI GDIOBJ_AllocObjWithHandle ( ULONG  ObjectType,
ULONG  cjSize 
)

Definition at line 1535 of file gdiobj.c.

1536{
1537 POBJ pobj;
1538 FLONG fl = 0;
1539 UCHAR objt = (ObjectType >> 16) & 0xFF;
1540
1541 if ((objt == GDIObjType_DC_TYPE && cjSize == sizeof(DC)) ||
1542 (objt == GDIObjType_PAL_TYPE && cjSize == sizeof(PALETTE)) ||
1543 (objt == GDIObjType_RGN_TYPE && cjSize == sizeof(REGION)) ||
1544 (objt == GDIObjType_SURF_TYPE && cjSize == sizeof(SURFACE)) ||
1545 (objt == GDIObjType_PATH_TYPE && cjSize == sizeof(PATH)))
1546 {
1548 }
1549
1550 pobj = GDIOBJ_AllocateObject(objt, cjSize, fl);
1551 if (!pobj)
1552 {
1553 return NULL;
1554 }
1555
1557 {
1558 GDIOBJ_vFreeObject(pobj);
1559 return NULL;
1560 }
1561 return pobj;
1562}
ObjectType
Definition: metafile.c:81
unsigned long FLONG
Definition: ntbasedef.h:378
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
@ GDIObjType_PAL_TYPE
Definition: ntgdityp.h:128
@ GDIObjType_DC_TYPE
Definition: ntgdityp.h:121
@ GDIObjType_PATH_TYPE
Definition: ntgdityp.h:127
@ GDIObjType_RGN_TYPE
Definition: ntgdityp.h:124
@ GDIObjType_SURF_TYPE
Definition: ntgdityp.h:125
struct _PATH PATH
struct _REGION REGION
Definition: polytest.cpp:41
struct _SURFACE SURFACE
VOID NTAPI GDIOBJ_vFreeObject(POBJ pobj)
Definition: gdiobj.c:603
HGDIOBJ NTAPI GDIOBJ_hInsertObject(POBJ pobj, ULONG ulOwner)
Definition: gdiobj.c:919
POBJ NTAPI GDIOBJ_AllocateObject(UCHAR objt, ULONG cjSize, FLONG fl)
Definition: gdiobj.c:569
struct _PALETTE PALETTE
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by NtGdiCreateServerMetaFile(), PEN_AllocExtPenWithHandle(), PEN_AllocPenWithHandle(), and SURFACE_AllocSurface().

◆ GDIOBJ_bLockMultipleObjects()

BOOL NTAPI GDIOBJ_bLockMultipleObjects ( ULONG  ulCount,
HGDIOBJ ahObj,
PGDIOBJ apObj,
UCHAR  objt 
)

◆ GDIOBJ_ConvertFromStockObj()

BOOL NTAPI GDIOBJ_ConvertFromStockObj ( HGDIOBJ phObj)

Definition at line 1502 of file gdiobj.c.

1503{
1504 PENTRY pentry;
1505 POBJ pobj;
1506
1507 /* Reference the handle entry */
1508 pentry = ENTRY_ReferenceEntryByHandle(*phObj, 0);
1509 if (!pentry)
1510 {
1511 DPRINT1("GDIOBJ: Requested handle 0x%p is not valid.\n", *phObj);
1512 return FALSE;
1513 }
1514
1515 /* Update the entry */
1516 pentry->FullUnique &= ~GDI_ENTRY_STOCK_MASK;
1518
1519 /* Get the pointer to the BASEOBJECT */
1520 pobj = pentry->einfo.pobj;
1521
1522 /* Calculate the new handle */
1523 pobj->hHmgr = (HGDIOBJ)((ULONG_PTR)pobj->hHmgr & ~GDI_HANDLE_STOCK_MASK);
1524
1525 /* Return the new handle */
1526 *phObj = pobj->hHmgr;
1527
1528 /* Dereference the handle */
1530
1531 return TRUE;
1532}
#define DPRINT1
Definition: precomp.h:8
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define PtrToUlong(u)
Definition: config.h:107
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
Definition: ntgdihdl.h:218
union _ENTRY::_OBJECTOWNER ObjectOwner
union _ENTRY::_EINFO einfo
USHORT FullUnique
Definition: ntgdihdl.h:235
struct _BASEOBJECT * pobj
Definition: ntgdihdl.h:221
ULONG ulObj
Definition: ntgdihdl.h:232
VOID NTAPI GDIOBJ_vDereferenceObject(POBJ pobj)
Definition: gdiobj.c:638
static PENTRY ENTRY_ReferenceEntryByHandle(HGDIOBJ hobj, FLONG fl)
Definition: gdiobj.c:478

Referenced by NtGdiClearBitmapAttributes(), and NtGdiClearBrushAttributes().

◆ GDIOBJ_ConvertToStockObj()

BOOL NTAPI GDIOBJ_ConvertToStockObj ( HGDIOBJ hObj)

Definition at line 1468 of file gdiobj.c.

1469{
1470 PENTRY pentry;
1471 POBJ pobj;
1472
1473 /* Reference the handle entry */
1474 pentry = ENTRY_ReferenceEntryByHandle(*phObj, 0);
1475 if (!pentry)
1476 {
1477 DPRINT1("GDIOBJ: Requested handle 0x%p is not valid.\n", *phObj);
1478 return FALSE;
1479 }
1480
1481 /* Update the entry */
1483 pentry->ObjectOwner.ulObj = 0;
1484
1485 /* Get the pointer to the BASEOBJECT */
1486 pobj = pentry->einfo.pobj;
1487
1488 /* Calculate the new handle */
1490
1491 /* Return the new handle */
1492 *phObj = pobj->hHmgr;
1493
1494 /* Dereference the handle */
1496
1497 return TRUE;
1498}
#define GDI_HANDLE_STOCK_MASK
Definition: gdi.h:19
#define GDI_ENTRY_STOCK_MASK
Definition: ntgdihdl.h:33

Referenced by CreateStockObjects(), CreateSysColorObjects(), NtGdiSetBitmapAttributes(), and NtGdiSetBrushAttributes().

◆ GDIOBJ_hInsertObject()

HGDIOBJ NTAPI GDIOBJ_hInsertObject ( POBJ  pobj,
ULONG  ulOwner 
)

Definition at line 919 of file gdiobj.c.

922{
923 PENTRY pentry;
924 UCHAR objt;
925
926 /* Must have no handle and only one reference */
927 ASSERT(GDI_HANDLE_GET_INDEX(pobj->hHmgr) == 0);
928 ASSERT(pobj->cExclusiveLock == 0);
929 ASSERT(pobj->ulShareCount == 1);
930
931 /* Get a free handle entry */
932 pentry = ENTRY_pentPopFreeEntry();
933 if (!pentry)
934 {
935 DPRINT1("GDIOBJ: Could not get a free entry.\n");
936 return NULL;
937 }
938
939 /* Make the object exclusively locked */
943 pobj->cExclusiveLock = 1;
946
947 /* Get object type from the hHmgr field */
948 objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0xff;
950
951 /* Check if current process is requested owner */
952 if (ulOwner == GDI_OBJ_HMGR_POWNED)
953 {
954 /* Increment the process handle count */
956
957 /* Use Process id */
959 }
960
961 /* Insert the object into the handle table */
962 pobj->hHmgr = ENTRY_hInsertObject(pentry, pobj, objt, ulOwner);
963
964 /* Return the handle */
965 DPRINT("GDIOBJ: Created handle: %p\n", pobj->hHmgr);
966 DBG_LOGEVENT(&pobj->slhLog, EVENT_CREATE_HANDLE, 0);
967 return pobj->hHmgr;
968}
#define HandleToUlong(h)
Definition: basetsd.h:73
#define ULONG_PTR
Definition: config.h:101
#define ExInitializePushLock
Definition: ex.h:1016
FORCEINLINE VOID ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
Definition: ex.h:1039
PsGetCurrentThreadId
Definition: CrNtStubs.h:8
#define GDI_HANDLE_GET_INDEX(h)
Definition: gdi.h:28
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
@ GDIObjType_DEF_TYPE
Definition: ntgdityp.h:120
#define DPRINT
Definition: sndvol32.h:73
DWORD dwThreadId
Definition: gdiobj.h:43
EX_PUSH_LOCK pushlock
Definition: gdiobj.h:47
static PENTRY ENTRY_pentPopFreeEntry(VOID)
Definition: gdiobj.c:382
FORCEINLINE void INCREASE_THREAD_LOCK_COUNT(_In_ HANDLE hobj)
Definition: gdiobj.c:63
static HGDIOBJ ENTRY_hInsertObject(PENTRY pentry, POBJ pobj, UCHAR objt, ULONG ulOwner)
Definition: gdiobj.c:546
FORCEINLINE VOID IncrementCurrentProcessGdiHandleCount(void)
Definition: gdiobj.c:332

Referenced by DC_AllocDcWithHandle(), EngCreatePalette(), GDIOBJ_AllocObjWithHandle(), BASEOBJECT::hInsertObject(), NtGdiCreateClientObj(), PALETTE_AllocPalWithHandle(), and REGION_AllocRgnWithHandle().

◆ GDIOBJ_LockObject()

PGDIOBJ NTAPI GDIOBJ_LockObject ( HGDIOBJ  hobj,
UCHAR  objt 
)

Definition at line 833 of file gdiobj.c.

836{
837 PENTRY pentry;
838 POBJ pobj;
840
841 /* Check if the handle type matches */
843 if ((((ULONG_PTR)hobj >> 16) & 0x1f) != objt)
844 {
845 DPRINT("Wrong object type: hobj=0x%p, objt=0x%x\n", hobj, objt);
846 return NULL;
847 }
848
849 /* Make sure lock order is correct */
850 ASSERT_LOCK_ORDER(objt);
851
852 /* Reference the handle entry */
853 pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
854 if (!pentry)
855 {
856 DPRINT("GDIOBJ: Requested handle 0x%p is not valid.\n", hobj);
857 return NULL;
858 }
859
860 /* Get the pointer to the BASEOBJECT */
861 pobj = pentry->einfo.pobj;
862
863 /* Check if we already own the lock */
865 if (pobj->dwThreadId != dwThreadId)
866 {
867 /* Disable APCs and acquire the push lock */
870
871 /* Set us as lock owner */
872 ASSERT(pobj->dwThreadId == 0);
873 pobj->dwThreadId = dwThreadId;
874 }
875
876 /* Increase lock count */
877 pobj->cExclusiveLock++;
879 DBG_LOGEVENT(&pobj->slhLog, EVENT_LOCK, 0);
880
881 /* Return the object */
882 return pobj;
883}
DWORD dwThreadId
Definition: fdebug.c:31
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ASSERT_LOCK_ORDER(hobj)
Definition: gdiobj.c:124
#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt)
Definition: gdiobj.c:126

Referenced by DC_LockDc(), GDIOBJ_bLockMultipleObjects(), NtGdiGetServerMetaFileBits(), and REGION_LockRgn().

◆ GDIOBJ_pvGetObjectAttr()

PVOID NTAPI GDIOBJ_pvGetObjectAttr ( POBJ  pobj)

Definition at line 1095 of file gdiobj.c.

1096{
1097 ULONG ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
1098 return gpentHmgr[ulIndex].pUser;
1099}
PVOID pUser
Definition: ntgdihdl.h:238
uint32_t ULONG
Definition: typedefs.h:59
PENTRY gpentHmgr
Definition: gdiobj.c:149

◆ GDIOBJ_ReferenceObjectByHandle()

POBJ NTAPI GDIOBJ_ReferenceObjectByHandle ( HGDIOBJ  hobj,
UCHAR  objt 
)

Definition at line 698 of file gdiobj.c.

701{
702 PENTRY pentry;
703 POBJ pobj;
704
705 /* Check if the handle type matches */
707 if ((((ULONG_PTR)hobj >> 16) & 0x1f) != objt)
708 {
709 DPRINT("GDIOBJ: Wrong type. handle=%p, type=%x\n", hobj, objt);
710 return NULL;
711 }
712
713 /* Reference the handle entry */
714 pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
715 if (!pentry)
716 {
717 DPRINT("GDIOBJ: Requested handle 0x%p is not valid.\n", hobj);
718 return NULL;
719 }
720
721 /* Get the pointer to the BASEOBJECT */
722 pobj = pentry->einfo.pobj;
723
724 /* Check if the object is exclusively locked */
725 if (pobj->cExclusiveLock != 0)
726 {
727 DPRINT1("GDIOBJ: Cannot reference object %p with exclusive lock.\n", hobj);
729 DBG_DUMP_EVENT_LIST(&pobj->slhLog);
730 return NULL;
731 }
732
733 DBG_LOGEVENT(&pobj->slhLog, EVENT_REFERENCE, gpaulRefCount[pentry - gpentHmgr]);
734
735 /* All is well, return the object */
736 return pobj;
737}
#define DBG_DUMP_EVENT_LIST(pslh)
Definition: gdidebug.h:111
#define ASSERT_SHARED_OBJECT_TYPE(objt)
Definition: gdiobj.c:125
PULONG gpaulRefCount
Definition: gdiobj.c:150

Referenced by GDIOBJ_ShareLockObj(), GreGetObject(), and PEN_ShareLockPen().

◆ GDIOBJ_ShareLockObj()

PGDIOBJ NTAPI GDIOBJ_ShareLockObj ( HGDIOBJ  hObj,
DWORD  ObjectType 
)

Definition at line 1456 of file gdiobj.c.

1457{
1458 if (ExpectedType == GDI_OBJECT_TYPE_DONTCARE)
1459 ExpectedType = GDI_HANDLE_GET_TYPE(hObj);
1460 return GDIOBJ_ReferenceObjectByHandle(hObj, (ExpectedType >> 16) & 0x1f);
1461}
#define GDI_OBJECT_TYPE_DONTCARE
Definition: gdi.h:64
#define GDI_HANDLE_GET_TYPE(h)
Definition: gdi.h:31
POBJ NTAPI GDIOBJ_ReferenceObjectByHandle(HGDIOBJ hobj, UCHAR objt)
Definition: gdiobj.c:698

Referenced by BASEOBJECT::LockShared().

◆ GDIOBJ_TryLockObject()

PGDIOBJ NTAPI GDIOBJ_TryLockObject ( HGDIOBJ  hobj,
UCHAR  objt 
)

Definition at line 764 of file gdiobj.c.

767{
768 PENTRY pentry;
769 POBJ pobj;
771
772 /* Check if the handle type matches */
774 if ((((ULONG_PTR)hobj >> 16) & 0x1f) != objt)
775 {
776 DPRINT("Wrong object type: hobj=0x%p, objt=0x%x\n", hobj, objt);
777 return NULL;
778 }
779
780 /* Make sure lock order is correct */
781 ASSERT_LOCK_ORDER(objt);
782
783 /* Reference the handle entry */
784 pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
785 if (!pentry)
786 {
787 DPRINT("GDIOBJ: Requested handle 0x%p is not valid.\n", hobj);
788 return NULL;
789 }
790
791 /* Get the pointer to the BASEOBJECT */
792 pobj = pentry->einfo.pobj;
793
794 /* Check if we already own the lock */
796 if (pobj->dwThreadId != dwThreadId)
797 {
798 /* Disable APCs and try acquiring the push lock */
801 {
802 ULONG cRefs, ulIndex;
803 /* Already owned. Clean up and leave. */
805
806 /* Calculate the index */
807 ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
808
809 /* Decrement reference count */
810 ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0);
811 cRefs = InterlockedDecrement((LONG*)&gpaulRefCount[ulIndex]);
812 ASSERT(cRefs & REF_MASK_VALID);
813
814 return NULL;
815 }
816
817 /* Set us as lock owner */
818 ASSERT(pobj->dwThreadId == 0);
819 pobj->dwThreadId = dwThreadId;
820 }
821
822 /* Increase lock count */
823 pobj->cExclusiveLock++;
825 DBG_LOGEVENT(&pobj->slhLog, EVENT_LOCK, 0);
826
827 /* Return the object */
828 return pobj;
829}
#define InterlockedDecrement
Definition: armddk.h:52
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
long LONG
Definition: pedump.c:60
@ REF_MASK_COUNT
Definition: gdiobj.c:141
@ REF_MASK_VALID
Definition: gdiobj.c:140
#define ASSERT_TRYLOCK_OBJECT_TYPE(objt)
Definition: gdiobj.c:127
FORCEINLINE BOOLEAN ExTryAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
Definition: misc.h:117

Referenced by DRIVEROBJ_TryLockObject().

◆ GDIOBJ_vDeleteObject()

VOID NTAPI GDIOBJ_vDeleteObject ( POBJ  pobj)

Definition at line 1118 of file gdiobj.c.

1119{
1120 ULONG ulIndex;
1121
1122 /* Set the object's delete flag */
1124 DBG_LOGEVENT(&pobj->slhLog, EVENT_DELETE, 0);
1125
1126 /* Get the handle index */
1127 ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
1128 if (ulIndex)
1129 {
1130 /* Reset the handle valid bit */
1132
1133 /* Check if the object is exclusively locked */
1134 if (pobj->cExclusiveLock != 0)
1135 {
1136 /* Reset lock owner and lock count */
1137 pobj->dwThreadId = 0;
1138 pobj->cExclusiveLock = 0;
1139
1140 /* Release the pushlock and reenable APCs */
1144 }
1145 }
1146
1147 /* Dereference the object (will take care of deletion) */
1149}
FORCEINLINE VOID ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
Definition: ex.h:1255
#define InterlockedOr16
Definition: interlocked.h:254
#define InterlockedAnd
Definition: interlocked.h:77
short SHORT
Definition: pedump.c:59
FORCEINLINE void DECREASE_THREAD_LOCK_COUNT(_In_ HANDLE hobj)
Definition: gdiobj.c:79

Referenced by EngDeleteDriverObj(), EngDeletePalette(), EngDeletePath(), EngDeleteSurface(), GDI_CleanupForProcess(), GreDeleteObject(), IntEngMaskBlt(), IntGdiExtCreatePen(), NtGdiCreateBitmap(), NtGdiCreatePaletteInternal(), NtGdiCreateServerMetaFile(), NtGdiGetPixel(), PATH_Delete(), REGION_AllocRgnWithHandle(), REGION_Delete(), SURFACE_AllocSurface(), and UserDrawIconEx().

◆ GDIOBJ_vDereferenceObject()

VOID NTAPI GDIOBJ_vDereferenceObject ( POBJ  pobj)

Definition at line 638 of file gdiobj.c.

639{
640 ULONG cRefs, ulIndex;
641
642 /* Calculate the index */
643 ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
644
645 /* Check if the object has a handle */
646 if (ulIndex)
647 {
648 /* Decrement reference count */
649 if ((gpaulRefCount[ulIndex] & REF_MASK_COUNT) == 0)
650 {
651 DBG_DUMP_EVENT_LIST(&pobj->slhLog);
652 }
653 ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0);
654 cRefs = InterlockedDecrement((LONG*)&gpaulRefCount[ulIndex]);
655 DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
656
657 /* Check if we reached 0 and handle bit is not set */
658 if ((cRefs & REF_MASK_INUSE) == 0)
659 {
660 /* Make sure it's ok to delete the object */
662
663 /* Check if the handle was process owned */
664 if (gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC &&
666 {
667 /* Decrement the process handle count */
668 ASSERT(gpentHmgr[ulIndex].ObjectOwner.ulObj ==
671 }
672
673 /* Push entry to the free list */
675
676 /* Free the object */
677 GDIOBJ_vFreeObject(pobj);
678 }
679 }
680 else
681 {
682 /* Decrement the objects reference count */
683 ASSERT(pobj->ulShareCount > 0);
684 cRefs = InterlockedDecrement((LONG*)&pobj->ulShareCount);
685 DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
686
687 /* Check if we reached 0 */
688 if (cRefs == 0)
689 {
690 /* Free the object */
691 GDIOBJ_vFreeObject(pobj);
692 }
693 }
694}
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
#define GDI_OBJ_HMGR_NONE
Definition: ntgdihdl.h:118
@ REF_MASK_INUSE
Definition: gdiobj.c:142
static VOID ENTRY_vPushFreeEntry(PENTRY pentFree)
Definition: gdiobj.c:439
FORCEINLINE VOID DecrementCurrentProcessGdiHandleCount(void)
Definition: gdiobj.c:340

Referenced by GDIOBJ_ConvertFromStockObj(), GDIOBJ_ConvertToStockObj(), GDIOBJ_ReferenceObjectByHandle(), GDIOBJ_vDeleteObject(), GreDeleteObject(), GreGetObject(), GreIsHandleValid(), GreSetObjectOwnerEx(), NtGdiSetColorSpace(), SURFACE_vSetPalette(), and BASEOBJECT::vUnlock().

◆ GDIOBJ_vFreeObject()

VOID NTAPI GDIOBJ_vFreeObject ( POBJ  pobj)

Definition at line 603 of file gdiobj.c.

604{
605 UCHAR objt;
606
607 DBG_CLEANUP_EVENT_LIST(&pobj->slhLog);
608
609 /* Get the object type */
610 objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0x1f;
611
612 /* Check if we have a delete procedure (for C++ based objects) */
613 if (apfnDelete[objt] != NULL)
614 {
615 /* Invoke the delete procedure */
616 apfnDelete[objt](pobj);
617 }
618 else
619 {
620 /* Call the cleanup procedure */
621 NT_ASSERT(apfnCleanup[objt]);
622 apfnCleanup[objt](pobj);
623
624 /* Check if the object is allocated from a lookaside list */
625 if (pobj->BaseFlags & BASEFLAG_LOOKASIDE)
626 {
627 ExFreeToPagedLookasideList(&gpaLookasideList[objt], pobj);
628 }
629 else
630 {
632 }
633 }
634}
#define DBG_CLEANUP_EVENT_LIST(pslh)
Definition: gdidebug.h:112
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static const GDICLEANUPPROC apfnCleanup[]
Definition: gdiobj.c:159
static const GDIOBJDELETEPROC apfnDelete[]
Definition: gdiobj.c:197
#define NT_ASSERT
Definition: rtlfuncs.h:3327

Referenced by DC_AllocDcWithHandle(), EngCreatePalette(), GDIOBJ_AllocObjWithHandle(), GDIOBJ_vDereferenceObject(), NtGdiCreateClientObj(), PALETTE_AllocPalWithHandle(), and REGION_AllocRgnWithHandle().

◆ GDIOBJ_vReferenceObjectByPointer()

VOID NTAPI GDIOBJ_vReferenceObjectByPointer ( POBJ  pobj)

Definition at line 741 of file gdiobj.c.

742{
743 ULONG cRefs;
744
745 /* Check if the object has a handle */
746 if (GDI_HANDLE_GET_INDEX(pobj->hHmgr))
747 {
748 /* Increase the handle's reference count */
749 ULONG ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
750 ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0);
751 cRefs = InterlockedIncrement((LONG*)&gpaulRefCount[ulIndex]);
752 }
753 else
754 {
755 /* Increase the object's reference count */
756 cRefs = InterlockedIncrement((LONG*)&pobj->ulShareCount);
757 }
758
759 DBG_LOGEVENT(&pobj->slhLog, EVENT_REFERENCE, cRefs);
760}
#define InterlockedIncrement
Definition: armddk.h:53

Referenced by DC_vCopyState(), DC_vSelectFillBrush(), DC_vSelectLineBrush(), DC_vSelectPalette(), DC_vSelectSurface(), EBRUSHOBJ_vInit(), InitPaletteImpl(), PDEVOBJ_pSurface(), SURFACE_ShareLockByPointer(), and SURFACE_vSetPalette().

◆ GDIOBJ_vSetObjectAttr()

VOID NTAPI GDIOBJ_vSetObjectAttr ( POBJ  pobj,
PVOID  pvObjAttr 
)

Definition at line 1103 of file gdiobj.c.

1104{
1105 ULONG ulIndex;
1106
1107 ASSERT(pobj->hHmgr);
1108
1109 /* Get the handle index */
1110 ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
1111
1112 /* Set pointer to the usermode attribute */
1113 gpentHmgr[ulIndex].pUser = pvObjAttr;
1114}

Referenced by DC_bAllocDcAttr(), DC_vFreeDcAttr(), IntGdiSetRegionOwner(), REGION_bAllocRgnAttr(), and BASEOBJECT::vSetObjectAttr().

◆ GDIOBJ_vSetObjectOwner()

VOID NTAPI GDIOBJ_vSetObjectOwner ( POBJ  pobj,
ULONG  ulOwner 
)

Definition at line 972 of file gdiobj.c.

975{
976 PENTRY pentry;
977 ULONG ulOldOwner;
978
979 /* This is a ugly HACK, needed to fix IntGdiSetDCOwnerEx */
980 if (GDI_HANDLE_IS_STOCKOBJ(pobj->hHmgr))
981 {
982 DPRINT("Trying to set ownership of stock object %p to %lx\n", pobj->hHmgr, ulNewOwner);
983 return;
984 }
985
986 /* Get the handle entry */
988 pentry = &gpentHmgr[GDI_HANDLE_GET_INDEX(pobj->hHmgr)];
989
990 /* Check if the new owner is the same as the old one */
991 ulOldOwner = pentry->ObjectOwner.ulObj;
992 if (ulOldOwner == ulNewOwner)
993 {
994 /* Nothing to do */
995 return;
996 }
997
998 /* Is the current process requested? */
999 if (ulNewOwner == GDI_OBJ_HMGR_POWNED)
1000 {
1001 /* Use process id */
1002 ulNewOwner = HandleToUlong(PsGetCurrentProcessId());
1003 }
1004
1005 // HACK
1006 if (ulNewOwner == GDI_OBJ_HMGR_NONE)
1007 ulNewOwner = GDI_OBJ_HMGR_PUBLIC;
1008
1009 /* Was the object process owned? */
1010 if ((ulOldOwner != GDI_OBJ_HMGR_PUBLIC) &&
1011 (ulOldOwner != GDI_OBJ_HMGR_NONE))
1012 {
1013 /* Decrement the previous owners handle count */
1014 DecrementGdiHandleCount(ulOldOwner);
1015 }
1016
1017 /* Is the new owner a process? */
1018 if ((ulNewOwner != GDI_OBJ_HMGR_PUBLIC) &&
1019 (ulNewOwner != GDI_OBJ_HMGR_NONE))
1020 {
1021 /* Increment the new owners handle count */
1022 IncrementGdiHandleCount(ulNewOwner);
1023 }
1024 else
1025 {
1026 /* Make sure we don't leak user mode memory */
1027 NT_ASSERT(pentry->pUser == NULL);
1028 }
1029
1030 /* Set new owner */
1031 pentry->ObjectOwner.ulObj = ulNewOwner;
1032 DBG_LOGEVENT(&pobj->slhLog, EVENT_SET_OWNER, 0);
1033}
#define GDI_HANDLE_IS_STOCKOBJ(h)
Definition: gdi.h:37
static VOID IncrementGdiHandleCount(ULONG ulProcessId)
Definition: gdiobj.c:348
static VOID DecrementGdiHandleCount(ULONG ulProcessId)
Definition: gdiobj.c:365

Referenced by DC_vSetOwner(), EngCreateBitmap(), EngCreateDeviceBitmap(), EngCreateDeviceSurface(), GreSetObjectOwnerEx(), NtGdiCreateServerMetaFile(), and NtGdiSaveDC().

◆ GDIOBJ_vUnlockObject()

VOID NTAPI GDIOBJ_vUnlockObject ( POBJ  pobj)

Definition at line 887 of file gdiobj.c.

888{
889 ULONG cRefs, ulIndex;
890 ASSERT(pobj->cExclusiveLock > 0);
891
892 /* Decrease lock count */
893 pobj->cExclusiveLock--;
895 DBG_LOGEVENT(&pobj->slhLog, EVENT_UNLOCK, 0);
896
897 /* Check if this was the last lock */
898 if (pobj->cExclusiveLock == 0)
899 {
900 /* Reset lock owner */
901 pobj->dwThreadId = 0;
902
903 /* Release the pushlock and reenable APCs */
906 }
907
908 /* Calculate the index */
909 ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr);
910
911 /* Decrement reference count */
912 ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0);
913 cRefs = InterlockedDecrement((LONG*)&gpaulRefCount[ulIndex]);
914 ASSERT(cRefs & REF_MASK_VALID);
915}

Referenced by DC_UnlockDc(), GDIOBJ_bLockMultipleObjects(), GreStretchBltMask(), NtGdiAlphaBlend(), NtGdiCreateClientObj(), NtGdiCreateServerMetaFile(), NtGdiGetServerMetaFileBits(), NtGdiTransparentBlt(), PATH_CreatePath(), REGION_UnlockRgn(), and BASEOBJECT::vUnlock().

◆ GreDeleteObject()

BOOL NTAPI GreDeleteObject ( HGDIOBJ  hObject)

Definition at line 1165 of file gdiobj.c.

1166{
1167 PENTRY pentry;
1168
1169 /* Check for stock objects */
1170 if (GDI_HANDLE_IS_STOCKOBJ(hobj))
1171 {
1172 DPRINT1("GreDeleteObject: Cannot delete stock object %p.\n", hobj);
1173 return FALSE;
1174 }
1175
1176 /* Reference the handle entry */
1177 pentry = ENTRY_ReferenceEntryByHandle(hobj, 0);
1178 if (!pentry)
1179 {
1180 DPRINT1("GreDeleteObject: Trying to delete invalid object %p\n", hobj);
1181 return FALSE;
1182 }
1183
1184 /* Check for public owner */
1185 if (pentry->ObjectOwner.ulObj == GDI_OBJ_HMGR_PUBLIC)
1186 {
1187 DPRINT1("GreDeleteObject: Trying to delete global object %p\n", hobj);
1189 return FALSE;
1190 }
1191
1192 /* Delete the object */
1194 return TRUE;
1195}
VOID NTAPI GDIOBJ_vDeleteObject(POBJ pobj)
Definition: gdiobj.c:1118

Referenced by BITMAP_CopyBitmap(), co_IntDrawCaret(), co_IntPaintWindows(), co_UserExcludeUpdateRgn(), co_UserFreeWindow(), co_UserGetUpdateRgn(), co_WinPosSetWindowPos(), CreateBrushInternal(), DC_vRestoreDC(), DceDeleteClipRgn(), DceFreeDCE(), DefWndDoSizeMove(), DIB_CreateDIBSection(), DrawTextExWorker(), ForceNCPaintErase(), FreeCurIconObject(), GdiFlushUserBatch(), GreGetDIBitsInternal(), IntBeginPaint(), IntCreateDIBitmap(), IntDefWindowProc(), IntDestroyMonitorObject(), IntEndDesktopGraphics(), IntForceMinimizeWindow(), IntFreeElementData(), IntGdiCreateMaskFromRLE(), IntGdiDeleteColorSpace(), IntGdiDeleteDC(), IntGetNCUpdateRgn(), IntInvalidateWindows(), IntPaintDesktop(), IntSetDIBits(), IntUpdateLayeredWindowI(), MENU_DrawPopupGlyph(), MenuInit(), NC_HandleNCActivate(), NtGdiDeleteClientObj(), NtGdiDeleteObjectApp(), NtGdiExtCreateRegion(), NtGdiFrameRgn(), NtGdiStretchDIBitsInternal(), PaintSuspendedWindow(), REGION_XorRegion(), SelectWindowRgn(), SnapWindow(), SpiSetWallpaper(), TEXT_DrawUnderscore(), UITOOLS95_DFC_ButtonCheckRadio(), UITOOLS95_DrawFrameCaption(), UITOOLS95_DrawFrameMenu(), UITOOLS95_DrawFrameScroll(), UserDrawCaptionText(), UserGetDCEx(), UserUpdateMonitorSize(), and BRUSH::~BRUSH().

◆ GreGetObject()

INT NTAPI GreGetObject ( IN HGDIOBJ  hobj,
IN INT  cbCount,
OUT PVOID  pvBuffer 
)

Definition at line 1277 of file gdiobj.c.

1281{
1282 PVOID pvObj;
1283 UCHAR objt;
1284 INT iResult = 0;
1285
1286 /* Verify object type */
1287 objt = ((ULONG_PTR)hobj >> 16) & 0x1f;
1288 if (objt != GDIObjType_BRUSH_TYPE &&
1289 objt != GDIObjType_SURF_TYPE &&
1290 objt != GDIObjType_LFONT_TYPE &&
1291 objt != GDIObjType_PAL_TYPE)
1292 {
1293 DPRINT1("GreGetObject: Invalid object type\n");
1294 return 0;
1295 }
1296
1297 pvObj = GDIOBJ_ReferenceObjectByHandle(hobj, objt);
1298 if (!pvObj)
1299 {
1300 DPRINT("GreGetObject: Could not lock object\n");
1301 return 0;
1302 }
1303
1304 switch (GDI_HANDLE_GET_TYPE(hobj))
1305 {
1308 iResult = PEN_GetObject(pvObj, cbCount, pvBuffer);
1309 break;
1310
1312 iResult = BRUSH_GetObject(pvObj, cbCount, pvBuffer);
1313 break;
1314
1316 iResult = BITMAP_GetObject(pvObj, cbCount, pvBuffer);
1317 break;
1318
1320 iResult = FontGetObject(pvObj, cbCount, pvBuffer);
1321 break;
1322
1324 iResult = PALETTE_GetObject(pvObj, cbCount, pvBuffer);
1325 break;
1326
1327 default:
1328 DPRINT1("GDI object type of 0x%p not implemented\n", hobj);
1329 break;
1330 }
1331
1333 return iResult;
1334}
INT APIENTRY BITMAP_GetObject(SURFACE *psurf, INT Count, LPVOID buffer)
Definition: bitmaps.c:771
INT FASTCALL BRUSH_GetObject(PBRUSH pbr, INT cjBuffer, LPLOGBRUSH plbBuffer)
Definition: brush.cpp:271
@ GDILoObjType_LO_FONT_TYPE
Definition: gdi_private.h:37
@ GDILoObjType_LO_PALETTE_TYPE
Definition: gdi_private.h:36
@ GDILoObjType_LO_BRUSH_TYPE
Definition: gdi_private.h:33
@ GDILoObjType_LO_BITMAP_TYPE
Definition: gdi_private.h:35
@ GDILoObjType_LO_EXTPEN_TYPE
Definition: gdi_private.h:45
@ GDILoObjType_LO_PEN_TYPE
Definition: gdi_private.h:44
static int cbCount
Definition: fiber.c:42
@ GDIObjType_LFONT_TYPE
Definition: ntgdityp.h:130
@ GDIObjType_BRUSH_TYPE
Definition: ntgdityp.h:136
int32_t INT
Definition: typedefs.h:58
ULONG FASTCALL FontGetObject(_Inout_ PTEXTOBJ plfont, _In_ ULONG cjBuffer, _Out_ PVOID pvBuffer)
Definition: font.c:296
INT FASTCALL PALETTE_GetObject(PPALETTE ppal, INT cbCount, LPLOGBRUSH lpBuffer)
Definition: palette.c:247
INT APIENTRY PEN_GetObject(PBRUSH pbrushPen, INT cbCount, PLOGPEN pBuffer)
Definition: pen.c:290

Referenced by IntTMWFixUp(), IntUpdateLayeredWindowI(), MENU_DrawBitmapItem(), MENU_GetBitmapItemSize(), NtGdiExtGetObjectW(), and PATH_WidenPathEx().

◆ GreGetObjectOwner()

ULONG NTAPI GreGetObjectOwner ( HGDIOBJ  hobj)

Definition at line 1199 of file gdiobj.c.

1200{
1201 ULONG ulIndex, ulOwner;
1202
1203 if (hobj == NULL)
1204 {
1205 DPRINT("GreGetObjectOwner: invalid NULL handle\n");
1207 }
1208
1209 /* Get the handle index */
1210 ulIndex = GDI_HANDLE_GET_INDEX(hobj);
1211
1212 /* Check if the handle is valid */
1213 if (ulIndex >= GDI_HANDLE_COUNT ||
1214 gpentHmgr[ulIndex].Objt == GDIObjType_DEF_TYPE ||
1215 ((ULONG_PTR)hobj >> 16) != gpentHmgr[ulIndex].FullUnique)
1216 {
1217 DPRINT1("GreGetObjectOwner: invalid handle 0x%p.\n", hobj);
1219 }
1220
1221 /* Get the object owner */
1222 ulOwner = gpentHmgr[ulIndex].ObjectOwner.ulObj;
1223
1224 if (ulOwner == HandleToUlong(PsGetCurrentProcessId()))
1225 return GDI_OBJ_HMGR_POWNED;
1226
1227 if (ulOwner == GDI_OBJ_HMGR_PUBLIC)
1228 return GDI_OBJ_HMGR_PUBLIC;
1229
1231}
#define GDI_HANDLE_COUNT
Definition: gdi.h:12
#define GDI_OBJ_HMGR_RESTRICTED
Definition: ntgdihdl.h:119

Referenced by DceFreeDCE(), GreSetBitmapOwner(), NtGdiDeleteObjectApp(), REGION_UnlockRgn(), and REGION_vSyncRegion().

◆ GreIsHandleValid()

◆ GreSetObjectOwner()

BOOL NTAPI GreSetObjectOwner ( HGDIOBJ  hobj,
ULONG  ulOwner 
)

◆ GreSetObjectOwnerEx()

BOOL NTAPI GreSetObjectOwnerEx ( HGDIOBJ  hobj,
ULONG  ulOwner,
ULONG  Flags 
)

Definition at line 1235 of file gdiobj.c.

1239{
1240 PENTRY pentry;
1241
1242 /* Check for stock objects */
1243 if (GDI_HANDLE_IS_STOCKOBJ(hobj))
1244 {
1245 DPRINT("GreSetObjectOwner: Got stock object %p\n", hobj);
1246 return FALSE;
1247 }
1248
1249 /* Reference the handle entry */
1250 pentry = ENTRY_ReferenceEntryByHandle(hobj, Flags);
1251 if (!pentry)
1252 {
1253 DPRINT("GreSetObjectOwner: Invalid handle 0x%p.\n", hobj);
1254 return FALSE;
1255 }
1256
1257 /* Call internal function */
1258 GDIOBJ_vSetObjectOwner(pentry->einfo.pobj, ulOwner);
1259
1260 /* Dereference the object */
1262
1263 return TRUE;
1264}
VOID NTAPI GDIOBJ_vSetObjectOwner(POBJ pobj, ULONG ulNewOwner)
Definition: gdiobj.c:972
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by GreSetObjectOwner(), and NtUserConsoleControl().

◆ InitGdiHandleTable()

NTSTATUS NTAPI InitGdiHandleTable ( VOID  )

Definition at line 259 of file gdiobj.c.

260{
262 LARGE_INTEGER liSize;
263 PVOID pvSection;
264 SIZE_T cjViewSize = 0;
265
266 /* Create a section for the shared handle table */
267 liSize.QuadPart = sizeof(GDI_HANDLE_TABLE); // GDI_HANDLE_COUNT * sizeof(ENTRY);
270 NULL,
271 &liSize,
273 SEC_COMMIT | 0x1,
274 NULL,
275 NULL);
276 if (!NT_SUCCESS(status))
277 {
278 DPRINT1("INITGDI: Could not allocate a GDI handle table.\n");
279 return status;
280 }
281
282 /* Map the section in session space */
284 (PVOID*)&gpentHmgr,
285 &cjViewSize);
286 if (!NT_SUCCESS(status))
287 {
288 DPRINT1("INITGDI: Failed to map handle table section\n");
290 return status;
291 }
292
293 /* Allocate memory for the reference counter table */
294 gpaulRefCount = EngAllocSectionMem(&pvSection,
296 GDI_HANDLE_COUNT * sizeof(ULONG),
297 'frHG');
298 if (!gpaulRefCount)
299 {
300 DPRINT1("INITGDI: Failed to allocate reference table.\n");
303 }
304
305 gulFirstFree = 0;
307
309
310 /* Initialize the lookaside lists */
315 return STATUS_NO_MEMORY;
316
326
327 return STATUS_SUCCESS;
328}
NTSTATUS NTAPI MmMapViewInSessionSpace(IN PVOID Section, OUT PVOID *MappedBase, IN OUT PSIZE_T ViewSize)
Definition: section.c:2689
Definition: brush.hpp:16
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define NonPagedPool
Definition: env_spec_w32.h:307
static const unsigned RESERVE_ENTRIES_COUNT
Definition: gdiobj.h:11
#define SEC_COMMIT
Definition: mmtypes.h:100
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define SECTION_ALL_ACCESS
Definition: nt_native.h:1296
@ GDIObjType_ICMLCS_TYPE
Definition: ntgdityp.h:129
@ GDIObjTypeTotal
Definition: ntgdityp.h:152
@ GDIObjType_CLIENTOBJ_TYPE
Definition: ntgdityp.h:126
#define FL_ZERO_MEMORY
Definition: polytest.cpp:58
NTSTATUS NTAPI MmCreateSection(OUT PVOID *Section, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize, IN ULONG SectionPageProtection, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL, IN PFILE_OBJECT FileObject OPTIONAL)
Definition: section.c:4674
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: text.h:60
Definition: path.h:35
Definition: region.h:8
Definition: ps.c:97
void * PVOID
Definition: typedefs.h:50
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
volatile ULONG gulFirstUnused
Definition: gdiobj.c:152
static VOID InitLookasideList(UCHAR objt, ULONG cjSize)
Definition: gdiobj.c:245
volatile ULONG gulFirstFree
Definition: gdiobj.c:151
PGDI_HANDLE_TABLE GdiHandleTable
Definition: gdiobj.c:1453
#define TAG_GDIHNDTBLE
Definition: tags.h:16
struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST PAGED_LOOKASIDE_LIST
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by DriverEntry().

Variable Documentation

◆ GdiHandleTable

◆ RESERVE_ENTRIES_COUNT

const unsigned RESERVE_ENTRIES_COUNT = 10
static

Definition at line 11 of file gdiobj.h.

Referenced by GDI_CleanupForProcess(), InitGdiHandleTable(), and KdbCommand_Gdi_dumpht().