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
9 /** Includes ******************************************************************/
17 /** Internal interface ********************************************************/
20 * \brief DRIVEROBJ cleanup function
23 DRIVEROBJ_Cleanup(PVOID pObject
)
25 PEDRIVEROBJ pedo
= pObject
;
26 FREEOBJPROC pFreeProc
;
28 pFreeProc
= pedo
->drvobj
.pFreeProc
;
31 return pFreeProc(pedo
->drvobj
.pvObj
);
37 /** Public interface **********************************************************/
44 _In_opt_ FREEOBJPROC pFreeObjProc
,
49 PDEVOBJ
*ppdev
= (PDEVOBJ
*)hdev
;
51 /* Allocate a new DRIVEROBJ */
52 pedo
= DRIVEROBJ_AllocObjectWithHandle();
57 hdo
= pedo
->baseobj
.hHmgr
;
60 pedo
->drvobj
.pvObj
= pvObj
;
61 pedo
->drvobj
.pFreeProc
= pFreeObjProc
;
62 pedo
->drvobj
.hdev
= hdev
;
63 pedo
->drvobj
.dhpdev
= ppdev
->dhpdev
;
65 /* Unlock the object */
66 DRIVEROBJ_UnlockObject(pedo
);
68 /* Return the handle */
76 _In_ _Post_ptr_invalid_ HDRVOBJ hdo
,
83 pedo
= DRIVEROBJ_LockObject(hdo
);
89 /* Manually call cleanup callback */
92 if (!pedo
->drvobj
.pFreeProc(pedo
->drvobj
.pvObj
))
95 DRIVEROBJ_UnlockObject(pedo
);
100 /* Prevent cleanup callback from being called again */
101 pedo
->drvobj
.pFreeProc
= NULL
;
103 /* NOTE: We don't care about the bLocked param, as our handle manager
104 allows freeing the object, while we hold any number of locks. */
106 /* Delete the object */
107 GDIOBJ_vDeleteObject(&pedo
->baseobj
);
119 /* Lock the object */
120 pedo
= DRIVEROBJ_LockObject(hdo
);
122 /* Return pointer to the DRIVEROBJ structure */
123 return &pedo
->drvobj
;
130 _In_ _Post_ptr_invalid_ HDRVOBJ hdo
)
135 /* First lock to get a pointer to the object */
136 pedo
= DRIVEROBJ_LockObject(hdo
);
139 /* Object could not be locked, fail. */
144 cLocks
= pedo
->baseobj
.cExclusiveLock
;
145 DRIVEROBJ_UnlockObject(pedo
);
147 /* Check if we still hold a lock */
150 /* Object wasn't locked before, fail. */
155 DRIVEROBJ_UnlockObject(pedo
);