2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: include/internal/objmgr.h
5 * PURPOSE: Object manager definitions
6 * PROGRAMMER: David Welch (welch@mcmail.com)
9 #ifndef __INCLUDE_INTERNAL_OBJMGR_H
10 #define __INCLUDE_INTERNAL_OBJMGR_H
12 #define NTOS_MODE_KERNEL
15 #define TAG_OBJECT_TYPE TAG('O', 'b', 'j', 'T')
19 typedef PVOID POBJECT
;
24 LONGLONG UseThisFieldToCopy
;
25 float DoNotUseThisField
;
29 #define OB_FLAG_CREATE_INFO 0x01 // has OBJECT_CREATE_INFO
30 #define OB_FLAG_KERNEL_MODE 0x02 // created by kernel
31 #define OB_FLAG_CREATOR_INFO 0x04 // has OBJECT_CREATOR_INFO
32 #define OB_FLAG_EXCLUSIVE 0x08 // OBJ_EXCLUSIVE
33 #define OB_FLAG_PERMANENT 0x10 // OBJ_PERMANENT
34 #define OB_FLAG_SECURITY 0x20 // has security descriptor
35 #define OB_FLAG_SINGLE_PROCESS 0x40 // no HandleDBList
37 /* Will be moved to public headers once "Entry" is gone */
38 typedef struct _OBJECT_HEADER
48 UCHAR HandleInfoOffset
;
49 UCHAR QuotaInfoOffset
;
52 POBJECT_CREATE_INFORMATION ObjectCreateInfo
;
53 PVOID QuotaBlockCharged
;
55 PSECURITY_DESCRIPTOR SecurityDescriptor
;
57 } OBJECT_HEADER
, *POBJECT_HEADER
;
59 typedef struct _DIRECTORY_OBJECT
65 * PURPOSE: Head of the list of our subdirectories
69 } DIRECTORY_OBJECT
, *PDIRECTORY_OBJECT
;
71 typedef struct _SYMLINK_OBJECT
75 UNICODE_STRING TargetName
;
76 LARGE_INTEGER CreateTime
;
77 } SYMLINK_OBJECT
, *PSYMLINK_OBJECT
;
80 * Enumeration of object types
96 #define BODY_TO_HEADER(objbdy) \
97 CONTAINING_RECORD((objbdy), OBJECT_HEADER, Body)
99 #define HEADER_TO_OBJECT_NAME(objhdr) ((POBJECT_HEADER_NAME_INFO) \
100 (!(objhdr)->NameInfoOffset ? NULL: ((PCHAR)(objhdr) - (objhdr)->NameInfoOffset)))
102 #define HEADER_TO_HANDLE_INFO(objhdr) ((POBJECT_HEADER_HANDLE_INFO) \
103 (!(objhdr)->HandleInfoOffset ? NULL: ((PCHAR)(objhdr) - (objhdr)->HandleInfoOffset)))
105 #define HEADER_TO_CREATOR_INFO(objhdr) ((POBJECT_HEADER_CREATOR_INFO) \
106 (!((objhdr)->Flags & OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(objhdr) - sizeof(OBJECT_HEADER_CREATOR_INFO))))
108 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER))
110 #define HANDLE_TO_EX_HANDLE(handle) \
111 (LONG)(((LONG)(handle) >> 2) - 1)
112 #define EX_HANDLE_TO_HANDLE(exhandle) \
113 (HANDLE)(((exhandle) + 1) << 2)
115 extern PDIRECTORY_OBJECT NameSpaceRoot
;
116 extern POBJECT_TYPE ObSymbolicLinkType
;
117 extern PHANDLE_TABLE ObpKernelHandleTable
;
119 #define KERNEL_HANDLE_FLAG (1 << ((sizeof(HANDLE) * 8) - 1))
120 #define ObIsKernelHandle(Handle, ProcessorMode) \
121 (((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
122 ((ProcessorMode) == KernelMode))
123 #define ObKernelHandleToHandle(Handle) \
124 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
126 VOID
ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent
,
127 POBJECT_HEADER Header
,
129 VOID
ObpRemoveEntryDirectory(POBJECT_HEADER Header
);
132 ObInitSymbolicLinkImplementation(VOID
);
135 NTSTATUS
ObpCreateHandle(struct _EPROCESS
* Process
,
137 ACCESS_MASK GrantedAccess
,
140 VOID
ObCreateHandleTable(struct _EPROCESS
* Parent
,
142 struct _EPROCESS
* Process
);
143 NTSTATUS
ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
144 PUNICODE_STRING ObjectName
,
145 PVOID
* ReturnedObject
,
146 PUNICODE_STRING RemainingPath
,
147 POBJECT_TYPE ObjectType
);
150 ObpQueryHandleAttributes(HANDLE Handle
,
151 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
154 ObpSetHandleAttributes(HANDLE Handle
,
155 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
159 ObpCreateTypeObject(struct _OBJECT_TYPE_INITIALIZER
*ObjectTypeInitializer
,
160 PUNICODE_STRING TypeName
,
161 POBJECT_TYPE
*ObjectType
);
164 ObGetObjectHandleCount(PVOID Object
);
166 ObDuplicateObject(PEPROCESS SourceProcess
,
167 PEPROCESS TargetProcess
,
169 PHANDLE TargetHandle
,
170 ACCESS_MASK DesiredAccess
,
171 BOOLEAN InheritHandle
,
175 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable
);
179 ObQueryDeviceMapInformation(PEPROCESS Process
, PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
);
182 ObpSetPermanentObject (IN PVOID ObjectBody
, IN BOOLEAN Permanent
);
186 ObKillProcess(PEPROCESS Process
);
187 /* Security descriptor cache functions */
190 ObpInitSdCache(VOID
);
193 ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD
,
194 OUT PSECURITY_DESCRIPTOR
*DestinationSD
);
197 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
200 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
203 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
207 ObInitializeFastReference(IN PEX_FAST_REF FastRef
,
212 ObFastReplaceObject(IN PEX_FAST_REF FastRef
,
217 ObFastReferenceObject(IN PEX_FAST_REF FastRef
);
221 ObFastDereferenceObject(IN PEX_FAST_REF FastRef
,
224 /* Secure object information functions */
226 typedef struct _CAPTURED_OBJECT_ATTRIBUTES
228 HANDLE RootDirectory
;
230 PSECURITY_DESCRIPTOR SecurityDescriptor
;
231 PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
232 } CAPTURED_OBJECT_ATTRIBUTES
, *PCAPTURED_OBJECT_ATTRIBUTES
;
236 ObpCaptureObjectName(IN PUNICODE_STRING CapturedName
,
237 IN PUNICODE_STRING ObjectName
,
238 IN KPROCESSOR_MODE AccessMode
);
242 ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes
,
243 IN KPROCESSOR_MODE AccessMode
,
244 IN POBJECT_TYPE ObjectType
,
245 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
246 OUT PUNICODE_STRING ObjectName
);
250 ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
);
252 /* object information classes */
254 #define ICIF_QUERY 0x1
256 #define ICIF_QUERY_SIZE_VARIABLE 0x4
257 #define ICIF_SET_SIZE_VARIABLE 0x8
258 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
260 typedef struct _INFORMATION_CLASS_INFO
262 ULONG RequiredSizeQUERY
;
263 ULONG RequiredSizeSET
;
265 ULONG AlignmentQUERY
;
267 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
269 #define ICI_SQ_SAME(Size, Alignment, Flags) \
270 { Size, Size, Alignment, Alignment, Flags }
272 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
273 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
275 #define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode) \
277 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
279 if(!(ClassList[Class].Flags & ICIF_##Mode)) \
281 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
283 else if(ClassList[Class].RequiredSize##Mode > 0 && \
284 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
286 if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \
287 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
289 *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \
295 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
300 #define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode) \
302 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
304 *(AlignmentVar) = ClassList[Class].Alignment##Mode; \
308 *(AlignmentVar) = sizeof(ULONG); \
312 #define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen, PrevMode, StatusVar) \
314 if(PrevMode == UserMode) \
318 ProbeForWrite(Buffer, \
323 ProbeForWrite(RetLen, \
330 *(StatusVar) = _SEH_GetExceptionCode(); \
334 if(!NT_SUCCESS(*(StatusVar))) \
336 DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar)); \
337 return *(StatusVar); \
342 #define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode, StatusVar) \
344 if(PrevMode == UserMode) \
348 ProbeForRead(Buffer, \
354 *(StatusVar) = _SEH_GetExceptionCode(); \
358 if(!NT_SUCCESS(*(StatusVar))) \
360 DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar)); \
361 return *(StatusVar); \
366 #define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen, PrevMode, StatusVar) \
369 /* get the preferred alignment for the information class or return */ \
370 /* default alignment in case the class doesn't exist */ \
371 GetInfoClassAlignment(Class, \
376 /* probe the ENTIRE buffers and return on failure */ \
377 ProbeSetInfoBuffer(Buffer, \
383 /* validate information class index and check buffer size */ \
384 CheckInfoClass(Class, \
391 #define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer, BufferLen, RetLen, PrevMode, StatusVar) \
394 /* get the preferred alignment for the information class or return */ \
395 /* alignment in case the class doesn't exist */ \
396 GetInfoClassAlignment(Class, \
401 /* probe the ENTIRE buffers and return on failure */ \
402 ProbeQueryInfoBuffer(Buffer, \
409 /* validate information class index and check buffer size */ \
410 CheckInfoClass(Class, \
417 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */