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')
23 } COMMON_BODY_HEADER
, *PCOMMON_BODY_HEADER
;
25 typedef PVOID POBJECT
;
28 typedef struct _OBJECT_TYPE
31 * PURPOSE: Tag to be used when allocating objects of this type
36 * PURPOSE: Name of the type
38 UNICODE_STRING TypeName
;
41 * PURPOSE: Total number of objects of this type
46 * PURPOSE: Total number of handles of this type
51 * PURPOSE: Peak objects of this type
56 * PURPOSE: Peak handles of this type
61 * PURPOSE: Paged pool charge
63 ULONG PagedPoolCharge
;
66 * PURPOSE: Nonpaged pool charge
68 ULONG NonpagedPoolCharge
;
71 * PURPOSE: Mapping of generic access rights
73 PGENERIC_MAPPING Mapping
;
76 * PURPOSE: Dumps the object
79 VOID
STDCALL_FUNC (*Dump
)(VOID
);
82 * PURPOSE: Opens the object
85 VOID
STDCALL_FUNC (*Open
)(VOID
);
88 * PURPOSE: Called to close an object if OkayToClose returns true
90 VOID
STDCALL_FUNC (*Close
)(PVOID ObjectBody
,
94 * PURPOSE: Called to delete an object when the last reference is removed
96 VOID
STDCALL_FUNC (*Delete
)(PVOID ObjectBody
);
99 * PURPOSE: Called when an open attempts to open a file apparently
100 * residing within the object
102 * STATUS_SUCCESS NextObject was found
103 * STATUS_UNSUCCESSFUL NextObject not found
104 * STATUS_REPARSE Path changed, restart parsing the path
106 NTSTATUS
STDCALL_FUNC (*Parse
)(PVOID ParsedObject
,
108 PUNICODE_STRING FullPath
,
113 * PURPOSE: Called to set, query, delete or assign a security-descriptor
116 * STATUS_SUCCESS NextObject was found
118 NTSTATUS
STDCALL_FUNC (*Security
)(PVOID ObjectBody
,
119 SECURITY_OPERATION_CODE OperationCode
,
120 SECURITY_INFORMATION SecurityInformation
,
121 PSECURITY_DESCRIPTOR SecurityDescriptor
,
122 PULONG BufferLength
);
125 * PURPOSE: Called to query the name of the object
127 * STATUS_SUCCESS NextObject was found
129 NTSTATUS
STDCALL_FUNC (*QueryName
)(PVOID ObjectBody
,
130 POBJECT_NAME_INFORMATION ObjectNameInfo
,
132 PULONG ReturnLength
);
135 * PURPOSE: Called when a process asks to close the object
137 VOID
STDCALL_FUNC (*OkayToClose
)(VOID
);
139 NTSTATUS
STDCALL_FUNC (*Create
)(PVOID ObjectBody
,
142 struct _OBJECT_ATTRIBUTES
* ObjectAttributes
);
144 VOID
STDCALL_FUNC (*DuplicationNotify
)(PEPROCESS DuplicateTo
,
145 PEPROCESS DuplicateFrom
,
151 typedef struct _OBJECT_HEADER
153 * PURPOSE: Header for every object managed by the object manager
162 struct _DIRECTORY_OBJECT
* Parent
;
163 POBJECT_TYPE ObjectType
;
164 PSECURITY_DESCRIPTOR SecurityDescriptor
;
167 * PURPOSE: Object type
168 * NOTE: This overlaps the first member of the object body
173 * PURPOSE: Object size
174 * NOTE: This overlaps the second member of the object body
179 } OBJECT_HEADER
, *POBJECT_HEADER
;
182 typedef struct _DIRECTORY_OBJECT
188 * PURPOSE: Head of the list of our subdirectories
192 } DIRECTORY_OBJECT
, *PDIRECTORY_OBJECT
;
194 typedef struct _SYMLINK_OBJECT
198 UNICODE_STRING TargetName
;
199 LARGE_INTEGER CreateTime
;
200 } SYMLINK_OBJECT
, *PSYMLINK_OBJECT
;
203 typedef struct _TYPE_OBJECT
208 /* pointer to object type data */
209 POBJECT_TYPE ObjectType
;
210 } TYPE_OBJECT
, *PTYPE_OBJECT
;
214 * Enumeration of object types
230 #define HEADER_TO_BODY(objhdr) \
231 (PVOID)((ULONG_PTR)objhdr + sizeof(OBJECT_HEADER) - sizeof(COMMON_BODY_HEADER))
233 #define BODY_TO_HEADER(objbdy) \
234 CONTAINING_RECORD(&(((PCOMMON_BODY_HEADER)objbdy)->Type), OBJECT_HEADER, Type)
236 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
238 #define HANDLE_TO_EX_HANDLE(handle) \
239 (LONG)(((LONG)(handle) >> 2) - 1)
240 #define EX_HANDLE_TO_HANDLE(exhandle) \
241 (HANDLE)(((exhandle) + 1) << 2)
243 extern PDIRECTORY_OBJECT NameSpaceRoot
;
244 extern POBJECT_TYPE ObSymbolicLinkType
;
246 VOID
ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent
,
247 POBJECT_HEADER Header
,
249 VOID
ObpRemoveEntryDirectory(POBJECT_HEADER Header
);
252 ObInitSymbolicLinkImplementation(VOID
);
255 NTSTATUS
ObCreateHandle(struct _EPROCESS
* Process
,
257 ACCESS_MASK GrantedAccess
,
260 VOID
ObCreateHandleTable(struct _EPROCESS
* Parent
,
262 struct _EPROCESS
* Process
);
263 NTSTATUS
ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes
,
264 PVOID
* ReturnedObject
,
265 PUNICODE_STRING RemainingPath
,
266 POBJECT_TYPE ObjectType
);
267 VOID
ObDeleteHandleTable(struct _EPROCESS
* Process
);
270 ObDeleteHandle(PEPROCESS Process
,
274 ObpQueryHandleAttributes(HANDLE Handle
,
275 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
278 ObpSetHandleAttributes(HANDLE Handle
,
279 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
282 ObpCreateTypeObject(POBJECT_TYPE ObjectType
);
285 ObGetObjectHandleCount(PVOID Object
);
287 ObDuplicateObject(PEPROCESS SourceProcess
,
288 PEPROCESS TargetProcess
,
290 PHANDLE TargetHandle
,
291 ACCESS_MASK DesiredAccess
,
292 BOOLEAN InheritHandle
,
296 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable
);
300 ObQueryDeviceMapInformation(PEPROCESS Process
, PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
);
303 ObpSetPermanentObject (IN PVOID ObjectBody
, IN BOOLEAN Permanent
);
306 /* Security descriptor cache functions */
309 ObpInitSdCache(VOID
);
312 ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD
,
313 OUT PSECURITY_DESCRIPTOR
*DestinationSD
);
316 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
319 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
322 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
324 /* Secure object information functions */
326 typedef struct _CAPTURED_OBJECT_ATTRIBUTES
328 HANDLE RootDirectory
;
330 PSECURITY_DESCRIPTOR SecurityDescriptor
;
331 PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
332 } CAPTURED_OBJECT_ATTRIBUTES
, *PCAPTURED_OBJECT_ATTRIBUTES
;
335 ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
336 IN KPROCESSOR_MODE AccessMode
,
337 IN POOL_TYPE PoolType
,
338 IN BOOLEAN CaptureIfKernel
,
339 OUT PCAPTURED_OBJECT_ATTRIBUTES CapturedObjectAttributes OPTIONAL
,
340 OUT PUNICODE_STRING ObjectName OPTIONAL
);
343 ObpReleaseObjectAttributes(IN PCAPTURED_OBJECT_ATTRIBUTES CapturedObjectAttributes OPTIONAL
,
344 IN PUNICODE_STRING ObjectName OPTIONAL
,
345 IN KPROCESSOR_MODE AccessMode
,
346 IN BOOLEAN CaptureIfKernel
);
348 /* object information classes */
350 #define ICIF_QUERY 0x1
352 #define ICIF_QUERY_SIZE_VARIABLE 0x4
353 #define ICIF_SET_SIZE_VARIABLE 0x8
354 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
356 typedef struct _INFORMATION_CLASS_INFO
358 ULONG RequiredSizeQUERY
;
359 ULONG RequiredSizeSET
;
361 ULONG AlignmentQUERY
;
363 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
365 #define ICI_SQ_SAME(Size, Alignment, Flags) \
366 { Size, Size, Alignment, Alignment, Flags }
368 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
369 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
371 #define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode) \
373 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
375 if(!(ClassList[Class].Flags & ICIF_##Mode)) \
377 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
379 else if(ClassList[Class].RequiredSize##Mode > 0 && \
380 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
382 if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \
383 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
385 *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \
391 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
396 #define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode) \
398 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
400 *(AlignmentVar) = ClassList[Class].Alignment##Mode; \
404 *(AlignmentVar) = sizeof(ULONG); \
408 #define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen, PrevMode, StatusVar) \
410 if(PrevMode == UserMode) \
414 ProbeForWrite(Buffer, \
419 ProbeForWrite(RetLen, \
426 *(StatusVar) = _SEH_GetExceptionCode(); \
430 if(!NT_SUCCESS(*(StatusVar))) \
432 DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar)); \
433 return *(StatusVar); \
438 #define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode, StatusVar) \
440 if(PrevMode == UserMode) \
444 ProbeForRead(Buffer, \
450 *(StatusVar) = _SEH_GetExceptionCode(); \
454 if(!NT_SUCCESS(*(StatusVar))) \
456 DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar)); \
457 return *(StatusVar); \
462 #define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen, PrevMode, StatusVar) \
465 /* get the preferred alignment for the information class or return */ \
466 /* default alignment in case the class doesn't exist */ \
467 GetInfoClassAlignment(Class, \
472 /* probe the ENTIRE buffers and return on failure */ \
473 ProbeSetInfoBuffer(Buffer, \
479 /* validate information class index and check buffer size */ \
480 CheckInfoClass(Class, \
487 #define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer, BufferLen, RetLen, PrevMode, StatusVar) \
490 /* get the preferred alignment for the information class or return */ \
491 /* alignment in case the class doesn't exist */ \
492 GetInfoClassAlignment(Class, \
497 /* probe the ENTIRE buffers and return on failure */ \
498 ProbeQueryInfoBuffer(Buffer, \
505 /* validate information class index and check buffer size */ \
506 CheckInfoClass(Class, \
513 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */