2005-06-16 20:46:39 +00:00
|
|
|
/*
|
2009-03-17 00:30:15 +00:00
|
|
|
* COPYRIGHT: GPL, see COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS win32 kernel mode sunsystem
|
2005-06-16 20:46:39 +00:00
|
|
|
* PURPOSE: GDI DRIVEROBJ Functions
|
2009-03-17 00:30:15 +00:00
|
|
|
* FILE: subsystems/win32k/eng/driverobj.c
|
|
|
|
* PROGRAMER: Timo Kreuzer
|
2005-06-16 20:46:39 +00:00
|
|
|
*/
|
2005-06-29 07:09:25 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/** Includes ******************************************************************/
|
|
|
|
|
2005-06-16 20:46:39 +00:00
|
|
|
#include <w32k.h>
|
|
|
|
|
2005-06-29 07:09:25 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
|
|
|
|
/** Internal interface ********************************************************/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief DRIVEROBJ cleanup function
|
2005-06-16 20:46:39 +00:00
|
|
|
*/
|
2009-03-17 00:30:15 +00:00
|
|
|
BOOL INTERNAL_CALL
|
|
|
|
DRIVEROBJ_Cleanup(PVOID pObject)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
PEDRIVEROBJ pedo = pObject;
|
|
|
|
FREEOBJPROC pFreeProc;
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
pFreeProc = pedo->drvobj.pFreeProc;
|
|
|
|
if (pFreeProc)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
return pFreeProc(pedo->drvobj.pvObj);
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
2009-03-17 00:30:15 +00:00
|
|
|
|
|
|
|
return TRUE;
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/** Public interface **********************************************************/
|
2005-06-16 20:46:39 +00:00
|
|
|
|
|
|
|
HDRVOBJ
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2005-06-16 20:46:39 +00:00
|
|
|
EngCreateDriverObj(
|
2009-03-17 00:30:15 +00:00
|
|
|
IN PVOID pvObj,
|
|
|
|
IN FREEOBJPROC pFreeObjProc,
|
|
|
|
IN HDEV hdev)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
PEDRIVEROBJ pedo;
|
|
|
|
HDRVOBJ hdo;
|
2009-03-20 18:02:55 +00:00
|
|
|
PDEVOBJ *ppdev = (PDEVOBJ*)hdev;
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Allocate a new DRIVEROBJ */
|
|
|
|
pedo = DRIVEROBJ_AllocObjectWithHandle();
|
|
|
|
if (!pedo)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
return NULL;
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
2009-03-17 00:30:15 +00:00
|
|
|
hdo = pedo->baseobj.hHmgr;
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Fill in fields */
|
|
|
|
pedo->drvobj.pvObj = pvObj;
|
|
|
|
pedo->drvobj.pFreeProc = pFreeObjProc;
|
|
|
|
pedo->drvobj.hdev = hdev;
|
2009-08-16 12:57:41 +00:00
|
|
|
pedo->drvobj.dhpdev = ppdev->dhpdev;
|
2009-03-17 00:30:15 +00:00
|
|
|
|
|
|
|
/* Unlock the object */
|
|
|
|
DRIVEROBJ_UnlockObject(pedo);
|
|
|
|
|
|
|
|
/* Return the handle */
|
|
|
|
return hdo;
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2005-06-16 20:46:39 +00:00
|
|
|
EngDeleteDriverObj(
|
2009-03-17 00:30:15 +00:00
|
|
|
IN HDRVOBJ hdo,
|
|
|
|
IN BOOL bCallBack,
|
|
|
|
IN BOOL bLocked)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
PEDRIVEROBJ pedo;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Lock the object */
|
|
|
|
pedo = DRIVEROBJ_LockObject(hdo);
|
|
|
|
if (!pedo)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
return FALSE;
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Manually call cleanup callback */
|
|
|
|
if (bCallBack)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
if (!pedo->drvobj.pFreeProc(pedo->drvobj.pvObj))
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Callback failed */
|
|
|
|
DRIVEROBJ_UnlockObject(pedo);
|
|
|
|
return FALSE;
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Prevent cleanup callback from being called again */
|
|
|
|
pedo->drvobj.pFreeProc = NULL;
|
|
|
|
|
|
|
|
/* NOTE: We don't care about the bLocked param, as our handle manager
|
|
|
|
allows freeing the object, while we hold any number of locks. */
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Free the object */
|
|
|
|
return DRIVEROBJ_FreeObjectByHandle(hdo);
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PDRIVEROBJ
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2009-03-17 00:30:15 +00:00
|
|
|
EngLockDriverObj(
|
|
|
|
IN HDRVOBJ hdo)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
PEDRIVEROBJ pedo;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Lock the object */
|
|
|
|
pedo = DRIVEROBJ_LockObject(hdo);
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Return pointer to the DRIVEROBJ structure */
|
|
|
|
return &pedo->drvobj;
|
2005-06-16 20:46:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2009-03-17 00:30:15 +00:00
|
|
|
EngUnlockDriverObj(
|
|
|
|
IN HDRVOBJ hdo)
|
2005-06-16 20:46:39 +00:00
|
|
|
{
|
2009-03-17 00:30:15 +00:00
|
|
|
PEDRIVEROBJ pedo;
|
2009-03-17 01:06:34 +00:00
|
|
|
ULONG cLocks;
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* First lock to get a pointer to the object */
|
|
|
|
pedo = DRIVEROBJ_LockObject(hdo);
|
|
|
|
if(!pedo)
|
|
|
|
{
|
|
|
|
/* Object could not be locked, fail. */
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Unlock object */
|
2009-03-17 01:06:34 +00:00
|
|
|
cLocks = DRIVEROBJ_UnlockObject(pedo);
|
2005-06-16 20:46:39 +00:00
|
|
|
|
2009-03-17 00:30:15 +00:00
|
|
|
/* Check if we still hold a lock */
|
2009-03-17 01:06:34 +00:00
|
|
|
if (cLocks < 1)
|
2009-03-17 00:30:15 +00:00
|
|
|
{
|
|
|
|
/* Object wasn't locked before, fail. */
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Unlock again */
|
|
|
|
DRIVEROBJ_UnlockObject(pedo);
|
|
|
|
|
|
|
|
/* Success */
|
|
|
|
return TRUE;
|
|
|
|
}
|
2005-06-16 20:46:39 +00:00
|
|
|
|