[WIN32K]
[reactos.git] / reactos / win32ss / gdi / eng / driverobj.c
1 /*
2 * COPYRIGHT: GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS win32 kernel mode sunsystem
4 * PURPOSE: GDI DRIVEROBJ Functions
5 * FILE: subsystems/win32k/eng/driverobj.c
6 * PROGRAMER: Timo Kreuzer
7 */
8
9 /** Includes ******************************************************************/
10
11 #include <win32k.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16
17 /** Internal interface ********************************************************/
18
19 /*!
20 * \brief DRIVEROBJ cleanup function
21 */
22 BOOL NTAPI
23 DRIVEROBJ_Cleanup(PVOID pObject)
24 {
25 PEDRIVEROBJ pedo = pObject;
26 FREEOBJPROC pFreeProc;
27
28 pFreeProc = pedo->drvobj.pFreeProc;
29 if (pFreeProc)
30 {
31 return pFreeProc(pedo->drvobj.pvObj);
32 }
33
34 return TRUE;
35 }
36
37 /** Public interface **********************************************************/
38
39 _Must_inspect_result_
40 HDRVOBJ
41 APIENTRY
42 EngCreateDriverObj(
43 _In_ PVOID pvObj,
44 _In_opt_ FREEOBJPROC pFreeObjProc,
45 _In_ HDEV hdev)
46 {
47 PEDRIVEROBJ pedo;
48 HDRVOBJ hdo;
49 PDEVOBJ *ppdev = (PDEVOBJ*)hdev;
50
51 /* Allocate a new DRIVEROBJ */
52 pedo = DRIVEROBJ_AllocObjectWithHandle();
53 if (!pedo)
54 {
55 return NULL;
56 }
57 hdo = pedo->baseobj.hHmgr;
58
59 /* Fill in fields */
60 pedo->drvobj.pvObj = pvObj;
61 pedo->drvobj.pFreeProc = pFreeObjProc;
62 pedo->drvobj.hdev = hdev;
63 pedo->drvobj.dhpdev = ppdev->dhpdev;
64
65 /* Unlock the object */
66 DRIVEROBJ_UnlockObject(pedo);
67
68 /* Return the handle */
69 return hdo;
70 }
71
72
73 BOOL
74 APIENTRY
75 EngDeleteDriverObj(
76 _In_ _Post_ptr_invalid_ HDRVOBJ hdo,
77 _In_ BOOL bCallBack,
78 _In_ BOOL bLocked)
79 {
80 PEDRIVEROBJ pedo;
81
82 /* Lock the object */
83 pedo = DRIVEROBJ_TryLockObject(hdo);
84 if (!pedo)
85 {
86 return FALSE;
87 }
88
89 /* Manually call cleanup callback */
90 if (bCallBack)
91 {
92 if (!pedo->drvobj.pFreeProc(pedo->drvobj.pvObj))
93 {
94 /* Callback failed */
95 DRIVEROBJ_UnlockObject(pedo);
96 return FALSE;
97 }
98 }
99
100 /* Prevent cleanup callback from being called again */
101 pedo->drvobj.pFreeProc = NULL;
102
103 /* Unlock if the caller indicates it is locked */
104 if (bLocked)
105 DRIVEROBJ_UnlockObject(pedo);
106
107 /* Now delete the object */
108 GDIOBJ_vDeleteObject(&pedo->baseobj);
109 return TRUE;
110 }
111
112
113 PDRIVEROBJ
114 APIENTRY
115 EngLockDriverObj(
116 _In_ HDRVOBJ hdo)
117 {
118 PEDRIVEROBJ pedo;
119
120 /* Lock the object */
121 pedo = DRIVEROBJ_TryLockObject(hdo);
122
123 /* Return pointer to the DRIVEROBJ structure */
124 return &pedo->drvobj;
125 }
126
127
128 BOOL
129 APIENTRY
130 EngUnlockDriverObj(
131 _In_ _Post_ptr_invalid_ HDRVOBJ hdo)
132 {
133 PEDRIVEROBJ pedo;
134 ULONG cLocks;
135
136 /* First lock to get a pointer to the object */
137 pedo = DRIVEROBJ_TryLockObject(hdo);
138 if(!pedo)
139 {
140 /* Object could not be locked, fail. */
141 return FALSE;
142 }
143
144 /* Unlock object */
145 cLocks = pedo->baseobj.cExclusiveLock;
146 DRIVEROBJ_UnlockObject(pedo);
147
148 /* Check if we still hold a lock */
149 if (cLocks < 2)
150 {
151 /* Object wasn't locked before, fail. */
152 return FALSE;
153 }
154
155 /* Unlock again */
156 DRIVEROBJ_UnlockObject(pedo);
157
158 /* Success */
159 return TRUE;
160 }
161