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 enum _OB_OPEN_REASON
30 (STDCALL
*OB_CREATE_METHOD
)(
34 struct _OBJECT_ATTRIBUTES
* ObjectAttributes
);
36 /* Object Callbacks */
38 (STDCALL
*OB_OPEN_METHOD
)(
39 OB_OPEN_REASON Reason
,
43 ACCESS_MASK GrantedAccess
);
46 (STDCALL
*OB_PARSE_METHOD
)(
49 PUNICODE_STRING FullPath
,
54 (STDCALL
*OB_DELETE_METHOD
)(
58 (STDCALL
*OB_CLOSE_METHOD
)(
63 (STDCALL
*OB_DUMP_METHOD
)(
67 (STDCALL
*OB_OKAYTOCLOSE_METHOD
)(
71 (STDCALL
*OB_QUERYNAME_METHOD
)(
73 POBJECT_NAME_INFORMATION ObjectNameInfo
,
78 (STDCALL
*OB_FIND_METHOD
)(
84 (STDCALL
*OB_SECURITY_METHOD
)(
86 SECURITY_OPERATION_CODE OperationCode
,
87 SECURITY_INFORMATION SecurityInformation
,
88 PSECURITY_DESCRIPTOR SecurityDescriptor
,
91 typedef struct _OBJECT_HEADER_NAME_INFO
93 struct _DIRECTORY_OBJECT
*Directory
;
95 ULONG QueryReferences
;
97 ULONG DbgReferenceCount
;
98 } OBJECT_HEADER_NAME_INFO
, *POBJECT_HEADER_NAME_INFO
;
100 typedef struct _OBJECT_CREATE_INFORMATION
103 HANDLE RootDirectory
;
105 KPROCESSOR_MODE ProbeMode
;
106 ULONG PagedPoolCharge
;
107 ULONG NonPagedPoolCharge
;
108 ULONG SecurityDescriptorCharge
;
109 PSECURITY_DESCRIPTOR SecurityDescriptor
;
110 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
111 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
112 } OBJECT_CREATE_INFORMATION
, *POBJECT_CREATE_INFORMATION
;
114 typedef struct _OBJECT_TYPE_INITIALIZER
117 UCHAR UseDefaultObject
;
118 UCHAR CaseInsensitive
;
119 ULONG InvalidAttributes
;
120 GENERIC_MAPPING GenericMapping
;
121 ULONG ValidAccessMask
;
122 UCHAR SecurityRequired
;
123 UCHAR MaintainHandleCount
;
124 UCHAR MaintainTypeList
;
126 ULONG DefaultPagedPoolCharge
;
127 ULONG DefaultNonPagedPoolCharge
;
128 OB_DUMP_METHOD DumpProcedure
;
129 OB_OPEN_METHOD OpenProcedure
;
130 OB_CLOSE_METHOD CloseProcedure
;
131 OB_DELETE_METHOD DeleteProcedure
;
132 OB_PARSE_METHOD ParseProcedure
;
133 OB_SECURITY_METHOD SecurityProcedure
;
134 OB_QUERYNAME_METHOD QueryNameProcedure
;
135 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure
;
136 } OBJECT_TYPE_INITIALIZER
, *POBJECT_TYPE_INITIALIZER
;
138 typedef struct _OBJECT_TYPE
140 ERESOURCE Mutex
; /* Used to lock the Object Type */
141 LIST_ENTRY TypeList
; /* Links all the Types Together for Debugging */
142 UNICODE_STRING Name
; /* Name of the Type */
143 PVOID DefaultObject
; /* What Object to use during a Wait (ie, FileObjects wait on FileObject->Event) */
144 ULONG Index
; /* Index of this Type in the Object Directory */
145 ULONG TotalNumberOfObjects
; /* Total number of objects of this type */
146 ULONG TotalNumberOfHandles
; /* Total number of handles of this type */
147 ULONG HighWaterNumberOfObjects
; /* Peak number of objects of this type */
148 ULONG HighWaterNumberOfHandles
; /* Peak number of handles of this type */
149 OBJECT_TYPE_INITIALIZER TypeInfo
; /* Information captured during type creation */
150 ULONG Key
; /* Key to use when allocating objects of this type */
151 ERESOURCE ObjectLocks
[4]; /* Locks for locking the Objects */
154 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
156 struct _EPROCESS
*Process
;
158 } OBJECT_HANDLE_COUNT_ENTRY
, *POBJECT_HANDLE_COUNT_ENTRY
;
160 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
163 POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries
[1];
164 } OBJECT_HANDLE_COUNT_DATABASE
, *POBJECT_HANDLE_COUNT_DATABASE
;
166 typedef struct _OBJECT_HEADER_HANDLE_INFO
169 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase
;
170 OBJECT_HANDLE_COUNT_ENTRY SingleEntry
;
172 } OBJECT_HEADER_HANDLE_INFO
, *POBJECT_HEADER_HANDLE_INFO
;
174 typedef struct _OBJECT_HEADER_CREATOR_INFO
177 PVOID CreatorUniqueProcess
;
178 USHORT CreatorBackTraceIndex
;
180 } OBJECT_HEADER_CREATOR_INFO
, *POBJECT_HEADER_CREATOR_INFO
;
182 typedef PVOID POBJECT
;
187 LONGLONG UseThisFieldToCopy
;
188 float DoNotUseThisField
;
192 #define OB_FLAG_CREATE_INFO 0x01 // has OBJECT_CREATE_INFO
193 #define OB_FLAG_KERNEL_MODE 0x02 // created by kernel
194 #define OB_FLAG_CREATOR_INFO 0x04 // has OBJECT_CREATOR_INFO
195 #define OB_FLAG_EXCLUSIVE 0x08 // OBJ_EXCLUSIVE
196 #define OB_FLAG_PERMANENT 0x10 // OBJ_PERMANENT
197 #define OB_FLAG_SECURITY 0x20 // has security descriptor
198 #define OB_FLAG_SINGLE_PROCESS 0x40 // no HandleDBList
200 /* Will be moved to public headers once "Entry" is gone */
201 typedef struct _OBJECT_HEADER
210 UCHAR NameInfoOffset
;
211 UCHAR HandleInfoOffset
;
212 UCHAR QuotaInfoOffset
;
215 POBJECT_CREATE_INFORMATION ObjectCreateInfo
;
216 PVOID QuotaBlockCharged
;
218 PSECURITY_DESCRIPTOR SecurityDescriptor
;
220 } OBJECT_HEADER
, *POBJECT_HEADER
;
222 typedef struct _DIRECTORY_OBJECT
228 * PURPOSE: Head of the list of our subdirectories
232 } DIRECTORY_OBJECT
, *PDIRECTORY_OBJECT
;
234 typedef struct _SYMLINK_OBJECT
238 UNICODE_STRING TargetName
;
239 LARGE_INTEGER CreateTime
;
240 } SYMLINK_OBJECT
, *PSYMLINK_OBJECT
;
243 * Enumeration of object types
259 #define BODY_TO_HEADER(objbdy) \
260 CONTAINING_RECORD((objbdy), OBJECT_HEADER, Body)
262 #define HEADER_TO_OBJECT_NAME(objhdr) ((POBJECT_HEADER_NAME_INFO) \
263 (!(objhdr)->NameInfoOffset ? NULL: ((PCHAR)(objhdr) - (objhdr)->NameInfoOffset)))
265 #define HEADER_TO_HANDLE_INFO(objhdr) ((POBJECT_HEADER_HANDLE_INFO) \
266 (!(objhdr)->HandleInfoOffset ? NULL: ((PCHAR)(objhdr) - (objhdr)->HandleInfoOffset)))
268 #define HEADER_TO_CREATOR_INFO(objhdr) ((POBJECT_HEADER_CREATOR_INFO) \
269 (!((objhdr)->Flags & OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(objhdr) - sizeof(OBJECT_HEADER_CREATOR_INFO))))
271 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER))
273 #define HANDLE_TO_EX_HANDLE(handle) \
274 (LONG)(((LONG)(handle) >> 2) - 1)
275 #define EX_HANDLE_TO_HANDLE(exhandle) \
276 (HANDLE)(((exhandle) + 1) << 2)
278 extern PDIRECTORY_OBJECT NameSpaceRoot
;
279 extern POBJECT_TYPE ObSymbolicLinkType
;
280 extern PHANDLE_TABLE ObpKernelHandleTable
;
282 #define KERNEL_HANDLE_FLAG (1 << ((sizeof(HANDLE) * 8) - 1))
283 #define ObIsKernelHandle(Handle, ProcessorMode) \
284 (((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
285 ((ProcessorMode) == KernelMode))
286 #define ObKernelHandleToHandle(Handle) \
287 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
289 VOID
ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent
,
290 POBJECT_HEADER Header
,
292 VOID
ObpRemoveEntryDirectory(POBJECT_HEADER Header
);
295 ObInitSymbolicLinkImplementation(VOID
);
298 NTSTATUS
ObpCreateHandle(struct _EPROCESS
* Process
,
300 ACCESS_MASK GrantedAccess
,
303 VOID
ObCreateHandleTable(struct _EPROCESS
* Parent
,
305 struct _EPROCESS
* Process
);
306 NTSTATUS
ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
307 PUNICODE_STRING ObjectName
,
308 PVOID
* ReturnedObject
,
309 PUNICODE_STRING RemainingPath
,
310 POBJECT_TYPE ObjectType
);
313 ObpQueryHandleAttributes(HANDLE Handle
,
314 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
317 ObpSetHandleAttributes(HANDLE Handle
,
318 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
);
322 ObpCreateTypeObject(struct _OBJECT_TYPE_INITIALIZER
*ObjectTypeInitializer
,
323 PUNICODE_STRING TypeName
,
324 POBJECT_TYPE
*ObjectType
);
327 ObGetObjectHandleCount(PVOID Object
);
329 ObDuplicateObject(PEPROCESS SourceProcess
,
330 PEPROCESS TargetProcess
,
332 PHANDLE TargetHandle
,
333 ACCESS_MASK DesiredAccess
,
334 BOOLEAN InheritHandle
,
338 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable
);
342 ObQueryDeviceMapInformation(PEPROCESS Process
, PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
);
345 ObpSetPermanentObject (IN PVOID ObjectBody
, IN BOOLEAN Permanent
);
349 ObKillProcess(PEPROCESS Process
);
350 /* Security descriptor cache functions */
353 ObpInitSdCache(VOID
);
356 ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD
,
357 OUT PSECURITY_DESCRIPTOR
*DestinationSD
);
360 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
363 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
366 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
370 ObInitializeFastReference(IN PEX_FAST_REF FastRef
,
375 ObFastReplaceObject(IN PEX_FAST_REF FastRef
,
380 ObFastReferenceObject(IN PEX_FAST_REF FastRef
);
384 ObFastDereferenceObject(IN PEX_FAST_REF FastRef
,
387 /* Secure object information functions */
389 typedef struct _CAPTURED_OBJECT_ATTRIBUTES
391 HANDLE RootDirectory
;
393 PSECURITY_DESCRIPTOR SecurityDescriptor
;
394 PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
395 } CAPTURED_OBJECT_ATTRIBUTES
, *PCAPTURED_OBJECT_ATTRIBUTES
;
399 ObpCaptureObjectName(IN PUNICODE_STRING CapturedName
,
400 IN PUNICODE_STRING ObjectName
,
401 IN KPROCESSOR_MODE AccessMode
);
405 ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes
,
406 IN KPROCESSOR_MODE AccessMode
,
407 IN POBJECT_TYPE ObjectType
,
408 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
,
409 OUT PUNICODE_STRING ObjectName
);
413 ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
);
415 /* object information classes */
417 #define ICIF_QUERY 0x1
419 #define ICIF_QUERY_SIZE_VARIABLE 0x4
420 #define ICIF_SET_SIZE_VARIABLE 0x8
421 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
423 typedef struct _INFORMATION_CLASS_INFO
425 ULONG RequiredSizeQUERY
;
426 ULONG RequiredSizeSET
;
428 ULONG AlignmentQUERY
;
430 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
432 #define ICI_SQ_SAME(Size, Alignment, Flags) \
433 { Size, Size, Alignment, Alignment, Flags }
435 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
436 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
438 #define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode) \
440 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
442 if(!(ClassList[Class].Flags & ICIF_##Mode)) \
444 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
446 else if(ClassList[Class].RequiredSize##Mode > 0 && \
447 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
449 if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \
450 (BufferLen) != ClassList[Class].RequiredSize##Mode) \
452 *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \
458 *(StatusVar) = STATUS_INVALID_INFO_CLASS; \
463 #define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode) \
465 if((Class) >= 0 && (Class) < sizeof(ClassList) / sizeof(ClassList[0])) \
467 *(AlignmentVar) = ClassList[Class].Alignment##Mode; \
471 *(AlignmentVar) = sizeof(ULONG); \
475 #define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen, PrevMode, StatusVar) \
477 if(PrevMode == UserMode) \
481 ProbeForWrite(Buffer, \
486 ProbeForWrite(RetLen, \
493 *(StatusVar) = _SEH_GetExceptionCode(); \
497 if(!NT_SUCCESS(*(StatusVar))) \
499 DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar)); \
500 return *(StatusVar); \
505 #define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode, StatusVar) \
507 if(PrevMode == UserMode) \
511 ProbeForRead(Buffer, \
517 *(StatusVar) = _SEH_GetExceptionCode(); \
521 if(!NT_SUCCESS(*(StatusVar))) \
523 DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar)); \
524 return *(StatusVar); \
529 #define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen, PrevMode, StatusVar) \
532 /* get the preferred alignment for the information class or return */ \
533 /* default alignment in case the class doesn't exist */ \
534 GetInfoClassAlignment(Class, \
539 /* probe the ENTIRE buffers and return on failure */ \
540 ProbeSetInfoBuffer(Buffer, \
546 /* validate information class index and check buffer size */ \
547 CheckInfoClass(Class, \
554 #define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer, BufferLen, RetLen, PrevMode, StatusVar) \
557 /* get the preferred alignment for the information class or return */ \
558 /* alignment in case the class doesn't exist */ \
559 GetInfoClassAlignment(Class, \
564 /* probe the ENTIRE buffers and return on failure */ \
565 ProbeQueryInfoBuffer(Buffer, \
572 /* validate information class index and check buffer size */ \
573 CheckInfoClass(Class, \
580 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */