summaryrefslogblamecommitdiffstats
path: root/private/os2/server/srvobjmn.c
blob: 595094cabcf22d44eb995d887dd467a65c42f044 (plain) (tree)

















































































































































































































































































































































                                                                         
/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    srvobjmn.c

Abstract:

    This is the local object manager module for the OS/2 Subsystem Server

Author:

    Mark Lucovsky (markl) 10-Jul-1990

Environment:

    User Mode Only

Revision History:

--*/

#include "os2srv.h"

NTSTATUS
Os2InitializeLocalObjectManager( VOID )

/*++

Routine Description:

    This function initializes the local object manager for
    named Os2 objects.

    The local object directory is used to translate an object
    name/type into an object handle.

Arguments:

    None

Return Value:

    NT_SUCCESS() - Function completed without error
    !NT_SUCCESS() - Function failed

--*/

{
    //
    // Create a generic table for object names.
    //

    RtlInitializeGenericTable (
        &Os2LocalObjectNames,
        Os2LocalObjectCompare,
        Os2LocalObjectDirentAllocate,
        Os2LocalObjectDirentDeallocate,
        NULL
        );

    return(STATUS_SUCCESS);
}

RTL_GENERIC_COMPARE_RESULTS
Os2LocalObjectCompare(
    IN struct _RTL_GENERIC_TABLE *Table,
    IN PVOID FirstStruct,
    IN PVOID SecondStruct
    )

/*++

Routine Description:

    This function is called during local object name lookup to
    determine if an object is in the local object directory.

Arguments:

    Table - Not used

    FirstStruct - Supplies the address of a local object directory entry
        whose name is compared against the equvalent value in
        SecondStruct.

    SecondStruct - Supplies the address of a local object directory entry
        whose name is compared against the equvalent value in
        FirstStruct.

Return Value:

    GenericLessThan - FirstStruct is less than SecondStruct

    GenericGreaterThan - FirstStruct is greater than SecondStruct

    GenericEqual - FirstStruct and SecondStruct are equal

--*/

{

    POS2_LOCAL_OBJECT_DIRENT FirstDirent;
    POS2_LOCAL_OBJECT_DIRENT SecondDirent;
    LONG CompareResult;

    UNREFERENCED_PARAMETER(Table);
    FirstDirent = (POS2_LOCAL_OBJECT_DIRENT) FirstStruct;
    SecondDirent = (POS2_LOCAL_OBJECT_DIRENT) SecondStruct;

    CompareResult = RtlCompareString(
                        &FirstDirent->ObjectName,
                        &SecondDirent->ObjectName,
                        TRUE
                        );

    if ( CompareResult ) {
        if ( CompareResult < 0 ) {
            return GenericLessThan;
        } else {
            return GenericGreaterThan;
        }
    } else {
        return GenericEqual;
    }

}

PVOID
Os2LocalObjectDirentAllocate(
    IN struct _RTL_GENERIC_TABLE *Table,
    IN CLONG ByteSize
    )

/*++

Routine Description:

    This function is called during local object directory entry
    creation to allocate space for an object directory entry.

Arguments:

    Table - Not used.

    ByteSize - Supplies the amount of space to allocate to store the
        directory entry.

Return Value:

    NON-NULL - returns the address of the allocated dirent

--*/

{
    UNREFERENCED_PARAMETER(Table);
    return RtlAllocateHeap( Os2Heap, 0, ByteSize );
}

VOID
Os2LocalObjectDirentDeallocate(
    IN struct _RTL_GENERIC_TABLE *Table,
    IN PVOID Buffer
    )

/*++

Routine Description:

    This function is called to deallocate a local object dirent.

Arguments:

    Table - Not Used.

    Buffer - Supplies the address of the dirent to deallocate

Return Value:

    None.

--*/

{
    UNREFERENCED_PARAMETER(Table);
    RtlFreeHeap( Os2Heap, 0, Buffer );
}

POS2_LOCAL_OBJECT_DIRENT
Os2LookupLocalObjectByName(
    IN PSTRING ObjectName,
    IN OS2_LOCAL_OBJECT_TYPE ObjectType
    )

/*++

Routine Description:

    This function looks up the specified object name in the
    local object directory. If a matching object is found,
    its type is checked against the specified type and the
    address of the directory entry is returned.


Arguments:

    ObjectName - Supplies the name of the object to lookup
        in the local object directory.

    ObjectType - Supplies the object type to match against. A value
        of LocalObjectAnyType matches all object types (just performs
        a name lookup).

Return Value:

    NULL - The object was not found, or the object was found but its type
        did not match.

    NON-NULL - Returns a pointer to the matching directory entry.


--*/

{
    POS2_LOCAL_OBJECT_DIRENT Match;
    OS2_LOCAL_OBJECT_DIRENT Template;

    Template.ObjectName = *ObjectName;

    Match = RtlLookupElementGenericTable(
                &Os2LocalObjectNames,
                &Template
                );

    if ( Match ) {
        if (ObjectType != LocalObjectAnyType) {
            if ( ObjectType != Match->ObjectType ) {
                Match = NULL;
            }
        }
    }

    return Match;
}

POS2_LOCAL_OBJECT_DIRENT
Os2InsertLocalObjectName(
    IN PSTRING ObjectName,
    IN OS2_LOCAL_OBJECT_TYPE ObjectType,
    IN ULONG ObjectHandle
    )

/*++

Routine Description:

    This function inserts an object name into the local object
    directory creating a directory entry. Duplicate names are
    not supported (assertion). description-of-function.


Arguments:

    ObjectName - Supplies the name of the object to insert
        in the local object directory.

    ObjectType - Supplies the object type to match against.

    Handle - Supplies a handle to the object.

Return Value:

    NON-NULL - Returns the address of the inserted dirent.

    NULL - No memory to allocate the dirent exists.

--*/

{
    POS2_LOCAL_OBJECT_DIRENT Match;
    OS2_LOCAL_OBJECT_DIRENT Template;
    BOOLEAN Inserted;

    Template.ObjectType = ObjectType;
    Template.ObjectName = *ObjectName;
    Template.ObjectHandle = ObjectHandle;

    try {
        Match = RtlInsertElementGenericTable(
                    &Os2LocalObjectNames,
                    &Template,
                    sizeof(Template),
                    &Inserted
                    );
    } except ( EXCEPTION_EXECUTE_HANDLER ) {
        return NULL;
    }

    ASSERT(Inserted);

    return Match;
}

VOID
Os2DeleteLocalObject(
    IN POS2_LOCAL_OBJECT_DIRENT Dirent
    )

/*++

Routine Description:

    This function deletes an object directory entry (name, handle, type)
    from the local object directory.


Arguments:

    Dirent - Supplies the directory entry of the object to
        remove from the table.

Return Value:

    None.

--*/

{
    BOOLEAN ret;

    ret = RtlDeleteElementGenericTable(
            &Os2LocalObjectNames,
            Dirent
            );
    ASSERT(ret);
}