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
24 DRIVEROBJ_vCleanup(PVOID pObject
)
26 PEDRIVEROBJ pedo
= pObject
;
27 FREEOBJPROC pFreeProc
;
29 pFreeProc
= pedo
->drvobj
.pFreeProc
;
32 NT_VERIFY(pFreeProc(pedo
->drvobj
.pvObj
));
36 /** Public interface **********************************************************/
43 _In_opt_ 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 */
75 _In_ _Post_ptr_invalid_ HDRVOBJ hdo
,
82 pedo
= DRIVEROBJ_TryLockObject(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 /* Unlock if the caller indicates it is locked */
104 DRIVEROBJ_UnlockObject(pedo
);
106 /* Now delete the object */
107 GDIOBJ_vDeleteObject(&pedo
->baseobj
);
119 /* Lock the object */
120 pedo
= DRIVEROBJ_TryLockObject(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_TryLockObject(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
);