A couple of header fixes to get all the FreeLDR-loaded boot drivers to compile and...
[reactos.git] / reactos / 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 #undef NTDDI_VERSION
23 #define NTDDI_VERSION NTDDI_WS03SP1
24
25 //
26 // Dependencies
27 //
28 #include <umtypes.h>
29 #ifndef NTOS_MODE_USER
30 #include <extypes.h>
31 #endif
32
33 #ifdef NTOS_MODE_USER
34 //
35 // Definitions for Object Creation
36 //
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
46
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; \
54 }
55
56 //
57 // Number of custom-defined bits that can be attached to a handle
58 //
59 #define OBJ_HANDLE_TAGBITS 0x3
60
61 //
62 // Directory Object Access Rights
63 //
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)
69
70 //
71 // Slash separator used in the OB Namespace (and Registry)
72 //
73 #define OBJ_NAME_PATH_SEPARATOR L'\\'
74
75 //
76 // Object Information Classes for NtQueryInformationObject
77 //
78 typedef enum _OBJECT_INFORMATION_CLASS
79 {
80 ObjectBasicInformation,
81 ObjectNameInformation,
82 ObjectTypeInformation,
83 ObjectTypesInformation,
84 ObjectHandleFlagInformation,
85 ObjectSessionInformation,
86 MaxObjectInfoClass
87 } OBJECT_INFORMATION_CLASS;
88
89 #else
90
91 //
92 // Object Flags
93 //
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
102
103 #define OBJECT_TO_OBJECT_HEADER(o) \
104 CONTAINING_RECORD((o), OBJECT_HEADER, Body)
105
106 #define OBJECT_HEADER_TO_NAME_INFO(h) \
107 ((POBJECT_HEADER_NAME_INFO)(!(h)->NameInfoOffset ? \
108 NULL: ((PCHAR)(h) - (h)->NameInfoOffset)))
109
110 #define OBJECT_HEADER_TO_HANDLE_INFO(h) \
111 ((POBJECT_HEADER_HANDLE_INFO)(!(h)->HandleInfoOffset ? \
112 NULL: ((PCHAR)(h) - (h)->HandleInfoOffset)))
113
114 #define OBJECT_HEADER_TO_QUOTA_INFO(h) \
115 ((POBJECT_HEADER_QUOTA_INFO)(!(h)->QuotaInfoOffset ? \
116 NULL: ((PCHAR)(h) - (h)->QuotaInfoOffset)))
117
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))))
122
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))
127
128 //
129 // Reasons for Open Callback
130 //
131 typedef enum _OB_OPEN_REASON
132 {
133 ObCreateHandle,
134 ObOpenHandle,
135 ObDuplicateHandle,
136 ObInheritHandle,
137 ObMaxOpenReason
138 } OB_OPEN_REASON;
139
140 #endif
141
142 //
143 // Object Duplication Flags
144 //
145 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
146
147 //
148 // Number of hash entries in an Object Directory
149 //
150 #define NUMBER_HASH_BUCKETS 37
151
152 //
153 // Types for DosDeviceDriveType
154 //
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
162
163 //
164 // Dump Control Structure for Object Debugging
165 //
166 typedef struct _OB_DUMP_CONTROL
167 {
168 PVOID Stream;
169 ULONG Detail;
170 } OB_DUMP_CONTROL, *POB_DUMP_CONTROL;
171
172 #ifndef NTOS_MODE_USER
173
174 //
175 // Object Type Callbacks
176 //
177 typedef VOID
178 (NTAPI *OB_DUMP_METHOD)(
179 IN PVOID Object,
180 IN POB_DUMP_CONTROL Control OPTIONAL
181 );
182
183 typedef NTSTATUS
184 (NTAPI *OB_OPEN_METHOD)(
185 IN OB_OPEN_REASON Reason,
186 IN PEPROCESS Process OPTIONAL,
187 IN PVOID ObjectBody,
188 IN ACCESS_MASK GrantedAccess,
189 IN ULONG HandleCount
190 );
191
192 typedef VOID
193 (NTAPI *OB_CLOSE_METHOD)(
194 IN PEPROCESS Process OPTIONAL,
195 IN PVOID Object,
196 IN ACCESS_MASK GrantedAccess,
197 IN ULONG ProcessHandleCount,
198 IN ULONG SystemHandleCount
199 );
200
201 typedef VOID
202 (NTAPI *OB_DELETE_METHOD)(
203 IN PVOID Object
204 );
205
206 typedef NTSTATUS
207 (NTAPI *OB_PARSE_METHOD)(
208 IN PVOID ParseObject,
209 IN PVOID ObjectType,
210 IN OUT PACCESS_STATE AccessState,
211 IN KPROCESSOR_MODE AccessMode,
212 IN ULONG Attributes,
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,
217 OUT PVOID *Object
218 );
219
220 typedef NTSTATUS
221 (NTAPI *OB_SECURITY_METHOD)(
222 IN PVOID Object,
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
230 );
231
232 typedef NTSTATUS
233 (NTAPI *OB_QUERYNAME_METHOD)(
234 IN PVOID Object,
235 IN BOOLEAN HasObjectName,
236 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
237 IN ULONG Length,
238 OUT PULONG ReturnLength,
239 IN KPROCESSOR_MODE AccessMode
240 );
241
242 typedef NTSTATUS
243 (NTAPI *OB_OKAYTOCLOSE_METHOD)(
244 IN PEPROCESS Process OPTIONAL,
245 IN PVOID Object,
246 IN HANDLE Handle,
247 IN KPROCESSOR_MODE AccessMode
248 );
249
250 #else
251
252 //
253 // Object Information Types for NtQueryInformationObject
254 //
255 typedef struct _OBJECT_NAME_INFORMATION
256 {
257 UNICODE_STRING Name;
258 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
259
260 #endif
261
262 typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION
263 {
264 BOOLEAN Inherit;
265 BOOLEAN ProtectFromClose;
266 } OBJECT_HANDLE_ATTRIBUTE_INFORMATION, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION;
267
268 typedef struct _OBJECT_DIRECTORY_INFORMATION
269 {
270 UNICODE_STRING Name;
271 UNICODE_STRING TypeName;
272 } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
273
274 //
275 // Object Type Information
276 //
277 typedef struct _OBJECT_TYPE_INFORMATION
278 {
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;
297 ULONG PoolType;
298 ULONG DefaultPagedPoolCharge;
299 ULONG DefaultNonPagedPoolCharge;
300 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
301
302 #ifdef NTOS_MODE_USER
303
304 typedef struct _OBJECT_BASIC_INFORMATION
305 {
306 ULONG Attributes;
307 ACCESS_MASK GrantedAccess;
308 ULONG HandleCount;
309 ULONG PointerCount;
310 ULONG PagedPoolUsage;
311 ULONG NonPagedPoolUsage;
312 ULONG Reserved[3];
313 ULONG NameInformationLength;
314 ULONG TypeInformationLength;
315 ULONG SecurityDescriptorLength;
316 LARGE_INTEGER CreateTime;
317 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
318
319 #else
320
321 typedef struct _OBJECT_CREATE_INFORMATION
322 {
323 ULONG Attributes;
324 HANDLE RootDirectory;
325 PVOID ParseContext;
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;
334
335 //
336 // Object Type Initialize for ObCreateObjectType
337 //
338 typedef struct _OBJECT_TYPE_INITIALIZER
339 {
340 USHORT Length;
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;
349 POOL_TYPE PoolType;
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;
361
362 //
363 // Object Type Object
364 //
365 typedef struct _OBJECT_TYPE
366 {
367 ERESOURCE Mutex;
368 LIST_ENTRY TypeList;
369 UNICODE_STRING Name;
370 PVOID DefaultObject;
371 ULONG Index;
372 ULONG TotalNumberOfObjects;
373 ULONG TotalNumberOfHandles;
374 ULONG HighWaterNumberOfObjects;
375 ULONG HighWaterNumberOfHandles;
376 OBJECT_TYPE_INITIALIZER TypeInfo;
377 ULONG Key;
378 ERESOURCE ObjectLocks[4];
379 } OBJECT_TYPE;
380
381 //
382 // Object Directory Structures
383 //
384 typedef struct _OBJECT_DIRECTORY_ENTRY
385 {
386 struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
387 PVOID Object;
388 #if (NTDDI_VERSION >= NTDDI_WS03)
389 ULONG HashValue;
390 #endif
391 } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
392
393 typedef struct _OBJECT_DIRECTORY
394 {
395 struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
396 #if (NTDDI_VERSION < NTDDI_WINXP)
397 ERESOURCE Lock;
398 #else
399 EX_PUSH_LOCK Lock;
400 #endif
401 #if (NTDDI_VERSION < NTDDI_WINXP)
402 BOOLEAN CurrentEntryValid;
403 #else
404 struct _DEVICE_MAP *DeviceMap;
405 #endif
406 ULONG SessionId;
407 #if (NTDDI_VERSION == NTDDI_WINXP)
408 USHORT Reserved;
409 USHORT SymbolicLinkUsageCount;
410 #endif
411 } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
412
413 //
414 // Object Header Addon Information
415 //
416 typedef struct _OBJECT_HEADER_NAME_INFO
417 {
418 POBJECT_DIRECTORY Directory;
419 UNICODE_STRING Name;
420 ULONG QueryReferences;
421 ULONG Reserved2;
422 ULONG DbgReferenceCount;
423 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
424
425 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
426 {
427 struct _EPROCESS *Process;
428 ULONG HandleCount;
429 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
430
431 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
432 {
433 ULONG CountEntries;
434 OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
435 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
436
437 typedef struct _OBJECT_HEADER_HANDLE_INFO
438 {
439 union
440 {
441 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
442 OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
443 };
444 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
445
446 typedef struct _OBJECT_HEADER_CREATOR_INFO
447 {
448 LIST_ENTRY TypeList;
449 PVOID CreatorUniqueProcess;
450 USHORT CreatorBackTraceIndex;
451 USHORT Reserved;
452 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
453
454 typedef struct _OBJECT_HEADER_QUOTA_INFO
455 {
456 ULONG PagedPoolCharge;
457 ULONG NonPagedPoolCharge;
458 ULONG SecurityDescriptorCharge;
459 PEPROCESS ExclusiveProcess;
460 } OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
461
462 //
463 // Object Header
464 //
465 typedef struct _OBJECT_HEADER
466 {
467 LONG PointerCount;
468 union
469 {
470 LONG HandleCount;
471 volatile PVOID NextToFree;
472 };
473 POBJECT_TYPE Type;
474 UCHAR NameInfoOffset;
475 UCHAR HandleInfoOffset;
476 UCHAR QuotaInfoOffset;
477 UCHAR Flags;
478 union
479 {
480 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
481 PVOID QuotaBlockCharged;
482 };
483 PSECURITY_DESCRIPTOR SecurityDescriptor;
484 QUAD Body;
485 } OBJECT_HEADER, *POBJECT_HEADER;
486
487 //
488 // Object Lookup Context
489 //
490 typedef struct _OBP_LOOKUP_CONTEXT
491 {
492 POBJECT_DIRECTORY Directory;
493 PVOID Object;
494 ULONG HashValue;
495 USHORT HashIndex;
496 BOOLEAN DirectoryLocked;
497 ULONG LockStateSignature;
498 } OBP_LOOKUP_CONTEXT, *POBP_LOOKUP_CONTEXT;
499
500 //
501 // Device Map
502 //
503 typedef struct _DEVICE_MAP
504 {
505 POBJECT_DIRECTORY DosDevicesDirectory;
506 POBJECT_DIRECTORY GlobalDosDevicesDirectory;
507 ULONG ReferenceCount;
508 ULONG DriveMap;
509 UCHAR DriveType[32];
510 } DEVICE_MAP, *PDEVICE_MAP;
511
512 //
513 // Symbolic Link Object
514 //
515 typedef struct _OBJECT_SYMBOLIC_LINK
516 {
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;
523
524 //
525 // Kernel Exports
526 //
527 extern POBJECT_TYPE NTSYSAPI ObDirectoryType;
528 extern PDEVICE_MAP NTSYSAPI ObSystemDeviceMap;
529
530 #endif // !NTOS_MODE_USER
531
532 #endif // _OBTYPES_H