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
232 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
235 extern PDIRECTORY_OBJECT NameSpaceRoot
;
236 extern POBJECT_TYPE ObSymbolicLinkType
;
239 POBJECT_HEADER
BODY_TO_HEADER(PVOID body
);
240 PVOID
HEADER_TO_BODY(POBJECT_HEADER obj
);
242 VOID
ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent
,
243 POBJECT_HEADER Header
,
245 VOID
ObpRemoveEntryDirectory(POBJECT_HEADER Header
);
248 ObInitSymbolicLinkImplementation(VOID
);
251 NTSTATUS
ObCreateHandle(struct _EPROCESS
* Process
,
253 ACCESS_MASK GrantedAccess
,
256 VOID
ObCreateHandleTable(struct _EPROCESS
* Parent
,
258 struct _EPROCESS
* Process
);
259 NTSTATUS
ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes
,
260 PVOID
* ReturnedObject
,
261 PUNICODE_STRING RemainingPath
,
262 POBJECT_TYPE ObjectType
);
263 VOID
ObCloseAllHandles(struct _EPROCESS
* Process
);
264 VOID
ObDeleteHandleTable(struct _EPROCESS
* Process
);
267 ObDeleteHandle(PEPROCESS Process
,
272 ObpQueryHandleAttributes(HANDLE Handle
,
273 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
276 ObpSetHandleAttributes(HANDLE Handle
,
277 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
280 ObpCreateTypeObject(POBJECT_TYPE ObjectType
);
283 ObGetObjectHandleCount(PVOID Object
);
285 ObDuplicateObject(PEPROCESS SourceProcess
,
286 PEPROCESS TargetProcess
,
288 PHANDLE TargetHandle
,
289 ACCESS_MASK DesiredAccess
,
290 BOOLEAN InheritHandle
,
294 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable
);
298 ObQueryDeviceMapInformation(PEPROCESS Process
, PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
);
301 ObpSetPermanentObject (IN PVOID ObjectBody
, IN BOOLEAN Permanent
);
304 /* Security descriptor cache functions */
307 ObpInitSdCache(VOID
);
310 ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD
,
311 OUT PSECURITY_DESCRIPTOR
*DestinationSD
);
314 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
317 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
320 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
322 /* Secure object information functions */
324 typedef struct _CAPTURED_OBJECT_ATTRIBUTES
326 HANDLE RootDirectory
;
328 PSECURITY_DESCRIPTOR SecurityDescriptor
;
329 PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
330 } CAPTURED_OBJECT_ATTRIBUTES
, *PCAPTURED_OBJECT_ATTRIBUTES
;
333 ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
334 IN KPROCESSOR_MODE AccessMode
,
335 IN POOL_TYPE PoolType
,
336 IN BOOLEAN CaptureIfKernel
,
337 OUT PCAPTURED_OBJECT_ATTRIBUTES CapturedObjectAttributes OPTIONAL
,
338 OUT PUNICODE_STRING ObjectName OPTIONAL
);
341 ObpReleaseObjectAttributes(IN PCAPTURED_OBJECT_ATTRIBUTES CapturedObjectAttributes OPTIONAL
,
342 IN PUNICODE_STRING ObjectName OPTIONAL
,
343 IN KPROCESSOR_MODE AccessMode
,
344 IN BOOLEAN CaptureIfKernel
);
346 /* object information classes */
348 #define ICIF_QUERY 0x1
350 #define ICIF_QUERY_SIZE_VARIABLE 0x4
351 #define ICIF_SET_SIZE_VARIABLE 0x8
352 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
354 typedef struct _INFORMATION_CLASS_INFO
356 ULONG RequiredSizeQUERY
;
357 ULONG RequiredSizeSET
;
359 ULONG AlignmentQUERY
;
361 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
363 #define ICI_SQ_SAME(Size, Alignment, Flags) \
364 { Size, Size, Alignment, Alignment, Flags }
366 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
367 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
369 #define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode) \
371 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
373 if(!(ClassList[Class].Flags & ICIF_##Mode)) \
375 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
377 else if(ClassList[Class].RequiredSize##Mode > 0 && \
378 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
380 if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \
381 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
383 *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \
389 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
394 #define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode) \
396 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
398 *(AlignmentVar) = ClassList[Class].Alignment##Mode; \
402 *(AlignmentVar) = sizeof(ULONG); \
406 #define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen, PrevMode, StatusVar) \
408 if(PrevMode == UserMode) \
412 ProbeForWrite(Buffer, \
417 ProbeForWrite(RetLen, \
424 *(StatusVar) = _SEH_GetExceptionCode(); \
428 if(!NT_SUCCESS(*(StatusVar))) \
430 DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar)); \
431 return *(StatusVar); \
436 #define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode, StatusVar) \
438 if(PrevMode == UserMode) \
442 ProbeForRead(Buffer, \
448 *(StatusVar) = _SEH_GetExceptionCode(); \
452 if(!NT_SUCCESS(*(StatusVar))) \
454 DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar)); \
455 return *(StatusVar); \
460 #define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen, PrevMode, StatusVar) \
463 /* get the preferred alignment for the information class or return */ \
464 /* default alignment in case the class doesn't exist */ \
465 GetInfoClassAlignment(Class, \
470 /* probe the ENTIRE buffers and return on failure */ \
471 ProbeSetInfoBuffer(Buffer, \
477 /* validate information class index and check buffer size */ \
478 CheckInfoClass(Class, \
485 #define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer, BufferLen, RetLen, PrevMode, StatusVar) \
488 /* get the preferred alignment for the information class or return */ \
489 /* alignment in case the class doesn't exist */ \
490 GetInfoClassAlignment(Class, \
495 /* probe the ENTIRE buffers and return on failure */ \
496 ProbeQueryInfoBuffer(Buffer, \
503 /* validate information class index and check buffer size */ \
504 CheckInfoClass(Class, \
511 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */