1 #ifndef _INCLUDE_DDK_OBFUNCS_H
2 #define _INCLUDE_DDK_OBFUNCS_H
3 /* OBJECT MANAGER ************************************************************/
5 typedef enum _OB_OPEN_REASON
15 typedef NTSTATUS STDCALL_FUNC
16 (*OB_CREATE_METHOD
)(PVOID ObjectBody
,
19 struct _OBJECT_ATTRIBUTES
* ObjectAttributes
);
21 /* Object Callbacks */
22 typedef NTSTATUS STDCALL_FUNC
23 (*OB_OPEN_METHOD
)(OB_OPEN_REASON Reason
,
27 ACCESS_MASK GrantedAccess
);
29 typedef NTSTATUS STDCALL_FUNC
30 (*OB_PARSE_METHOD
)(PVOID Object
,
32 PUNICODE_STRING FullPath
,
36 typedef VOID STDCALL_FUNC
37 (*OB_DELETE_METHOD
)(PVOID DeletedObject
);
39 typedef VOID STDCALL_FUNC
40 (*OB_CLOSE_METHOD
)(PVOID ClosedObject
, ULONG HandleCount
);
42 typedef VOID STDCALL_FUNC
43 (*OB_DUMP_METHOD
)(VOID
);
45 typedef NTSTATUS STDCALL_FUNC
46 (*OB_OKAYTOCLOSE_METHOD
)(VOID
);
48 typedef NTSTATUS STDCALL_FUNC
49 (*OB_QUERYNAME_METHOD
)(PVOID ObjectBody
,
50 POBJECT_NAME_INFORMATION ObjectNameInfo
,
54 typedef PVOID STDCALL_FUNC
55 (*OB_FIND_METHOD
)(PVOID WinStaObject
,
59 typedef NTSTATUS STDCALL_FUNC
60 (*OB_SECURITY_METHOD
)(PVOID ObjectBody
,
61 SECURITY_OPERATION_CODE OperationCode
,
62 SECURITY_INFORMATION SecurityInformation
,
63 PSECURITY_DESCRIPTOR SecurityDescriptor
,
66 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
68 struct _EPROCESS
*Process
;
70 } OBJECT_HANDLE_COUNT_ENTRY
, *POBJECT_HANDLE_COUNT_ENTRY
;
72 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
75 POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries
[1];
76 } OBJECT_HANDLE_COUNT_DATABASE
, *POBJECT_HANDLE_COUNT_DATABASE
;
78 typedef struct _OBJECT_HEADER_HANDLE_INFO
81 POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase
;
82 OBJECT_HANDLE_COUNT_ENTRY SingleEntry
;
84 } OBJECT_HEADER_HANDLE_INFO
, *POBJECT_HEADER_HANDLE_INFO
;
86 typedef struct _OBJECT_HEADER_CREATOR_INFO
89 PVOID CreatorUniqueProcess
;
90 USHORT CreatorBackTraceIndex
;
92 } OBJECT_HEADER_CREATOR_INFO
, *POBJECT_HEADER_CREATOR_INFO
;
94 typedef struct _OBJECT_HEADER_NAME_INFO
96 struct _DIRECTORY_OBJECT
*Directory
;
98 ULONG QueryReferences
;
100 ULONG DbgReferenceCount
;
101 } OBJECT_HEADER_NAME_INFO
, *POBJECT_HEADER_NAME_INFO
;
103 typedef struct _OBJECT_CREATE_INFORMATION
106 HANDLE RootDirectory
;
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
;
117 typedef struct _OBJECT_TYPE_INITIALIZER
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
;
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
;
141 typedef struct _OBJECT_TYPE
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 */
158 ObAssignSecurity(IN PACCESS_STATE AccessState
,
159 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
161 IN POBJECT_TYPE Type
);
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
,
170 IN ULONG PagedPoolCharge OPTIONAL
,
171 IN ULONG NonPagedPoolCharge OPTIONAL
,
175 ObfDereferenceObject(IN PVOID Object
);
178 ObfReferenceObject(IN PVOID Object
);
180 #define ObDereferenceObject(Object) \
181 ObfDereferenceObject(Object)
183 #define ObReferenceObject(Object) \
184 ObfReferenceObject(Object)
187 ObGetObjectPointerCount(IN PVOID Object
);
190 ObGetObjectSecurity(IN PVOID Object
,
191 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
192 OUT PBOOLEAN MemoryAllocated
);
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
,
203 ObMakeTemporaryObject(IN PVOID ObjectBody
);
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
,
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
,
224 ObQueryNameString(IN PVOID Object
,
225 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
227 OUT PULONG ReturnLength
);
230 ObQueryObjectAuditingByHandle(IN HANDLE Handle
,
231 OUT PBOOLEAN GenerateOnClose
);
234 * FUNCTION: Performs access validation on an object handle and if access
235 * is granted returns a pointer to the object's body
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
243 * HandleInformation (OUT) = Points to a structure which receives
244 * information about the handle
248 ObReferenceObjectByHandle(IN HANDLE Handle
,
249 IN ACCESS_MASK DesiredAccess
,
250 IN POBJECT_TYPE ObjectType OPTIONAL
,
251 IN KPROCESSOR_MODE AccessMode
,
253 OUT POBJECT_HANDLE_INFORMATION HandleInfo OPTIONAL
);
256 * FUNCTION: Increments the reference count for a given object
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
265 ObReferenceObjectByPointer(IN PVOID Object
,
266 IN ACCESS_MASK DesiredAccess
,
267 IN POBJECT_TYPE ObjectType
,
268 IN KPROCESSOR_MODE AccessMode
);
271 ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath
,
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
);
281 ObReleaseObjectSecurity(IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
282 IN BOOLEAN MemoryAllocated
);
286 ObSetSecurityDescriptorInfo(IN PVOID Object,
287 IN PSECURITY_INFORMATION SecurityInformation,
288 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
290 IN POOL_TYPE PoolType,
291 IN PGENERIC_MAPPING GenericMapping);
295 ObFindHandleForObject(IN PEPROCESS Process
,
297 IN POBJECT_TYPE ObjectType
,
298 IN POBJECT_HANDLE_INFORMATION HandleInformation
,
299 OUT PHANDLE HandleReturn
);
301 #endif /* ndef _INCLUDE_DDK_OBFUNCS_H */