2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/internal/ob.h
5 * PURPOSE: Internal header for the Object Manager
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
10 // Define this if you want debugging support
12 #define _OB_DEBUG_ 0x00
15 // These define the Debug Masks Supported
17 #define OB_HANDLE_DEBUG 0x01
18 #define OB_NAMESPACE_DEBUG 0x02
19 #define OB_SECURITY_DEBUG 0x04
20 #define OB_REFERENCE_DEBUG 0x08
21 #define OB_CALLBACK_DEBUG 0x10
24 // Debug/Tracing support
27 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
28 #define OBTRACE DbgPrintEx
30 #define OBTRACE(x, ...) \
31 if (x & ObpTraceLevel) DbgPrint(__VA_ARGS__)
34 #define OBTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
38 // Mask to detect GENERIC_XXX access masks being used
40 #define GENERIC_ACCESS \
49 #define OBJ_PROTECT_CLOSE 0x01
50 //#define OBJ_INHERIT 0x02
51 #define OBJ_AUDIT_OBJECT_CLOSE 0x04
52 #define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE |\
54 OBJ_AUDIT_OBJECT_CLOSE)
57 // Handle Access Protection Close Flag
59 #define ObpAccessProtectCloseBit 0x02000000L
62 // System Process Quota Block
64 #define OBP_SYSTEM_PROCESS_QUOTA ((PEPROCESS_QUOTA_BLOCK)(ULONG_PTR)1)
67 // Identifies a Kernel Handle
70 #define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL
72 #define KERNEL_HANDLE_FLAG 0x80000000
74 #define ObpIsKernelHandle(Handle, ProcessorMode) \
75 ((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \
76 ((ProcessorMode) == KernelMode) && \
77 ((Handle) != NtCurrentProcess()) && \
78 ((Handle) != NtCurrentThread()))
81 // Converts to and from a Kernel Handle to a normal handle
83 #define ObKernelHandleToHandle(Handle) \
84 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
85 #define ObMarkHandleAsKernelHandle(Handle) \
86 (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
89 // Converts from an EXHANDLE object to a POBJECT_HEADER
91 #define ObpGetHandleObject(x) \
92 ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
95 // Recovers the security descriptor from a cached security descriptor header
97 #define ObpGetHeaderForSd(x) \
98 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor)
101 // Recovers the security descriptor from a cached security descriptor list entry
103 #define ObpGetHeaderForEntry(x) \
104 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link)
107 // Context Structures for Ex*Handle Callbacks
109 typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
111 KPROCESSOR_MODE PreviousMode
;
112 OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information
;
113 } OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT
;
115 typedef struct _OBP_CLOSE_HANDLE_CONTEXT
117 PHANDLE_TABLE HandleTable
;
118 KPROCESSOR_MODE AccessMode
;
119 } OBP_CLOSE_HANDLE_CONTEXT
, *POBP_CLOSE_HANDLE_CONTEXT
;
121 typedef struct _OBP_FIND_HANDLE_DATA
123 POBJECT_HEADER ObjectHeader
;
124 POBJECT_TYPE ObjectType
;
125 POBJECT_HANDLE_INFORMATION HandleInformation
;
126 } OBP_FIND_HANDLE_DATA
, *POBP_FIND_HANDLE_DATA
;
129 // Cached Security Descriptor Header
131 typedef struct _SECURITY_DESCRIPTOR_HEADER
136 QUAD SecurityDescriptor
;
137 } SECURITY_DESCRIPTOR_HEADER
, *PSECURITY_DESCRIPTOR_HEADER
;
140 // Cached Security Descriptor List
142 typedef struct _OB_SD_CACHE_LIST
144 EX_PUSH_LOCK PushLock
;
146 } OB_SD_CACHE_LIST
, *POB_SD_CACHE_LIST
;
149 // Structure for quick-compare of a DOS Device path
153 WCHAR Name
[sizeof(ULARGE_INTEGER
) / sizeof(WCHAR
)];
154 ULARGE_INTEGER Alignment
;
158 // Private Temporary Buffer for Lookup Routines
160 #define TAG_OB_TEMP_STORAGE 'tSbO'
161 typedef struct _OB_TEMP_BUFFER
163 ACCESS_STATE LocalAccessState
;
164 OBJECT_CREATE_INFORMATION ObjectCreateInfo
;
165 OBP_LOOKUP_CONTEXT LookupContext
;
166 AUX_ACCESS_DATA AuxData
;
167 } OB_TEMP_BUFFER
, *POB_TEMP_BUFFER
;
170 // Startup and Shutdown Functions
186 // Directory Namespace Functions
190 ObpDeleteEntryDirectory(
191 IN POBP_LOOKUP_CONTEXT Context
196 ObpInsertEntryDirectory(
197 IN POBJECT_DIRECTORY Parent
,
198 IN POBP_LOOKUP_CONTEXT Context
,
199 IN POBJECT_HEADER ObjectHeader
204 ObpLookupEntryDirectory(
205 IN POBJECT_DIRECTORY Directory
,
206 IN PUNICODE_STRING Name
,
208 IN UCHAR SearchShadow
,
209 IN POBP_LOOKUP_CONTEXT Context
213 // Symbolic Link Functions
217 ObpDeleteSymbolicLink(
223 ObpParseSymbolicLink(
224 IN PVOID ParsedObject
,
226 IN OUT PACCESS_STATE AccessState
,
227 IN KPROCESSOR_MODE AccessMode
,
229 IN OUT PUNICODE_STRING FullPath
,
230 IN OUT PUNICODE_STRING RemainingName
,
231 IN OUT PVOID Context OPTIONAL
,
232 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
233 OUT PVOID
*NextObject
238 ObpCreateSymbolicLinkName(
239 IN POBJECT_SYMBOLIC_LINK SymbolicLink
244 ObpDeleteSymbolicLinkName(
245 IN POBJECT_SYMBOLIC_LINK SymbolicLink
249 // Process/Handle Table Init/Rundown
254 IN PEPROCESS Parent OPTIONAL
,
260 ObReferenceProcessHandleTable(
266 ObDereferenceProcessHandleTable(
277 // Object Lookup Functions
282 IN HANDLE RootHandle OPTIONAL
,
283 IN OUT PUNICODE_STRING ObjectName
,
285 IN POBJECT_TYPE ObjectType
,
286 IN KPROCESSOR_MODE AccessMode
,
287 IN OUT PVOID ParseContext
,
288 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
289 IN PVOID InsertObject OPTIONAL
,
290 IN OUT PACCESS_STATE AccessState
,
291 OUT POBP_LOOKUP_CONTEXT LookupContext
,
292 OUT PVOID
*FoundObject
296 // Object Attribute Functions
300 ObpSetHandleAttributes(
301 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry
,
307 ObQueryDeviceMapInformation(
308 _In_opt_ PEPROCESS Process
,
309 _Out_ PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
,
314 // Object Lifetime Functions
320 IN BOOLEAN CalledFromWorkerThread
325 ObDereferenceObjectEx(
339 ObReferenceObjectSafe(
351 ObpSetPermanentObject(
364 ObClearProcessHandleTable(
371 IN PEPROCESS SourceProcess
,
372 IN HANDLE SourceHandle
,
373 IN PEPROCESS TargetProcess OPTIONAL
,
374 IN PHANDLE TargetHandle OPTIONAL
,
375 IN ACCESS_MASK DesiredAccess
,
376 IN ULONG HandleAttributes
,
378 IN KPROCESSOR_MODE PreviousMode
383 ObFreeObjectCreateInfoBuffer(
384 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
389 ObpFreeObjectNameBuffer(
390 IN PUNICODE_STRING Name
401 ObReferenceFileObjectForWrite(
403 IN KPROCESSOR_MODE AccessMode
,
404 OUT PFILE_OBJECT
*FileObject
,
405 OUT POBJECT_HANDLE_INFORMATION HandleInformation
409 // DOS Devices Functions
414 IN PEPROCESS Process
,
415 IN HANDLE DirectoryHandle
420 ObSetDirectoryDeviceMap(OUT PDEVICE_MAP
* DeviceMap
,
421 IN HANDLE DirectoryHandle
426 ObDereferenceDeviceMap(
432 ObfDereferenceDeviceMap(
433 IN PDEVICE_MAP DeviceMap
446 ObpCreateDosDevicesDirectory(
452 ObIsLUIDDeviceMapsEnabled(
458 ObpReferenceDeviceMap(
463 // Security descriptor cache functions
474 ObpReferenceSecurityDescriptor(
475 IN POBJECT_HEADER ObjectHeader
479 // Object Security Routines
485 IN OUT PACCESS_STATE AccessState
,
487 IN KPROCESSOR_MODE AccessMode
,
488 OUT PNTSTATUS ReturnedStatus
493 ObCheckCreateObjectAccess(
495 IN ACCESS_MASK CreateAccess
,
496 IN PACCESS_STATE AccessState
,
497 IN PUNICODE_STRING ComponentName
,
499 IN KPROCESSOR_MODE AccessMode
,
500 OUT PNTSTATUS AccessStatus
505 ObpCheckTraverseAccess(
507 IN ACCESS_MASK TraverseAccess
,
508 IN PACCESS_STATE AccessState OPTIONAL
,
510 IN KPROCESSOR_MODE AccessMode
,
511 OUT PNTSTATUS AccessStatus
516 ObpCheckObjectReference(
518 IN OUT PACCESS_STATE AccessState
,
520 IN KPROCESSOR_MODE AccessMode
,
521 OUT PNTSTATUS AccessStatus
525 // Default Object Security Callback Routines
529 ObAssignObjectSecurityDescriptor(
531 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
,
532 IN POOL_TYPE PoolType
538 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
543 ObQuerySecurityDescriptorInfo(
545 IN PSECURITY_INFORMATION SecurityInformation
,
546 OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
547 IN OUT PULONG Length
,
548 IN PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
553 ObSetSecurityDescriptorInfo(
555 IN PSECURITY_INFORMATION SecurityInformation
,
556 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
557 IN OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
558 IN POOL_TYPE PoolType
,
559 IN PGENERIC_MAPPING GenericMapping
563 // Executive Fast Referencing Functions
567 ObInitializeFastReference(
568 IN PEX_FAST_REF FastRef
,
575 IN PEX_FAST_REF FastRef
,
581 ObFastReferenceObject(
582 IN PEX_FAST_REF FastRef
587 ObFastReferenceObjectLocked(
588 IN PEX_FAST_REF FastRef
593 ObFastDereferenceObject(
594 IN PEX_FAST_REF FastRef
,
599 // Object Create and Object Name Capture Functions
603 ObpCaptureObjectName(
604 IN PUNICODE_STRING CapturedName
,
605 IN PUNICODE_STRING ObjectName
,
606 IN KPROCESSOR_MODE AccessMode
,
607 IN BOOLEAN AllocateFromLookaside
612 ObpCaptureObjectCreateInformation(
613 IN POBJECT_ATTRIBUTES ObjectAttributes
,
614 IN KPROCESSOR_MODE AccessMode
,
615 IN KPROCESSOR_MODE CreatorMode
,
616 IN BOOLEAN AllocateFromLookaside
,
617 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
618 OUT PUNICODE_STRING ObjectName
626 ObGetProcessHandleCount(
631 // Global data inside the Object Manager
633 extern ULONG ObpTraceLevel
;
634 extern KEVENT ObpDefaultObject
;
635 extern KGUARDED_MUTEX ObpDeviceMapLock
;
636 extern POBJECT_TYPE ObpTypeObjectType
;
637 extern POBJECT_TYPE ObpDirectoryObjectType
;
638 extern POBJECT_TYPE ObpSymbolicLinkObjectType
;
639 extern POBJECT_DIRECTORY ObpRootDirectoryObject
;
640 extern POBJECT_DIRECTORY ObpTypeDirectoryObject
;
641 extern PHANDLE_TABLE ObpKernelHandleTable
;
642 extern WORK_QUEUE_ITEM ObpReaperWorkItem
;
643 extern volatile PVOID ObpReaperList
;
644 extern GENERAL_LOOKASIDE ObpNameBufferLookasideList
, ObpCreateInfoLookasideList
;
645 extern BOOLEAN IoCountOperations
;
646 extern ALIGNEDNAME ObpDosDevicesShortNamePrefix
;
647 extern ALIGNEDNAME ObpDosDevicesShortNameRoot
;
648 extern UNICODE_STRING ObpDosDevicesShortName
;
649 extern WCHAR ObpUnsecureGlobalNamesBuffer
[128];
650 extern ULONG ObpUnsecureGlobalNamesLength
;
651 extern ULONG ObpObjectSecurityMode
;
652 extern ULONG ObpProtectionMode
;
653 extern ULONG ObpLUIDDeviceMapsDisabled
;
654 extern ULONG ObpLUIDDeviceMapsEnabled
;