-move structs OBJECT_TYPE/OBJECT_HEADER into private headers
[reactos.git] / reactos / ntoskrnl / include / internal / ob.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: include/internal/objmgr.h
5 * PURPOSE: Object manager definitions
6 * PROGRAMMER: David Welch (welch@mcmail.com)
7 */
8
9 #ifndef __INCLUDE_INTERNAL_OBJMGR_H
10 #define __INCLUDE_INTERNAL_OBJMGR_H
11
12 #define NTOS_MODE_KERNEL
13 #include <ntos.h>
14
15 #define TAG_OBJECT_TYPE TAG('O', 'b', 'j', 'T')
16
17 struct _EPROCESS;
18
19 typedef struct
20 {
21 CSHORT Type;
22 CSHORT Size;
23 } COMMON_BODY_HEADER, *PCOMMON_BODY_HEADER;
24
25 typedef PVOID POBJECT;
26
27
28 typedef struct _OBJECT_TYPE
29 {
30 /*
31 * PURPOSE: Tag to be used when allocating objects of this type
32 */
33 ULONG Tag;
34
35 /*
36 * PURPOSE: Name of the type
37 */
38 UNICODE_STRING TypeName;
39
40 /*
41 * PURPOSE: Total number of objects of this type
42 */
43 ULONG TotalObjects;
44
45 /*
46 * PURPOSE: Total number of handles of this type
47 */
48 ULONG TotalHandles;
49
50 /*
51 * PURPOSE: Peak objects of this type
52 */
53 ULONG PeakObjects;
54
55 /*
56 * PURPOSE: Peak handles of this type
57 */
58 ULONG PeakHandles;
59
60 /*
61 * PURPOSE: Paged pool charge
62 */
63 ULONG PagedPoolCharge;
64
65 /*
66 * PURPOSE: Nonpaged pool charge
67 */
68 ULONG NonpagedPoolCharge;
69
70 /*
71 * PURPOSE: Mapping of generic access rights
72 */
73 PGENERIC_MAPPING Mapping;
74
75 /*
76 * PURPOSE: Dumps the object
77 * NOTE: To be defined
78 */
79 VOID STDCALL_FUNC (*Dump)(VOID);
80
81 /*
82 * PURPOSE: Opens the object
83 * NOTE: To be defined
84 */
85 VOID STDCALL_FUNC (*Open)(VOID);
86
87 /*
88 * PURPOSE: Called to close an object if OkayToClose returns true
89 */
90 VOID STDCALL_FUNC (*Close)(PVOID ObjectBody,
91 ULONG HandleCount);
92
93 /*
94 * PURPOSE: Called to delete an object when the last reference is removed
95 */
96 VOID STDCALL_FUNC (*Delete)(PVOID ObjectBody);
97
98 /*
99 * PURPOSE: Called when an open attempts to open a file apparently
100 * residing within the object
101 * RETURNS
102 * STATUS_SUCCESS NextObject was found
103 * STATUS_UNSUCCESSFUL NextObject not found
104 * STATUS_REPARSE Path changed, restart parsing the path
105 */
106 NTSTATUS STDCALL_FUNC (*Parse)(PVOID ParsedObject,
107 PVOID *NextObject,
108 PUNICODE_STRING FullPath,
109 PWSTR *Path,
110 ULONG Attributes);
111
112 /*
113 * PURPOSE: Called to set, query, delete or assign a security-descriptor
114 * to the object
115 * RETURNS
116 * STATUS_SUCCESS NextObject was found
117 */
118 NTSTATUS STDCALL_FUNC (*Security)(PVOID ObjectBody,
119 SECURITY_OPERATION_CODE OperationCode,
120 SECURITY_INFORMATION SecurityInformation,
121 PSECURITY_DESCRIPTOR SecurityDescriptor,
122 PULONG BufferLength);
123
124 /*
125 * PURPOSE: Called to query the name of the object
126 * RETURNS
127 * STATUS_SUCCESS NextObject was found
128 */
129 NTSTATUS STDCALL_FUNC (*QueryName)(PVOID ObjectBody,
130 POBJECT_NAME_INFORMATION ObjectNameInfo,
131 ULONG Length,
132 PULONG ReturnLength);
133
134 /*
135 * PURPOSE: Called when a process asks to close the object
136 */
137 VOID STDCALL_FUNC (*OkayToClose)(VOID);
138
139 NTSTATUS STDCALL_FUNC (*Create)(PVOID ObjectBody,
140 PVOID Parent,
141 PWSTR RemainingPath,
142 struct _OBJECT_ATTRIBUTES* ObjectAttributes);
143
144 VOID STDCALL_FUNC (*DuplicationNotify)(PEPROCESS DuplicateTo,
145 PEPROCESS DuplicateFrom,
146 PVOID Object);
147 } OBJECT_TYPE;
148
149
150
151 typedef struct _OBJECT_HEADER
152 /*
153 * PURPOSE: Header for every object managed by the object manager
154 */
155 {
156 UNICODE_STRING Name;
157 LIST_ENTRY Entry;
158 LONG RefCount;
159 LONG HandleCount;
160 BOOLEAN CloseInProcess;
161 BOOLEAN Permanent;
162 BOOLEAN Inherit;
163 struct _DIRECTORY_OBJECT* Parent;
164 POBJECT_TYPE ObjectType;
165 PSECURITY_DESCRIPTOR SecurityDescriptor;
166
167 /*
168 * PURPOSE: Object type
169 * NOTE: This overlaps the first member of the object body
170 */
171 CSHORT Type;
172
173 /*
174 * PURPOSE: Object size
175 * NOTE: This overlaps the second member of the object body
176 */
177 CSHORT Size;
178
179
180 } OBJECT_HEADER, *POBJECT_HEADER;
181
182
183 typedef struct _DIRECTORY_OBJECT
184 {
185 CSHORT Type;
186 CSHORT Size;
187
188 /*
189 * PURPOSE: Head of the list of our subdirectories
190 */
191 LIST_ENTRY head;
192 KSPIN_LOCK Lock;
193 } DIRECTORY_OBJECT, *PDIRECTORY_OBJECT;
194
195 typedef struct _SYMLINK_OBJECT
196 {
197 CSHORT Type;
198 CSHORT Size;
199 UNICODE_STRING TargetName;
200 LARGE_INTEGER CreateTime;
201 } SYMLINK_OBJECT, *PSYMLINK_OBJECT;
202
203
204 typedef struct _TYPE_OBJECT
205 {
206 CSHORT Type;
207 CSHORT Size;
208
209 /* pointer to object type data */
210 POBJECT_TYPE ObjectType;
211 } TYPE_OBJECT, *PTYPE_OBJECT;
212
213
214 /*
215 * Enumeration of object types
216 */
217 enum
218 {
219 OBJTYP_INVALID,
220 OBJTYP_TYPE,
221 OBJTYP_DIRECTORY,
222 OBJTYP_SYMLNK,
223 OBJTYP_DEVICE,
224 OBJTYP_THREAD,
225 OBJTYP_FILE,
226 OBJTYP_PROCESS,
227 OBJTYP_SECTION,
228 OBJTYP_MAX,
229 };
230
231
232 #define OBJECT_ALLOC_SIZE(ObjectSize) ((ObjectSize)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
233
234
235 extern PDIRECTORY_OBJECT NameSpaceRoot;
236 extern POBJECT_TYPE ObSymbolicLinkType;
237
238
239 POBJECT_HEADER BODY_TO_HEADER(PVOID body);
240 PVOID HEADER_TO_BODY(POBJECT_HEADER obj);
241
242 VOID ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent,
243 POBJECT_HEADER Header,
244 PWSTR Name);
245 VOID ObpRemoveEntryDirectory(POBJECT_HEADER Header);
246
247 VOID
248 ObInitSymbolicLinkImplementation(VOID);
249
250
251 NTSTATUS ObCreateHandle(struct _EPROCESS* Process,
252 PVOID ObjectBody,
253 ACCESS_MASK GrantedAccess,
254 BOOLEAN Inherit,
255 PHANDLE Handle);
256 VOID ObCreateHandleTable(struct _EPROCESS* Parent,
257 BOOLEAN Inherit,
258 struct _EPROCESS* Process);
259 NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
260 PVOID* ReturnedObject,
261 PUNICODE_STRING RemainingPath,
262 POBJECT_TYPE ObjectType);
263 VOID ObCloseAllHandles(struct _EPROCESS* Process);
264 VOID ObDeleteHandleTable(struct _EPROCESS* Process);
265
266 NTSTATUS
267 ObDeleteHandle(PEPROCESS Process,
268 HANDLE Handle,
269 PVOID *ObjectBody);
270
271 NTSTATUS
272 ObpQueryHandleAttributes(HANDLE Handle,
273 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo);
274
275 NTSTATUS
276 ObpSetHandleAttributes(HANDLE Handle,
277 POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo);
278
279 NTSTATUS
280 ObpCreateTypeObject(POBJECT_TYPE ObjectType);
281
282 ULONG
283 ObGetObjectHandleCount(PVOID Object);
284 NTSTATUS
285 ObDuplicateObject(PEPROCESS SourceProcess,
286 PEPROCESS TargetProcess,
287 HANDLE SourceHandle,
288 PHANDLE TargetHandle,
289 ACCESS_MASK DesiredAccess,
290 BOOLEAN InheritHandle,
291 ULONG Options);
292
293 ULONG
294 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable);
295
296 VOID
297 STDCALL
298 ObQueryDeviceMapInformation(PEPROCESS Process, PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo);
299
300 /* Security descriptor cache functions */
301
302 NTSTATUS
303 ObpInitSdCache(VOID);
304
305 NTSTATUS
306 ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD,
307 OUT PSECURITY_DESCRIPTOR *DestinationSD);
308
309 NTSTATUS
310 ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
311
312 VOID
313 ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
314
315 VOID
316 ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
317
318
319 #endif /* __INCLUDE_INTERNAL_OBJMGR_H */