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 **********************************************************/
43 IN FREEOBJPROC pFreeObjProc
,
48 PDEVOBJ
*ppdev
= (PDEVOBJ
*)hdev
;
50 /* Allocate a new DRIVEROBJ */
51 pedo
= DRIVEROBJ_AllocObjectWithHandle();
56 hdo
= pedo
->baseobj
.hHmgr
;
59 pedo
->drvobj
.pvObj
= pvObj
;
60 pedo
->drvobj
.pFreeProc
= pFreeObjProc
;
61 pedo
->drvobj
.hdev
= hdev
;
62 pedo
->drvobj
.dhpdev
= ppdev
->dhpdev
;
64 /* Unlock the object */
65 DRIVEROBJ_UnlockObject(pedo
);
67 /* Return the handle */
82 pedo
= DRIVEROBJ_LockObject(hdo
);
88 /* Manually call cleanup callback */
91 if (!pedo
->drvobj
.pFreeProc(pedo
->drvobj
.pvObj
))
94 DRIVEROBJ_UnlockObject(pedo
);
99 /* Prevent cleanup callback from being called again */
100 pedo
->drvobj
.pFreeProc
= NULL
;
102 /* NOTE: We don't care about the bLocked param, as our handle manager
103 allows freeing the object, while we hold any number of locks. */
105 /* Delete the object */
106 GDIOBJ_vDeleteObject(&pedo
->baseobj
);
118 /* Lock the object */
119 pedo
= DRIVEROBJ_LockObject(hdo
);
121 /* Return pointer to the DRIVEROBJ structure */
122 return &pedo
->drvobj
;
134 /* First lock to get a pointer to the object */
135 pedo
= DRIVEROBJ_LockObject(hdo
);
138 /* Object could not be locked, fail. */
143 cLocks
= pedo
->baseobj
.cExclusiveLock
;
144 DRIVEROBJ_UnlockObject(pedo
);
146 /* Check if we still hold a lock */
149 /* Object wasn't locked before, fail. */
154 DRIVEROBJ_UnlockObject(pedo
);