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.
343 lines
7.6 KiB
343 lines
7.6 KiB
#ifndef _OM_H
|
|
#define _OM_H
|
|
|
|
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
om.h
|
|
|
|
Abstract:
|
|
|
|
Public data structures and procedure prototypes for the
|
|
Object Manager (Om) subcomponent of the NT Cluster Service
|
|
|
|
Author:
|
|
|
|
Rod Gamache (rodga) 13-Mar-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// Common object header
|
|
//
|
|
#define OM_TRACE_REF 0
|
|
|
|
|
|
|
|
//
|
|
// Delete object callback method
|
|
//
|
|
typedef VOID (*OM_DELETE_OBJECT_METHOD)(
|
|
IN PVOID Object
|
|
);
|
|
|
|
typedef OM_DELETE_OBJECT_METHOD *POM_DELETE_OBJECT_METHOD;
|
|
|
|
//
|
|
// Object Types
|
|
//
|
|
|
|
typedef enum _ObjectType {
|
|
ObjectTypeResource = 1,
|
|
ObjectTypeResType,
|
|
ObjectTypeGroup,
|
|
ObjectTypeNode,
|
|
ObjectTypeCluster,
|
|
ObjectTypeNetwork,
|
|
ObjectTypeNetInterface,
|
|
ObjectTypeMax
|
|
} OBJECT_TYPE;
|
|
|
|
|
|
//
|
|
// Object Type structure
|
|
//
|
|
|
|
typedef struct _OM_OBJECT_TYPE_INITIALIZE {
|
|
DWORD ObjectSize;
|
|
DWORD Signature;
|
|
LPCWSTR Name;
|
|
OM_DELETE_OBJECT_METHOD DeleteObjectMethod;
|
|
} OM_OBJECT_TYPE_INITIALIZE, *POM_OBJECT_TYPE_INITIALIZE;
|
|
|
|
typedef struct _OM_OBJECT_TYPE {
|
|
LIST_ENTRY ListHead;
|
|
LIST_ENTRY CallbackListHead;
|
|
DWORD Signature;
|
|
DWORD Type;
|
|
LPWSTR Name;
|
|
DWORD ObjectSize;
|
|
DWORD EnumKey; // If we ever run out, go to DWORDLONG
|
|
CRITICAL_SECTION CriticalSection;
|
|
OM_DELETE_OBJECT_METHOD DeleteObjectMethod;
|
|
} OM_OBJECT_TYPE, *POM_OBJECT_TYPE;
|
|
|
|
|
|
//
|
|
// Object flags
|
|
//
|
|
#define OM_FLAG_OBJECT_INSERTED 0x00000001
|
|
|
|
//the callback registered for object notifications
|
|
typedef void (WINAPI *OM_OBJECT_NOTIFYCB)(
|
|
IN PVOID pContext,
|
|
IN PVOID pObject,
|
|
IN DWORD dwNotification
|
|
);
|
|
|
|
// the notification record stored for an object
|
|
typedef struct _OM_NOTIFY_RECORD{
|
|
LIST_ENTRY ListEntry;
|
|
OM_OBJECT_NOTIFYCB pfnObjNotifyCb;
|
|
DWORD dwNotifyMask;
|
|
PVOID pContext;
|
|
}OM_NOTIFY_RECORD,*POM_NOTIFY_RECORD;
|
|
|
|
|
|
//
|
|
// Object header structure
|
|
//
|
|
|
|
typedef struct _OM_HEADER {
|
|
#if OM_TRACE_REF
|
|
LIST_ENTRY DeadListEntry;
|
|
#endif
|
|
LIST_ENTRY ListEntry;
|
|
DWORD Signature;
|
|
DWORD RefCount;
|
|
DWORD Flags;
|
|
LPWSTR Id;
|
|
LPWSTR Name;
|
|
POM_OBJECT_TYPE ObjectType;
|
|
DWORD EnumKey;
|
|
LIST_ENTRY CbListHead;
|
|
DWORDLONG Body; // For alignment
|
|
} OM_HEADER, *POM_HEADER;
|
|
|
|
#define OmpObjectToHeader(pObject) CONTAINING_RECORD((pObject), OM_HEADER, Body)
|
|
#define OmpReferenceHeader(pOmHeader) InterlockedIncrement(&(pOmHeader)->RefCount)
|
|
|
|
|
|
#if OM_TRACE_REF
|
|
|
|
extern DWORDLONG *OmpMatchRef;
|
|
|
|
#define OmReferenceObject(pObject) \
|
|
{ \
|
|
CsDbgPrint(LOG_NOISE, \
|
|
"[OM] Reference object %1!lx! (new refcnt %2!d!) from file %3!s! line %4!u!.\n", \
|
|
pObject, \
|
|
((OmpObjectToHeader(pObject))->RefCount) + 1, \
|
|
__FILE__, \
|
|
__LINE__ ); \
|
|
OmpReferenceHeader(OmpObjectToHeader(pObject));\
|
|
}
|
|
|
|
#define OmDereferenceObject(pObject) \
|
|
{ \
|
|
CsDbgPrint(LOG_NOISE, \
|
|
"[OM] DeReference object %1!lx! (new refcnt %2!d!) from file %3!s! line %4!u!.\n", \
|
|
pObject, \
|
|
((OmpObjectToHeader(pObject))->RefCount) - 1, \
|
|
__FILE__, \
|
|
__LINE__ ); \
|
|
OmpDereferenceObject(pObject); \
|
|
}
|
|
|
|
//SS: Dont use this in an initialization assignment! This includes a comma, expression
|
|
#define OmReferenceObjectByName(ObjectType, Name) \
|
|
((CsDbgPrint(LOG_NOISE, \
|
|
"[OM] Reference object name %1!ws! from file %2!s! line %3!u!.\n", \
|
|
Name, \
|
|
__FILE__, \
|
|
__LINE__ )), \
|
|
(OmpReferenceObjectByName(ObjectType, Name))) \
|
|
|
|
//SS: Dont use this in an initialization assignment! This includes a comma, expression
|
|
#define OmReferenceObjectById(ObjectType, Id) \
|
|
((CsDbgPrint(LOG_NOISE, \
|
|
"[OM] Reference object Id %1!ws! from file %2!s! line %3!u!.\n", \
|
|
Id, \
|
|
__FILE__, \
|
|
__LINE__ )), \
|
|
(OmpReferenceObjectById(ObjectType, Id))) \
|
|
|
|
#else
|
|
|
|
#define OmReferenceObject(pObject) OmpReferenceHeader(OmpObjectToHeader(pObject))
|
|
#define OmDereferenceObject(pObject) OmpDereferenceObject(pObject)
|
|
|
|
//SS: Dont use these in an initialization assignment! This includes a comma, expression
|
|
// when the OM_TRACE_REF flag is on
|
|
#define OmReferenceObjectById(ObjectType, Id) OmpReferenceObjectById(ObjectType, Id)
|
|
#define OmReferenceObjectByName(ObjectType, Name) OmpReferenceObjectByName(ObjectType, Name)
|
|
|
|
#endif
|
|
|
|
#define OmObjectSignature(pObject) (OmpObjectToHeader(pObject))->Signature
|
|
|
|
|
|
//
|
|
// Read-only access to object name, Id, and type
|
|
//
|
|
#define OmObjectId(pObject) ((LPCWSTR)(OmpObjectToHeader(pObject)->Id))
|
|
#define OmObjectName(pObject) ((LPCWSTR)(OmpObjectToHeader(pObject)->Name))
|
|
#define OmObjectType(pObject) (OmpObjectToHeader(pObject)->ObjectType->Type)
|
|
|
|
#define OmObjectInserted(pObject) ((BOOL)(OmpObjectToHeader(pObject)->Flags & OM_FLAG_OBJECT_INSERTED))
|
|
|
|
|
|
//
|
|
// Enumeration callback routine definitions
|
|
//
|
|
typedef BOOL (*OM_ENUM_OBJECT_ROUTINE)(
|
|
IN PVOID Context1,
|
|
IN PVOID Context2,
|
|
IN PVOID Object,
|
|
IN LPCWSTR Name
|
|
);
|
|
|
|
|
|
//
|
|
// Global Functions
|
|
//
|
|
|
|
|
|
//
|
|
// Startup and shutdown
|
|
//
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmInitialize(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
OmShutdown(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Object types
|
|
//
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmCreateType(
|
|
IN OBJECT_TYPE ObjectType,
|
|
IN POM_OBJECT_TYPE_INITIALIZE ObjectTypeInitialize
|
|
);
|
|
|
|
//
|
|
// Objects management
|
|
//
|
|
|
|
PVOID
|
|
WINAPI
|
|
OmCreateObject(
|
|
IN OBJECT_TYPE ObjectType,
|
|
IN LPCWSTR ObjectId,
|
|
IN LPCWSTR ObjectName OPTIONAL,
|
|
OUT PBOOL Created OPTIONAL
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmInsertObject(
|
|
IN PVOID Object
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmRemoveObject(
|
|
IN PVOID Object
|
|
);
|
|
|
|
PVOID
|
|
WINAPI
|
|
OmpReferenceObjectById(
|
|
IN OBJECT_TYPE ObjectType,
|
|
IN LPCWSTR Id
|
|
);
|
|
|
|
PVOID
|
|
WINAPI
|
|
OmpReferenceObjectByName(
|
|
IN OBJECT_TYPE ObjectType,
|
|
IN LPCWSTR Name
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmCountObjects(
|
|
IN OBJECT_TYPE ObjectType,
|
|
OUT LPDWORD NumberOfObjects
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmEnumObjects(
|
|
IN OBJECT_TYPE ObjectType,
|
|
IN OM_ENUM_OBJECT_ROUTINE EnumerationRoutine,
|
|
IN PVOID Context1,
|
|
IN PVOID Context2
|
|
);
|
|
|
|
VOID
|
|
OmpDereferenceObject(
|
|
IN PVOID Object
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmSetObjectName(
|
|
IN PVOID Object,
|
|
IN LPCWSTR ObjectName
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmRegisterNotify(
|
|
IN PVOID pObject,
|
|
IN PVOID pContext,
|
|
IN DWORD dwNotifyMask,
|
|
IN OM_OBJECT_NOTIFYCB pfnObjNotifyCb
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmDeregisterNotify(
|
|
IN PVOID pObject,
|
|
IN OM_OBJECT_NOTIFYCB lpfnObjNotifyCb
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmRegisterTypeNotify(
|
|
IN OBJECT_TYPE ObjectType,
|
|
IN PVOID Context,
|
|
IN DWORD NotifyMask,
|
|
IN OM_OBJECT_NOTIFYCB lpfnObjNotifyCb
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
OmNotifyCb(
|
|
IN PVOID pObject,
|
|
IN DWORD dwNotification
|
|
);
|
|
|
|
|
|
#endif //ifndef _OM_H
|
|
|
|
|