2020-09-30 17:17:25 +02:00

271 lines
5.9 KiB
C

/*++
Copyright (c) 1989-2000 Microsoft Corporation
Module Name:
ob.h
Abstract:
This module contains the object manager structure public data
structures and procedure prototypes to be used within the NT
system.
--*/
#ifndef _OB_
#define _OB_
//
// Object manager handle table support.
//
#define OB_HANDLES_PER_TABLE_SHIFT 6
#define OB_HANDLES_PER_TABLE (1 << OB_HANDLES_PER_TABLE_SHIFT)
#define OB_TABLES_PER_SEGMENT 8
#define OB_HANDLES_PER_SEGMENT (OB_TABLES_PER_SEGMENT * OB_HANDLES_PER_TABLE)
typedef struct _OBJECT_HANDLE_TABLE {
LONG HandleCount;
LONG_PTR FirstFreeTableEntry;
HANDLE NextHandleNeedingPool;
PVOID **RootTable;
PVOID *BuiltinRootTable[OB_TABLES_PER_SEGMENT];
} OBJECT_HANDLE_TABLE, *POBJECT_HANDLE_TABLE;
//
// Object type information structure.
//
typedef PVOID (*OB_ALLOCATE_METHOD)(
IN SIZE_T NumberOfBytes,
IN ULONG Tag
);
typedef VOID (*OB_FREE_METHOD)(
IN PVOID Pointer
);
typedef VOID (*OB_CLOSE_METHOD)(
IN PVOID Object,
IN ULONG SystemHandleCount
);
typedef VOID (*OB_DELETE_METHOD)(
IN PVOID Object
);
typedef NTSTATUS (*OB_PARSE_METHOD)(
IN PVOID ParseObject,
IN struct _OBJECT_TYPE *ObjectType,
IN ULONG Attributes,
IN OUT POBJECT_STRING CompleteName,
IN OUT POBJECT_STRING RemainingName,
IN OUT PVOID Context OPTIONAL,
OUT PVOID *Object
);
typedef struct _OBJECT_TYPE {
OB_ALLOCATE_METHOD AllocateProcedure;
OB_FREE_METHOD FreeProcedure;
OB_CLOSE_METHOD CloseProcedure;
OB_DELETE_METHOD DeleteProcedure;
OB_PARSE_METHOD ParseProcedure;
PVOID DefaultObject;
ULONG PoolTag;
} OBJECT_TYPE, *POBJECT_TYPE;
//
// Object header structure.
//
typedef struct _OBJECT_HEADER {
LONG PointerCount;
LONG HandleCount;
POBJECT_TYPE Type;
ULONG Flags;
QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;
#define OB_FLAG_NAMED_OBJECT 0x01
#define OB_FLAG_PERMANENT_OBJECT 0x02
#define OB_FLAG_ATTACHED_OBJECT 0x04
#define OBJECT_TO_OBJECT_HEADER(Object) \
CONTAINING_RECORD(Object, OBJECT_HEADER, Body)
#define OBJECT_TO_OBJECT_HEADER_NAME_INFO(Object) \
((POBJECT_HEADER_NAME_INFO)OBJECT_TO_OBJECT_HEADER(Object) - 1)
#define OBJECT_HEADER_NAME_INFO_TO_OBJECT_HEADER(ObjectHeaderNameInfo) \
((POBJECT_HEADER)((POBJECT_HEADER_NAME_INFO)(ObjectHeaderNameInfo) + 1))
#define OBJECT_HEADER_TO_OBJECT_HEADER_NAME_INFO(ObjectHeader) \
((POBJECT_HEADER_NAME_INFO)(ObjectHeader) - 1)
#define OBJECT_HEADER_NAME_INFO_TO_OBJECT(ObjectHeaderNameInfo) \
(&OBJECT_HEADER_NAME_INFO_TO_OBJECT_HEADER(ObjectHeaderNameInfo)->Body)
typedef struct _OBJECT_HEADER_NAME_INFO {
struct _OBJECT_HEADER_NAME_INFO *ChainLink;
struct _OBJECT_DIRECTORY *Directory;
OBJECT_STRING Name;
} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
//
// Object directory structure.
//
#define OB_NUMBER_HASH_BUCKETS 11
typedef struct _OBJECT_DIRECTORY {
struct _OBJECT_HEADER_NAME_INFO *HashBuckets[OB_NUMBER_HASH_BUCKETS];
} OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
//
// Symbolic link object structure.
//
typedef struct _OBJECT_SYMBOLIC_LINK {
PVOID LinkTargetObject;
OBJECT_STRING LinkTarget;
} OBJECT_SYMBOLIC_LINK, *POBJECT_SYMBOLIC_LINK;
//
// The following global event can be used for types of objects that can never be
// signaled.
//
extern KEVENT ObpDefaultObject;
//
// Define the maximum number of KWAIT_BLOCKs that will be allocated on the stack
// for a NtWaitForMultipleObjectsEx call.
//
// This number is chosen such that:
//
// (OB_MAXIMUM_STACK_WAIT_BLOCKS * (sizeof(PVOID) + sizeof(KWAIT_BLOCK))) <=
// sizeof(PVOID) * MAXIMUM_WAIT_OBJECTS
//
#define OB_MAXIMUM_STACK_WAIT_BLOCKS 9
//
// Define the predefined handle value for the \?? directory.
//
#define ObDosDevicesDirectory() ((HANDLE)-3)
//
// Define the predefined handle value for the \Win32NamedObjects directory.
//
#define ObWin32NamedObjectsDirectory() ((HANDLE)-4)
//
// Prototypes.
//
BOOLEAN
ObInitSystem(
VOID
);
VOID
ObDissectName (
IN OBJECT_STRING Path,
OUT POBJECT_STRING FirstName,
OUT POBJECT_STRING RemainingName
);
// begin_ntddk
NTKERNELAPI
NTSTATUS
ObCreateObject(
IN POBJECT_TYPE ObjectType,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN ULONG ObjectBodySize,
OUT PVOID *Object
);
NTKERNELAPI
NTSTATUS
ObInsertObject(
IN PVOID Object,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN ULONG ObjectPointerBias,
OUT PHANDLE Handle
);
NTKERNELAPI
NTSTATUS
ObReferenceObjectByHandle(
IN HANDLE Handle,
IN POBJECT_TYPE ObjectType OPTIONAL,
OUT PVOID *Object
);
NTKERNELAPI
NTSTATUS
ObOpenObjectByName(
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN POBJECT_TYPE ObjectType,
IN OUT PVOID ParseContext OPTIONAL,
OUT PHANDLE Handle
);
NTKERNELAPI
NTSTATUS
ObOpenObjectByPointer(
IN PVOID Object,
IN POBJECT_TYPE ObjectType,
OUT PHANDLE Handle
);
NTKERNELAPI
NTSTATUS
ObReferenceObjectByName(
IN POBJECT_STRING ObjectName,
IN ULONG Attributes,
IN POBJECT_TYPE ObjectType,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
);
NTKERNELAPI
VOID
ObMakeTemporaryObject(
IN PVOID Object
);
NTKERNELAPI
VOID
FASTCALL
ObfReferenceObject(
IN PVOID Object
);
#define ObReferenceObject(Object) ObfReferenceObject(Object)
NTKERNELAPI
NTSTATUS
ObReferenceObjectByPointer(
IN PVOID Object,
IN POBJECT_TYPE ObjectType
);
NTKERNELAPI
VOID
FASTCALL
ObfDereferenceObject(
IN PVOID Object
);
#define ObDereferenceObject(Object) ObfDereferenceObject(Object)
// end_ntddk
#endif // OB