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