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, 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 ObIsKernelHandle(Handle, ProcessorMode) \
65 (((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
66 ((ProcessorMode) == KernelMode))
69 // Converts to and from a Kernel Handle to a normal handle
71 #define ObKernelHandleToHandle(Handle) \
72 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
73 #define ObMarkHandleAsKernelHandle(Handle) \
74 (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
77 // Converts from an EXHANDLE object to a POBJECT_HEADER
79 #define ObpGetHandleObject(x) \
80 ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
83 // Recovers the security descriptor from a cached security descriptor header
85 #define ObpGetHeaderForSd(x) \
86 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor)
89 // Recovers the security descriptor from a cached security descriptor list entry
91 #define ObpGetHeaderForEntry(x) \
92 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link)
95 // Context Structures for Ex*Handle Callbacks
97 typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
99 KPROCESSOR_MODE PreviousMode
;
100 OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information
;
101 } OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT
;
103 typedef struct _OBP_CLOSE_HANDLE_CONTEXT
105 PHANDLE_TABLE HandleTable
;
106 KPROCESSOR_MODE AccessMode
;
107 } OBP_CLOSE_HANDLE_CONTEXT
, *POBP_CLOSE_HANDLE_CONTEXT
;
109 typedef struct _OBP_FIND_HANDLE_DATA
111 POBJECT_HEADER ObjectHeader
;
112 POBJECT_TYPE ObjectType
;
113 POBJECT_HANDLE_INFORMATION HandleInformation
;
114 } OBP_FIND_HANDLE_DATA
, *POBP_FIND_HANDLE_DATA
;
117 // Cached Security Descriptor Header
119 typedef struct _SECURITY_DESCRIPTOR_HEADER
124 QUAD SecurityDescriptor
;
125 } SECURITY_DESCRIPTOR_HEADER
, *PSECURITY_DESCRIPTOR_HEADER
;
128 // Cached Security Descriptor List
130 typedef struct _OB_SD_CACHE_LIST
132 EX_PUSH_LOCK PushLock
;
134 } OB_SD_CACHE_LIST
, *POB_SD_CACHE_LIST
;
137 // Structure for quick-compare of a DOS Device path
141 WCHAR Name
[sizeof(ULARGE_INTEGER
) / sizeof(WCHAR
)];
142 ULARGE_INTEGER Alignment
;
146 // Private Temporary Buffer for Lookup Routines
148 #define TAG_OB_TEMP_STORAGE 'tSbO'
149 typedef struct _OB_TEMP_BUFFER
151 ACCESS_STATE LocalAccessState
;
152 OBJECT_CREATE_INFORMATION ObjectCreateInfo
;
153 OBP_LOOKUP_CONTEXT LookupContext
;
154 AUX_ACCESS_DATA AuxData
;
155 } OB_TEMP_BUFFER
, *POB_TEMP_BUFFER
;
158 // Startup and Shutdown Functions
173 // Directory Namespace Functions
177 ObpDeleteEntryDirectory(
178 IN POBP_LOOKUP_CONTEXT Context
183 ObpInsertEntryDirectory(
184 IN POBJECT_DIRECTORY Parent
,
185 IN POBP_LOOKUP_CONTEXT Context
,
186 IN POBJECT_HEADER ObjectHeader
191 ObpLookupEntryDirectory(
192 IN POBJECT_DIRECTORY Directory
,
193 IN PUNICODE_STRING Name
,
195 IN UCHAR SearchShadow
,
196 IN POBP_LOOKUP_CONTEXT Context
200 // Symbolic Link Functions
204 ObpDeleteSymbolicLink(
210 ObpParseSymbolicLink(
211 IN PVOID ParsedObject
,
213 IN OUT PACCESS_STATE AccessState
,
214 IN KPROCESSOR_MODE AccessMode
,
216 IN OUT PUNICODE_STRING FullPath
,
217 IN OUT PUNICODE_STRING RemainingName
,
218 IN OUT PVOID Context OPTIONAL
,
219 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
220 OUT PVOID
*NextObject
225 ObpCreateSymbolicLinkName(
226 IN POBJECT_SYMBOLIC_LINK SymbolicLink
231 ObpDeleteSymbolicLinkName(
232 IN POBJECT_SYMBOLIC_LINK SymbolicLink
236 // Process/Handle Table Init/Rundown
241 IN PEPROCESS Parent OPTIONAL
,
247 ObReferenceProcessHandleTable(
253 ObDereferenceProcessHandleTable(
264 // Object Lookup Functions
269 IN HANDLE RootHandle
,
270 IN PUNICODE_STRING ObjectName
,
272 IN POBJECT_TYPE ObjectType
,
273 IN KPROCESSOR_MODE AccessMode
,
274 IN OUT PVOID ParseContext
,
275 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos
,
276 IN PVOID InsertObject
,
277 IN PACCESS_STATE AccessState
,
278 IN POBP_LOOKUP_CONTEXT LookupContext
,
279 OUT PVOID
*FoundObject
283 // Object Attribute Functions
287 ObpSetHandleAttributes(
288 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry
,
294 ObQueryDeviceMapInformation(
295 IN PEPROCESS Process
,
296 OUT PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
300 // Object Lifetime Functions
306 IN BOOLEAN CalledFromWorkerThread
311 ObDereferenceObjectEx(
325 ObReferenceObjectSafe(
337 ObpSetPermanentObject(
350 ObClearProcessHandleTable(
357 IN PEPROCESS SourceProcess
,
358 IN HANDLE SourceHandle
,
359 IN PEPROCESS TargetProcess OPTIONAL
,
360 IN PHANDLE TargetHandle OPTIONAL
,
361 IN ACCESS_MASK DesiredAccess
,
362 IN ULONG HandleAttributes
,
364 IN KPROCESSOR_MODE PreviousMode
369 ObFreeObjectCreateInfoBuffer(
370 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
375 ObpFreeObjectNameBuffer(
376 IN PUNICODE_STRING Name
386 // DOS Devices Functions
390 ObDereferenceDeviceMap(
396 ObfDereferenceDeviceMap(
409 ObpCreateDosDevicesDirectory(
414 // Security descriptor cache functions
424 ObpReferenceSecurityDescriptor(
425 IN POBJECT_HEADER ObjectHeader
429 // Object Security Routines
435 IN OUT PACCESS_STATE AccessState
,
437 IN KPROCESSOR_MODE AccessMode
,
438 OUT PNTSTATUS ReturnedStatus
443 ObCheckCreateObjectAccess(
445 IN ACCESS_MASK CreateAccess
,
446 IN PACCESS_STATE AccessState
,
447 IN PUNICODE_STRING ComponentName
,
449 IN KPROCESSOR_MODE AccessMode
,
450 OUT PNTSTATUS AccessStatus
455 ObpCheckTraverseAccess(
457 IN ACCESS_MASK TraverseAccess
,
458 IN PACCESS_STATE AccessState OPTIONAL
,
460 IN KPROCESSOR_MODE AccessMode
,
461 OUT PNTSTATUS AccessStatus
466 ObpCheckObjectReference(
468 IN OUT PACCESS_STATE AccessState
,
470 IN KPROCESSOR_MODE AccessMode
,
471 OUT PNTSTATUS AccessStatus
475 // Default Object Security Callback Routines
479 ObAssignObjectSecurityDescriptor(
481 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
,
482 IN POOL_TYPE PoolType
488 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
493 ObQuerySecurityDescriptorInfo(
495 IN PSECURITY_INFORMATION SecurityInformation
,
496 OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
497 IN OUT PULONG Length
,
498 IN PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
503 ObSetSecurityDescriptorInfo(
505 IN PSECURITY_INFORMATION SecurityInformation
,
506 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
507 IN OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
508 IN POOL_TYPE PoolType
,
509 IN PGENERIC_MAPPING GenericMapping
513 // Executive Fast Referencing Functions
517 ObInitializeFastReference(
518 IN PEX_FAST_REF FastRef
,
525 IN PEX_FAST_REF FastRef
,
531 ObFastReferenceObject(
532 IN PEX_FAST_REF FastRef
537 ObFastReferenceObjectLocked(
538 IN PEX_FAST_REF FastRef
543 ObFastDereferenceObject(
544 IN PEX_FAST_REF FastRef
,
549 // Object Create and Object Name Capture Functions
553 ObpCaptureObjectName(
554 IN PUNICODE_STRING CapturedName
,
555 IN PUNICODE_STRING ObjectName
,
556 IN KPROCESSOR_MODE AccessMode
,
557 IN BOOLEAN AllocateFromLookaside
562 ObpCaptureObjectCreateInformation(
563 IN POBJECT_ATTRIBUTES ObjectAttributes
,
564 IN KPROCESSOR_MODE AccessMode
,
565 IN KPROCESSOR_MODE CreatorMode
,
566 IN BOOLEAN AllocateFromLookaside
,
567 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
568 OUT PUNICODE_STRING ObjectName
576 ObGetProcessHandleCount(
581 // Global data inside the Object Manager
583 extern ULONG ObpTraceLevel
;
584 extern KEVENT ObpDefaultObject
;
585 extern KGUARDED_MUTEX ObpDeviceMapLock
;
586 extern POBJECT_TYPE ObpTypeObjectType
;
587 extern POBJECT_TYPE ObSymbolicLinkType
;
588 extern POBJECT_TYPE ObpTypeObjectType
;
589 extern POBJECT_DIRECTORY ObpRootDirectoryObject
;
590 extern POBJECT_DIRECTORY ObpTypeDirectoryObject
;
591 extern PHANDLE_TABLE ObpKernelHandleTable
;
592 extern WORK_QUEUE_ITEM ObpReaperWorkItem
;
593 extern volatile PVOID ObpReaperList
;
594 extern GENERAL_LOOKASIDE ObpNameBufferLookasideList
, ObpCreateInfoLookasideList
;
595 extern BOOLEAN IoCountOperations
;
596 extern ALIGNEDNAME ObpDosDevicesShortNamePrefix
;
597 extern ALIGNEDNAME ObpDosDevicesShortNameRoot
;
598 extern UNICODE_STRING ObpDosDevicesShortName
;