Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

565 lines
14 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
genobj.h
Abstract:
Definitions for the generic object implementation.
AZ roles has so many objects that need creation, enumeration, etc
that it seems prudent to have a single body of code for doing those operations.
Author:
Cliff Van Dyke (cliffv) 11-Apr-2001
--*/
#ifdef __cplusplus
extern "C" {
#endif
/////////////////////////////////////////////////////////////////////////////
//
// Structure definitions
//
/////////////////////////////////////////////////////////////////////////////
//
// A generic object list head.
//
// This structure represent the head of a linked list of objects. The linked
// list of objects are considered to be "children" of this structure.
//
typedef struct _GENERIC_OBJECT_HEAD {
//
// Head of the linked list of objects
//
LIST_ENTRY Head;
//
// Back pointer to the GenericObject containing this structure
//
struct _GENERIC_OBJECT *ParentGenericObject;
//
// Each of the list heads that are rooted on a single object are linked
// together. That list is headed by GENERIC_OBJECT->ChildGenericObjectHead.
// This field is a pointer to the next entry in the list.
//
struct _GENERIC_OBJECT_HEAD *SiblingGenericObjectHead;
//
// This is a circular list of all the GENERIC_OBJECT_HEAD structures of
// objects that share a namespace. For instance, an AzOperation and AzTask object
// may not have the same name.
//
LIST_ENTRY SharedNamespace;
//
// The next sequence number to give out.
//
ULONG NextSequenceNumber;
//
// Object type of objects in this list
//
ULONG ObjectType;
//
// The order of the defines below must match the tables at the top of genobj.cxx
//
#define OBJECT_TYPE_ROOT 0
#define OBJECT_TYPE_ADMIN_MANAGER 1
#define OBJECT_TYPE_APPLICATION 2
#define OBJECT_TYPE_OPERATION 3
#define OBJECT_TYPE_TASK 4
#define OBJECT_TYPE_SCOPE 5
#define OBJECT_TYPE_GROUP 6
#define OBJECT_TYPE_ROLE 7
#define OBJECT_TYPE_JUNCTION_POINT 8
#define OBJECT_TYPE_SID 9
#define OBJECT_TYPE_CLIENT_CONTEXT 10
#define OBJECT_TYPE_MAXIMUM 11
} GENERIC_OBJECT_HEAD, *PGENERIC_OBJECT_HEAD;
//
// A generic object
//
typedef struct _GENERIC_OBJECT {
//
// Link to the next instance of an object of this type for the same parent object
//
LIST_ENTRY Next;
//
// Back pointer to the head of the list this object is in
//
PGENERIC_OBJECT_HEAD ParentGenericObjectHead;
//
// Pointer to the list heads for children of this object
// This is a static list of the various GENERIC_OBJECT_HEAD structures
// that exist in the object type specific portion of this object.
// The list allows the generic object code to have insight into the
// children of this object.
//
PGENERIC_OBJECT_HEAD ChildGenericObjectHead;
//
// Pointer to the list heads of pointers to other objects
// This is a static list of the various GENERIC_OBJECT_LIST structures
// that exist in the object type specific portion of this object.
// The list allows the generic object code to have insight into the
// other types of objects pointed to by this object.
//
struct _GENERIC_OBJECT_LIST *GenericObjectLists;
//
// Pointer to the generic object at the root of all generic objects
// (Pointer to an AdminManager object)
//
struct _AZP_ADMIN_MANAGER *AdminManagerObject;
//
// Name of the object
//
AZP_STRING ObjectName;
//
// Description of the object
//
AZP_STRING Description;
//
// GUID of the object
// The Guid of the object is assigned by the persistence provider.
// The GUID is needed to make the object rename safe.
//
GUID PersistenceGuid;
//
// Number of references to this instance of the object
// These are references from within our code.
//
LONG ReferenceCount;
//
// Number of references to this instance of the object
// These are references represented by handles passed back to our caller.
//
LONG HandleReferenceCount;
//
// Sequence number of this object.
// The list specified in Next is maintained in SequenceNumber order.
// New entries are added to the tail end.
// Enumerations are returned in SequenceNumber order.
// SequenceNumber is returned to the caller as the EnumerationContext.
//
// This mechanism allows insertions and deletions to be handled seemlessly.
//
ULONG SequenceNumber;
//
// Specific object type represented by this generic object
//
ULONG ObjectType;
//
// Flags describing attributes of the generic object
//
ULONG Flags;
#define GENOBJ_FLAGS_DELETED 0x01 // Object has been deleted
#define GENOBJ_FLAGS_DIRTY 0x02 // Object has been modified
#define GENOBJ_FLAGS_REFRESH_ME 0x04 // Object needs to be refreshed from cache
} GENERIC_OBJECT, *PGENERIC_OBJECT;
//
// Object List
//
// Some objects have lists of references to other objects. These lists are
// not parent/child relationships. Rather they represent memberships, etc.
//
// This structure represents the head of such a list.
//
// Both the pointed-from and pointed-to object have a generic object list. The
// "forward" link represents the list that is managed via external API. The
// "backward" link is provided to allow fixup of references when an object is deleted.
// The "backward" link is also provided for cases where internal routines need to
// traverse the link relationship in the opposite direction of the external API.
// By convention, GENERIC_OBJECT_LIST instances in the forward direction are named
// simply by the name of the object to point to. For instance, an object list that points
// to AZ_OPERATION objects might be called "Operations". By convention, GENERIC_OBJECT_LIST
// instances in the backward direction are prefixed by the name "back". For instance,
// "backTasks".
//
// Note, there really isn't any reason why we couldn't expose "AddPropertyItem" and
// "RemovePropertyItem" APIs for the "back" lists. See the IsBackLink and LinkPairId
// definition.
//
typedef struct _GENERIC_OBJECT_LIST {
//
// Each of the object lists that are rooted on a single object are linked
// together. That list is headed by GENERIC_OBJECT->GenericObjectLists.
// This field is a pointer to the next entry in the list.
//
struct _GENERIC_OBJECT_LIST *NextGenericObjectList;
//
// Since an object list is a list of other objects, we want to be able to
// generically find the other objects. The array below is an array of pointers
// to the head of the lists that contain the other objects.
//
//
// Unused elements in this array are set to NULL.
//
// These pointers are always pointers to a field in a "parent" structure.
// Therefore, reference counts aren't needed. Instead, the "child" structure
// containing the pointer to the parent will be deleted before the parent structure.
//
#define GEN_OBJECT_HEAD_COUNT 3
PGENERIC_OBJECT_HEAD GenericObjectHeads[GEN_OBJECT_HEAD_COUNT];
//
// List identifier.
//
// The code maintains the link and the backlink. To do that, the code needs to
// find one the "other" generic object list from this one. That algorithm uses
// the IsBackLink and LinkPairId field.
//
// One object list has IsBackLink set TRUE and the other set FALSE. This handles
// the case where an object contain both a forward an backward object list. For
// instance, the AZ_GROUP object contains the AppMembers and backAppMembers fields.
// This field differentiates between the two.
//
// There are cases where an object has multiple links between the same object types.
// For instance, the AZ_GROUP object has both AppMembers and AppNonMembers links.
// In those cases, the LinkPairId is set to a unique value to identify the pair.
// In most cases, the value is simply zero.
//
BOOL IsBackLink;
ULONG LinkPairId;
#define AZP_LINKPAIR_MEMBERS 1
#define AZP_LINKPAIR_NON_MEMBERS 2
#define AZP_LINKPAIR_SID_MEMBERS 3
#define AZP_LINKPAIR_SID_NON_MEMBERS 4
//
// The array of pointers to the generic objects.
//
// Being in this list does not increment the ReferenceCount on the pointed-to
// generic object.
//
AZP_PTR_ARRAY GenericObjects;
} GENERIC_OBJECT_LIST, *PGENERIC_OBJECT_LIST;
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions
//
/////////////////////////////////////////////////////////////////////////////
//
// Macro to determine if a GENERIC_OBJECT_LIST is a list of sids
//
#define AzpIsSidList( _gol ) \
((_gol)->GenericObjectHeads[0] != NULL && \
(_gol)->GenericObjectHeads[0]->ObjectType == OBJECT_TYPE_SID )
/////////////////////////////////////////////////////////////////////////////
//
// Procedure definitions
//
/////////////////////////////////////////////////////////////////////////////
VOID
ObInitGenericHead(
IN PGENERIC_OBJECT_HEAD GenericObjectHead,
IN ULONG ObjectType,
IN PGENERIC_OBJECT ParentGenericObject,
IN PGENERIC_OBJECT_HEAD SiblingGenericObjectHead OPTIONAL,
IN PGENERIC_OBJECT_HEAD SharedNamespace OPTIONAL
);
PGENERIC_OBJECT
ObAllocateGenericObject(
IN ULONG ObjectType
);
VOID
ObFreeGenericObject(
IN PGENERIC_OBJECT GenericObject,
IN BOOLEAN JustRefresh
);
VOID
ObInsertGenericObject(
IN PGENERIC_OBJECT_HEAD GenericObjectHead,
IN PGENERIC_OBJECT GenericObject
);
VOID
ObIncrHandleRefCount(
IN PGENERIC_OBJECT GenericObject
);
VOID
ObDecrHandleRefCount(
IN PGENERIC_OBJECT GenericObject
);
DWORD
ObGetHandleType(
IN PGENERIC_OBJECT Handle,
IN BOOL AllowDeletedObjects,
OUT PULONG ObjectType
);
DWORD
ObReferenceObjectByHandle(
IN PGENERIC_OBJECT Handle,
IN BOOL AllowDeletedObjects,
IN BOOLEAN RefreshCache,
IN ULONG ObjectType
);
VOID
ObDereferenceObject(
IN PGENERIC_OBJECT GenericObject
);
typedef DWORD
(OBJECT_INIT_ROUTINE)(
IN PGENERIC_OBJECT ParentGenericObject,
IN PGENERIC_OBJECT ChildGenericObject
);
typedef VOID
(OBJECT_FREE_ROUTINE)(
IN PGENERIC_OBJECT GenericObject
);
typedef DWORD
(OBJECT_GET_PROPERTY_ROUTINE)(
IN PGENERIC_OBJECT GenericObject,
IN ULONG PropertyId,
OUT PVOID *PropertyValue
);
typedef DWORD
(OBJECT_SET_PROPERTY_ROUTINE)(
IN PGENERIC_OBJECT GenericObject,
IN ULONG PropertyId,
IN PVOID PropertyValue
);
typedef DWORD
(OBJECT_ADD_PROPERTY_ITEM_ROUTINE)(
IN PGENERIC_OBJECT GenericObject,
IN PGENERIC_OBJECT_LIST GenericObjectList,
IN PGENERIC_OBJECT LinkedToObject
);
DWORD
ObCreateObject(
IN PGENERIC_OBJECT ParentGenericObject,
IN PGENERIC_OBJECT_HEAD GenericChildHead,
IN ULONG ChildObjectType,
IN PAZP_STRING ChildObjectNameString,
OUT PGENERIC_OBJECT *RetChildGenericObject
);
DWORD
ObCommonCreateObject(
IN PGENERIC_OBJECT ParentGenericObject,
IN ULONG ParentObjectType,
IN PGENERIC_OBJECT_HEAD GenericChildHead,
IN ULONG ChildObjectType,
IN LPCWSTR ChildObjectName,
IN DWORD Reserved,
OUT PGENERIC_OBJECT *RetChildGenericObject
);
DWORD
ObCommonOpenObject(
IN PGENERIC_OBJECT ParentGenericObject,
IN ULONG ParentObjectType,
IN PGENERIC_OBJECT_HEAD GenericChildHead,
IN ULONG ChildObjectType,
IN LPCWSTR ChildObjectName,
IN DWORD Reserved,
OUT PGENERIC_OBJECT *RetChildGenericObject
);
DWORD
ObEnumObjects(
IN PGENERIC_OBJECT_HEAD GenericChildHead,
IN BOOL EnumerateDeletedObjects,
IN BOOL RefreshCache,
IN OUT PULONG EnumerationContext,
OUT PGENERIC_OBJECT *RetChildGenericObject
);
DWORD
ObCommonEnumObjects(
IN PGENERIC_OBJECT ParentGenericObject,
IN ULONG ParentObjectType,
IN PGENERIC_OBJECT_HEAD GenericChildHead,
IN OUT PULONG EnumerationContext,
IN DWORD Reserved,
OUT PGENERIC_OBJECT *RetChildGenericObject
);
DWORD
ObCommonGetProperty(
IN PGENERIC_OBJECT GenericObject,
IN ULONG ObjectType,
IN ULONG PropertyId,
IN DWORD Reserved,
OUT PVOID *PropertyValue
);
DWORD
ObCommonSetProperty(
IN PGENERIC_OBJECT GenericObject,
IN ULONG ObjectType,
IN ULONG PropertyId,
IN DWORD Reserved,
IN PVOID PropertyValue
);
VOID
ObMarkObjectDeleted(
IN PGENERIC_OBJECT GenericObject
);
DWORD
ObCommonDeleteObject(
IN PGENERIC_OBJECT ParentGenericObject,
IN ULONG ParentObjectType,
IN PGENERIC_OBJECT_HEAD GenericChildHead,
IN ULONG ChildObjectType,
IN LPCWSTR ChildObjectName,
IN DWORD Reserved
);
VOID
ObInitObjectList(
IN OUT PGENERIC_OBJECT_LIST GenericObjectList,
IN PGENERIC_OBJECT_LIST NextGenericObjectList OPTIONAL,
IN BOOL IsBackLink,
IN ULONG LinkPairId,
IN PGENERIC_OBJECT_HEAD GenericObjectHead0 OPTIONAL,
IN PGENERIC_OBJECT_HEAD GenericObjectHead1 OPTIONAL,
IN PGENERIC_OBJECT_HEAD GenericObjectHead2 OPTIONAL
);
DWORD
ObAddPropertyItem(
IN PGENERIC_OBJECT GenericObject,
IN PGENERIC_OBJECT_LIST GenericObjectList,
IN PAZP_STRING ObjectName
);
DWORD
ObCommonAddPropertyItem(
IN PGENERIC_OBJECT GenericObject,
IN ULONG ObjectType,
IN PGENERIC_OBJECT_LIST GenericObjectList,
IN DWORD Reserved,
IN LPWSTR ObjectName
);
DWORD
ObLookupPropertyItem(
IN PGENERIC_OBJECT_LIST GenericObjectList,
IN AZP_STRING ObjectName,
OUT PULONG InsertionPoint OPTIONAL
);
DWORD
ObRemovePropertyItem(
IN PGENERIC_OBJECT GenericObject,
IN PGENERIC_OBJECT_LIST GenericObjectList,
IN PAZP_STRING ObjectName
);
DWORD
ObCommonRemovePropertyItem(
IN PGENERIC_OBJECT GenericObject,
IN ULONG ObjectType,
IN PGENERIC_OBJECT_LIST GenericObjectList,
IN DWORD Reserved,
IN LPWSTR ObjectName
);
PAZ_STRING_ARRAY
ObGetPropertyItems(
IN PGENERIC_OBJECT_LIST GenericObjectList
);
VOID
ObRemoveObjectListLinks(
IN PGENERIC_OBJECT GenericObject,
IN BOOLEAN BackwardLinksToo
);
VOID
ObFreeObjectList(
IN OUT PGENERIC_OBJECT_LIST GenericObjectList
);
#ifdef __cplusplus
}
#endif