Reactos
1/*
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)
7*/
8
9//
10// Define this if you want debugging support
11//
12#define _OB_DEBUG_ 0x00
13
14//
15// These define the Debug Masks Supported
16//
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
22
23//
24// Debug/Tracing support
25//
26#if _OB_DEBUG_
27#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
28#define OBTRACE DbgPrintEx
29#else
30#define OBTRACE(x, ...) \
31 if (x & ObpTraceLevel) DbgPrint(__VA_ARGS__)
32#endif
33#else
34#define OBTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
35#endif
36
37//
38// Mask to detect GENERIC_XXX access masks being used
39//
40#define GENERIC_ACCESS \
41 (GENERIC_READ | \
42 GENERIC_WRITE | \
43 GENERIC_EXECUTE | \
44 GENERIC_ALL)
45
46//
47// Handle Bit Flags
48//
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 |\
53 OBJ_INHERIT | \
54 OBJ_AUDIT_OBJECT_CLOSE)
55
56//
57// Handle Access Protection Close Flag
58//
59#define ObpAccessProtectCloseBit 0x02000000L
60
61//
62// System Process Quota Block
63//
64#define OBP_SYSTEM_PROCESS_QUOTA ((PEPROCESS_QUOTA_BLOCK)(ULONG_PTR)1)
65
66//
67// Identifies a Kernel Handle
68//
69#ifdef _WIN64
70#define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL
71#else
72#define KERNEL_HANDLE_FLAG 0x80000000
73#endif
74#define ObpIsKernelHandle(Handle, ProcessorMode) \
75 ((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \
76 ((ProcessorMode) == KernelMode) && \
77 ((Handle) != NtCurrentProcess()) && \
78 ((Handle) != NtCurrentThread()))
79
80//
81// Converts to and from a Kernel Handle to a normal handle
82//
83#define ObKernelHandleToHandle(Handle) \
84 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
85#define ObMarkHandleAsKernelHandle(Handle) \
86 (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
87
88//
89// Converts from an EXHANDLE object to a POBJECT_HEADER
90//
91#define ObpGetHandleObject(x) \
92 ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
93
94//
95// Recovers the security descriptor from a cached security descriptor header
96//
97#define ObpGetHeaderForSd(x) \
98 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor)
99
100//
101// Recovers the security descriptor from a cached security descriptor list entry
102//
103#define ObpGetHeaderForEntry(x) \
104 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link)
105
106//
107// Context Structures for Ex*Handle Callbacks
108//
109typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
110{
111 KPROCESSOR_MODE PreviousMode;
112 OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information;
113} OBP_SET_HANDLE_ATTRIBUTES_CONTEXT, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT;
114
115typedef struct _OBP_CLOSE_HANDLE_CONTEXT
116{
117 PHANDLE_TABLE HandleTable;
118 KPROCESSOR_MODE AccessMode;
119} OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT;
120
121typedef struct _OBP_FIND_HANDLE_DATA
122{
123 POBJECT_HEADER ObjectHeader;
124 POBJECT_TYPE ObjectType;
125 POBJECT_HANDLE_INFORMATION HandleInformation;
126} OBP_FIND_HANDLE_DATA, *POBP_FIND_HANDLE_DATA;
127
128//
129// Cached Security Descriptor Header
130//
131typedef struct _SECURITY_DESCRIPTOR_HEADER
132{
133 LIST_ENTRY Link;
134 ULONG RefCount;
135 ULONG FullHash;
136 QUAD SecurityDescriptor;
137} SECURITY_DESCRIPTOR_HEADER, *PSECURITY_DESCRIPTOR_HEADER;
138
139//
140// Cached Security Descriptor List
141//
142typedef struct _OB_SD_CACHE_LIST
143{
144 EX_PUSH_LOCK PushLock;
145 LIST_ENTRY Head;
146} OB_SD_CACHE_LIST, *POB_SD_CACHE_LIST;
147
148//
149// Structure for quick-compare of a DOS Device path
150//
151typedef union
152{
153 WCHAR Name[sizeof(ULARGE_INTEGER) / sizeof(WCHAR)];
154 ULARGE_INTEGER Alignment;
155} ALIGNEDNAME;
156
157//
158// Private Temporary Buffer for Lookup Routines
159//
160#define TAG_OB_TEMP_STORAGE 'tSbO'
161typedef struct _OB_TEMP_BUFFER
162{
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;
168
169//
170// Startup and Shutdown Functions
171//
172CODE_SEG("INIT")
173BOOLEAN
174NTAPI
175ObInitSystem(
176 VOID
177);
178
179VOID
180NTAPI
181ObShutdownSystem(
182 VOID
183);
184
185//
186// Directory Namespace Functions
187//
188BOOLEAN
189NTAPI
190ObpDeleteEntryDirectory(
191 IN POBP_LOOKUP_CONTEXT Context
192);
193
194BOOLEAN
195NTAPI
196ObpInsertEntryDirectory(
197 IN POBJECT_DIRECTORY Parent,
198 IN POBP_LOOKUP_CONTEXT Context,
199 IN POBJECT_HEADER ObjectHeader
200);
201
202PVOID
203NTAPI
204ObpLookupEntryDirectory(
205 IN POBJECT_DIRECTORY Directory,
206 IN PUNICODE_STRING Name,
207 IN ULONG Attributes,
208 IN BOOLEAN SearchShadow,
209 IN POBP_LOOKUP_CONTEXT Context
210);
211
212//
213// Symbolic Link Functions
214//
215VOID
216NTAPI
217ObpDeleteSymbolicLink(
218 IN PVOID ObjectBody
219);
220
221NTSTATUS
222NTAPI
223ObpParseSymbolicLink(
224 IN PVOID ParsedObject,
225 IN PVOID ObjectType,
226 IN OUT PACCESS_STATE AccessState,
227 IN KPROCESSOR_MODE AccessMode,
228 IN ULONG Attributes,
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
234);
235
236VOID
237NTAPI
238ObpCreateSymbolicLinkName(
239 IN POBJECT_SYMBOLIC_LINK SymbolicLink
240);
241
242VOID
243NTAPI
244ObpDeleteSymbolicLinkName(
245 IN POBJECT_SYMBOLIC_LINK SymbolicLink
246);
247
248//
249// Process/Handle Table Init/Rundown
250//
251NTSTATUS
252NTAPI
253ObInitProcess(
254 IN PEPROCESS Parent OPTIONAL,
255 IN PEPROCESS Process
256);
257
258PHANDLE_TABLE
259NTAPI
260ObReferenceProcessHandleTable(
261 IN PEPROCESS Process
262);
263
264VOID
265NTAPI
266ObDereferenceProcessHandleTable(
267 IN PEPROCESS Process
268);
269
270VOID
271NTAPI
272ObKillProcess(
273 IN PEPROCESS Process
274);
275
276//
277// Object Lookup Functions
278//
279NTSTATUS
280NTAPI
281ObpLookupObjectName(
282 IN HANDLE RootHandle OPTIONAL,
283 IN OUT PUNICODE_STRING ObjectName,
284 IN ULONG Attributes,
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
293);
294
295//
296// Object Attribute Functions
297//
298BOOLEAN
299NTAPI
300ObpSetHandleAttributes(
301 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry,
302 IN ULONG_PTR Context
303);
304
305NTSTATUS
306NTAPI
307ObQueryDeviceMapInformation(
308 _In_opt_ PEPROCESS Process,
309 _Out_ PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo,
310 _In_ ULONG Flags
311);
312
313//
314// Object Lifetime Functions
315//
316VOID
317NTAPI
318ObpDeleteObject(
319 IN PVOID Object,
320 IN BOOLEAN CalledFromWorkerThread
321);
322
323LONG
324FASTCALL
325ObDereferenceObjectEx(
326 IN PVOID Object,
327 IN LONG Count
328);
329
330LONG
331FASTCALL
332ObReferenceObjectEx(
333 IN PVOID Object,
334 IN LONG Count
335);
336
337BOOLEAN
338FASTCALL
339ObReferenceObjectSafe(
340 IN PVOID Object
341);
342
343VOID
344NTAPI
345ObpReapObject(
346 IN PVOID Unused
347);
348
349VOID
350FASTCALL
351ObpSetPermanentObject(
352 IN PVOID ObjectBody,
353 IN BOOLEAN Permanent
354);
355
356VOID
357NTAPI
358ObpDeleteNameCheck(
359 IN PVOID Object
360);
361
362VOID
363NTAPI
364ObClearProcessHandleTable(
365 IN PEPROCESS Process
366);
367
368NTSTATUS
369NTAPI
370ObDuplicateObject(
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,
377 IN ULONG Options,
378 IN KPROCESSOR_MODE PreviousMode
379);
380
381VOID
382NTAPI
383ObFreeObjectCreateInfoBuffer(
384 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
385);
386
387VOID
388NTAPI
389ObpFreeObjectNameBuffer(
390 IN PUNICODE_STRING Name
391);
392
393VOID
394NTAPI
395ObpDeleteObjectType(
396 IN PVOID Object
397);
398
399NTSTATUS
400NTAPI
401ObReferenceFileObjectForWrite(
402 IN HANDLE Handle,
403 IN KPROCESSOR_MODE AccessMode,
404 OUT PFILE_OBJECT *FileObject,
405 OUT POBJECT_HANDLE_INFORMATION HandleInformation
406);
407
408//
409// DOS Devices Functions
410//
411NTSTATUS
412NTAPI
413ObSetDeviceMap(
414 IN PEPROCESS Process,
415 IN HANDLE DirectoryHandle
416);
417
418NTSTATUS
419NTAPI
420ObSetDirectoryDeviceMap(OUT PDEVICE_MAP * DeviceMap,
421 IN HANDLE DirectoryHandle
422);
423
424VOID
425NTAPI
426ObDereferenceDeviceMap(
427 IN PEPROCESS Process
428);
429
430VOID
431FASTCALL
432ObfDereferenceDeviceMap(
433 IN PDEVICE_MAP DeviceMap
434);
435
436VOID
437NTAPI
438ObInheritDeviceMap(
439 IN PEPROCESS Parent,
440 IN PEPROCESS Process
441);
442
443CODE_SEG("INIT")
444NTSTATUS
445NTAPI
446ObpCreateDosDevicesDirectory(
447 VOID
448);
449
450ULONG
451NTAPI
452ObIsLUIDDeviceMapsEnabled(
453 VOID
454);
455
456PDEVICE_MAP
457NTAPI
458ObpReferenceDeviceMap(
459 VOID
460);
461
462//
463// Security descriptor cache functions
464//
465CODE_SEG("INIT")
466NTSTATUS
467NTAPI
468ObpInitSdCache(
469 VOID
470);
471
472PSECURITY_DESCRIPTOR
473NTAPI
474ObpReferenceSecurityDescriptor(
475 IN POBJECT_HEADER ObjectHeader
476);
477
478//
479// Object Security Routines
480//
481BOOLEAN
482NTAPI
483ObCheckObjectAccess(
484 IN PVOID Object,
485 IN OUT PACCESS_STATE AccessState,
486 IN BOOLEAN LockHeld,
487 IN KPROCESSOR_MODE AccessMode,
488 OUT PNTSTATUS ReturnedStatus
489);
490
491BOOLEAN
492NTAPI
493ObCheckCreateObjectAccess(
494 IN PVOID Object,
495 IN ACCESS_MASK CreateAccess,
496 IN PACCESS_STATE AccessState,
497 IN PUNICODE_STRING ComponentName,
498 IN BOOLEAN LockHeld,
499 IN KPROCESSOR_MODE AccessMode,
500 OUT PNTSTATUS AccessStatus
501);
502
503BOOLEAN
504NTAPI
505ObpCheckTraverseAccess(
506 IN PVOID Object,
507 IN ACCESS_MASK TraverseAccess,
508 IN PACCESS_STATE AccessState OPTIONAL,
509 IN BOOLEAN LockHeld,
510 IN KPROCESSOR_MODE AccessMode,
511 OUT PNTSTATUS AccessStatus
512);
513
514BOOLEAN
515NTAPI
516ObpCheckObjectReference(
517 IN PVOID Object,
518 IN OUT PACCESS_STATE AccessState,
519 IN BOOLEAN LockHeld,
520 IN KPROCESSOR_MODE AccessMode,
521 OUT PNTSTATUS AccessStatus
522);
523
524//
525// Default Object Security Callback Routines
526//
527NTSTATUS
528NTAPI
529ObAssignObjectSecurityDescriptor(
530 IN PVOID Object,
531 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
532 IN POOL_TYPE PoolType
533);
534
535NTSTATUS
536NTAPI
537ObDeassignSecurity(
538 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor
539);
540
541NTSTATUS
542NTAPI
543ObQuerySecurityDescriptorInfo(
544 IN PVOID Object,
545 IN PSECURITY_INFORMATION SecurityInformation,
546 OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
547 IN OUT PULONG Length,
548 IN PSECURITY_DESCRIPTOR *OutputSecurityDescriptor
549);
550
551NTSTATUS
552NTAPI
553ObSetSecurityDescriptorInfo(
554 IN PVOID Object,
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
560);
561
562//
563// Executive Fast Referencing Functions
564//
565VOID
566FASTCALL
567ObInitializeFastReference(
568 IN PEX_FAST_REF FastRef,
569 IN PVOID Object
570);
571
572PVOID
573FASTCALL
574ObFastReplaceObject(
575 IN PEX_FAST_REF FastRef,
576 IN PVOID Object
577);
578
579PVOID
580FASTCALL
581ObFastReferenceObject(
582 IN PEX_FAST_REF FastRef
583);
584
585PVOID
586FASTCALL
587ObFastReferenceObjectLocked(
588 IN PEX_FAST_REF FastRef
589);
590
591VOID
592FASTCALL
593ObFastDereferenceObject(
594 IN PEX_FAST_REF FastRef,
595 IN PVOID Object
596);
597
598//
599// Object Create and Object Name Capture Functions
600//
601NTSTATUS
602NTAPI
603ObpCaptureObjectName(
604 IN PUNICODE_STRING CapturedName,
605 IN PUNICODE_STRING ObjectName,
606 IN KPROCESSOR_MODE AccessMode,
607 IN BOOLEAN AllocateFromLookaside
608);
609
610NTSTATUS
611NTAPI
612ObpCaptureObjectCreateInformation(
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
619);
620
621//
622// Miscellanea
623//
624ULONG
625NTAPI
626ObGetProcessHandleCount(
627 IN PEPROCESS Process
628);
629
630//
631// Global data inside the Object Manager
632//
633extern ULONG ObpTraceLevel;
634extern KEVENT ObpDefaultObject;
635extern KGUARDED_MUTEX ObpDeviceMapLock;
636extern POBJECT_TYPE ObpTypeObjectType;
637extern POBJECT_TYPE ObpDirectoryObjectType;
638extern POBJECT_TYPE ObpSymbolicLinkObjectType;
639extern POBJECT_DIRECTORY ObpRootDirectoryObject;
640extern POBJECT_DIRECTORY ObpTypeDirectoryObject;
641extern PHANDLE_TABLE ObpKernelHandleTable;
642extern WORK_QUEUE_ITEM ObpReaperWorkItem;
643extern volatile PVOID ObpReaperList;
644extern GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList;
645extern BOOLEAN IoCountOperations;
646extern ALIGNEDNAME ObpDosDevicesShortNamePrefix;
647extern ALIGNEDNAME ObpDosDevicesShortNameRoot;
648extern UNICODE_STRING ObpDosDevicesShortName;
649extern WCHAR ObpUnsecureGlobalNamesBuffer[128];
650extern ULONG ObpUnsecureGlobalNamesLength;
651extern ULONG ObpCaseInsensitive;
652extern ULONG ObpObjectSecurityMode;
653extern ULONG ObpProtectionMode;
654extern ULONG ObpLUIDDeviceMapsDisabled;
655extern ULONG ObpLUIDDeviceMapsEnabled;
656
657//
658// Inlined Functions
659//
660#include "ob_x.h"