[WIN32K]
[reactos.git] / reactos / win32ss / gdi / ntgdi / baseobj.hpp
1
2 #pragma once
3
4 #define GDIOBJ_POOL_TAG(type) ('00hG' + (((type) & 0x1f) << 24))
5
6 #define BASEOBJECT CBASEOBJECT
7
8 class BASEOBJECT : private _BASEOBJECT
9 {
10 public:
11
12 enum OWNER
13 {
14 POWNED = GDI_OBJ_HMGR_POWNED,
15 PUBLIC = GDI_OBJ_HMGR_PUBLIC,
16 NONE = GDI_OBJ_HMGR_NONE
17 };
18
19 protected:
20
21 BASEOBJECT(
22 _In_ GDILOOBJTYPE loobjtype)
23 {
24 /* Initialize the object */
25 _BASEOBJECT::hHmgr = (HGDIOBJ)(ULONG_PTR)loobjtype;
26 this->cExclusiveLock = 0;
27 this->ulShareCount = 1;
28 this->BaseFlags = 0;//fl & 0xffff;
29 DBG_INITLOG(&this->slhLog);
30 DBG_LOGEVENT(&this->slhLog, EVENT_ALLOCATE, 0);
31 #if DBG_ENABLE_GDIOBJ_BACKTRACES
32 DbgCaptureStackBackTace(this->apvBackTrace, 1, GDI_OBJECT_STACK_LEVELS);
33 #endif /* GDI_DEBUG */
34 }
35
36 static
37 BASEOBJECT*
38 LockExclusive(
39 HGDIOBJ hobj,
40 GDIOBJTYPE objtype);
41
42 static
43 BASEOBJECT*
44 LockExclusive(
45 HGDIOBJ hobj,
46 GDILOOBJTYPE loobjtype);
47
48 static
49 BASEOBJECT*
50 LockShared(
51 HGDIOBJ hobj,
52 GDILOOBJTYPE loobjtype,
53 OWNER owner)
54 {
55 return 0;
56 }
57
58 VOID
59 vSetObjectAttr(
60 _In_opt_ PVOID pvUserAttr)
61 {
62 GDIOBJ_vSetObjectAttr((POBJ)this, pvUserAttr);
63 }
64
65
66 public:
67
68 static
69 inline
70 PVOID
71 pvAllocate(
72 _In_ GDIOBJTYPE objtype,
73 _In_ SIZE_T cjSize)
74 {
75 return ExAllocatePoolWithTag(PagedPool, cjSize, GDIOBJ_POOL_TAG(objtype));
76 }
77
78 VOID
79 vUnlock(
80 VOID)
81 {
82 if (this->cExclusiveLock > 0)
83 {
84 GDIOBJ_vUnlockObject(this);
85 }
86 else
87 {
88 GDIOBJ_vDereferenceObject(this);
89 }
90 }
91
92 inline
93 HGDIOBJ
94 hHmgr(
95 VOID)
96 {
97 return _BASEOBJECT::hHmgr;
98 }
99
100 HGDIOBJ
101 hInsertObject(
102 OWNER owner)
103 {
104 return GDIOBJ_hInsertObject(this, owner);
105 }
106
107 };
108
109