/*++ Copyright (c) 1999-1999 Microsoft Corporation Module Name: objtable.h Abstract: This module contains public declarations and definitions for the UL object table package. Author: Keith Moore (keithmo) 20-Apr-1999 Revision History: --*/ #ifndef _OBJTABLE_H_ #define _OBJTABLE_H_ // // Pointer to an object cleanup routine. This cleanup routine is invoked // whenever the final reference to an object is removed by a call to // UlDereferenceObject(). // // Arguments: // // pObjectInfo - Supplies a pointer to the UL_OBJECT_INFO structure // embedded within the object being destroyed. The destruction // handler can get to the original object with the // CONTAINING_RECORD() macro. // // Note: // // This routine is invoked without the table lock held. // // This routine is invoked at the same IRQL as the caller to // UlDereferenceObject(). // typedef VOID (NTAPI * PUL_DESTROY_HANDLER)( IN struct _UL_OBJECT_INFO *pObjectInfo ); // // An object type definition. One of these must be registered with UL // for each object type supported. // typedef struct _UL_OBJECT_TYPE { // // All object types are kept on a global list. // LIST_ENTRY ObjectTypeListEntry; // // The cleanup routine for this object type. // PUL_DESTROY_HANDLER pDestroyHandler; // // The name of this object type. // UNICODE_STRING TypeName; // // Various statistics. // LONG ObjectsCreated; LONG ObjectsDestroyed; LONG References; LONG Dereferences; } UL_OBJECT_TYPE, *PUL_OBJECT_TYPE; // // Per-object info. One of these structures must be present in each // object managed by the object package. // typedef struct _UL_OBJECT_INFO { // // Pointer to the type definition information for this object. // PUL_OBJECT_TYPE pType; // // The number of outstanding references to this object. // LONG ReferenceCount; } UL_OBJECT_INFO, *PUL_OBJECT_INFO; // // Initialize/terminate the object table package. // NTSTATUS UlInitializeObjectTablePackage( VOID ); VOID UlTerminateObjectTablePackage( VOID ); // // Initialize an object type descriptor. // // Arguments: // // pType - Receives the initialized object type descriptor. // // pTypeName - Supplies a human-readable name for the new type. // // pDestroyHandler - Supplies the object destruction handler // for this type. // // Note: // // The UL_OBJECT_TYPE structure must be in non-paged memory // and must remain available throughout the life of the driver. // VOID UlInitializeObjectType( OUT PUL_OBJECT_TYPE pType, IN PWSTR pTypeName, IN PUL_DESTROY_HANDLER pDestroyHandler ); // // Create a new object table. // // Arguments: // // pNewObjectTable - Receives a pointer to the new object table // if successful. // // Return Value: // // NTSTATUS - Completion status. // NTSTATUS UlCreateObjectTable( OUT PUL_OBJECT_TABLE *pNewObjectTable ); // // Destroys an existing object table. // // Arguments: // // pObjectTable - Supplies the object table to destroy. // // Return Value: // // NTSTATUS - Completion status. // // Note: // // Any outstanding objects in the table are removed (and dereferenced) // by this routine. This may result in a flood of destruction handler // invocations. // NTSTATUS UlDestroyObjectTable( IN PUL_OBJECT_TABLE pObjectTable ); // // Creates an table entry for a newly created object. // // Arguments: // // pObjectTable - Supplies the object table that will contain the // new object. // // pObjectType - Supplies the object type for the new object. // // pObjectInfo - Supplies a pointer to the UL_OBJECT_INFO // struture embedded within the newly created object. // // pNewOpaqueId - Receives the new opaque ID for the object // if successful. // // Return Value: // // NTSTATUS - Completion status. // // Note: // // The newly created object (the one containing pObjectInfo) is // assumed to have been created with a reference count of at least // one. In other words, the object already accounts for the object // table's reference. This reference is removed when the object's // opaque ID is removed from the object table. // NTSTATUS UlCreateObject( IN PUL_OBJECT_TABLE pObjectTable, IN PUL_OBJECT_TYPE pObjectType, IN PUL_OBJECT_INFO pObjectInfo, OUT PUL_OPAQUE_ID pNewOpaqueId ); // // Closes an object by invaliding the opaque ID and dereferenceing the // associated object. // // Arguments: // // pObjectTable - Supplies the object table containing the object. // // pObjectType - Supplies the object type for the object. // // OpaqueId - Supplies the opaque ID of the object to close. // // pLastReference - Receives TRUE if the last reference to the // object was removed. // // Return Value: // // NTSTATUS - Completion status. // NTSTATUS UlCloseObject( IN PUL_OBJECT_TABLE pObjectTable, IN PUL_OBJECT_TYPE pObjectType, IN UL_OPAQUE_ID OpaqueId, OUT PBOOLEAN pLastReference ); // // Increments the reference count on an object given the object's // opaque ID. // // Arguments: // // pObjectTable - Supplies the object table containing the object. // // pObjectType - Supplies the object type for the object. // // OpaqueId - Supplies the opaque ID of the object to reference. // // pObjectInfo - Receives a pointer to the UL_OBJECT_INFO structure // embedded within the referenced object if successful. // // Return Value: // // NTSTATUS - Completion status. // NTSTATUS UlReferenceObjectByOpaqueId( IN PUL_OBJECT_TABLE pObjectTable, IN PUL_OBJECT_TYPE pObjectType, IN UL_OPAQUE_ID OpaqueId, OUT PUL_OBJECT_INFO *pObjectInfo ); // // Increments the reference count on an object given a pointer to // the object. // // Arguments: // // pObjectInfo - Supplies a pointer to the UL_OBJECT_INFO structure // embedded within the object to reference. // VOID UlReferenceObjectByPointer( IN PUL_OBJECT_INFO pObjectInfo ); // // Dereferences an object. If this removes the last reference to the // object, then the destruction handler is invoked. // // Arguments: // // pObjectInfo - Supplies a pointer to the UL_OBJECT_INFO structure // embedded within the object to dereference. // // Return Value: // // BOOLEAN - TRUE if the final reference to the object was removed // (and therefore the destruction handler was invoked), FALSE // otherwise. // BOOLEAN UlDereferenceObject( IN PUL_OBJECT_INFO pObjectInfo ); #endif // _OBJTABLE_H_