Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661/** PROJECT: ReactOS Kernel* LICENSE: GPL - See COPYING in the top level directory* FILE: ntoskrnl/include/internal/ob.h* PURPOSE: Internal header for the Object Manager* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)*/
//// Define this if you want debugging support//#define _OB_DEBUG_ 0x00
//// These define the Debug Masks Supported//#define OB_HANDLE_DEBUG 0x01#define OB_NAMESPACE_DEBUG 0x02#define OB_SECURITY_DEBUG 0x04#define OB_REFERENCE_DEBUG 0x08#define OB_CALLBACK_DEBUG 0x10
//// Debug/Tracing support//#if _OB_DEBUG_#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented#define OBTRACE DbgPrintEx#else#define OBTRACE(x, ...) \ if (x & ObpTraceLevel) DbgPrint(__VA_ARGS__)#endif#else#define OBTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)#endif
//// Mask to detect GENERIC_XXX access masks being used//#define GENERIC_ACCESS \ (GENERIC_READ | \ GENERIC_WRITE | \ GENERIC_EXECUTE | \ GENERIC_ALL)
//// Handle Bit Flags//#define OBJ_PROTECT_CLOSE 0x01//#define OBJ_INHERIT 0x02#define OBJ_AUDIT_OBJECT_CLOSE 0x04#define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE |\ OBJ_INHERIT | \ OBJ_AUDIT_OBJECT_CLOSE)
//// Handle Access Protection Close Flag//#define ObpAccessProtectCloseBit 0x02000000L
//// System Process Quota Block//#define OBP_SYSTEM_PROCESS_QUOTA ((PEPROCESS_QUOTA_BLOCK)(ULONG_PTR)1)
//// Identifies a Kernel Handle//#ifdef _WIN64#define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL#else#define KERNEL_HANDLE_FLAG 0x80000000#endif#define ObpIsKernelHandle(Handle, ProcessorMode) \ ((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \ ((ProcessorMode) == KernelMode) && \ ((Handle) != NtCurrentProcess()) && \ ((Handle) != NtCurrentThread()))
//// Converts to and from a Kernel Handle to a normal handle//#define ObKernelHandleToHandle(Handle) \ (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)#define ObMarkHandleAsKernelHandle(Handle) \ (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
//// Converts from an EXHANDLE object to a POBJECT_HEADER//#define ObpGetHandleObject(x) \ ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
//// Recovers the security descriptor from a cached security descriptor header//#define ObpGetHeaderForSd(x) \ CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor)
//// Recovers the security descriptor from a cached security descriptor list entry//#define ObpGetHeaderForEntry(x) \ CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link)
//// Context Structures for Ex*Handle Callbacks//typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT{ KPROCESSOR_MODE PreviousMode; OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information;} OBP_SET_HANDLE_ATTRIBUTES_CONTEXT, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT;
typedef struct _OBP_CLOSE_HANDLE_CONTEXT{ PHANDLE_TABLE HandleTable; KPROCESSOR_MODE AccessMode;} OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT;
typedef struct _OBP_FIND_HANDLE_DATA{ POBJECT_HEADER ObjectHeader; POBJECT_TYPE ObjectType; POBJECT_HANDLE_INFORMATION HandleInformation;} OBP_FIND_HANDLE_DATA, *POBP_FIND_HANDLE_DATA;
//// Cached Security Descriptor Header//typedef struct _SECURITY_DESCRIPTOR_HEADER{ LIST_ENTRY Link; ULONG RefCount; ULONG FullHash; QUAD SecurityDescriptor;} SECURITY_DESCRIPTOR_HEADER, *PSECURITY_DESCRIPTOR_HEADER;
//// Cached Security Descriptor List//typedef struct _OB_SD_CACHE_LIST{ EX_PUSH_LOCK PushLock; LIST_ENTRY Head;} OB_SD_CACHE_LIST, *POB_SD_CACHE_LIST;
//// Structure for quick-compare of a DOS Device path//typedef union{ WCHAR Name[sizeof(ULARGE_INTEGER) / sizeof(WCHAR)]; ULARGE_INTEGER Alignment;} ALIGNEDNAME;
//// Private Temporary Buffer for Lookup Routines//#define TAG_OB_TEMP_STORAGE 'tSbO'typedef struct _OB_TEMP_BUFFER{ ACCESS_STATE LocalAccessState; OBJECT_CREATE_INFORMATION ObjectCreateInfo; OBP_LOOKUP_CONTEXT LookupContext; AUX_ACCESS_DATA AuxData;} OB_TEMP_BUFFER, *POB_TEMP_BUFFER;
//// Startup and Shutdown Functions//CODE_SEG("INIT")BOOLEANNTAPIObInitSystem( VOID);
VOIDNTAPIObShutdownSystem( VOID);
//// Directory Namespace Functions//BOOLEANNTAPIObpDeleteEntryDirectory( IN POBP_LOOKUP_CONTEXT Context);
BOOLEANNTAPIObpInsertEntryDirectory( IN POBJECT_DIRECTORY Parent, IN POBP_LOOKUP_CONTEXT Context, IN POBJECT_HEADER ObjectHeader);
PVOIDNTAPIObpLookupEntryDirectory( IN POBJECT_DIRECTORY Directory, IN PUNICODE_STRING Name, IN ULONG Attributes, IN BOOLEAN SearchShadow, IN POBP_LOOKUP_CONTEXT Context);
//// Symbolic Link Functions//VOIDNTAPIObpDeleteSymbolicLink( IN PVOID ObjectBody);
NTSTATUSNTAPIObpParseSymbolicLink( IN PVOID ParsedObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING FullPath, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *NextObject);
VOIDNTAPIObpCreateSymbolicLinkName( IN POBJECT_SYMBOLIC_LINK SymbolicLink);
VOIDNTAPIObpDeleteSymbolicLinkName( IN POBJECT_SYMBOLIC_LINK SymbolicLink);
//// Process/Handle Table Init/Rundown//NTSTATUSNTAPIObInitProcess( IN PEPROCESS Parent OPTIONAL, IN PEPROCESS Process);
PHANDLE_TABLENTAPIObReferenceProcessHandleTable( IN PEPROCESS Process);
VOIDNTAPIObDereferenceProcessHandleTable( IN PEPROCESS Process);
VOIDNTAPIObKillProcess( IN PEPROCESS Process);
//// Object Lookup Functions//NTSTATUSNTAPIObpLookupObjectName( IN HANDLE RootHandle OPTIONAL, IN OUT PUNICODE_STRING ObjectName, IN ULONG Attributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, IN PVOID InsertObject OPTIONAL, IN OUT PACCESS_STATE AccessState, OUT POBP_LOOKUP_CONTEXT LookupContext, OUT PVOID *FoundObject);
//// Object Attribute Functions//BOOLEANNTAPIObpSetHandleAttributes( IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry, IN ULONG_PTR Context);
NTSTATUSNTAPIObQueryDeviceMapInformation( _In_opt_ PEPROCESS Process, _Out_ PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo, _In_ ULONG Flags);
//// Object Lifetime Functions//VOIDNTAPIObpDeleteObject( IN PVOID Object, IN BOOLEAN CalledFromWorkerThread);
LONGFASTCALLObDereferenceObjectEx( IN PVOID Object, IN LONG Count);
LONGFASTCALLObReferenceObjectEx( IN PVOID Object, IN LONG Count);
BOOLEANFASTCALLObReferenceObjectSafe( IN PVOID Object);
VOIDNTAPIObpReapObject( IN PVOID Unused);
VOIDFASTCALLObpSetPermanentObject( IN PVOID ObjectBody, IN BOOLEAN Permanent);
VOIDNTAPIObpDeleteNameCheck( IN PVOID Object);
VOIDNTAPIObClearProcessHandleTable( IN PEPROCESS Process);
NTSTATUSNTAPIObDuplicateObject( IN PEPROCESS SourceProcess, IN HANDLE SourceHandle, IN PEPROCESS TargetProcess OPTIONAL, IN PHANDLE TargetHandle OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG HandleAttributes, IN ULONG Options, IN KPROCESSOR_MODE PreviousMode);
VOIDNTAPIObFreeObjectCreateInfoBuffer( IN POBJECT_CREATE_INFORMATION ObjectCreateInfo);
VOIDNTAPIObpFreeObjectNameBuffer( IN PUNICODE_STRING Name);
VOIDNTAPIObpDeleteObjectType( IN PVOID Object);
NTSTATUSNTAPIObReferenceFileObjectForWrite( IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode, OUT PFILE_OBJECT *FileObject, OUT POBJECT_HANDLE_INFORMATION HandleInformation);
//// DOS Devices Functions//NTSTATUSNTAPIObSetDeviceMap( IN PEPROCESS Process, IN HANDLE DirectoryHandle);
NTSTATUSNTAPIObSetDirectoryDeviceMap(OUT PDEVICE_MAP * DeviceMap, IN HANDLE DirectoryHandle);
VOIDNTAPIObDereferenceDeviceMap( IN PEPROCESS Process);
VOIDFASTCALLObfDereferenceDeviceMap( IN PDEVICE_MAP DeviceMap);
VOIDNTAPIObInheritDeviceMap( IN PEPROCESS Parent, IN PEPROCESS Process);
CODE_SEG("INIT")NTSTATUSNTAPIObpCreateDosDevicesDirectory( VOID);
ULONGNTAPIObIsLUIDDeviceMapsEnabled( VOID);
PDEVICE_MAPNTAPIObpReferenceDeviceMap( VOID);
//// Security descriptor cache functions//CODE_SEG("INIT")NTSTATUSNTAPIObpInitSdCache( VOID);
PSECURITY_DESCRIPTORNTAPIObpReferenceSecurityDescriptor( IN POBJECT_HEADER ObjectHeader);
//// Object Security Routines//BOOLEANNTAPIObCheckObjectAccess( IN PVOID Object, IN OUT PACCESS_STATE AccessState, IN BOOLEAN LockHeld, IN KPROCESSOR_MODE AccessMode, OUT PNTSTATUS ReturnedStatus);
BOOLEANNTAPIObCheckCreateObjectAccess( IN PVOID Object, IN ACCESS_MASK CreateAccess, IN PACCESS_STATE AccessState, IN PUNICODE_STRING ComponentName, IN BOOLEAN LockHeld, IN KPROCESSOR_MODE AccessMode, OUT PNTSTATUS AccessStatus);
BOOLEANNTAPIObpCheckTraverseAccess( IN PVOID Object, IN ACCESS_MASK TraverseAccess, IN PACCESS_STATE AccessState OPTIONAL, IN BOOLEAN LockHeld, IN KPROCESSOR_MODE AccessMode, OUT PNTSTATUS AccessStatus);
BOOLEANNTAPIObpCheckObjectReference( IN PVOID Object, IN OUT PACCESS_STATE AccessState, IN BOOLEAN LockHeld, IN KPROCESSOR_MODE AccessMode, OUT PNTSTATUS AccessStatus);
//// Default Object Security Callback Routines//NTSTATUSNTAPIObAssignObjectSecurityDescriptor( IN PVOID Object, IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, IN POOL_TYPE PoolType);
NTSTATUSNTAPIObDeassignSecurity( IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
NTSTATUSNTAPIObQuerySecurityDescriptorInfo( IN PVOID Object, IN PSECURITY_INFORMATION SecurityInformation, OUT PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG Length, IN PSECURITY_DESCRIPTOR *OutputSecurityDescriptor);
NTSTATUSNTAPIObSetSecurityDescriptorInfo( IN PVOID Object, IN PSECURITY_INFORMATION SecurityInformation, IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping);
//// Executive Fast Referencing Functions//VOIDFASTCALLObInitializeFastReference( IN PEX_FAST_REF FastRef, IN PVOID Object);
PVOIDFASTCALLObFastReplaceObject( IN PEX_FAST_REF FastRef, IN PVOID Object);
PVOIDFASTCALLObFastReferenceObject( IN PEX_FAST_REF FastRef);
PVOIDFASTCALLObFastReferenceObjectLocked( IN PEX_FAST_REF FastRef);
VOIDFASTCALLObFastDereferenceObject( IN PEX_FAST_REF FastRef, IN PVOID Object);
//// Object Create and Object Name Capture Functions//NTSTATUSNTAPIObpCaptureObjectName( IN PUNICODE_STRING CapturedName, IN PUNICODE_STRING ObjectName, IN KPROCESSOR_MODE AccessMode, IN BOOLEAN AllocateFromLookaside);
NTSTATUSNTAPIObpCaptureObjectCreateInformation( IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, IN KPROCESSOR_MODE CreatorMode, IN BOOLEAN AllocateFromLookaside, IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, OUT PUNICODE_STRING ObjectName);
//// Miscellanea//ULONGNTAPIObGetProcessHandleCount( IN PEPROCESS Process);
//// Global data inside the Object Manager//extern ULONG ObpTraceLevel;extern KEVENT ObpDefaultObject;extern KGUARDED_MUTEX ObpDeviceMapLock;extern POBJECT_TYPE ObpTypeObjectType;extern POBJECT_TYPE ObpDirectoryObjectType;extern POBJECT_TYPE ObpSymbolicLinkObjectType;extern POBJECT_DIRECTORY ObpRootDirectoryObject;extern POBJECT_DIRECTORY ObpTypeDirectoryObject;extern PHANDLE_TABLE ObpKernelHandleTable;extern WORK_QUEUE_ITEM ObpReaperWorkItem;extern volatile PVOID ObpReaperList;extern GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList;extern BOOLEAN IoCountOperations;extern ALIGNEDNAME ObpDosDevicesShortNamePrefix;extern ALIGNEDNAME ObpDosDevicesShortNameRoot;extern UNICODE_STRING ObpDosDevicesShortName;extern WCHAR ObpUnsecureGlobalNamesBuffer[128];extern ULONG ObpUnsecureGlobalNamesLength;extern ULONG ObpCaseInsensitive;extern ULONG ObpObjectSecurityMode;extern ULONG ObpProtectionMode;extern ULONG ObpLUIDDeviceMapsDisabled;extern ULONG ObpLUIDDeviceMapsEnabled;
//// Inlined Functions//#include "ob_x.h"