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