diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/os2/server/srvobjmn.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to '')
-rw-r--r-- | private/os2/server/srvobjmn.c | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/private/os2/server/srvobjmn.c b/private/os2/server/srvobjmn.c new file mode 100644 index 000000000..595094cab --- /dev/null +++ b/private/os2/server/srvobjmn.c @@ -0,0 +1,338 @@ +/*++ + +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); +} |