1 /* $Id: ntobj.c,v 1.21 2004/07/17 12:08:21 ekohl Exp $
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
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/id.h>
19 #include <internal/debug.h>
22 /* FUNCTIONS ************************************************************/
24 /**********************************************************************
26 * NtSetInformationObject
37 NtSetInformationObject (IN HANDLE ObjectHandle
,
38 IN OBJECT_INFORMATION_CLASS ObjectInformationClass
,
39 IN PVOID ObjectInformation
,
45 if (ObjectInformationClass
!= ObjectHandleInformation
)
46 return STATUS_INVALID_INFO_CLASS
;
48 if (Length
!= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
))
49 return STATUS_INFO_LENGTH_MISMATCH
;
51 Status
= ObReferenceObjectByHandle (ObjectHandle
,
54 (KPROCESSOR_MODE
)KeGetPreviousMode (),
57 if (!NT_SUCCESS (Status
))
62 Status
= ObpSetHandleAttributes (ObjectHandle
,
63 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION
)ObjectInformation
);
65 ObDereferenceObject (Object
);
71 /**********************************************************************
84 NtQueryObject (IN HANDLE ObjectHandle
,
85 IN OBJECT_INFORMATION_CLASS ObjectInformationClass
,
86 OUT PVOID ObjectInformation
,
88 OUT PULONG ReturnLength OPTIONAL
)
90 OBJECT_HANDLE_INFORMATION HandleInfo
;
91 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 (ReturnLength
!= NULL
)
206 *ReturnLength
= InfoLength
;
212 /**********************************************************************
214 * ObMakeTemporaryObject
227 ObMakeTemporaryObject(IN PVOID ObjectBody
)
229 POBJECT_HEADER ObjectHeader
;
231 ObjectHeader
= BODY_TO_HEADER(ObjectBody
);
232 ObjectHeader
->Permanent
= FALSE
;
236 /**********************************************************************
238 * NtMakeTemporaryObject
249 NtMakeTemporaryObject(IN HANDLE Handle
)
251 POBJECT_HEADER ObjectHeader
;
255 Status
= ObReferenceObjectByHandle(Handle
,
258 (KPROCESSOR_MODE
)KeGetPreviousMode(),
261 if (Status
!= STATUS_SUCCESS
)
266 ObjectHeader
= BODY_TO_HEADER(Object
);
267 ObjectHeader
->Permanent
= FALSE
;
269 ObDereferenceObject(Object
);
271 return STATUS_SUCCESS
;
275 /**********************************************************************
277 * NtMakePermanentObject
288 NtMakePermanentObject(IN HANDLE Handle
)
290 POBJECT_HEADER ObjectHeader
;
294 Status
= ObReferenceObjectByHandle(Handle
,
297 (KPROCESSOR_MODE
)KeGetPreviousMode(),
300 if (Status
!= STATUS_SUCCESS
)
305 ObjectHeader
= BODY_TO_HEADER(Object
);
306 ObjectHeader
->Permanent
= TRUE
;
308 ObDereferenceObject(Object
);
310 return STATUS_SUCCESS
;