- NDK compatibility fixes for MSDDK. Use NTAPI instead of STDCALL, and use NTSYSAPI...
[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
75 /* FUNCTION TYPES ************************************************************/
76
77 /* Object Callbacks FIXME: Update these soon */
78 typedef NTSTATUS
79 (NTAPI *OB_OPEN_METHOD)(
80 OB_OPEN_REASON Reason,
81 PVOID ObjectBody,
82 PEPROCESS Process,
83 ULONG HandleCount,
84 ACCESS_MASK GrantedAccess
85 );
86
87 typedef NTSTATUS
88 (NTAPI *OB_PARSE_METHOD)(
89 PVOID Object,
90 PVOID *NextObject,
91 PUNICODE_STRING FullPath,
92 PWSTR *Path,
93 ULONG Attributes
94 );
95
96 typedef VOID
97 (NTAPI *OB_DELETE_METHOD)(
98 PVOID DeletedObject
99 );
100
101 typedef VOID
102 (NTAPI *OB_CLOSE_METHOD)(
103 PVOID ClosedObject,
104 ULONG HandleCount
105 );
106
107 typedef VOID
108 (NTAPI *OB_DUMP_METHOD)(VOID);
109
110 typedef NTSTATUS
111 (NTAPI *OB_OKAYTOCLOSE_METHOD)(VOID);
112
113 typedef NTSTATUS
114 (NTAPI *OB_QUERYNAME_METHOD)(
115 PVOID ObjectBody,
116 POBJECT_NAME_INFORMATION ObjectNameInfo,
117 ULONG Length,
118 PULONG ReturnLength
119 );
120
121 typedef PVOID
122 (NTAPI *OB_FIND_METHOD)(
123 PVOID WinStaObject,
124 PWSTR Name,
125 ULONG Attributes
126 );
127
128 typedef NTSTATUS
129 (NTAPI *OB_SECURITY_METHOD)(
130 PVOID Object,
131 SECURITY_OPERATION_CODE OperationType,
132 SECURITY_INFORMATION SecurityInformation,
133 PSECURITY_DESCRIPTOR NewSecurityDescriptor,
134 PULONG ReturnLength,
135 PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
136 POOL_TYPE PoolType,
137 PGENERIC_MAPPING GenericMapping
138 );
139
140 /* FIXME: TEMPORARY HACK */
141 typedef NTSTATUS
142 (NTAPI *OB_CREATE_METHOD)(
143 PVOID ObjectBody,
144 PVOID Parent,
145 PWSTR RemainingPath,
146 struct _OBJECT_ATTRIBUTES* ObjectAttributes
147 );
148 #endif
149
150 /* TYPES *********************************************************************/
151
152 #ifdef NTOS_MODE_USER
153 typedef struct _OBJECT_NAME_INFORMATION
154 {
155 UNICODE_STRING Name;
156 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
157 #endif
158
159 #ifndef NTOS_MODE_USER
160 typedef struct _OBJECT_BASIC_INFORMATION
161 {
162 ULONG Attributes;
163 ACCESS_MASK GrantedAccess;
164 ULONG HandleCount;
165 ULONG PointerCount;
166 ULONG PagedPoolUsage;
167 ULONG NonPagedPoolUsage;
168 ULONG Reserved[3];
169 ULONG NameInformationLength;
170 ULONG TypeInformationLength;
171 ULONG SecurityDescriptorLength;
172 LARGE_INTEGER CreateTime;
173 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
174
175 typedef struct _OBJECT_HEADER_NAME_INFO
176 {
177 struct _DIRECTORY_OBJECT *Directory;
178 UNICODE_STRING Name;
179 ULONG QueryReferences;
180 ULONG Reserved2;
181 ULONG DbgReferenceCount;
182 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
183
184 typedef struct _OBJECT_CREATE_INFORMATION
185 {
186 ULONG Attributes;
187 HANDLE RootDirectory;
188 PVOID ParseContext;
189 KPROCESSOR_MODE ProbeMode;
190 ULONG PagedPoolCharge;
191 ULONG NonPagedPoolCharge;
192 ULONG SecurityDescriptorCharge;
193 PSECURITY_DESCRIPTOR SecurityDescriptor;
194 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
195 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
196 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
197
198 typedef struct _OBJECT_TYPE_INITIALIZER
199 {
200 USHORT Length;
201 UCHAR UseDefaultObject;
202 UCHAR CaseInsensitive;
203 ULONG InvalidAttributes;
204 GENERIC_MAPPING GenericMapping;
205 ULONG ValidAccessMask;
206 UCHAR SecurityRequired;
207 UCHAR MaintainHandleCount;
208 UCHAR MaintainTypeList;
209 POOL_TYPE PoolType;
210 ULONG DefaultPagedPoolCharge;
211 ULONG DefaultNonPagedPoolCharge;
212 OB_DUMP_METHOD DumpProcedure;
213 OB_OPEN_METHOD OpenProcedure;
214 OB_CLOSE_METHOD CloseProcedure;
215 OB_DELETE_METHOD DeleteProcedure;
216 OB_PARSE_METHOD ParseProcedure;
217 OB_SECURITY_METHOD SecurityProcedure;
218 OB_QUERYNAME_METHOD QueryNameProcedure;
219 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
220 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
221
222 typedef struct _OBJECT_TYPE
223 {
224 ERESOURCE Mutex;
225 LIST_ENTRY TypeList;
226 UNICODE_STRING Name;
227 PVOID DefaultObject;
228 ULONG Index;
229 ULONG TotalNumberOfObjects;
230 ULONG TotalNumberOfHandles;
231 ULONG HighWaterNumberOfObjects;
232 ULONG HighWaterNumberOfHandles;
233 OBJECT_TYPE_INITIALIZER TypeInfo;
234 ULONG Key;
235 ERESOURCE ObjectLocks[4];
236 } OBJECT_TYPE;
237
238 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
239 {
240 struct _EPROCESS *Process;
241 ULONG HandleCount;
242 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
243
244 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
245 {
246 ULONG CountEntries;
247 POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
248 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
249
250 typedef struct _OBJECT_HEADER_HANDLE_INFO
251 {
252 union
253 {
254 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
255 OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
256 };
257 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
258
259 typedef struct _OBJECT_HEADER_CREATOR_INFO
260 {
261 LIST_ENTRY TypeList;
262 PVOID CreatorUniqueProcess;
263 USHORT CreatorBackTraceIndex;
264 USHORT Reserved;
265 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
266
267 typedef struct _OBJECT_HEADER
268 {
269 LIST_ENTRY Entry; /* FIXME: REMOVE THIS SOON */
270 LONG PointerCount;
271 union
272 {
273 LONG HandleCount;
274 PVOID NextToFree;
275 };
276 POBJECT_TYPE Type;
277 UCHAR NameInfoOffset;
278 UCHAR HandleInfoOffset;
279 UCHAR QuotaInfoOffset;
280 UCHAR Flags;
281 union
282 {
283 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
284 PVOID QuotaBlockCharged;
285 };
286 PSECURITY_DESCRIPTOR SecurityDescriptor;
287 QUAD Body;
288 } OBJECT_HEADER, *POBJECT_HEADER;
289
290 /*
291 * FIXME: These will eventually become centerfold in the compliant Ob Manager
292 * For now, they are only here so Device Map is properly defined before the header
293 * changes
294 */
295 typedef struct _OBJECT_DIRECTORY_ENTRY
296 {
297 struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
298 PVOID Object;
299 ULONG HashValue;
300 } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
301
302 #define NUMBER_HASH_BUCKETS 37
303 typedef struct _OBJECT_DIRECTORY
304 {
305 struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
306 struct _EX_PUSH_LOCK *Lock;
307 struct _DEVICE_MAP *DeviceMap;
308 ULONG SessionId;
309 } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
310
311 typedef struct _DEVICE_MAP
312 {
313 POBJECT_DIRECTORY DosDevicesDirectory;
314 POBJECT_DIRECTORY GlobalDosDevicesDirectory;
315 ULONG ReferenceCount;
316 ULONG DriveMap;
317 UCHAR DriveType[32];
318 } DEVICE_MAP, *PDEVICE_MAP;
319
320 /* EXPORTED DATA *************************************************************/
321
322 extern POBJECT_TYPE NTSYSAPI ObDirectoryType;
323 extern PDEVICE_MAP NTSYSAPI ObSystemDeviceMap;
324 #endif
325
326 #endif