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
14 #define ICIF_QUERY 0x1
16 #define ICIF_QUERY_SIZE_VARIABLE 0x4
17 #define ICIF_SET_SIZE_VARIABLE 0x8
18 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
20 typedef struct _DIRECTORY_OBJECT
26 * PURPOSE: Head of the list of our subdirectories
30 } DIRECTORY_OBJECT
, *PDIRECTORY_OBJECT
;
32 typedef struct _SYMLINK_OBJECT
36 UNICODE_STRING TargetName
;
37 LARGE_INTEGER CreateTime
;
38 } SYMLINK_OBJECT
, *PSYMLINK_OBJECT
;
40 typedef struct _INFORMATION_CLASS_INFO
42 ULONG RequiredSizeQUERY
;
43 ULONG RequiredSizeSET
;
47 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
49 #define BODY_TO_HEADER(objbdy) \
50 CONTAINING_RECORD((objbdy), OBJECT_HEADER, Body)
52 #define HEADER_TO_OBJECT_NAME(objhdr) ((POBJECT_HEADER_NAME_INFO) \
53 (!(objhdr)->NameInfoOffset ? NULL: ((PCHAR)(objhdr) - (objhdr)->NameInfoOffset)))
55 #define HEADER_TO_HANDLE_INFO(objhdr) ((POBJECT_HEADER_HANDLE_INFO) \
56 (!(objhdr)->HandleInfoOffset ? NULL: ((PCHAR)(objhdr) - (objhdr)->HandleInfoOffset)))
58 #define HEADER_TO_CREATOR_INFO(objhdr) ((POBJECT_HEADER_CREATOR_INFO) \
59 (!((objhdr)->Flags & OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(objhdr) - sizeof(OBJECT_HEADER_CREATOR_INFO))))
61 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER))
63 #define KERNEL_HANDLE_FLAG (1 << ((sizeof(HANDLE) * 8) - 1))
64 #define ObIsKernelHandle(Handle, ProcessorMode) \
65 (((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
66 ((ProcessorMode) == KernelMode))
67 #define ObKernelHandleToHandle(Handle) \
68 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
70 extern PDIRECTORY_OBJECT NameSpaceRoot
;
71 extern POBJECT_TYPE ObSymbolicLinkType
;
72 extern PHANDLE_TABLE ObpKernelHandleTable
;
77 PDIRECTORY_OBJECT Parent
,
78 POBJECT_HEADER Header
,
84 ObpRemoveEntryDirectory(POBJECT_HEADER Header
);
88 ObInitSymbolicLinkImplementation(VOID
);
93 struct _EPROCESS
* Process
,
95 ACCESS_MASK GrantedAccess
,
103 struct _EPROCESS
* Parent
,
105 struct _EPROCESS
* Process
111 POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
112 PUNICODE_STRING ObjectName
,
113 PVOID
* ReturnedObject
,
114 PUNICODE_STRING RemainingPath
,
115 POBJECT_TYPE ObjectType
120 ObpQueryHandleAttributes(
122 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
127 ObpSetHandleAttributes(
129 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
135 struct _OBJECT_TYPE_INITIALIZER
*ObjectTypeInitializer
,
136 PUNICODE_STRING TypeName
,
137 POBJECT_TYPE
*ObjectType
142 ObGetObjectHandleCount(PVOID Object
);
147 PEPROCESS SourceProcess
,
148 PEPROCESS TargetProcess
,
150 PHANDLE TargetHandle
,
151 ACCESS_MASK DesiredAccess
,
152 BOOLEAN InheritHandle
,
158 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable
);
162 ObQueryDeviceMapInformation(
164 PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
169 ObpSetPermanentObject(
176 ObKillProcess(PEPROCESS Process
);
178 /* Security descriptor cache functions */
182 ObpInitSdCache(VOID
);
186 ObpAddSecurityDescriptor(
187 IN PSECURITY_DESCRIPTOR SourceSD
,
188 OUT PSECURITY_DESCRIPTOR
*DestinationSD
193 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
197 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
201 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
205 ObInitializeFastReference(
206 IN PEX_FAST_REF FastRef
,
213 IN PEX_FAST_REF FastRef
,
219 ObFastReferenceObject(IN PEX_FAST_REF FastRef
);
223 ObFastDereferenceObject(
224 IN PEX_FAST_REF FastRef
,
228 /* Secure object information functions */
232 ObpCaptureObjectName(
233 IN PUNICODE_STRING CapturedName
,
234 IN PUNICODE_STRING ObjectName
,
235 IN KPROCESSOR_MODE AccessMode
240 ObpCaptureObjectAttributes(
241 IN POBJECT_ATTRIBUTES ObjectAttributes
,
242 IN KPROCESSOR_MODE AccessMode
,
243 IN POBJECT_TYPE ObjectType
,
244 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
245 OUT PUNICODE_STRING ObjectName
250 ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
);
252 /* object information classes */
254 #define ICI_SQ_SAME(Size, Alignment, Flags) \
255 { Size, Size, Alignment, Alignment, Flags }
257 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
258 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
260 #define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode) \
262 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
264 if(!(ClassList[Class].Flags & ICIF_##Mode)) \
266 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
268 else if(ClassList[Class].RequiredSize##Mode > 0 && \
269 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
271 if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \
272 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
274 *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \
280 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
285 #define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode) \
287 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
289 *(AlignmentVar) = ClassList[Class].Alignment##Mode; \
293 *(AlignmentVar) = sizeof(ULONG); \
297 #define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen, PrevMode, StatusVar) \
299 if(PrevMode != KernelMode) \
303 ProbeForWrite(Buffer, \
308 ProbeForWrite(RetLen, \
315 *(StatusVar) = _SEH_GetExceptionCode(); \
319 if(!NT_SUCCESS(*(StatusVar))) \
321 DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar)); \
322 return *(StatusVar); \
327 #define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode, StatusVar) \
329 if(PrevMode != KernelMode) \
333 ProbeForRead(Buffer, \
339 *(StatusVar) = _SEH_GetExceptionCode(); \
343 if(!NT_SUCCESS(*(StatusVar))) \
345 DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar)); \
346 return *(StatusVar); \
351 #define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen, PrevMode, StatusVar) \
354 /* get the preferred alignment for the information class or return */ \
355 /* default alignment in case the class doesn't exist */ \
356 GetInfoClassAlignment(Class, \
361 /* probe the ENTIRE buffers and return on failure */ \
362 ProbeSetInfoBuffer(Buffer, \
368 /* validate information class index and check buffer size */ \
369 CheckInfoClass(Class, \
376 #define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer, BufferLen, RetLen, PrevMode, StatusVar) \
379 /* get the preferred alignment for the information class or return */ \
380 /* alignment in case the class doesn't exist */ \
381 GetInfoClassAlignment(Class, \
386 /* probe the ENTIRE buffers and return on failure */ \
387 ProbeQueryInfoBuffer(Buffer, \
394 /* validate information class index and check buffer size */ \
395 CheckInfoClass(Class, \
402 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */