7b97d2df114d132f963805b161cc85ff50162610
[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 /* Values for DosDeviceDriveType */
17 #define DOSDEVICE_DRIVE_UNKNOWN 0
18 #define DOSDEVICE_DRIVE_CALCULATE 1
19 #define DOSDEVICE_DRIVE_REMOVABLE 2
20 #define DOSDEVICE_DRIVE_FIXED 3
21 #define DOSDEVICE_DRIVE_REMOTE 4
22 #define DOSDEVICE_DRIVE_CDROM 5
23 #define DOSDEVICE_DRIVE_RAMDISK 6
24
25 /* Object Flags */
26 #define OB_FLAG_CREATE_INFO 0x01
27 #define OB_FLAG_KERNEL_MODE 0x02
28 #define OB_FLAG_CREATOR_INFO 0x04
29 #define OB_FLAG_EXCLUSIVE 0x08
30 #define OB_FLAG_PERMANENT 0x10
31 #define OB_FLAG_SECURITY 0x20
32 #define OB_FLAG_SINGLE_PROCESS 0x40
33
34 /* ENUMERATIONS **************************************************************/
35
36 typedef enum _OB_OPEN_REASON
37 {
38 ObCreateHandle,
39 ObOpenHandle,
40 ObDuplicateHandle,
41 ObInheritHandle,
42 ObMaxOpenReason
43 } OB_OPEN_REASON;
44
45 /* FUNCTION TYPES ************************************************************/
46
47 /* Object Callbacks FIXME: Update these soon */
48 typedef NTSTATUS
49 (STDCALL *OB_OPEN_METHOD)(
50 OB_OPEN_REASON Reason,
51 PVOID ObjectBody,
52 PEPROCESS Process,
53 ULONG HandleCount,
54 ACCESS_MASK GrantedAccess
55 );
56
57 typedef NTSTATUS
58 (STDCALL *OB_PARSE_METHOD)(
59 PVOID Object,
60 PVOID *NextObject,
61 PUNICODE_STRING FullPath,
62 PWSTR *Path,
63 ULONG Attributes
64 );
65
66 typedef VOID
67 (STDCALL *OB_DELETE_METHOD)(
68 PVOID DeletedObject
69 );
70
71 typedef VOID
72 (STDCALL *OB_CLOSE_METHOD)(
73 PVOID ClosedObject,
74 ULONG HandleCount
75 );
76
77 typedef VOID
78 (STDCALL *OB_DUMP_METHOD)(VOID);
79
80 typedef NTSTATUS
81 (STDCALL *OB_OKAYTOCLOSE_METHOD)(VOID);
82
83 typedef NTSTATUS
84 (STDCALL *OB_QUERYNAME_METHOD)(
85 PVOID ObjectBody,
86 POBJECT_NAME_INFORMATION ObjectNameInfo,
87 ULONG Length,
88 PULONG ReturnLength
89 );
90
91 typedef PVOID
92 (STDCALL *OB_FIND_METHOD)(
93 PVOID WinStaObject,
94 PWSTR Name,
95 ULONG Attributes
96 );
97
98 typedef NTSTATUS
99 (STDCALL *OB_SECURITY_METHOD)(
100 PVOID ObjectBody,
101 SECURITY_OPERATION_CODE OperationCode,
102 SECURITY_INFORMATION SecurityInformation,
103 PSECURITY_DESCRIPTOR SecurityDescriptor,
104 PULONG BufferLength
105 );
106
107 /* FIXME: TEMPORARY HACK */
108 typedef NTSTATUS
109 (STDCALL *OB_CREATE_METHOD)(
110 PVOID ObjectBody,
111 PVOID Parent,
112 PWSTR RemainingPath,
113 struct _OBJECT_ATTRIBUTES* ObjectAttributes
114 );
115
116 /* TYPES *********************************************************************/
117
118 typedef struct _OBJECT_BASIC_INFORMATION
119 {
120 ULONG Attributes;
121 ACCESS_MASK GrantedAccess;
122 ULONG HandleCount;
123 ULONG PointerCount;
124 ULONG PagedPoolUsage;
125 ULONG NonPagedPoolUsage;
126 ULONG Reserved[3];
127 ULONG NameInformationLength;
128 ULONG TypeInformationLength;
129 ULONG SecurityDescriptorLength;
130 LARGE_INTEGER CreateTime;
131 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
132
133 typedef struct _OBJECT_HEADER_NAME_INFO
134 {
135 struct _DIRECTORY_OBJECT *Directory;
136 UNICODE_STRING Name;
137 ULONG QueryReferences;
138 ULONG Reserved2;
139 ULONG DbgReferenceCount;
140 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
141
142 typedef struct _OBJECT_CREATE_INFORMATION
143 {
144 ULONG Attributes;
145 HANDLE RootDirectory;
146 PVOID ParseContext;
147 KPROCESSOR_MODE ProbeMode;
148 ULONG PagedPoolCharge;
149 ULONG NonPagedPoolCharge;
150 ULONG SecurityDescriptorCharge;
151 PSECURITY_DESCRIPTOR SecurityDescriptor;
152 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
153 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
154 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
155
156 typedef struct _OBJECT_TYPE_INITIALIZER
157 {
158 WORD Length;
159 UCHAR UseDefaultObject;
160 UCHAR CaseInsensitive;
161 ULONG InvalidAttributes;
162 GENERIC_MAPPING GenericMapping;
163 ULONG ValidAccessMask;
164 UCHAR SecurityRequired;
165 UCHAR MaintainHandleCount;
166 UCHAR MaintainTypeList;
167 POOL_TYPE PoolType;
168 ULONG DefaultPagedPoolCharge;
169 ULONG DefaultNonPagedPoolCharge;
170 OB_DUMP_METHOD DumpProcedure;
171 OB_OPEN_METHOD OpenProcedure;
172 OB_CLOSE_METHOD CloseProcedure;
173 OB_DELETE_METHOD DeleteProcedure;
174 OB_PARSE_METHOD ParseProcedure;
175 OB_SECURITY_METHOD SecurityProcedure;
176 OB_QUERYNAME_METHOD QueryNameProcedure;
177 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
178 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
179
180 typedef struct _OBJECT_TYPE
181 {
182 ERESOURCE Mutex;
183 LIST_ENTRY TypeList;
184 UNICODE_STRING Name;
185 PVOID DefaultObject;
186 ULONG Index;
187 ULONG TotalNumberOfObjects;
188 ULONG TotalNumberOfHandles;
189 ULONG HighWaterNumberOfObjects;
190 ULONG HighWaterNumberOfHandles;
191 OBJECT_TYPE_INITIALIZER TypeInfo;
192 ULONG Key;
193 ERESOURCE ObjectLocks[4];
194 } OBJECT_TYPE;
195
196 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
197 {
198 struct _EPROCESS *Process;
199 ULONG HandleCount;
200 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
201
202 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
203 {
204 ULONG CountEntries;
205 POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
206 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
207
208 typedef struct _OBJECT_HEADER_HANDLE_INFO
209 {
210 union
211 {
212 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
213 OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
214 };
215 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
216
217 typedef struct _OBJECT_HEADER_CREATOR_INFO
218 {
219 LIST_ENTRY TypeList;
220 PVOID CreatorUniqueProcess;
221 USHORT CreatorBackTraceIndex;
222 USHORT Reserved;
223 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
224
225 typedef struct _QUAD
226 {
227 union
228 {
229 LONGLONG UseThisFieldToCopy;
230 float DoNotUseThisField;
231 };
232 } QUAD, *PQUAD;
233
234 typedef struct _OBJECT_HEADER
235 {
236 LIST_ENTRY Entry; /* FIXME: REMOVE THIS SOON */
237 LONG PointerCount;
238 union
239 {
240 LONG HandleCount;
241 PVOID NextToFree;
242 };
243 POBJECT_TYPE Type;
244 UCHAR NameInfoOffset;
245 UCHAR HandleInfoOffset;
246 UCHAR QuotaInfoOffset;
247 UCHAR Flags;
248 union
249 {
250 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
251 PVOID QuotaBlockCharged;
252 };
253 PSECURITY_DESCRIPTOR SecurityDescriptor;
254 QUAD Body;
255 } OBJECT_HEADER, *POBJECT_HEADER;
256
257 /*
258 * FIXME: These will eventually become centerfold in the compliant Ob Manager
259 * For now, they are only here so Device Map is properly defined before the header
260 * changes
261 */
262 typedef struct _OBJECT_DIRECTORY_ENTRY
263 {
264 struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
265 PVOID Object;
266 ULONG HashValue;
267 } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
268
269 #define NUMBER_HASH_BUCKETS 37
270 typedef struct _OBJECT_DIRECTORY
271 {
272 struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
273 struct _EX_PUSH_LOCK *Lock;
274 struct _DEVICE_MAP *DeviceMap;
275 ULONG SessionId;
276 } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
277
278 typedef struct _DEVICE_MAP
279 {
280 POBJECT_DIRECTORY DosDevicesDirectory;
281 POBJECT_DIRECTORY GlobalDosDevicesDirectory;
282 ULONG ReferenceCount;
283 ULONG DriveMap;
284 UCHAR DriveType[32];
285 } DEVICE_MAP, *PDEVICE_MAP;
286
287 /* EXPORTED DATA *************************************************************/
288
289 extern NTOSAPI POBJECT_TYPE ObDirectoryType;
290 extern NTOSAPI PDEVICE_MAP ObSystemDeviceMap;
291
292 #endif