Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
DECLARE_HANDLE(HDD_OBJ);
#ifndef W32PID
#define W32PID ULONG
#endif
/*****************************Struct***************************************\
* * DD_BASEOBJECT * \**************************************************************************/
typedef struct _DD_BASEOBJECT { HANDLE hHmgr; ULONG ulShareCount; USHORT cExclusiveLock; USHORT BaseFlags; ULONG_PTR Tid; } DD_BASEOBJECT, *PDD_BASEOBJECT, *PDD_OBJ;
/*****************************Struct***************************************\
* * OBJECTOWNER * * Description: * * This object is used for shared and exclusive object ownership * * Fields for shared Object: * * Pid : 31 * Lock : 1 * \**************************************************************************/
//
// The lock and the Pid share the same DWORD.
//
// It seems that this is safe from the word tearing problem on the Alpha architecture
// due to the fact that we always use the InterlockedCompareExchange loop for
// the Lock and we require that the lock is set when setting the Pid.
//
typedef struct _DD_OBJECTOWNER_S { ULONG Lock:1; W32PID Pid_Shifted:31; // The lowest two bits of the PID are
// reserved for application use. However,
// the second bit is used by the
// OBJECT_OWNER_xxxx constants and so we
// use 31 bits for the Pid_Shifted field.
// WARNING: do not access this field directly,
// but rather via the macros below.
} DD_OBJECTOWNER_S, *PDD_OBJECTOWNER_S;
typedef union _DD_OBJECTOWNER { DD_OBJECTOWNER_S Share; ULONG ulObj; } DD_OBJECTOWNER, *PDD_OBJECTOWNER;
#define OBJECT_OWNER_ERROR ( 0x80000022)
#define OBJECT_OWNER_PUBLIC ( 0x00000000)
#define OBJECT_OWNER_CURRENT ( 0x80000002)
#define OBJECT_OWNER_NONE ( 0x80000012)
// Note: when accessing the Pid_Shifted field the compiler will shift the
// value by one bit to account for the field being only in the upper 31
// bits of the OBJECTOWNER_S structure. For example, if the OBJECTOWNER_S
// is 8, the Pid_Shifted would be only 4. However, since we are really
// interested in the upper 31 bits of the PID, this shifting is not
// appropriate (we need masking instead). I'm not aware of any compiler
// primitives that will accomplish this and will use the macros below
// instead.
#define DD_LOCK_MASK 0x00000001
#define DD_PID_MASK 0xfffffffe
#define DD_PID_BITS 0xfffffffc // The actual bits used by the PID
#define DD_W32GetCurrentPID() (W32PID)(HandleToUlong(PsGetCurrentProcessId()) & DD_PID_BITS)
#define DD_W32GetCurrentTID() (W32PID)HandleToUlong(PsGetCurrentThreadId())
#define DD_OBJECTOWNER_PID(ObjectOwner) \
((W32PID) ((ObjectOwner).ulObj & DD_PID_MASK))
#define DD_SET_OBJECTOWNER_PID(ObjectOwner, Pid) \
((ObjectOwner).ulObj) = ((ObjectOwner).ulObj & DD_LOCK_MASK) | ((Pid) & DD_PID_MASK);
/*****************************Struct***************************************\
* * ENTRY * * Description: * * This object is allocated for each entry in the handle manager and * keeps track of object owners, reference counts, pointers, and handle * objt and iuniq * * Fields: * * einfo - pointer to object or next free handle * ObjectOwner - lock object * ObjectInfo - Object Type, Unique and flags * dwReserved - * \**************************************************************************/
typedef union _DD_EINFO { PDD_OBJ pobj; // Pointer to object
HDD_OBJ hFree; // Next entry in free list
} DD_EINFO;
typedef UCHAR DD_OBJTYPE;
typedef struct _DD_ENTRY { DD_EINFO einfo; DD_OBJECTOWNER ObjectOwner; USHORT FullUnique; DD_OBJTYPE Objt; UCHAR Flags; ULONG_PTR dwReserved; } DD_ENTRY, *PDD_ENTRY;
// entry.Flags flags
#define DD_HMGR_ENTRY_UNDELETABLE 0x0001
/*********************************Class************************************\
* class OBJECT * * Basic engine object. All objects managed by the handle manager are * derived from this. * * History: * Sat 11-Dec-1993 -by- Patrick Haluptzok [patrickh] * Move the lock counts and owning tid to the object. * * 18-Dec-1989 -by- Donald Sidoroff [donalds] * Wrote it. \**************************************************************************/
class DD_OBJECT : public _DD_BASEOBJECT /* obj */ { public: DD_OBJECT() {} ~DD_OBJECT() {}
//
// Number of exclusive references by tid.
//
LONG cExclusiveLockGet() { return(cExclusiveLock); } LONG cShareLockGet() { return(ulShareCount); } HANDLE hGet() { return(hHmgr); } };
|