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
160 BOOLEAN CloseInProcess
;
163 struct _DIRECTORY_OBJECT
* Parent
;
164 POBJECT_TYPE ObjectType
;
165 PSECURITY_DESCRIPTOR SecurityDescriptor
;
168 * PURPOSE: Object type
169 * NOTE: This overlaps the first member of the object body
174 * PURPOSE: Object size
175 * NOTE: This overlaps the second member of the object body
180 } OBJECT_HEADER
, *POBJECT_HEADER
;
183 typedef struct _DIRECTORY_OBJECT
189 * PURPOSE: Head of the list of our subdirectories
193 } DIRECTORY_OBJECT
, *PDIRECTORY_OBJECT
;
195 typedef struct _SYMLINK_OBJECT
199 UNICODE_STRING TargetName
;
200 LARGE_INTEGER CreateTime
;
201 } SYMLINK_OBJECT
, *PSYMLINK_OBJECT
;
204 typedef struct _TYPE_OBJECT
209 /* pointer to object type data */
210 POBJECT_TYPE ObjectType
;
211 } TYPE_OBJECT
, *PTYPE_OBJECT
;
215 * Enumeration of object types
231 #define HEADER_TO_BODY(objhdr) \
232 (PVOID)((ULONG_PTR)objhdr + sizeof(OBJECT_HEADER) - sizeof(COMMON_BODY_HEADER))
234 #define BODY_TO_HEADER(objbdy) \
235 CONTAINING_RECORD(&(((PCOMMON_BODY_HEADER)objbdy)->Type), OBJECT_HEADER, Type)
237 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
239 #define HANDLE_TO_EX_HANDLE(handle) \
240 (LONG)(((LONG)(handle) >> 2) - 1)
241 #define EX_HANDLE_TO_HANDLE(exhandle) \
242 (HANDLE)(((exhandle) + 1) << 2)
244 extern PDIRECTORY_OBJECT NameSpaceRoot
;
245 extern POBJECT_TYPE ObSymbolicLinkType
;
247 VOID
ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent
,
248 POBJECT_HEADER Header
,
250 VOID
ObpRemoveEntryDirectory(POBJECT_HEADER Header
);
253 ObInitSymbolicLinkImplementation(VOID
);
256 NTSTATUS
ObCreateHandle(struct _EPROCESS
* Process
,
258 ACCESS_MASK GrantedAccess
,
261 VOID
ObCreateHandleTable(struct _EPROCESS
* Parent
,
263 struct _EPROCESS
* Process
);
264 NTSTATUS
ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes
,
265 PVOID
* ReturnedObject
,
266 PUNICODE_STRING RemainingPath
,
267 POBJECT_TYPE ObjectType
);
268 VOID
ObDeleteHandleTable(struct _EPROCESS
* Process
);
271 ObDeleteHandle(PEPROCESS Process
,
275 ObpQueryHandleAttributes(HANDLE Handle
,
276 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
279 ObpSetHandleAttributes(HANDLE Handle
,
280 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
283 ObpCreateTypeObject(POBJECT_TYPE ObjectType
);
286 ObGetObjectHandleCount(PVOID Object
);
288 ObDuplicateObject(PEPROCESS SourceProcess
,
289 PEPROCESS TargetProcess
,
291 PHANDLE TargetHandle
,
292 ACCESS_MASK DesiredAccess
,
293 BOOLEAN InheritHandle
,
297 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable
);
301 ObQueryDeviceMapInformation(PEPROCESS Process
, PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
);
304 ObpSetPermanentObject (IN PVOID ObjectBody
, IN BOOLEAN Permanent
);
307 /* Security descriptor cache functions */
310 ObpInitSdCache(VOID
);
313 ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD
,
314 OUT PSECURITY_DESCRIPTOR
*DestinationSD
);
317 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
320 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
323 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
325 /* Secure object information functions */
327 typedef struct _CAPTURED_OBJECT_ATTRIBUTES
329 HANDLE RootDirectory
;
331 PSECURITY_DESCRIPTOR SecurityDescriptor
;
332 PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
333 } CAPTURED_OBJECT_ATTRIBUTES
, *PCAPTURED_OBJECT_ATTRIBUTES
;
336 ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
337 IN KPROCESSOR_MODE AccessMode
,
338 IN POOL_TYPE PoolType
,
339 IN BOOLEAN CaptureIfKernel
,
340 OUT PCAPTURED_OBJECT_ATTRIBUTES CapturedObjectAttributes OPTIONAL
,
341 OUT PUNICODE_STRING ObjectName OPTIONAL
);
344 ObpReleaseObjectAttributes(IN PCAPTURED_OBJECT_ATTRIBUTES CapturedObjectAttributes OPTIONAL
,
345 IN PUNICODE_STRING ObjectName OPTIONAL
,
346 IN KPROCESSOR_MODE AccessMode
,
347 IN BOOLEAN CaptureIfKernel
);
349 /* object information classes */
351 #define ICIF_QUERY 0x1
353 #define ICIF_QUERY_SIZE_VARIABLE 0x4
354 #define ICIF_SET_SIZE_VARIABLE 0x8
355 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
357 typedef struct _INFORMATION_CLASS_INFO
359 ULONG RequiredSizeQUERY
;
360 ULONG RequiredSizeSET
;
362 ULONG AlignmentQUERY
;
364 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
366 #define ICI_SQ_SAME(Size, Alignment, Flags) \
367 { Size, Size, Alignment, Alignment, Flags }
369 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
370 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
372 #define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode) \
374 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
376 if(!(ClassList[Class].Flags & ICIF_##Mode)) \
378 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
380 else if(ClassList[Class].RequiredSize##Mode > 0 && \
381 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
383 if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \
384 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
386 *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \
392 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
397 #define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode) \
399 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
401 *(AlignmentVar) = ClassList[Class].Alignment##Mode; \
405 *(AlignmentVar) = sizeof(ULONG); \
409 #define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen, PrevMode, StatusVar) \
411 if(PrevMode == UserMode) \
415 ProbeForWrite(Buffer, \
420 ProbeForWrite(RetLen, \
427 *(StatusVar) = _SEH_GetExceptionCode(); \
431 if(!NT_SUCCESS(*(StatusVar))) \
433 DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar)); \
434 return *(StatusVar); \
439 #define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode, StatusVar) \
441 if(PrevMode == UserMode) \
445 ProbeForRead(Buffer, \
451 *(StatusVar) = _SEH_GetExceptionCode(); \
455 if(!NT_SUCCESS(*(StatusVar))) \
457 DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar)); \
458 return *(StatusVar); \
463 #define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen, PrevMode, StatusVar) \
466 /* get the preferred alignment for the information class or return */ \
467 /* default alignment in case the class doesn't exist */ \
468 GetInfoClassAlignment(Class, \
473 /* probe the ENTIRE buffers and return on failure */ \
474 ProbeSetInfoBuffer(Buffer, \
480 /* validate information class index and check buffer size */ \
481 CheckInfoClass(Class, \
488 #define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer, BufferLen, RetLen, PrevMode, StatusVar) \
491 /* get the preferred alignment for the information class or return */ \
492 /* alignment in case the class doesn't exist */ \
493 GetInfoClassAlignment(Class, \
498 /* probe the ENTIRE buffers and return on failure */ \
499 ProbeQueryInfoBuffer(Buffer, \
506 /* validate information class index and check buffer size */ \
507 CheckInfoClass(Class, \
514 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */