358 lines
12 KiB
C
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 */
|