3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ob/ntobj.c
6 * PURPOSE: User mode interface to object manager
8 * PROGRAMMERS: David Welch (welch@cwcom.net)
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
18 /* FUNCTIONS ************************************************************/
20 /**********************************************************************
22 * NtSetInformationObject
33 NtSetInformationObject (IN HANDLE ObjectHandle
,
34 IN OBJECT_INFORMATION_CLASS ObjectInformationClass
,
35 IN PVOID ObjectInformation
,
43 if (ObjectInformationClass
!= ObjectHandleInformation
)
44 return STATUS_INVALID_INFO_CLASS
;
46 if (Length
!= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
))
47 return STATUS_INFO_LENGTH_MISMATCH
;
49 Status
= ObReferenceObjectByHandle (ObjectHandle
,
52 (KPROCESSOR_MODE
)KeGetPreviousMode (),
55 if (!NT_SUCCESS (Status
))
60 Status
= ObpSetHandleAttributes (ObjectHandle
,
61 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION
)ObjectInformation
);
63 ObDereferenceObject (Object
);
69 /**********************************************************************
82 NtQueryObject (IN HANDLE ObjectHandle
,
83 IN OBJECT_INFORMATION_CLASS ObjectInformationClass
,
84 OUT PVOID ObjectInformation
,
86 OUT PULONG ResultLength OPTIONAL
)
88 OBJECT_HANDLE_INFORMATION HandleInfo
;
89 POBJECT_HEADER ObjectHeader
;
96 Status
= ObReferenceObjectByHandle (ObjectHandle
,
99 (KPROCESSOR_MODE
)KeGetPreviousMode(),
102 if (!NT_SUCCESS (Status
))
107 ObjectHeader
= BODY_TO_HEADER(Object
);
109 switch (ObjectInformationClass
)
111 case ObjectBasicInformation
:
112 InfoLength
= sizeof(OBJECT_BASIC_INFORMATION
);
113 if (Length
!= sizeof(OBJECT_BASIC_INFORMATION
))
115 Status
= STATUS_INFO_LENGTH_MISMATCH
;
119 POBJECT_BASIC_INFORMATION BasicInfo
;
121 BasicInfo
= (POBJECT_BASIC_INFORMATION
)ObjectInformation
;
122 BasicInfo
->Attributes
= HandleInfo
.HandleAttributes
;
123 BasicInfo
->GrantedAccess
= HandleInfo
.GrantedAccess
;
124 BasicInfo
->HandleCount
= ObjectHeader
->HandleCount
;
125 BasicInfo
->PointerCount
= ObjectHeader
->RefCount
;
126 BasicInfo
->PagedPoolUsage
= 0; /* FIXME*/
127 BasicInfo
->NonPagedPoolUsage
= 0; /* FIXME*/
128 BasicInfo
->NameInformationLength
= 0; /* FIXME*/
129 BasicInfo
->TypeInformationLength
= 0; /* FIXME*/
130 BasicInfo
->SecurityDescriptorLength
= 0; /* FIXME*/
131 if (ObjectHeader
->ObjectType
== ObSymbolicLinkType
)
133 BasicInfo
->CreateTime
.QuadPart
=
134 ((PSYMLINK_OBJECT
)Object
)->CreateTime
.QuadPart
;
138 BasicInfo
->CreateTime
.QuadPart
= (ULONGLONG
)0;
140 Status
= STATUS_SUCCESS
;
144 case ObjectNameInformation
:
145 Status
= ObQueryNameString (Object
,
146 (POBJECT_NAME_INFORMATION
)ObjectInformation
,
151 case ObjectTypeInformation
:
154 if (Length
!= sizeof(OBJECT_TYPE_INFORMATION
))
156 Status
= STATUS_INVALID_BUFFER_SIZE
;
160 POBJECT_TYPE_INFORMATION TypeInfo
;
162 TypeInfo
= (POBJECT_TYPE_INFORMATION
)ObjectInformation
;
163 // FIXME: Is this supposed to only be the header's Name field?
164 // Can somebody check/verify this?
165 RtlCopyUnicodeString(&typeinfo
->Name
,&ObjectHeader
->Name
);
167 if (Status
!= STATUS_SUCCESS
)
172 RtlCopyUnicodeString(&typeinfo
->Type
,&ObjectHeader
->ObjectType
->TypeName
);
173 //This should be info from the object header, not the object type, right?
174 typeinfo
->TotalHandles
= ObjectHeader
-> HandleCount
;
175 typeinfo
->ReferenceCount
= ObjectHeader
-> RefCount
;
178 Status
= STATUS_NOT_IMPLEMENTED
;
181 case ObjectAllTypesInformation
:
182 Status
= STATUS_NOT_IMPLEMENTED
;
185 case ObjectHandleInformation
:
186 InfoLength
= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
);
187 if (Length
!= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
))
189 Status
= STATUS_INFO_LENGTH_MISMATCH
;
193 Status
= ObpQueryHandleAttributes (ObjectHandle
,
194 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION
)ObjectInformation
);
199 Status
= STATUS_INVALID_INFO_CLASS
;
203 ObDereferenceObject (Object
);
205 if (ResultLength
!= NULL
)
206 *ResultLength
= InfoLength
;
212 /**********************************************************************
214 * ObpSetPermanentObject/2
217 * Fast general purpose routine to set an object's permanent
218 * attribute, given a pointer to the object's body.
221 ObpSetPermanentObject (IN PVOID ObjectBody
, IN BOOLEAN Permanent
)
223 POBJECT_HEADER ObjectHeader
;
225 ObjectHeader
= BODY_TO_HEADER(ObjectBody
);
226 ObjectHeader
->Permanent
= Permanent
;
228 if (ObjectHeader
->HandleCount
== 0 && !Permanent
&& ObjectHeader
->Parent
!= NULL
)
230 /* Remove the object from the namespace */
231 ObpRemoveEntryDirectory(ObjectHeader
);
235 /**********************************************************************
237 * ObMakeTemporaryObject/1
250 ObMakeTemporaryObject(IN PVOID ObjectBody
)
252 ObpSetPermanentObject (ObjectBody
, FALSE
);
256 /**********************************************************************
258 * NtMakeTemporaryObject
269 NtMakeTemporaryObject(IN HANDLE ObjectHandle
)
276 Status
= ObReferenceObjectByHandle(ObjectHandle
,
279 (KPROCESSOR_MODE
)KeGetPreviousMode(),
282 if (Status
!= STATUS_SUCCESS
)
287 ObpSetPermanentObject (ObjectBody
, FALSE
);
289 ObDereferenceObject(ObjectBody
);
291 return STATUS_SUCCESS
;
295 /**********************************************************************
297 * NtMakePermanentObject/1
310 NtMakePermanentObject(IN HANDLE ObjectHandle
)
317 Status
= ObReferenceObjectByHandle(ObjectHandle
,
320 (KPROCESSOR_MODE
)KeGetPreviousMode(),
323 if (Status
!= STATUS_SUCCESS
)
328 ObpSetPermanentObject (ObjectBody
, TRUE
);
330 ObDereferenceObject(ObjectBody
);
332 return STATUS_SUCCESS
;