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 // Identifies a Kernel Handle
60 #define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL
62 #define KERNEL_HANDLE_FLAG 0x80000000
64 #define ObpIsKernelHandle(Handle, ProcessorMode) \
65 ((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \
66 ((ProcessorMode) == KernelMode) && \
67 ((Handle) != NtCurrentProcess()) && \
68 ((Handle) != NtCurrentThread()))
71 // Converts to and from a Kernel Handle to a normal handle
73 #define ObKernelHandleToHandle(Handle) \
74 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
75 #define ObMarkHandleAsKernelHandle(Handle) \
76 (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
79 // Converts from an EXHANDLE object to a POBJECT_HEADER
81 #define ObpGetHandleObject(x) \
82 ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
85 // Recovers the security descriptor from a cached security descriptor header
87 #define ObpGetHeaderForSd(x) \
88 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor)
91 // Recovers the security descriptor from a cached security descriptor list entry
93 #define ObpGetHeaderForEntry(x) \
94 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link)
97 // Context Structures for Ex*Handle Callbacks
99 typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
101 KPROCESSOR_MODE PreviousMode
;
102 OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information
;
103 } OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT
;
105 typedef struct _OBP_CLOSE_HANDLE_CONTEXT
107 PHANDLE_TABLE HandleTable
;
108 KPROCESSOR_MODE AccessMode
;
109 } OBP_CLOSE_HANDLE_CONTEXT
, *POBP_CLOSE_HANDLE_CONTEXT
;
111 typedef struct _OBP_FIND_HANDLE_DATA
113 POBJECT_HEADER ObjectHeader
;
114 POBJECT_TYPE ObjectType
;
115 POBJECT_HANDLE_INFORMATION HandleInformation
;
116 } OBP_FIND_HANDLE_DATA
, *POBP_FIND_HANDLE_DATA
;
119 // Cached Security Descriptor Header
121 typedef struct _SECURITY_DESCRIPTOR_HEADER
126 QUAD SecurityDescriptor
;
127 } SECURITY_DESCRIPTOR_HEADER
, *PSECURITY_DESCRIPTOR_HEADER
;
130 // Cached Security Descriptor List
132 typedef struct _OB_SD_CACHE_LIST
134 EX_PUSH_LOCK PushLock
;
136 } OB_SD_CACHE_LIST
, *POB_SD_CACHE_LIST
;
139 // Structure for quick-compare of a DOS Device path
143 WCHAR Name
[sizeof(ULARGE_INTEGER
) / sizeof(WCHAR
)];
144 ULARGE_INTEGER Alignment
;
148 // Private Temporary Buffer for Lookup Routines
150 #define TAG_OB_TEMP_STORAGE 'tSbO'
151 typedef struct _OB_TEMP_BUFFER
153 ACCESS_STATE LocalAccessState
;
154 OBJECT_CREATE_INFORMATION ObjectCreateInfo
;
155 OBP_LOOKUP_CONTEXT LookupContext
;
156 AUX_ACCESS_DATA AuxData
;
157 } OB_TEMP_BUFFER
, *POB_TEMP_BUFFER
;
160 // Startup and Shutdown Functions
175 // Directory Namespace Functions
179 ObpDeleteEntryDirectory(
180 IN POBP_LOOKUP_CONTEXT Context
185 ObpInsertEntryDirectory(
186 IN POBJECT_DIRECTORY Parent
,
187 IN POBP_LOOKUP_CONTEXT Context
,
188 IN POBJECT_HEADER ObjectHeader
193 ObpLookupEntryDirectory(
194 IN POBJECT_DIRECTORY Directory
,
195 IN PUNICODE_STRING Name
,
197 IN UCHAR SearchShadow
,
198 IN POBP_LOOKUP_CONTEXT Context
202 // Symbolic Link Functions
206 ObpDeleteSymbolicLink(
212 ObpParseSymbolicLink(
213 IN PVOID ParsedObject
,
215 IN OUT PACCESS_STATE AccessState
,
216 IN KPROCESSOR_MODE AccessMode
,
218 IN OUT PUNICODE_STRING FullPath
,
219 IN OUT PUNICODE_STRING RemainingName
,
220 IN OUT PVOID Context OPTIONAL
,
221 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
222 OUT PVOID
*NextObject
227 ObpCreateSymbolicLinkName(
228 IN POBJECT_SYMBOLIC_LINK SymbolicLink
233 ObpDeleteSymbolicLinkName(
234 IN POBJECT_SYMBOLIC_LINK SymbolicLink
238 // Process/Handle Table Init/Rundown
243 IN PEPROCESS Parent OPTIONAL
,
249 ObReferenceProcessHandleTable(
255 ObDereferenceProcessHandleTable(
266 // Object Lookup Functions
271 IN HANDLE RootHandle OPTIONAL
,
272 IN OUT PUNICODE_STRING ObjectName
,
274 IN POBJECT_TYPE ObjectType
,
275 IN KPROCESSOR_MODE AccessMode
,
276 IN OUT PVOID ParseContext
,
277 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
278 IN PVOID InsertObject OPTIONAL
,
279 IN OUT PACCESS_STATE AccessState
,
280 OUT POBP_LOOKUP_CONTEXT LookupContext
,
281 OUT PVOID
*FoundObject
285 // Object Attribute Functions
289 ObpSetHandleAttributes(
290 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry
,
296 ObQueryDeviceMapInformation(
297 IN PEPROCESS Process
,
298 OUT PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
302 // Object Lifetime Functions
308 IN BOOLEAN CalledFromWorkerThread
313 ObDereferenceObjectEx(
327 ObReferenceObjectSafe(
339 ObpSetPermanentObject(
352 ObClearProcessHandleTable(
359 IN PEPROCESS SourceProcess
,
360 IN HANDLE SourceHandle
,
361 IN PEPROCESS TargetProcess OPTIONAL
,
362 IN PHANDLE TargetHandle OPTIONAL
,
363 IN ACCESS_MASK DesiredAccess
,
364 IN ULONG HandleAttributes
,
366 IN KPROCESSOR_MODE PreviousMode
371 ObFreeObjectCreateInfoBuffer(
372 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
377 ObpFreeObjectNameBuffer(
378 IN PUNICODE_STRING Name
389 ObReferenceFileObjectForWrite(
391 IN KPROCESSOR_MODE AccessMode
,
392 OUT PFILE_OBJECT
*FileObject
,
393 OUT POBJECT_HANDLE_INFORMATION HandleInformation
397 // DOS Devices Functions
402 IN HANDLE DirectoryHandle
407 ObDereferenceDeviceMap(
413 ObfDereferenceDeviceMap(
414 IN PDEVICE_MAP DeviceMap
426 ObpCreateDosDevicesDirectory(
431 // Security descriptor cache functions
441 ObpReferenceSecurityDescriptor(
442 IN POBJECT_HEADER ObjectHeader
446 // Object Security Routines
452 IN OUT PACCESS_STATE AccessState
,
454 IN KPROCESSOR_MODE AccessMode
,
455 OUT PNTSTATUS ReturnedStatus
460 ObCheckCreateObjectAccess(
462 IN ACCESS_MASK CreateAccess
,
463 IN PACCESS_STATE AccessState
,
464 IN PUNICODE_STRING ComponentName
,
466 IN KPROCESSOR_MODE AccessMode
,
467 OUT PNTSTATUS AccessStatus
472 ObpCheckTraverseAccess(
474 IN ACCESS_MASK TraverseAccess
,
475 IN PACCESS_STATE AccessState OPTIONAL
,
477 IN KPROCESSOR_MODE AccessMode
,
478 OUT PNTSTATUS AccessStatus
483 ObpCheckObjectReference(
485 IN OUT PACCESS_STATE AccessState
,
487 IN KPROCESSOR_MODE AccessMode
,
488 OUT PNTSTATUS AccessStatus
492 // Default Object Security Callback Routines
496 ObAssignObjectSecurityDescriptor(
498 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
,
499 IN POOL_TYPE PoolType
505 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
510 ObQuerySecurityDescriptorInfo(
512 IN PSECURITY_INFORMATION SecurityInformation
,
513 OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
514 IN OUT PULONG Length
,
515 IN PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
520 ObSetSecurityDescriptorInfo(
522 IN PSECURITY_INFORMATION SecurityInformation
,
523 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
524 IN OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
525 IN POOL_TYPE PoolType
,
526 IN PGENERIC_MAPPING GenericMapping
530 // Executive Fast Referencing Functions
534 ObInitializeFastReference(
535 IN PEX_FAST_REF FastRef
,
542 IN PEX_FAST_REF FastRef
,
548 ObFastReferenceObject(
549 IN PEX_FAST_REF FastRef
554 ObFastReferenceObjectLocked(
555 IN PEX_FAST_REF FastRef
560 ObFastDereferenceObject(
561 IN PEX_FAST_REF FastRef
,
566 // Object Create and Object Name Capture Functions
570 ObpCaptureObjectName(
571 IN PUNICODE_STRING CapturedName
,
572 IN PUNICODE_STRING ObjectName
,
573 IN KPROCESSOR_MODE AccessMode
,
574 IN BOOLEAN AllocateFromLookaside
579 ObpCaptureObjectCreateInformation(
580 IN POBJECT_ATTRIBUTES ObjectAttributes
,
581 IN KPROCESSOR_MODE AccessMode
,
582 IN KPROCESSOR_MODE CreatorMode
,
583 IN BOOLEAN AllocateFromLookaside
,
584 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
585 OUT PUNICODE_STRING ObjectName
593 ObGetProcessHandleCount(
598 // Global data inside the Object Manager
600 extern ULONG ObpTraceLevel
;
601 extern KEVENT ObpDefaultObject
;
602 extern KGUARDED_MUTEX ObpDeviceMapLock
;
603 extern POBJECT_TYPE ObpTypeObjectType
;
604 extern POBJECT_TYPE ObpDirectoryObjectType
;
605 extern POBJECT_TYPE ObpSymbolicLinkObjectType
;
606 extern POBJECT_DIRECTORY ObpRootDirectoryObject
;
607 extern POBJECT_DIRECTORY ObpTypeDirectoryObject
;
608 extern PHANDLE_TABLE ObpKernelHandleTable
;
609 extern WORK_QUEUE_ITEM ObpReaperWorkItem
;
610 extern volatile PVOID ObpReaperList
;
611 extern GENERAL_LOOKASIDE ObpNameBufferLookasideList
, ObpCreateInfoLookasideList
;
612 extern BOOLEAN IoCountOperations
;
613 extern ALIGNEDNAME ObpDosDevicesShortNamePrefix
;
614 extern ALIGNEDNAME ObpDosDevicesShortNameRoot
;
615 extern UNICODE_STRING ObpDosDevicesShortName
;