- Remove deprecated zwtypes.h and spread out the types in the NT subsystems where...
[reactos.git] / reactos / include / ndk / obtypes.h
1 /*
2 * PROJECT: ReactOS Native Headers
3 * FILE: include/ndk/obtypes.h
4 * PURPOSE: Defintions for Object Manager Types not defined in DDK/IFS
5 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
6 * UPDATE HISTORY:
7 * Created 06/10/04
8 */
9 #ifndef _OBTYPES_H
10 #define _OBTYPES_H
11
12 /* DEPENDENCIES **************************************************************/
13
14 /* CONSTANTS *****************************************************************/
15
16 #ifdef NTOS_MODE_USER
17 /* Definitions for Object Creation */
18 #define OBJ_INHERIT 2L
19 #define OBJ_PERMANENT 16L
20 #define OBJ_EXCLUSIVE 32L
21 #define OBJ_CASE_INSENSITIVE 64L
22 #define OBJ_OPENIF 128L
23 #define OBJ_OPENLINK 256L
24 #define OBJ_VALID_ATTRIBUTES 498L
25 #define InitializeObjectAttributes(p,n,a,r,s) { \
26 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
27 (p)->RootDirectory = (r); \
28 (p)->Attributes = (a); \
29 (p)->ObjectName = (n); \
30 (p)->SecurityDescriptor = (s); \
31 (p)->SecurityQualityOfService = NULL; \
32 }
33
34 /* Directory Object Access Rights */
35 #define DIRECTORY_QUERY 0x0001
36 #define DIRECTORY_TRAVERSE 0x0002
37 #define DIRECTORY_CREATE_OBJECT 0x0004
38 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
39 #define DIRECTORY_ALL_ACCESS STANDARD_RIGHTS_REQUIRED | 0xF
40 #endif
41
42 /* Duplication Flags */
43 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
44
45 /* Values for DosDeviceDriveType */
46 #define DOSDEVICE_DRIVE_UNKNOWN 0
47 #define DOSDEVICE_DRIVE_CALCULATE 1
48 #define DOSDEVICE_DRIVE_REMOVABLE 2
49 #define DOSDEVICE_DRIVE_FIXED 3
50 #define DOSDEVICE_DRIVE_REMOTE 4
51 #define DOSDEVICE_DRIVE_CDROM 5
52 #define DOSDEVICE_DRIVE_RAMDISK 6
53
54 #ifndef NTOS_MODE_USER
55 /* Object Flags */
56 #define OB_FLAG_CREATE_INFO 0x01
57 #define OB_FLAG_KERNEL_MODE 0x02
58 #define OB_FLAG_CREATOR_INFO 0x04
59 #define OB_FLAG_EXCLUSIVE 0x08
60 #define OB_FLAG_PERMANENT 0x10
61 #define OB_FLAG_SECURITY 0x20
62 #define OB_FLAG_SINGLE_PROCESS 0x40
63
64 /* ENUMERATIONS **************************************************************/
65
66 typedef enum _OB_OPEN_REASON
67 {
68 ObCreateHandle,
69 ObOpenHandle,
70 ObDuplicateHandle,
71 ObInheritHandle,
72 ObMaxOpenReason
73 } OB_OPEN_REASON;
74 #endif
75
76 typedef enum _OBJECT_INFORMATION_CLASS
77 {
78 ObjectBasicInformation,
79 ObjectNameInformation,
80 ObjectTypeInformation,
81 ObjectAllTypesInformation,
82 ObjectHandleInformation
83 } OBJECT_INFORMATION_CLASS;
84
85 /* FUNCTION TYPES ************************************************************/
86
87 #ifndef NTOS_MODE_USER
88 /* Object Callbacks FIXME: Update these soon */
89 typedef NTSTATUS
90 (NTAPI *OB_OPEN_METHOD)(
91 OB_OPEN_REASON Reason,
92 PVOID ObjectBody,
93 PEPROCESS Process,
94 ULONG HandleCount,
95 ACCESS_MASK GrantedAccess
96 );
97
98 typedef NTSTATUS
99 (NTAPI *OB_PARSE_METHOD)(
100 PVOID Object,
101 PVOID *NextObject,
102 PUNICODE_STRING FullPath,
103 PWSTR *Path,
104 ULONG Attributes
105 );
106
107 typedef VOID
108 (NTAPI *OB_DELETE_METHOD)(
109 PVOID DeletedObject
110 );
111
112 typedef VOID
113 (NTAPI *OB_CLOSE_METHOD)(
114 PVOID ClosedObject,
115 ULONG HandleCount
116 );
117
118 typedef VOID
119 (NTAPI *OB_DUMP_METHOD)(VOID);
120
121 typedef NTSTATUS
122 (NTAPI *OB_OKAYTOCLOSE_METHOD)(VOID);
123
124 typedef NTSTATUS
125 (NTAPI *OB_QUERYNAME_METHOD)(
126 PVOID ObjectBody,
127 POBJECT_NAME_INFORMATION ObjectNameInfo,
128 ULONG Length,
129 PULONG ReturnLength
130 );
131
132 typedef PVOID
133 (NTAPI *OB_FIND_METHOD)(
134 PVOID WinStaObject,
135 PWSTR Name,
136 ULONG Attributes
137 );
138
139 typedef NTSTATUS
140 (NTAPI *OB_SECURITY_METHOD)(
141 PVOID Object,
142 SECURITY_OPERATION_CODE OperationType,
143 SECURITY_INFORMATION SecurityInformation,
144 PSECURITY_DESCRIPTOR NewSecurityDescriptor,
145 PULONG ReturnLength,
146 PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
147 POOL_TYPE PoolType,
148 PGENERIC_MAPPING GenericMapping
149 );
150
151 /* FIXME: TEMPORARY HACK */
152 typedef NTSTATUS
153 (NTAPI *OB_CREATE_METHOD)(
154 PVOID ObjectBody,
155 PVOID Parent,
156 PWSTR RemainingPath,
157 struct _OBJECT_ATTRIBUTES* ObjectAttributes
158 );
159 #endif
160
161 /* TYPES *********************************************************************/
162
163 #ifdef NTOS_MODE_USER
164 typedef struct _OBJECT_NAME_INFORMATION
165 {
166 UNICODE_STRING Name;
167 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
168 #endif
169
170 typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION
171 {
172 BOOLEAN Inherit;
173 BOOLEAN ProtectFromClose;
174 } OBJECT_HANDLE_ATTRIBUTE_INFORMATION, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION;
175
176 typedef struct _OBJECT_DIRECTORY_INFORMATION
177 {
178 UNICODE_STRING ObjectName;
179 UNICODE_STRING ObjectTypeName;
180 } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
181
182 #ifndef NTOS_MODE_USER
183 typedef struct _OBJECT_BASIC_INFORMATION
184 {
185 ULONG Attributes;
186 ACCESS_MASK GrantedAccess;
187 ULONG HandleCount;
188 ULONG PointerCount;
189 ULONG PagedPoolUsage;
190 ULONG NonPagedPoolUsage;
191 ULONG Reserved[3];
192 ULONG NameInformationLength;
193 ULONG TypeInformationLength;
194 ULONG SecurityDescriptorLength;
195 LARGE_INTEGER CreateTime;
196 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
197
198 typedef struct _OBJECT_HEADER_NAME_INFO
199 {
200 struct _DIRECTORY_OBJECT *Directory;
201 UNICODE_STRING Name;
202 ULONG QueryReferences;
203 ULONG Reserved2;
204 ULONG DbgReferenceCount;
205 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
206
207 typedef struct _OBJECT_CREATE_INFORMATION
208 {
209 ULONG Attributes;
210 HANDLE RootDirectory;
211 PVOID ParseContext;
212 KPROCESSOR_MODE ProbeMode;
213 ULONG PagedPoolCharge;
214 ULONG NonPagedPoolCharge;
215 ULONG SecurityDescriptorCharge;
216 PSECURITY_DESCRIPTOR SecurityDescriptor;
217 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
218 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
219 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
220
221 typedef struct _OBJECT_TYPE_INITIALIZER
222 {
223 USHORT Length;
224 UCHAR UseDefaultObject;
225 UCHAR CaseInsensitive;
226 ULONG InvalidAttributes;
227 GENERIC_MAPPING GenericMapping;
228 ULONG ValidAccessMask;
229 UCHAR SecurityRequired;
230 UCHAR MaintainHandleCount;
231 UCHAR MaintainTypeList;
232 POOL_TYPE PoolType;
233 ULONG DefaultPagedPoolCharge;
234 ULONG DefaultNonPagedPoolCharge;
235 OB_DUMP_METHOD DumpProcedure;
236 OB_OPEN_METHOD OpenProcedure;
237 OB_CLOSE_METHOD CloseProcedure;
238 OB_DELETE_METHOD DeleteProcedure;
239 OB_PARSE_METHOD ParseProcedure;
240 OB_SECURITY_METHOD SecurityProcedure;
241 OB_QUERYNAME_METHOD QueryNameProcedure;
242 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
243 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
244
245 typedef struct _OBJECT_TYPE
246 {
247 ERESOURCE Mutex;
248 LIST_ENTRY TypeList;
249 UNICODE_STRING Name;
250 PVOID DefaultObject;
251 ULONG Index;
252 ULONG TotalNumberOfObjects;
253 ULONG TotalNumberOfHandles;
254 ULONG HighWaterNumberOfObjects;
255 ULONG HighWaterNumberOfHandles;
256 OBJECT_TYPE_INITIALIZER TypeInfo;
257 ULONG Key;
258 ERESOURCE ObjectLocks[4];
259 } OBJECT_TYPE;
260
261 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
262 {
263 struct _EPROCESS *Process;
264 ULONG HandleCount;
265 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
266
267 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
268 {
269 ULONG CountEntries;
270 POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
271 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
272
273 typedef struct _OBJECT_HEADER_HANDLE_INFO
274 {
275 union
276 {
277 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
278 OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
279 };
280 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
281
282 typedef struct _OBJECT_HEADER_CREATOR_INFO
283 {
284 LIST_ENTRY TypeList;
285 PVOID CreatorUniqueProcess;
286 USHORT CreatorBackTraceIndex;
287 USHORT Reserved;
288 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
289
290 typedef struct _OBJECT_HEADER
291 {
292 LIST_ENTRY Entry; /* FIXME: REMOVE THIS SOON */
293 LONG PointerCount;
294 union
295 {
296 LONG HandleCount;
297 PVOID NextToFree;
298 };
299 POBJECT_TYPE Type;
300 UCHAR NameInfoOffset;
301 UCHAR HandleInfoOffset;
302 UCHAR QuotaInfoOffset;
303 UCHAR Flags;
304 union
305 {
306 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
307 PVOID QuotaBlockCharged;
308 };
309 PSECURITY_DESCRIPTOR SecurityDescriptor;
310 QUAD Body;
311 } OBJECT_HEADER, *POBJECT_HEADER;
312
313 /*
314 * FIXME: These will eventually become centerfold in the compliant Ob Manager
315 * For now, they are only here so Device Map is properly defined before the header
316 * changes
317 */
318 typedef struct _OBJECT_DIRECTORY_ENTRY
319 {
320 struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
321 PVOID Object;
322 ULONG HashValue;
323 } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
324
325 #define NUMBER_HASH_BUCKETS 37
326 typedef struct _OBJECT_DIRECTORY
327 {
328 struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
329 struct _EX_PUSH_LOCK *Lock;
330 struct _DEVICE_MAP *DeviceMap;
331 ULONG SessionId;
332 } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
333
334 typedef struct _DEVICE_MAP
335 {
336 POBJECT_DIRECTORY DosDevicesDirectory;
337 POBJECT_DIRECTORY GlobalDosDevicesDirectory;
338 ULONG ReferenceCount;
339 ULONG DriveMap;
340 UCHAR DriveType[32];
341 } DEVICE_MAP, *PDEVICE_MAP;
342
343 /* EXPORTED DATA *************************************************************/
344
345 extern POBJECT_TYPE NTSYSAPI ObDirectoryType;
346 extern PDEVICE_MAP NTSYSAPI ObSystemDeviceMap;
347 #endif
348
349 #endif