2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/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, ...) DPRINT(__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 // Identifies a Kernel Handle
59 #define KERNEL_HANDLE_FLAG \
60 (1 << ((sizeof(HANDLE) * 8) - 1))
61 #define ObIsKernelHandle(Handle, ProcessorMode) \
62 (((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
63 ((ProcessorMode) == KernelMode))
66 // Converts to and from a Kernel Handle to a normal handle
68 #define ObKernelHandleToHandle(Handle) \
69 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
70 #define ObMarkHandleAsKernelHandle(Handle) \
71 (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
74 // Converts from an EXHANDLE object to a POBJECT_HEADER
76 #define ObpGetHandleObject(x) \
77 ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
80 // Recovers the security descriptor from a cached security descriptor header
82 #define ObpGetHeaderForSd(x) \
83 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor)
86 // Recovers the security descriptor from a cached security descriptor list entry
88 #define ObpGetHeaderForEntry(x) \
89 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link)
92 // Context Structures for Ex*Handle Callbacks
94 typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
96 KPROCESSOR_MODE PreviousMode
;
97 OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information
;
98 } OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT
;
100 typedef struct _OBP_CLOSE_HANDLE_CONTEXT
102 PHANDLE_TABLE HandleTable
;
103 KPROCESSOR_MODE AccessMode
;
104 } OBP_CLOSE_HANDLE_CONTEXT
, *POBP_CLOSE_HANDLE_CONTEXT
;
106 typedef struct _OBP_FIND_HANDLE_DATA
108 POBJECT_HEADER ObjectHeader
;
109 POBJECT_TYPE ObjectType
;
110 POBJECT_HANDLE_INFORMATION HandleInformation
;
111 } OBP_FIND_HANDLE_DATA
, *POBP_FIND_HANDLE_DATA
;
114 // Cached Security Descriptor Header
116 typedef struct _SECURITY_DESCRIPTOR_HEADER
121 QUAD SecurityDescriptor
;
122 } SECURITY_DESCRIPTOR_HEADER
, *PSECURITY_DESCRIPTOR_HEADER
;
125 // Cached Security Descriptor List
127 typedef struct _OB_SD_CACHE_LIST
129 EX_PUSH_LOCK PushLock
;
131 } OB_SD_CACHE_LIST
, *POB_SD_CACHE_LIST
;
134 // Structure for quick-compare of a DOS Device path
138 WCHAR Name
[sizeof(ULARGE_INTEGER
) / sizeof(WCHAR
)];
139 ULARGE_INTEGER Alignment
;
143 // Private Temporary Buffer for Lookup Routines
145 #define TAG_OB_TEMP_STORAGE 'tSbO'
146 typedef struct _OB_TEMP_BUFFER
148 ACCESS_STATE LocalAccessState
;
149 OBJECT_CREATE_INFORMATION ObjectCreateInfo
;
150 OBP_LOOKUP_CONTEXT LookupContext
;
151 AUX_ACCESS_DATA AuxData
;
152 } OB_TEMP_BUFFER
, *POB_TEMP_BUFFER
;
155 // Startup and Shutdown Functions
170 // Directory Namespace Functions
174 ObpDeleteEntryDirectory(
175 IN POBP_LOOKUP_CONTEXT Context
180 ObpInsertEntryDirectory(
181 IN POBJECT_DIRECTORY Parent
,
182 IN POBP_LOOKUP_CONTEXT Context
,
183 IN POBJECT_HEADER ObjectHeader
188 ObpLookupEntryDirectory(
189 IN POBJECT_DIRECTORY Directory
,
190 IN PUNICODE_STRING Name
,
192 IN UCHAR SearchShadow
,
193 IN POBP_LOOKUP_CONTEXT Context
197 // Symbolic Link Functions
201 ObpDeleteSymbolicLink(
207 ObpParseSymbolicLink(
208 IN PVOID ParsedObject
,
210 IN OUT PACCESS_STATE AccessState
,
211 IN KPROCESSOR_MODE AccessMode
,
213 IN OUT PUNICODE_STRING FullPath
,
214 IN OUT PUNICODE_STRING RemainingName
,
215 IN OUT PVOID Context OPTIONAL
,
216 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
217 OUT PVOID
*NextObject
222 ObpCreateSymbolicLinkName(
223 IN POBJECT_SYMBOLIC_LINK SymbolicLink
228 ObpDeleteSymbolicLinkName(
229 IN POBJECT_SYMBOLIC_LINK SymbolicLink
233 // Process/Handle Table Init/Rundown
238 IN PEPROCESS Parent OPTIONAL
,
244 ObReferenceProcessHandleTable(
250 ObDereferenceProcessHandleTable(
261 // Object Lookup Functions
266 IN HANDLE RootHandle
,
267 IN PUNICODE_STRING ObjectName
,
269 IN POBJECT_TYPE ObjectType
,
270 IN KPROCESSOR_MODE AccessMode
,
271 IN OUT PVOID ParseContext
,
272 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos
,
273 IN PVOID InsertObject
,
274 IN PACCESS_STATE AccessState
,
275 IN POBP_LOOKUP_CONTEXT LookupContext
,
276 OUT PVOID
*FoundObject
280 // Object Attribute Functions
284 ObpSetHandleAttributes(
285 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry
,
291 ObQueryDeviceMapInformation(
292 IN PEPROCESS Process
,
293 OUT PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
297 // Object Lifetime Functions
303 IN BOOLEAN CalledFromWorkerThread
308 ObDereferenceObjectEx(
322 ObReferenceObjectSafe(
334 ObpSetPermanentObject(
347 ObClearProcessHandleTable(
354 IN PEPROCESS SourceProcess
,
355 IN HANDLE SourceHandle
,
356 IN PEPROCESS TargetProcess OPTIONAL
,
357 IN PHANDLE TargetHandle OPTIONAL
,
358 IN ACCESS_MASK DesiredAccess
,
359 IN ULONG HandleAttributes
,
361 IN KPROCESSOR_MODE PreviousMode
366 ObFreeObjectCreateInfoBuffer(
367 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
372 ObpFreeObjectNameBuffer(
373 IN PUNICODE_STRING Name
383 // DOS Devices Functions
387 ObDereferenceDeviceMap(
393 ObfDereferenceDeviceMap(
406 ObpCreateDosDevicesDirectory(
411 // Security descriptor cache functions
421 ObpReferenceSecurityDescriptor(
422 IN POBJECT_HEADER ObjectHeader
426 // Object Security Routines
432 IN OUT PACCESS_STATE AccessState
,
434 IN KPROCESSOR_MODE AccessMode
,
435 OUT PNTSTATUS ReturnedStatus
440 ObCheckCreateObjectAccess(
442 IN ACCESS_MASK CreateAccess
,
443 IN PACCESS_STATE AccessState
,
444 IN PUNICODE_STRING ComponentName
,
446 IN KPROCESSOR_MODE AccessMode
,
447 OUT PNTSTATUS AccessStatus
452 ObpCheckTraverseAccess(
454 IN ACCESS_MASK TraverseAccess
,
455 IN PACCESS_STATE AccessState OPTIONAL
,
457 IN KPROCESSOR_MODE AccessMode
,
458 OUT PNTSTATUS AccessStatus
463 ObpCheckObjectReference(
465 IN OUT PACCESS_STATE AccessState
,
467 IN KPROCESSOR_MODE AccessMode
,
468 OUT PNTSTATUS AccessStatus
472 // Default Object Security Callback Routines
476 ObAssignObjectSecurityDescriptor(
478 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
,
479 IN POOL_TYPE PoolType
485 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
490 ObQuerySecurityDescriptorInfo(
492 IN PSECURITY_INFORMATION SecurityInformation
,
493 OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
494 IN OUT PULONG Length
,
495 IN PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
500 ObSetSecurityDescriptorInfo(
502 IN PSECURITY_INFORMATION SecurityInformation
,
503 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
504 IN OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
505 IN POOL_TYPE PoolType
,
506 IN PGENERIC_MAPPING GenericMapping
510 // Executive Fast Referencing Functions
514 ObInitializeFastReference(
515 IN PEX_FAST_REF FastRef
,
522 IN PEX_FAST_REF FastRef
,
528 ObFastReferenceObject(
529 IN PEX_FAST_REF FastRef
534 ObFastReferenceObjectLocked(
535 IN PEX_FAST_REF FastRef
540 ObFastDereferenceObject(
541 IN PEX_FAST_REF FastRef
,
546 // Object Create and Object Name Capture Functions
550 ObpCaptureObjectName(
551 IN PUNICODE_STRING CapturedName
,
552 IN PUNICODE_STRING ObjectName
,
553 IN KPROCESSOR_MODE AccessMode
,
554 IN BOOLEAN AllocateFromLookaside
559 ObpCaptureObjectCreateInformation(
560 IN POBJECT_ATTRIBUTES ObjectAttributes
,
561 IN KPROCESSOR_MODE AccessMode
,
562 IN BOOLEAN AllocateFromLookaside
,
563 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
564 OUT PUNICODE_STRING ObjectName
572 ObGetProcessHandleCount(
577 // Global data inside the Object Manager
579 extern ULONG ObpTraceLevel
;
580 extern KEVENT ObpDefaultObject
;
581 extern KGUARDED_MUTEX ObpDeviceMapLock
;
582 extern POBJECT_TYPE ObpTypeObjectType
;
583 extern POBJECT_TYPE ObSymbolicLinkType
;
584 extern POBJECT_TYPE ObpTypeObjectType
;
585 extern POBJECT_DIRECTORY ObpRootDirectoryObject
;
586 extern POBJECT_DIRECTORY ObpTypeDirectoryObject
;
587 extern PHANDLE_TABLE ObpKernelHandleTable
;
588 extern WORK_QUEUE_ITEM ObpReaperWorkItem
;
589 extern volatile PVOID ObpReaperList
;
590 extern GENERAL_LOOKASIDE ObpNameBufferLookasideList
, ObpCreateInfoLookasideList
;
591 extern BOOLEAN IoCountOperations
;
592 extern ALIGNEDNAME ObpDosDevicesShortNamePrefix
;
593 extern ALIGNEDNAME ObpDosDevicesShortNameRoot
;
594 extern UNICODE_STRING ObpDosDevicesShortName
;