Files
exectos/sdk/xtdk/obtypes.h
Aiken Harris e3081c0cf5
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 29s
Builds / ExectOS (i686, release) (push) Successful in 29s
Builds / ExectOS (i686, debug) (push) Successful in 48s
Builds / ExectOS (amd64, debug) (push) Successful in 51s
Define core Object Manager structures
2026-07-05 21:07:22 +02:00

358 lines
12 KiB
C

/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: sdk/xtdk/obtypes.h
* DESCRIPTION: Object Manager structures definitions
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
*/
#ifndef __XTDK_OBTYPES_H
#define __XTDK_OBTYPES_H
#include <xtbase.h>
#include <xttypes.h>
#include <xtstruct.h>
#include <iotypes.h>
/* Object header information flag masks */
#define OBJECT_FLAG_NEW_OBJECT 0x01
#define OBJECT_FLAG_KERNEL_MODE 0x02
#define OBJECT_FLAG_CREATOR_INFO 0x04
#define OBJECT_FLAG_EXCLUSIVE 0x08
#define OBJECT_FLAG_PERMANENT 0x10
#define OBJECT_FLAG_SECURITY_QUOTA 0x20
#define OBJECT_FLAG_SINGLE_PROCESS 0x40
#define OBJECT_FLAG_DEFER_DELETE 0x80
/* Object lock states */
#define OBJECT_LOCK_STATE_WAIT_EXCLUSIVE 0xAAAA1234
#define OBJECT_LOCK_WAITSHARED_SIGNATURE 0xBBBB1234
#define OBJECT_LOCK_STATE_OWNED_EXCLUSIVE 0xCCCC1234
#define OBJECT_LOCK_OWNEDSHARED_SIGNATURE 0xDDDD1234
#define OBJECT_LOCK_STATE_RELEASED_SIGNATURE 0xEEEE1234
#define OBJECT_LOCK_STATE_INITIALIZED 0xFFFF1234
/* Object name attribute flags */
#define OBJECT_INHERIT 0x00000002L
#define OBJECT_PERMANENT 0x00000010L
#define OBJECT_EXCLUSIVE 0x00000020L
#define OBJECT_CASE_INSENSITIVE 0x00000040L
#define OBJECT_OPENIF 0x00000080L
#define OBJECT_OPENLINK 0x00000100L
#define OBJECT_KERNEL_HANDLE 0x00000200L
#define OBJECT_FORCE_ACCESS_CHECK 0x00000400L
#define OBJECT_VALID_ATTRIBUTES 0x000007F2L
/* Maximum number of defined object types */
#define OBJECT_MAX_DEFINED_OBJECT_TYPES 48
/* Object name buffer size */
#define OBJECT_NAME_BUFFER_SIZE 248
/* Object name lock flags */
#define OBJECT_NAME_LOCKED ((LONG)0x80000000)
#define OBJECT_REMOVE_QUEUE_LOCKED (PVOID)1
/* Object name path separator */
#define OBJECT_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
/* Number of hash buckets */
#define OBJECT_NUMBER_HASH_BUCKETS 37
/* C/C++ specific code */
#ifndef __XTOS_ASSEMBLER__
/* Object Manager routine callbacks */
typedef VOID (XTAPI *POB_DUMP_METHOD)(IN PVOID Object, IN POBJECT_DUMP_CONTROL Control);
typedef XTSTATUS (XTAPI *POB_OPEN_METHOD)(IN OBJECT_OPEN_REASON Reason, IN PEPROCESS Process, IN PVOID ObjectBody, IN ACCESS_MASK GrantedAccess, IN ULONG HandleCount);
typedef VOID (XTAPI *POB_CLOSE_METHOD)(IN PEPROCESS Process, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG ProcessHandleCount, IN ULONG SystemHandleCount);
typedef VOID (XTAPI *POB_DELETE_METHOD)(IN PVOID Object);
typedef XTSTATUS (XTAPI *POB_PARSE_METHOD)(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE ProcessorMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, OUT PVOID *Object);
typedef XTSTATUS (XTAPI *POB_SECURITY_METHOD)(IN PVOID Object, IN SECURITY_OPERATION_CODE OperationType, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG CapturedLength, IN OUT PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor, IN MMPOOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping);
typedef XTSTATUS (XTAPI *POB_QUERYNAME_METHOD)(IN PVOID Object, IN BOOLEAN HasObjectName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE ProcessorMode);
typedef BOOLEAN (XTAPI *POB_OKAYTOCLOSE_METHOD)(IN PEPROCESS Process, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE ProcessorMode);
/* Bitmasks used to identify the presence of optional object headers in memory */
typedef enum _OBJECT_HEADER_INFO
{
ObjectHeaderInfoNone = 0,
ObjectHeaderInfoCreatorInfo = 0x01,
ObjectHeaderInfoNameInfo = 0x02,
ObjectHeaderInfoHandleInfo = 0x04,
ObjectHeaderInfoQuotaInfo = 0x08,
ObjectHeaderInfoProcessInfo = 0x10
} OBJECT_HEADER_INFO, *POBJECT_HEADER_INFO;
/* List of information classes used when querying or setting object attributes */
typedef enum _OBJECT_INFORMATION_CLASS
{
ObjectBasicInfo,
ObjectNameInfo,
ObjectTypeInfo,
ObjectAllInfo,
ObjectHandleFlagInfo
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
/* List of valid reasons for creating, opening, or duplicating an object handle */
typedef enum _OBJECT_OPEN_REASON
{
ObCreateHandle,
ObOpenHandle,
ObDuplicateHandle,
ObInheritHandle,
ObMaxOpenReason
} OBJECT_OPEN_REASON, *POBJECT_OPEN_REASON;
/* Mapping of device names to object manager devices */
typedef struct _DEVICE_MAP
{
POBJECT_DIRECTORY DevicesDirectory;
POBJECT_DIRECTORY GlobalDevicesDirectory;
ULONG ReferenceCount;
ULONG DriveMap;
UCHAR DriveType[32];
} DEVICE_MAP, *PDEVICE_MAP;
/* Parameters provided by a caller when creating or opening an object */
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PSECURITY_DESCRIPTOR SecurityDescriptor;
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
/* Internal data stored during object creation */
typedef struct _OBJECT_CREATE_INFORMATION
{
ULONG Attributes;
HANDLE RootDirectory;
PVOID ParseContext;
KPROCESSOR_MODE ProbeMode;
ULONG PagedPoolCharge;
ULONG NonPagedPoolCharge;
ULONG SecurityDescriptorCharge;
PSECURITY_DESCRIPTOR SecurityDescriptor;
PSECURITY_QUALITY_OF_SERVICE SecurityQos;
SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
/* Optional header storing information about the object's creator */
typedef struct _OBJECT_CREATOR_INFO
{
LIST_ENTRY TypeList;
HANDLE CreatorProcessId;
} OBJECT_CREATOR_INFO, *POBJECT_CREATOR_INFO;
/* Directory object used to structure the namespace hierarchy */
typedef struct _OBJECT_DIRECTORY
{
POBJECT_DIRECTORY_ENTRY HashBuckets[OBJECT_NUMBER_HASH_BUCKETS];
KPUSH_LOCK Lock;
PDEVICE_MAP DeviceMap;
ULONG SessionId;
} OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
/* Linked list entry representing an object within a directory bucket */
typedef struct _OBJECT_DIRECTORY_ENTRY
{
POBJECT_DIRECTORY_ENTRY ChainLink;
PVOID Object;
ULONG HashValue;
} OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
/* Control structure used during object diagnostic dumps */
typedef struct _OBJECT_DUMP_CONTROL
{
PVOID Stream;
ULONG Detail;
} OBJECT_DUMP_CONTROL, *POBJECT_DUMP_CONTROL;
/* Entry tracking the number of open handles a specific process holds */
typedef struct _OBJECT_HANDLE_COUNT_ENTRY
{
PEPROCESS OwningProcess;
ULONG HandleTableIndex;
ULONG HandleCount;
} OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
/* Database array tracking handle counts for objects opened by processes */
typedef struct _OBJECT_HANDLE_COUNT_DATABASE
{
ULONG CountEntries;
OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
} OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
/* Database tracking all handle counts across different processes */
typedef struct _OBJECT_HANDLE_COUNT_INFORMATION
{
ULONG TotalHandleCount;
ULONG EntryCount;
POBJECT_HANDLE_COUNT_ENTRY Entries;
} OBJECT_HANDLE_COUNT_INFORMATION, *POBJECT_HANDLE_COUNT_INFORMATION;
/* Optional header containing the handle count database */
typedef struct _OBJECT_HANDLE_INFO
{
OBJECT_HANDLE_COUNT_INFORMATION HandleCounts;
} OBJECT_HANDLE_INFO, *POBJECT_HANDLE_INFO;
/* Core object header */
typedef struct _OBJECT_HEADER
{
LONG_PTR PointerCount;
union
{
LONG_PTR HandleCount;
VOLATILE PVOID NextToFree;
};
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
UCHAR Flags;
union
{
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
PVOID QuotaBlockCharged;
};
PSECURITY_DESCRIPTOR SecurityDescriptor;
QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;
/* Creator tracking information */
typedef struct _OBJECT_HEADER_CREATOR_INFO
{
LIST_ENTRY TypeList;
PVOID CreatorUniqueProcess;
USHORT CreatorBackTraceIndex;
USHORT Reserved;
} OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
/* Union representing either a single handle count entry or a full database */
typedef union _OBJECT_HEADER_HANDLE_INFO
{
POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
} OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
/* Name information stored in the object header */
typedef struct _OBJECT_HEADER_NAME_INFO
{
POBJECT_DIRECTORY Directory;
UNICODE_STRING Name;
ULONG QueryReferences;
ULONG Reserved;
ULONG DbgReferenceCount;
} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
/* Active quota information stored in the object header */
typedef struct _OBJECT_HEADER_QUOTA_INFO
{
ULONG PagedPoolCharge;
ULONG NonPagedPoolCharge;
ULONG SecurityDescriptorCharge;
PEPROCESS ExclusiveProcess;
} OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
/* Context maintained during namespace traversal and directory lookups */
typedef struct _OBJECT_LOOKUP_CONTEXT
{
POBJECT_DIRECTORY Directory;
PVOID Object;
USHORT HashIndex;
BOOLEAN DirectoryLocked;
VOLATILE ULONG LockStateSignature;
} OBJECT_LOOKUP_CONTEXT, *POBJECT_LOOKUP_CONTEXT;
/* Optional header storing the object's hierarchical name and directory links */
typedef struct _OBJECT_NAME_INFO
{
LIST_ENTRY ObjectLinks;
UNICODE_STRING ObjectName;
PWSTR ObjectDirectoryPath;
} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
/* Structure used to query an object's name */
typedef struct _OBJECT_NAME_INFORMATION
{
UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
/* Memory layout sizes for the object's optional headers */
typedef struct _OBJECT_OPTIONAL_HEADER_LAYOUT
{
ULONG QuotaInfoSize;
ULONG HandleInfoSize;
ULONG NameInfoSize;
ULONG CreatorInfoSize;
ULONG TotalSize;
} OBJECT_OPTIONAL_HEADER_LAYOUT, *POBJECT_OPTIONAL_HEADER_LAYOUT;
/* Information block linking an object to a specific process */
typedef struct _OBJECT_PROCESS_INFO
{
LIST_ENTRY Entry;
PEPROCESS Process;
ULONG ReferenceCount;
} OBJECT_PROCESS_INFO, *POBJECT_PROCESS_INFO;
/* Optional header tracking memory pool charges */
typedef struct _OBJECT_QUOTA_INFO
{
ULONG PagedPoolCharge;
ULONG NonPagedPoolCharge;
ULONG SecurityDescriptorCharge;
PEPROCESS ExclusiveProcess;
} OBJECT_QUOTA_INFO, *POBJECT_QUOTA_INFO;
/* Configuration block defining the lifecycle and behavior of a specific object type */
typedef struct _OBJECT_TYPE_INITIALIZER
{
USHORT Length;
BOOLEAN UseDefaultObject;
BOOLEAN CaseInsensitive;
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ULONG ValidAccessMask;
BOOLEAN SecurityRequired;
BOOLEAN MaintainHandleCount;
BOOLEAN MaintainTypeList;
MMPOOL_TYPE PoolType;
ULONG DefaultPagedPoolCharge;
ULONG DefaultNonPagedPoolCharge;
POB_DUMP_METHOD DumpProcedure;
POB_OPEN_METHOD OpenProcedure;
POB_CLOSE_METHOD CloseProcedure;
POB_DELETE_METHOD DeleteProcedure;
POB_PARSE_METHOD ParseProcedure;
POB_SECURITY_METHOD SecurityProcedure;
POB_QUERYNAME_METHOD QueryNameProcedure;
POB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
/* Descriptor representing a registered object type in the system */
typedef struct _OBJECT_TYPE
{
LIST_ENTRY TypeList;
UNICODE_STRING Name;
PVOID DefaultObject;
ULONG Index;
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
ULONG HighWaterNumberOfObjects;
ULONG HighWaterNumberOfHandles;
OBJECT_TYPE_INITIALIZER TypeInfo;
KPUSH_LOCK TypeLock;
ULONG Key;
LIST_ENTRY CallbackList;
} OBJECT_TYPE;
#endif /* __XTOS_ASSEMBLER__ */
#endif /* __XTDK_OBTYPES_H */