3 Copyright (c) Alex Ionescu. All rights reserved.
11 Type definitions for the Object Manager
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
23 #define NTDDI_VERSION NTDDI_WS03SP1
29 #ifndef NTOS_MODE_USER
35 // Definitions for Object Creation
37 #define OBJ_INHERIT 0x00000002L
38 #define OBJ_PERMANENT 0x00000010L
39 #define OBJ_EXCLUSIVE 0x00000020L
40 #define OBJ_CASE_INSENSITIVE 0x00000040L
41 #define OBJ_OPENIF 0x00000080L
42 #define OBJ_OPENLINK 0x00000100L
43 #define OBJ_KERNEL_HANDLE 0x00000200L
44 #define OBJ_FORCE_ACCESS_CHECK 0x00000400L
45 #define OBJ_VALID_ATTRIBUTES 0x000007F2L
47 #define InitializeObjectAttributes(p,n,a,r,s) { \
48 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
49 (p)->RootDirectory = (r); \
50 (p)->Attributes = (a); \
51 (p)->ObjectName = (n); \
52 (p)->SecurityDescriptor = (s); \
53 (p)->SecurityQualityOfService = NULL; \
57 // Number of custom-defined bits that can be attached to a handle
59 #define OBJ_HANDLE_TAGBITS 0x3
62 // Directory Object Access Rights
64 #define DIRECTORY_QUERY 0x0001
65 #define DIRECTORY_TRAVERSE 0x0002
66 #define DIRECTORY_CREATE_OBJECT 0x0004
67 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
68 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
71 // Slash separator used in the OB Namespace (and Registry)
73 #define OBJ_NAME_PATH_SEPARATOR L'\\'
76 // Object Information Classes for NtQueryInformationObject
78 typedef enum _OBJECT_INFORMATION_CLASS
80 ObjectBasicInformation
,
81 ObjectNameInformation
,
82 ObjectTypeInformation
,
83 ObjectTypesInformation
,
84 ObjectHandleFlagInformation
,
85 ObjectSessionInformation
,
87 } OBJECT_INFORMATION_CLASS
;
94 #define OB_FLAG_CREATE_INFO 0x01
95 #define OB_FLAG_KERNEL_MODE 0x02
96 #define OB_FLAG_CREATOR_INFO 0x04
97 #define OB_FLAG_EXCLUSIVE 0x08
98 #define OB_FLAG_PERMANENT 0x10
99 #define OB_FLAG_SECURITY 0x20
100 #define OB_FLAG_SINGLE_PROCESS 0x40
101 #define OB_FLAG_DEFER_DELETE 0x80
103 #define OBJECT_TO_OBJECT_HEADER(o) \
104 CONTAINING_RECORD((o), OBJECT_HEADER, Body)
106 #define OBJECT_HEADER_TO_NAME_INFO(h) \
107 ((POBJECT_HEADER_NAME_INFO)(!(h)->NameInfoOffset ? \
108 NULL: ((PCHAR)(h) - (h)->NameInfoOffset)))
110 #define OBJECT_HEADER_TO_HANDLE_INFO(h) \
111 ((POBJECT_HEADER_HANDLE_INFO)(!(h)->HandleInfoOffset ? \
112 NULL: ((PCHAR)(h) - (h)->HandleInfoOffset)))
114 #define OBJECT_HEADER_TO_QUOTA_INFO(h) \
115 ((POBJECT_HEADER_QUOTA_INFO)(!(h)->QuotaInfoOffset ? \
116 NULL: ((PCHAR)(h) - (h)->QuotaInfoOffset)))
118 #define OBJECT_HEADER_TO_CREATOR_INFO(h) \
119 ((POBJECT_HEADER_CREATOR_INFO)(!((h)->Flags & \
120 OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(h) - \
121 sizeof(OBJECT_HEADER_CREATOR_INFO))))
123 #define OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(h) \
124 ((!((h)->Flags & OB_FLAG_EXCLUSIVE)) ? \
125 NULL: (((POBJECT_HEADER_QUOTA_INFO)((PCHAR)(h) - \
126 (h)->QuotaInfoOffset))->ExclusiveProcess))
129 // Reasons for Open Callback
131 typedef enum _OB_OPEN_REASON
143 // Object Duplication Flags
145 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
148 // Number of hash entries in an Object Directory
150 #define NUMBER_HASH_BUCKETS 37
153 // Types for DosDeviceDriveType
155 #define DOSDEVICE_DRIVE_UNKNOWN 0
156 #define DOSDEVICE_DRIVE_CALCULATE 1
157 #define DOSDEVICE_DRIVE_REMOVABLE 2
158 #define DOSDEVICE_DRIVE_FIXED 3
159 #define DOSDEVICE_DRIVE_REMOTE 4
160 #define DOSDEVICE_DRIVE_CDROM 5
161 #define DOSDEVICE_DRIVE_RAMDISK 6
164 // Dump Control Structure for Object Debugging
166 typedef struct _OB_DUMP_CONTROL
170 } OB_DUMP_CONTROL
, *POB_DUMP_CONTROL
;
172 #ifndef NTOS_MODE_USER
175 // Object Type Callbacks
178 (NTAPI
*OB_DUMP_METHOD
)(
180 IN POB_DUMP_CONTROL Control OPTIONAL
184 (NTAPI
*OB_OPEN_METHOD
)(
185 IN OB_OPEN_REASON Reason
,
186 IN PEPROCESS Process OPTIONAL
,
188 IN ACCESS_MASK GrantedAccess
,
193 (NTAPI
*OB_CLOSE_METHOD
)(
194 IN PEPROCESS Process OPTIONAL
,
196 IN ACCESS_MASK GrantedAccess
,
197 IN ULONG ProcessHandleCount
,
198 IN ULONG SystemHandleCount
202 (NTAPI
*OB_DELETE_METHOD
)(
207 (NTAPI
*OB_PARSE_METHOD
)(
208 IN PVOID ParseObject
,
210 IN OUT PACCESS_STATE AccessState
,
211 IN KPROCESSOR_MODE AccessMode
,
213 IN OUT PUNICODE_STRING CompleteName
,
214 IN OUT PUNICODE_STRING RemainingName
,
215 IN OUT PVOID Context OPTIONAL
,
216 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
221 (NTAPI
*OB_SECURITY_METHOD
)(
223 IN SECURITY_OPERATION_CODE OperationType
,
224 IN PSECURITY_INFORMATION SecurityInformation
,
225 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
226 IN OUT PULONG CapturedLength
,
227 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
228 IN POOL_TYPE PoolType
,
229 IN PGENERIC_MAPPING GenericMapping
233 (NTAPI
*OB_QUERYNAME_METHOD
)(
235 IN BOOLEAN HasObjectName
,
236 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
238 OUT PULONG ReturnLength
,
239 IN KPROCESSOR_MODE AccessMode
243 (NTAPI
*OB_OKAYTOCLOSE_METHOD
)(
244 IN PEPROCESS Process OPTIONAL
,
247 IN KPROCESSOR_MODE AccessMode
253 // Object Information Types for NtQueryInformationObject
255 typedef struct _OBJECT_NAME_INFORMATION
258 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
262 typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION
265 BOOLEAN ProtectFromClose
;
266 } OBJECT_HANDLE_ATTRIBUTE_INFORMATION
, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION
;
268 typedef struct _OBJECT_DIRECTORY_INFORMATION
271 UNICODE_STRING TypeName
;
272 } OBJECT_DIRECTORY_INFORMATION
, *POBJECT_DIRECTORY_INFORMATION
;
275 // Object Type Information
277 typedef struct _OBJECT_TYPE_INFORMATION
279 UNICODE_STRING TypeName
;
280 ULONG TotalNumberOfObjects
;
281 ULONG TotalNumberOfHandles
;
282 ULONG TotalPagedPoolUsage
;
283 ULONG TotalNonPagedPoolUsage
;
284 ULONG TotalNamePoolUsage
;
285 ULONG TotalHandleTableUsage
;
286 ULONG HighWaterNumberOfObjects
;
287 ULONG HighWaterNumberOfHandles
;
288 ULONG HighWaterPagedPoolUsage
;
289 ULONG HighWaterNonPagedPoolUsage
;
290 ULONG HighWaterNamePoolUsage
;
291 ULONG HighWaterHandleTableUsage
;
292 ULONG InvalidAttributes
;
293 GENERIC_MAPPING GenericMapping
;
294 ULONG ValidAccessMask
;
295 BOOLEAN SecurityRequired
;
296 BOOLEAN MaintainHandleCount
;
298 ULONG DefaultPagedPoolCharge
;
299 ULONG DefaultNonPagedPoolCharge
;
300 } OBJECT_TYPE_INFORMATION
, *POBJECT_TYPE_INFORMATION
;
302 #ifdef NTOS_MODE_USER
304 typedef struct _OBJECT_BASIC_INFORMATION
307 ACCESS_MASK GrantedAccess
;
310 ULONG PagedPoolUsage
;
311 ULONG NonPagedPoolUsage
;
313 ULONG NameInformationLength
;
314 ULONG TypeInformationLength
;
315 ULONG SecurityDescriptorLength
;
316 LARGE_INTEGER CreateTime
;
317 } OBJECT_BASIC_INFORMATION
, *POBJECT_BASIC_INFORMATION
;
321 typedef struct _OBJECT_CREATE_INFORMATION
324 HANDLE RootDirectory
;
326 KPROCESSOR_MODE ProbeMode
;
327 ULONG PagedPoolCharge
;
328 ULONG NonPagedPoolCharge
;
329 ULONG SecurityDescriptorCharge
;
330 PSECURITY_DESCRIPTOR SecurityDescriptor
;
331 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
332 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
;
333 } OBJECT_CREATE_INFORMATION
, *POBJECT_CREATE_INFORMATION
;
336 // Object Type Initialize for ObCreateObjectType
338 typedef struct _OBJECT_TYPE_INITIALIZER
341 BOOLEAN UseDefaultObject
;
342 BOOLEAN CaseInsensitive
;
343 ULONG InvalidAttributes
;
344 GENERIC_MAPPING GenericMapping
;
345 ULONG ValidAccessMask
;
346 BOOLEAN SecurityRequired
;
347 BOOLEAN MaintainHandleCount
;
348 BOOLEAN MaintainTypeList
;
350 ULONG DefaultPagedPoolCharge
;
351 ULONG DefaultNonPagedPoolCharge
;
352 OB_DUMP_METHOD DumpProcedure
;
353 OB_OPEN_METHOD OpenProcedure
;
354 OB_CLOSE_METHOD CloseProcedure
;
355 OB_DELETE_METHOD DeleteProcedure
;
356 OB_PARSE_METHOD ParseProcedure
;
357 OB_SECURITY_METHOD SecurityProcedure
;
358 OB_QUERYNAME_METHOD QueryNameProcedure
;
359 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure
;
360 } OBJECT_TYPE_INITIALIZER
, *POBJECT_TYPE_INITIALIZER
;
363 // Object Type Object
365 typedef struct _OBJECT_TYPE
372 ULONG TotalNumberOfObjects
;
373 ULONG TotalNumberOfHandles
;
374 ULONG HighWaterNumberOfObjects
;
375 ULONG HighWaterNumberOfHandles
;
376 OBJECT_TYPE_INITIALIZER TypeInfo
;
378 ERESOURCE ObjectLocks
[4];
382 // Object Directory Structures
384 typedef struct _OBJECT_DIRECTORY_ENTRY
386 struct _OBJECT_DIRECTORY_ENTRY
*ChainLink
;
388 #if (NTDDI_VERSION >= NTDDI_WS03)
391 } OBJECT_DIRECTORY_ENTRY
, *POBJECT_DIRECTORY_ENTRY
;
393 typedef struct _OBJECT_DIRECTORY
395 struct _OBJECT_DIRECTORY_ENTRY
*HashBuckets
[NUMBER_HASH_BUCKETS
];
396 #if (NTDDI_VERSION < NTDDI_WINXP)
401 #if (NTDDI_VERSION < NTDDI_WINXP)
402 BOOLEAN CurrentEntryValid
;
404 struct _DEVICE_MAP
*DeviceMap
;
407 #if (NTDDI_VERSION == NTDDI_WINXP)
409 USHORT SymbolicLinkUsageCount
;
411 } OBJECT_DIRECTORY
, *POBJECT_DIRECTORY
;
414 // Object Header Addon Information
416 typedef struct _OBJECT_HEADER_NAME_INFO
418 POBJECT_DIRECTORY Directory
;
420 ULONG QueryReferences
;
422 ULONG DbgReferenceCount
;
423 } OBJECT_HEADER_NAME_INFO
, *POBJECT_HEADER_NAME_INFO
;
425 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
427 struct _EPROCESS
*Process
;
429 } OBJECT_HANDLE_COUNT_ENTRY
, *POBJECT_HANDLE_COUNT_ENTRY
;
431 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
434 OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries
[1];
435 } OBJECT_HANDLE_COUNT_DATABASE
, *POBJECT_HANDLE_COUNT_DATABASE
;
437 typedef struct _OBJECT_HEADER_HANDLE_INFO
441 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase
;
442 OBJECT_HANDLE_COUNT_ENTRY SingleEntry
;
444 } OBJECT_HEADER_HANDLE_INFO
, *POBJECT_HEADER_HANDLE_INFO
;
446 typedef struct _OBJECT_HEADER_CREATOR_INFO
449 PVOID CreatorUniqueProcess
;
450 USHORT CreatorBackTraceIndex
;
452 } OBJECT_HEADER_CREATOR_INFO
, *POBJECT_HEADER_CREATOR_INFO
;
454 typedef struct _OBJECT_HEADER_QUOTA_INFO
456 ULONG PagedPoolCharge
;
457 ULONG NonPagedPoolCharge
;
458 ULONG SecurityDescriptorCharge
;
459 PEPROCESS ExclusiveProcess
;
460 } OBJECT_HEADER_QUOTA_INFO
, *POBJECT_HEADER_QUOTA_INFO
;
465 typedef struct _OBJECT_HEADER
471 volatile PVOID NextToFree
;
474 UCHAR NameInfoOffset
;
475 UCHAR HandleInfoOffset
;
476 UCHAR QuotaInfoOffset
;
480 POBJECT_CREATE_INFORMATION ObjectCreateInfo
;
481 PVOID QuotaBlockCharged
;
483 PSECURITY_DESCRIPTOR SecurityDescriptor
;
485 } OBJECT_HEADER
, *POBJECT_HEADER
;
488 // Object Lookup Context
490 typedef struct _OBP_LOOKUP_CONTEXT
492 POBJECT_DIRECTORY Directory
;
496 BOOLEAN DirectoryLocked
;
497 ULONG LockStateSignature
;
498 } OBP_LOOKUP_CONTEXT
, *POBP_LOOKUP_CONTEXT
;
503 typedef struct _DEVICE_MAP
505 POBJECT_DIRECTORY DosDevicesDirectory
;
506 POBJECT_DIRECTORY GlobalDosDevicesDirectory
;
507 ULONG ReferenceCount
;
510 } DEVICE_MAP
, *PDEVICE_MAP
;
513 // Symbolic Link Object
515 typedef struct _OBJECT_SYMBOLIC_LINK
517 LARGE_INTEGER CreationTime
;
518 UNICODE_STRING LinkTarget
;
519 UNICODE_STRING LinkTargetRemaining
;
520 PVOID LinkTargetObject
;
521 ULONG DosDeviceDriveIndex
;
522 } OBJECT_SYMBOLIC_LINK
, *POBJECT_SYMBOLIC_LINK
;
527 extern POBJECT_TYPE NTSYSAPI ObDirectoryType
;
528 extern PDEVICE_MAP NTSYSAPI ObSystemDeviceMap
;
530 #endif // !NTOS_MODE_USER