[CMAKE]
[reactos.git] / include / ndk / obtypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 obtypes.h
8
9 Abstract:
10
11 Type definitions for the Object Manager
12
13 Author:
14
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16
17 --*/
18
19 #ifndef _OBTYPES_H
20 #define _OBTYPES_H
21
22 //
23 // Dependencies
24 //
25 #include <umtypes.h>
26 #ifndef NTOS_MODE_USER
27 #include <extypes.h>
28 #endif
29
30 #ifdef NTOS_MODE_USER
31 //
32 // Definitions for Object Creation
33 //
34 #define OBJ_INHERIT 0x00000002L
35 #define OBJ_PERMANENT 0x00000010L
36 #define OBJ_EXCLUSIVE 0x00000020L
37 #define OBJ_CASE_INSENSITIVE 0x00000040L
38 #define OBJ_OPENIF 0x00000080L
39 #define OBJ_OPENLINK 0x00000100L
40 #define OBJ_KERNEL_HANDLE 0x00000200L
41 #define OBJ_FORCE_ACCESS_CHECK 0x00000400L
42 #define OBJ_VALID_ATTRIBUTES 0x000007F2L
43
44 #define InitializeObjectAttributes(p,n,a,r,s) { \
45 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
46 (p)->RootDirectory = (r); \
47 (p)->Attributes = (a); \
48 (p)->ObjectName = (n); \
49 (p)->SecurityDescriptor = (s); \
50 (p)->SecurityQualityOfService = NULL; \
51 }
52
53 //
54 // Number of custom-defined bits that can be attached to a handle
55 //
56 #define OBJ_HANDLE_TAGBITS 0x3
57
58 //
59 // Directory Object Access Rights
60 //
61 #define DIRECTORY_QUERY 0x0001
62 #define DIRECTORY_TRAVERSE 0x0002
63 #define DIRECTORY_CREATE_OBJECT 0x0004
64 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
65 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
66
67 //
68 // Slash separator used in the OB Namespace (and Registry)
69 //
70 #define OBJ_NAME_PATH_SEPARATOR L'\\'
71
72 //
73 // Object Information Classes for NtQueryInformationObject
74 //
75 typedef enum _OBJECT_INFORMATION_CLASS
76 {
77 ObjectBasicInformation,
78 ObjectNameInformation,
79 ObjectTypeInformation,
80 ObjectTypesInformation,
81 ObjectHandleFlagInformation,
82 ObjectSessionInformation,
83 MaxObjectInfoClass
84 } OBJECT_INFORMATION_CLASS;
85
86 #else
87
88 //
89 // Object Flags
90 //
91 #define OB_FLAG_CREATE_INFO 0x01
92 #define OB_FLAG_KERNEL_MODE 0x02
93 #define OB_FLAG_CREATOR_INFO 0x04
94 #define OB_FLAG_EXCLUSIVE 0x08
95 #define OB_FLAG_PERMANENT 0x10
96 #define OB_FLAG_SECURITY 0x20
97 #define OB_FLAG_SINGLE_PROCESS 0x40
98 #define OB_FLAG_DEFER_DELETE 0x80
99
100 #define OBJECT_TO_OBJECT_HEADER(o) \
101 CONTAINING_RECORD((o), OBJECT_HEADER, Body)
102
103 #define OBJECT_HEADER_TO_NAME_INFO(h) \
104 ((POBJECT_HEADER_NAME_INFO)(!(h)->NameInfoOffset ? \
105 NULL: ((PCHAR)(h) - (h)->NameInfoOffset)))
106
107 #define OBJECT_HEADER_TO_HANDLE_INFO(h) \
108 ((POBJECT_HEADER_HANDLE_INFO)(!(h)->HandleInfoOffset ? \
109 NULL: ((PCHAR)(h) - (h)->HandleInfoOffset)))
110
111 #define OBJECT_HEADER_TO_QUOTA_INFO(h) \
112 ((POBJECT_HEADER_QUOTA_INFO)(!(h)->QuotaInfoOffset ? \
113 NULL: ((PCHAR)(h) - (h)->QuotaInfoOffset)))
114
115 #define OBJECT_HEADER_TO_CREATOR_INFO(h) \
116 ((POBJECT_HEADER_CREATOR_INFO)(!((h)->Flags & \
117 OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(h) - \
118 sizeof(OBJECT_HEADER_CREATOR_INFO))))
119
120 #define OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(h) \
121 ((!((h)->Flags & OB_FLAG_EXCLUSIVE)) ? \
122 NULL: (((POBJECT_HEADER_QUOTA_INFO)((PCHAR)(h) - \
123 (h)->QuotaInfoOffset))->ExclusiveProcess))
124
125 //
126 // Reasons for Open Callback
127 //
128 typedef enum _OB_OPEN_REASON
129 {
130 ObCreateHandle,
131 ObOpenHandle,
132 ObDuplicateHandle,
133 ObInheritHandle,
134 ObMaxOpenReason
135 } OB_OPEN_REASON;
136
137 #endif
138
139 //
140 // Object Duplication Flags
141 //
142 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
143
144 //
145 // Number of hash entries in an Object Directory
146 //
147 #define NUMBER_HASH_BUCKETS 37
148
149 //
150 // Types for DosDeviceDriveType
151 //
152 #define DOSDEVICE_DRIVE_UNKNOWN 0
153 #define DOSDEVICE_DRIVE_CALCULATE 1
154 #define DOSDEVICE_DRIVE_REMOVABLE 2
155 #define DOSDEVICE_DRIVE_FIXED 3
156 #define DOSDEVICE_DRIVE_REMOTE 4
157 #define DOSDEVICE_DRIVE_CDROM 5
158 #define DOSDEVICE_DRIVE_RAMDISK 6
159
160 //
161 // Dump Control Structure for Object Debugging
162 //
163 typedef struct _OB_DUMP_CONTROL
164 {
165 PVOID Stream;
166 ULONG Detail;
167 } OB_DUMP_CONTROL, *POB_DUMP_CONTROL;
168
169 #ifndef NTOS_MODE_USER
170
171 //
172 // Object Type Callbacks
173 //
174 typedef VOID
175 (NTAPI *OB_DUMP_METHOD)(
176 IN PVOID Object,
177 IN POB_DUMP_CONTROL Control OPTIONAL
178 );
179
180 typedef NTSTATUS
181 (NTAPI *OB_OPEN_METHOD)(
182 IN OB_OPEN_REASON Reason,
183 IN PEPROCESS Process OPTIONAL,
184 IN PVOID ObjectBody,
185 IN ACCESS_MASK GrantedAccess,
186 IN ULONG HandleCount
187 );
188
189 typedef VOID
190 (NTAPI *OB_CLOSE_METHOD)(
191 IN PEPROCESS Process OPTIONAL,
192 IN PVOID Object,
193 IN ACCESS_MASK GrantedAccess,
194 IN ULONG ProcessHandleCount,
195 IN ULONG SystemHandleCount
196 );
197
198 typedef VOID
199 (NTAPI *OB_DELETE_METHOD)(
200 IN PVOID Object
201 );
202
203 typedef NTSTATUS
204 (NTAPI *OB_PARSE_METHOD)(
205 IN PVOID ParseObject,
206 IN PVOID ObjectType,
207 IN OUT PACCESS_STATE AccessState,
208 IN KPROCESSOR_MODE AccessMode,
209 IN ULONG Attributes,
210 IN OUT PUNICODE_STRING CompleteName,
211 IN OUT PUNICODE_STRING RemainingName,
212 IN OUT PVOID Context OPTIONAL,
213 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
214 OUT PVOID *Object
215 );
216
217 typedef NTSTATUS
218 (NTAPI *OB_SECURITY_METHOD)(
219 IN PVOID Object,
220 IN SECURITY_OPERATION_CODE OperationType,
221 IN PSECURITY_INFORMATION SecurityInformation,
222 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
223 IN OUT PULONG CapturedLength,
224 IN OUT PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor,
225 IN POOL_TYPE PoolType,
226 IN PGENERIC_MAPPING GenericMapping
227 );
228
229 typedef NTSTATUS
230 (NTAPI *OB_QUERYNAME_METHOD)(
231 IN PVOID Object,
232 IN BOOLEAN HasObjectName,
233 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
234 IN ULONG Length,
235 OUT PULONG ReturnLength,
236 IN KPROCESSOR_MODE AccessMode
237 );
238
239 typedef NTSTATUS
240 (NTAPI *OB_OKAYTOCLOSE_METHOD)(
241 IN PEPROCESS Process OPTIONAL,
242 IN PVOID Object,
243 IN HANDLE Handle,
244 IN KPROCESSOR_MODE AccessMode
245 );
246
247 #else
248
249 //
250 // Object Information Types for NtQueryInformationObject
251 //
252 typedef struct _OBJECT_NAME_INFORMATION
253 {
254 UNICODE_STRING Name;
255 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
256
257 #endif
258
259 typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION
260 {
261 BOOLEAN Inherit;
262 BOOLEAN ProtectFromClose;
263 } OBJECT_HANDLE_ATTRIBUTE_INFORMATION, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION;
264
265 typedef struct _OBJECT_DIRECTORY_INFORMATION
266 {
267 UNICODE_STRING Name;
268 UNICODE_STRING TypeName;
269 } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
270
271 //
272 // Object Type Information
273 //
274 typedef struct _OBJECT_TYPE_INFORMATION
275 {
276 UNICODE_STRING TypeName;
277 ULONG TotalNumberOfObjects;
278 ULONG TotalNumberOfHandles;
279 ULONG TotalPagedPoolUsage;
280 ULONG TotalNonPagedPoolUsage;
281 ULONG TotalNamePoolUsage;
282 ULONG TotalHandleTableUsage;
283 ULONG HighWaterNumberOfObjects;
284 ULONG HighWaterNumberOfHandles;
285 ULONG HighWaterPagedPoolUsage;
286 ULONG HighWaterNonPagedPoolUsage;
287 ULONG HighWaterNamePoolUsage;
288 ULONG HighWaterHandleTableUsage;
289 ULONG InvalidAttributes;
290 GENERIC_MAPPING GenericMapping;
291 ULONG ValidAccessMask;
292 BOOLEAN SecurityRequired;
293 BOOLEAN MaintainHandleCount;
294 ULONG PoolType;
295 ULONG DefaultPagedPoolCharge;
296 ULONG DefaultNonPagedPoolCharge;
297 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
298
299 typedef struct _OBJECT_ALL_TYPES_INFORMATION
300 {
301 ULONG NumberOfTypes;
302 //OBJECT_TYPE_INFORMATION TypeInformation[1];
303 } OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION;
304
305 #ifdef NTOS_MODE_USER
306
307 typedef struct _OBJECT_BASIC_INFORMATION
308 {
309 ULONG Attributes;
310 ACCESS_MASK GrantedAccess;
311 ULONG HandleCount;
312 ULONG PointerCount;
313 ULONG PagedPoolUsage;
314 ULONG NonPagedPoolUsage;
315 ULONG Reserved[3];
316 ULONG NameInformationLength;
317 ULONG TypeInformationLength;
318 ULONG SecurityDescriptorLength;
319 LARGE_INTEGER CreateTime;
320 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
321
322 #else
323
324 typedef struct _OBJECT_CREATE_INFORMATION
325 {
326 ULONG Attributes;
327 HANDLE RootDirectory;
328 PVOID ParseContext;
329 KPROCESSOR_MODE ProbeMode;
330 ULONG PagedPoolCharge;
331 ULONG NonPagedPoolCharge;
332 ULONG SecurityDescriptorCharge;
333 PSECURITY_DESCRIPTOR SecurityDescriptor;
334 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
335 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
336 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
337
338 //
339 // Object Type Initialize for ObCreateObjectType
340 //
341 typedef struct _OBJECT_TYPE_INITIALIZER
342 {
343 USHORT Length;
344 BOOLEAN UseDefaultObject;
345 BOOLEAN CaseInsensitive;
346 ULONG InvalidAttributes;
347 GENERIC_MAPPING GenericMapping;
348 ULONG ValidAccessMask;
349 BOOLEAN SecurityRequired;
350 BOOLEAN MaintainHandleCount;
351 BOOLEAN MaintainTypeList;
352 POOL_TYPE PoolType;
353 ULONG DefaultPagedPoolCharge;
354 ULONG DefaultNonPagedPoolCharge;
355 OB_DUMP_METHOD DumpProcedure;
356 OB_OPEN_METHOD OpenProcedure;
357 OB_CLOSE_METHOD CloseProcedure;
358 OB_DELETE_METHOD DeleteProcedure;
359 OB_PARSE_METHOD ParseProcedure;
360 OB_SECURITY_METHOD SecurityProcedure;
361 OB_QUERYNAME_METHOD QueryNameProcedure;
362 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
363 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
364
365 //
366 // Object Type Object
367 //
368 typedef struct _OBJECT_TYPE
369 {
370 ERESOURCE Mutex;
371 LIST_ENTRY TypeList;
372 UNICODE_STRING Name;
373 PVOID DefaultObject;
374 ULONG Index;
375 ULONG TotalNumberOfObjects;
376 ULONG TotalNumberOfHandles;
377 ULONG HighWaterNumberOfObjects;
378 ULONG HighWaterNumberOfHandles;
379 OBJECT_TYPE_INITIALIZER TypeInfo;
380 ULONG Key;
381 ERESOURCE ObjectLocks[4];
382 } OBJECT_TYPE;
383
384 //
385 // Object Directory Structures
386 //
387 typedef struct _OBJECT_DIRECTORY_ENTRY
388 {
389 struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
390 PVOID Object;
391 #if (NTDDI_VERSION >= NTDDI_WS03)
392 ULONG HashValue;
393 #endif
394 } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
395
396 typedef struct _OBJECT_DIRECTORY
397 {
398 struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
399 #if (NTDDI_VERSION < NTDDI_WINXP)
400 ERESOURCE Lock;
401 #else
402 EX_PUSH_LOCK Lock;
403 #endif
404 #if (NTDDI_VERSION < NTDDI_WINXP)
405 BOOLEAN CurrentEntryValid;
406 #else
407 struct _DEVICE_MAP *DeviceMap;
408 #endif
409 ULONG SessionId;
410 #if (NTDDI_VERSION == NTDDI_WINXP)
411 USHORT Reserved;
412 USHORT SymbolicLinkUsageCount;
413 #endif
414 } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
415
416 //
417 // Object Header Addon Information
418 //
419 typedef struct _OBJECT_HEADER_NAME_INFO
420 {
421 POBJECT_DIRECTORY Directory;
422 UNICODE_STRING Name;
423 ULONG QueryReferences;
424 ULONG Reserved2;
425 ULONG DbgReferenceCount;
426 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
427
428 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
429 {
430 struct _EPROCESS *Process;
431 ULONG HandleCount;
432 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
433
434 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
435 {
436 ULONG CountEntries;
437 OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
438 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
439
440 typedef struct _OBJECT_HEADER_HANDLE_INFO
441 {
442 union
443 {
444 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
445 OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
446 };
447 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
448
449 typedef struct _OBJECT_HEADER_CREATOR_INFO
450 {
451 LIST_ENTRY TypeList;
452 PVOID CreatorUniqueProcess;
453 USHORT CreatorBackTraceIndex;
454 USHORT Reserved;
455 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
456
457 typedef struct _OBJECT_HEADER_QUOTA_INFO
458 {
459 ULONG PagedPoolCharge;
460 ULONG NonPagedPoolCharge;
461 ULONG SecurityDescriptorCharge;
462 PEPROCESS ExclusiveProcess;
463 } OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
464
465 //
466 // Object Header
467 //
468 typedef struct _OBJECT_HEADER
469 {
470 LONG PointerCount;
471 union
472 {
473 LONG HandleCount;
474 volatile PVOID NextToFree;
475 };
476 POBJECT_TYPE Type;
477 UCHAR NameInfoOffset;
478 UCHAR HandleInfoOffset;
479 UCHAR QuotaInfoOffset;
480 UCHAR Flags;
481 union
482 {
483 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
484 PVOID QuotaBlockCharged;
485 };
486 PSECURITY_DESCRIPTOR SecurityDescriptor;
487 QUAD Body;
488 } OBJECT_HEADER, *POBJECT_HEADER;
489
490 //
491 // Object Lookup Context
492 //
493 typedef struct _OBP_LOOKUP_CONTEXT
494 {
495 POBJECT_DIRECTORY Directory;
496 PVOID Object;
497 ULONG HashValue;
498 USHORT HashIndex;
499 BOOLEAN DirectoryLocked;
500 ULONG LockStateSignature;
501 } OBP_LOOKUP_CONTEXT, *POBP_LOOKUP_CONTEXT;
502
503 //
504 // Device Map
505 //
506 typedef struct _DEVICE_MAP
507 {
508 POBJECT_DIRECTORY DosDevicesDirectory;
509 POBJECT_DIRECTORY GlobalDosDevicesDirectory;
510 ULONG ReferenceCount;
511 ULONG DriveMap;
512 UCHAR DriveType[32];
513 } DEVICE_MAP, *PDEVICE_MAP;
514
515 //
516 // Symbolic Link Object
517 //
518 typedef struct _OBJECT_SYMBOLIC_LINK
519 {
520 LARGE_INTEGER CreationTime;
521 UNICODE_STRING LinkTarget;
522 UNICODE_STRING LinkTargetRemaining;
523 PVOID LinkTargetObject;
524 ULONG DosDeviceDriveIndex;
525 } OBJECT_SYMBOLIC_LINK, *POBJECT_SYMBOLIC_LINK;
526
527 //
528 // Kernel Exports
529 //
530 extern POBJECT_TYPE NTSYSAPI ObDirectoryType;
531 extern PDEVICE_MAP NTSYSAPI ObSystemDeviceMap;
532
533 #endif // !NTOS_MODE_USER
534
535 #endif // _OBTYPES_H