diff --git a/sdk/xtdk/obtypes.h b/sdk/xtdk/obtypes.h new file mode 100644 index 0000000..7dcde43 --- /dev/null +++ b/sdk/xtdk/obtypes.h @@ -0,0 +1,357 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtdk/obtypes.h + * DESCRIPTION: Object Manager structures definitions + * DEVELOPERS: Aiken Harris + */ + +#ifndef __XTDK_OBTYPES_H +#define __XTDK_OBTYPES_H + +#include +#include +#include +#include + + +/* 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 */ diff --git a/sdk/xtdk/xtkmapi.h b/sdk/xtdk/xtkmapi.h index b859ce4..a2ef9b8 100644 --- a/sdk/xtdk/xtkmapi.h +++ b/sdk/xtdk/xtkmapi.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include diff --git a/sdk/xtdk/xtstruct.h b/sdk/xtdk/xtstruct.h index 0b61629..6c5eefa 100644 --- a/sdk/xtdk/xtstruct.h +++ b/sdk/xtdk/xtstruct.h @@ -72,6 +72,9 @@ typedef enum _MMPOOL_TYPE MMPOOL_TYPE, *PMMPOOL_TYPE; typedef enum _MMSYSTEM_PTE_POOL_TYPE MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE; typedef enum _MODE MODE, *PMODE; typedef enum _NONPAGED_LOOKASIDE_NUMBER NONPAGED_LOOKASIDE_NUMBER, *PNONPAGED_LOOKASIDE_NUMBER; +typedef enum _OBJECT_HEADER_INFO OBJECT_HEADER_INFO, *POBJECT_HEADER_INFO; +typedef enum _OBJECT_INFORMATION_CLASS OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS; +typedef enum _OBJECT_OPEN_REASON OBJECT_OPEN_REASON, *POBJECT_OPEN_REASON; typedef enum _POWER_ACTION POWER_ACTION, *PPOWER_ACTION; typedef enum _POWER_STATE_TYPE POWER_STATE_TYPE, *PPOWER_STATE_TYPE; typedef enum _PS_QUOTA_TYPE PS_QUOTA_TYPE, *PPS_QUOTA_TYPE; @@ -114,6 +117,7 @@ typedef struct _CPPORT CPPORT, *PCPPORT; typedef struct _CPTABLE_INFO CPTABLE_INFO, *PCPTABLE_INFO; typedef struct _CSTRING CSTRING, *PCSTRING; typedef struct _DEVICE_CAPABILITIES DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES; +typedef struct _DEVICE_MAP DEVICE_MAP, *PDEVICE_MAP; typedef struct _DEVICE_OBJECT DEVICE_OBJECT, *PDEVICE_OBJECT; typedef struct _DEVOBJ_EXTENSION DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION; typedef struct _DRIVER_EXTENSION DRIVER_EXTENSION, *PDRIVER_EXTENSION; @@ -363,6 +367,28 @@ typedef struct _MMPFNLIST MMPFNLIST, *PMMPFNLIST; typedef struct _NAMED_PIPE_CREATE_PARAMETERS NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS; typedef struct _NLSTABLE_INFO NLSTABLE_INFO, *PNLSTABLE_INFO; typedef struct _NONPAGED_LOOKASIDE_LIST NONPAGED_LOOKASIDE_LIST, *PNONPAGED_LOOKASIDE_LIST; +typedef struct _OBJECT_ATTRIBUTES OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; +typedef struct _OBJECT_CREATE_INFORMATION OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION; +typedef struct _OBJECT_CREATOR_INFO OBJECT_CREATOR_INFO, *POBJECT_CREATOR_INFO; +typedef struct _OBJECT_DIRECTORY OBJECT_DIRECTORY, *POBJECT_DIRECTORY; +typedef struct _OBJECT_DIRECTORY_ENTRY OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY; +typedef struct _OBJECT_DUMP_CONTROL OBJECT_DUMP_CONTROL, *POBJECT_DUMP_CONTROL; +typedef struct _OBJECT_HANDLE_COUNT_DATABASE OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE; +typedef struct _OBJECT_HANDLE_COUNT_ENTRY OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY; +typedef struct _OBJECT_HANDLE_COUNT_INFORMATION OBJECT_HANDLE_COUNT_INFORMATION, *POBJECT_HANDLE_COUNT_INFORMATION; +typedef struct _OBJECT_HANDLE_INFO OBJECT_HANDLE_INFO, *POBJECT_HANDLE_INFO; +typedef struct _OBJECT_HEADER OBJECT_HEADER, *POBJECT_HEADER; +typedef struct _OBJECT_HEADER_CREATOR_INFO OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO; +typedef struct _OBJECT_HEADER_NAME_INFO OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO; +typedef struct _OBJECT_HEADER_QUOTA_INFO OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO; +typedef struct _OBJECT_LOOKUP_CONTEXT OBJECT_LOOKUP_CONTEXT, *POBJECT_LOOKUP_CONTEXT; +typedef struct _OBJECT_NAME_INFO OBJECT_NAME_INFO, *POBJECT_NAME_INFO; +typedef struct _OBJECT_NAME_INFORMATION OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; +typedef struct _OBJECT_OPTIONAL_HEADER_LAYOUT OBJECT_OPTIONAL_HEADER_LAYOUT, *POBJECT_OPTIONAL_HEADER_LAYOUT; +typedef struct _OBJECT_PROCESS_INFO OBJECT_PROCESS_INFO, *POBJECT_PROCESS_INFO; +typedef struct _OBJECT_QUOTA_INFO OBJECT_QUOTA_INFO, *POBJECT_QUOTA_INFO; +typedef struct _OBJECT_TYPE OBJECT_TYPE, *POBJECT_TYPE; +typedef struct _OBJECT_TYPE_INITIALIZER OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER; typedef struct _OWNER_ENTRY OWNER_ENTRY, *POWNER_ENTRY; typedef struct _PAGED_LOOKASIDE_LIST PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; typedef struct _PCAT_FIRMWARE_INFORMATION PCAT_FIRMWARE_INFORMATION, *PPCAT_FIRMWARE_INFORMATION; @@ -463,6 +489,7 @@ typedef union _EFI_PXE_BASE_CODE_PACKET EFI_PXE_BASE_CODE_PACKET, *PEFI_PXE_BASE typedef union _EX_RUNDOWN_REFERENCE EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE; typedef union _KPUSH_LOCK KPUSH_LOCK, *PKPUSH_LOCK; typedef union _LARGE_INTEGER LARGE_INTEGER, *PLARGE_INTEGER; +typedef union _OBJECT_HEADER_HANDLE_INFO OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO; typedef union _POWER_STATE POWER_STATE, *PPOWER_STATE; typedef union _ULARGE_INTEGER ULARGE_INTEGER, *PULARGE_INTEGER;