8edf62bcf6cd648866329a378efd5ab3702df516
[reactos.git] / reactos / include / ddk / obfuncs.h
1 #ifndef _INCLUDE_DDK_OBFUNCS_H
2 #define _INCLUDE_DDK_OBFUNCS_H
3 /* OBJECT MANAGER ************************************************************/
4
5 typedef enum _OB_OPEN_REASON
6 {
7 ObCreateHandle,
8 ObOpenHandle,
9 ObDuplicateHandle,
10 ObInheritHandle,
11 ObMaxOpenReason
12 } OB_OPEN_REASON;
13
14 /* TEMPORARY HACK */
15 typedef NTSTATUS STDCALL_FUNC
16 (*OB_CREATE_METHOD)(PVOID ObjectBody,
17 PVOID Parent,
18 PWSTR RemainingPath,
19 struct _OBJECT_ATTRIBUTES* ObjectAttributes);
20
21 /* Object Callbacks */
22 typedef NTSTATUS STDCALL_FUNC
23 (*OB_OPEN_METHOD)(OB_OPEN_REASON Reason,
24 PVOID ObjectBody,
25 PEPROCESS Process,
26 ULONG HandleCount,
27 ACCESS_MASK GrantedAccess);
28
29 typedef NTSTATUS STDCALL_FUNC
30 (*OB_PARSE_METHOD)(PVOID Object,
31 PVOID *NextObject,
32 PUNICODE_STRING FullPath,
33 PWSTR *Path,
34 ULONG Attributes);
35
36 typedef VOID STDCALL_FUNC
37 (*OB_DELETE_METHOD)(PVOID DeletedObject);
38
39 typedef VOID STDCALL_FUNC
40 (*OB_CLOSE_METHOD)(PVOID ClosedObject, ULONG HandleCount);
41
42 typedef VOID STDCALL_FUNC
43 (*OB_DUMP_METHOD)(VOID);
44
45 typedef NTSTATUS STDCALL_FUNC
46 (*OB_OKAYTOCLOSE_METHOD)(VOID);
47
48 typedef NTSTATUS STDCALL_FUNC
49 (*OB_QUERYNAME_METHOD)(PVOID ObjectBody,
50 POBJECT_NAME_INFORMATION ObjectNameInfo,
51 ULONG Length,
52 PULONG ReturnLength);
53
54 typedef PVOID STDCALL_FUNC
55 (*OB_FIND_METHOD)(PVOID WinStaObject,
56 PWSTR Name,
57 ULONG Attributes);
58
59 typedef NTSTATUS STDCALL_FUNC
60 (*OB_SECURITY_METHOD)(PVOID ObjectBody,
61 SECURITY_OPERATION_CODE OperationCode,
62 SECURITY_INFORMATION SecurityInformation,
63 PSECURITY_DESCRIPTOR SecurityDescriptor,
64 PULONG BufferLength);
65
66 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
67 {
68 struct _EPROCESS *Process;
69 ULONG HandleCount;
70 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
71
72 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
73 {
74 ULONG CountEntries;
75 POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
76 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
77
78 typedef struct _OBJECT_HEADER_HANDLE_INFO
79 {
80 union {
81 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
82 OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
83 };
84 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
85
86 typedef struct _OBJECT_HEADER_CREATOR_INFO
87 {
88 LIST_ENTRY TypeList;
89 PVOID CreatorUniqueProcess;
90 USHORT CreatorBackTraceIndex;
91 USHORT Reserved;
92 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
93
94 typedef struct _OBJECT_HEADER_NAME_INFO
95 {
96 struct _DIRECTORY_OBJECT *Directory;
97 UNICODE_STRING Name;
98 ULONG QueryReferences;
99 ULONG Reserved2;
100 ULONG DbgReferenceCount;
101 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
102
103 typedef struct _OBJECT_CREATE_INFORMATION
104 {
105 ULONG Attributes;
106 HANDLE RootDirectory;
107 PVOID ParseContext;
108 KPROCESSOR_MODE ProbeMode;
109 ULONG PagedPoolCharge;
110 ULONG NonPagedPoolCharge;
111 ULONG SecurityDescriptorCharge;
112 PSECURITY_DESCRIPTOR SecurityDescriptor;
113 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
114 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
115 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
116
117 typedef struct _OBJECT_TYPE_INITIALIZER
118 {
119 WORD Length;
120 UCHAR UseDefaultObject;
121 UCHAR CaseInsensitive;
122 ULONG InvalidAttributes;
123 GENERIC_MAPPING GenericMapping;
124 ULONG ValidAccessMask;
125 UCHAR SecurityRequired;
126 UCHAR MaintainHandleCount;
127 UCHAR MaintainTypeList;
128 POOL_TYPE PoolType;
129 ULONG DefaultPagedPoolCharge;
130 ULONG DefaultNonPagedPoolCharge;
131 OB_DUMP_METHOD DumpProcedure;
132 OB_OPEN_METHOD OpenProcedure;
133 OB_CLOSE_METHOD CloseProcedure;
134 OB_DELETE_METHOD DeleteProcedure;
135 OB_PARSE_METHOD ParseProcedure;
136 OB_SECURITY_METHOD SecurityProcedure;
137 OB_QUERYNAME_METHOD QueryNameProcedure;
138 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
139 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
140
141 typedef struct _OBJECT_TYPE
142 {
143 ERESOURCE Mutex; /* Used to lock the Object Type */
144 LIST_ENTRY TypeList; /* Links all the Types Together for Debugging */
145 UNICODE_STRING Name; /* Name of the Type */
146 PVOID DefaultObject; /* What Object to use during a Wait (ie, FileObjects wait on FileObject->Event) */
147 ULONG Index; /* Index of this Type in the Object Directory */
148 ULONG TotalNumberOfObjects; /* Total number of objects of this type */
149 ULONG TotalNumberOfHandles; /* Total number of handles of this type */
150 ULONG HighWaterNumberOfObjects; /* Peak number of objects of this type */
151 ULONG HighWaterNumberOfHandles; /* Peak number of handles of this type */
152 OBJECT_TYPE_INITIALIZER TypeInfo; /* Information captured during type creation */
153 ULONG Key; /* Key to use when allocating objects of this type */
154 ERESOURCE ObjectLocks[4]; /* Locks for locking the Objects */
155 } OBJECT_TYPE;
156
157 NTSTATUS STDCALL
158 ObAssignSecurity(IN PACCESS_STATE AccessState,
159 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
160 IN PVOID Object,
161 IN POBJECT_TYPE Type);
162
163 NTSTATUS STDCALL
164 ObCreateObject (IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL,
165 IN POBJECT_TYPE ObjectType,
166 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
167 IN KPROCESSOR_MODE AccessMode,
168 IN OUT PVOID ParseContext OPTIONAL,
169 IN ULONG ObjectSize,
170 IN ULONG PagedPoolCharge OPTIONAL,
171 IN ULONG NonPagedPoolCharge OPTIONAL,
172 OUT PVOID *Object);
173
174 VOID FASTCALL
175 ObfDereferenceObject(IN PVOID Object);
176
177 VOID FASTCALL
178 ObfReferenceObject(IN PVOID Object);
179
180 #define ObDereferenceObject(Object) \
181 ObfDereferenceObject(Object)
182
183 #define ObReferenceObject(Object) \
184 ObfReferenceObject(Object)
185
186 ULONG STDCALL
187 ObGetObjectPointerCount(IN PVOID Object);
188
189 NTSTATUS STDCALL
190 ObGetObjectSecurity(IN PVOID Object,
191 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
192 OUT PBOOLEAN MemoryAllocated);
193
194 NTSTATUS STDCALL
195 ObInsertObject(IN PVOID Object,
196 IN PACCESS_STATE PassedAccessState OPTIONAL,
197 IN ACCESS_MASK DesiredAccess,
198 IN ULONG AdditionalReferences,
199 OUT PVOID* ReferencedObject OPTIONAL,
200 OUT PHANDLE Handle);
201
202 VOID STDCALL
203 ObMakeTemporaryObject(IN PVOID ObjectBody);
204
205 NTSTATUS STDCALL
206 ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
207 IN POBJECT_TYPE ObjectType,
208 IN OUT PVOID ParseContext OPTIONAL,
209 IN KPROCESSOR_MODE AccessMode,
210 IN ACCESS_MASK DesiredAccess,
211 IN PACCESS_STATE PassedAccessState,
212 OUT PHANDLE Handle);
213
214 NTSTATUS STDCALL
215 ObOpenObjectByPointer(IN PVOID Object,
216 IN ULONG HandleAttributes,
217 IN PACCESS_STATE PassedAccessState OPTIONAL,
218 IN ACCESS_MASK DesiredAccess OPTIONAL,
219 IN POBJECT_TYPE ObjectType OPTIONAL,
220 IN KPROCESSOR_MODE AccessMode,
221 OUT PHANDLE Handle);
222
223 NTSTATUS STDCALL
224 ObQueryNameString(IN PVOID Object,
225 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
226 IN ULONG Length,
227 OUT PULONG ReturnLength);
228
229 NTSTATUS STDCALL
230 ObQueryObjectAuditingByHandle(IN HANDLE Handle,
231 OUT PBOOLEAN GenerateOnClose);
232
233 /*
234 * FUNCTION: Performs access validation on an object handle and if access
235 * is granted returns a pointer to the object's body
236 * ARGUMENTS:
237 * Handle = Handle to the object
238 * DesiredAccess = Desired access to the object
239 * ObjectType (OPTIONAL) = Pointer to the object's type definition
240 * AccessMode = Access mode to use for the check
241 * Object (OUT) = Caller supplied storage for a pointer to the object's
242 * body
243 * HandleInformation (OUT) = Points to a structure which receives
244 * information about the handle
245 * RETURNS: Status
246 */
247 NTSTATUS STDCALL
248 ObReferenceObjectByHandle(IN HANDLE Handle,
249 IN ACCESS_MASK DesiredAccess,
250 IN POBJECT_TYPE ObjectType OPTIONAL,
251 IN KPROCESSOR_MODE AccessMode,
252 OUT PVOID* Object,
253 OUT POBJECT_HANDLE_INFORMATION HandleInfo OPTIONAL);
254
255 /*
256 * FUNCTION: Increments the reference count for a given object
257 * ARGUMENTS:
258 * Object = Points to the body of the object
259 * AccessMode = Requested access to the object
260 * ObjectType = Pointer to the object's type definition
261 * AccessMode = Access mode to use for the security check
262 * RETURNS: Status
263 */
264 NTSTATUS STDCALL
265 ObReferenceObjectByPointer(IN PVOID Object,
266 IN ACCESS_MASK DesiredAccess,
267 IN POBJECT_TYPE ObjectType,
268 IN KPROCESSOR_MODE AccessMode);
269
270 NTSTATUS STDCALL
271 ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath,
272 IN ULONG Attributes,
273 IN PACCESS_STATE PassedAccessState OPTIONAL,
274 IN ACCESS_MASK DesiredAccess OPTIONAL,
275 IN POBJECT_TYPE ObjectType,
276 IN KPROCESSOR_MODE AccessMode,
277 IN OUT PVOID ParseContext OPTIONAL,
278 OUT PVOID* ObjectPtr);
279
280 VOID STDCALL
281 ObReleaseObjectSecurity(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
282 IN BOOLEAN MemoryAllocated);
283
284 /*
285 NTSTATUS STDCALL
286 ObSetSecurityDescriptorInfo(IN PVOID Object,
287 IN PSECURITY_INFORMATION SecurityInformation,
288 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
289 ULONG Param4,
290 IN POOL_TYPE PoolType,
291 IN PGENERIC_MAPPING GenericMapping);
292 */
293
294 NTSTATUS STDCALL
295 ObFindHandleForObject(IN PEPROCESS Process,
296 IN PVOID Object,
297 IN POBJECT_TYPE ObjectType,
298 IN POBJECT_HANDLE_INFORMATION HandleInformation,
299 OUT PHANDLE HandleReturn);
300
301 #endif /* ndef _INCLUDE_DDK_OBFUNCS_H */