|
|
#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
|