1 /* $Id: ntobj.c,v 1.23 2004/08/15 16:39:10 chorns 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 *****************************************************************/
16 #include <internal/debug.h>
19 /* FUNCTIONS ************************************************************/
21 /**********************************************************************
23 * NtSetInformationObject
34 NtSetInformationObject (IN HANDLE ObjectHandle
,
35 IN OBJECT_INFORMATION_CLASS ObjectInformationClass
,
36 IN PVOID ObjectInformation
,
42 if (ObjectInformationClass
!= ObjectHandleInformation
)
43 return STATUS_INVALID_INFO_CLASS
;
45 if (Length
!= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
))
46 return STATUS_INFO_LENGTH_MISMATCH
;
48 Status
= ObReferenceObjectByHandle (ObjectHandle
,
51 (KPROCESSOR_MODE
)KeGetPreviousMode (),
54 if (!NT_SUCCESS (Status
))
59 Status
= ObpSetHandleAttributes (ObjectHandle
,
60 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION
)ObjectInformation
);
62 ObDereferenceObject (Object
);
68 /**********************************************************************
81 NtQueryObject (IN HANDLE ObjectHandle
,
82 IN OBJECT_INFORMATION_CLASS ObjectInformationClass
,
83 OUT PVOID ObjectInformation
,
85 OUT PULONG ReturnLength OPTIONAL
)
87 OBJECT_HANDLE_INFORMATION HandleInfo
;
88 POBJECT_HEADER ObjectHeader
;
93 Status
= ObReferenceObjectByHandle (ObjectHandle
,
96 (KPROCESSOR_MODE
)KeGetPreviousMode(),
99 if (!NT_SUCCESS (Status
))
104 ObjectHeader
= BODY_TO_HEADER(Object
);
106 switch (ObjectInformationClass
)
108 case ObjectBasicInformation
:
109 InfoLength
= sizeof(OBJECT_BASIC_INFORMATION
);
110 if (Length
!= sizeof(OBJECT_BASIC_INFORMATION
))
112 Status
= STATUS_INFO_LENGTH_MISMATCH
;
116 POBJECT_BASIC_INFORMATION BasicInfo
;
118 BasicInfo
= (POBJECT_BASIC_INFORMATION
)ObjectInformation
;
119 BasicInfo
->Attributes
= HandleInfo
.HandleAttributes
;
120 BasicInfo
->GrantedAccess
= HandleInfo
.GrantedAccess
;
121 BasicInfo
->HandleCount
= ObjectHeader
->HandleCount
;
122 BasicInfo
->PointerCount
= ObjectHeader
->RefCount
;
123 BasicInfo
->PagedPoolUsage
= 0; /* FIXME*/
124 BasicInfo
->NonPagedPoolUsage
= 0; /* FIXME*/
125 BasicInfo
->NameInformationLength
= 0; /* FIXME*/
126 BasicInfo
->TypeInformationLength
= 0; /* FIXME*/
127 BasicInfo
->SecurityDescriptorLength
= 0; /* FIXME*/
128 if (ObjectHeader
->ObjectType
== ObSymbolicLinkType
)
130 BasicInfo
->CreateTime
.QuadPart
=
131 ((PSYMLINK_OBJECT
)Object
)->CreateTime
.QuadPart
;
135 BasicInfo
->CreateTime
.QuadPart
= (ULONGLONG
)0;
137 Status
= STATUS_SUCCESS
;
141 case ObjectNameInformation
:
142 Status
= ObQueryNameString (Object
,
143 (POBJECT_NAME_INFORMATION
)ObjectInformation
,
148 case ObjectTypeInformation
:
151 if (Length
!= sizeof(OBJECT_TYPE_INFORMATION
))
153 Status
= STATUS_INVALID_BUFFER_SIZE
;
157 POBJECT_TYPE_INFORMATION TypeInfo
;
159 TypeInfo
= (POBJECT_TYPE_INFORMATION
)ObjectInformation
;
160 // FIXME: Is this supposed to only be the header's Name field?
161 // Can somebody check/verify this?
162 RtlCopyUnicodeString(&typeinfo
->Name
,&ObjectHeader
->Name
);
164 if (Status
!= STATUS_SUCCESS
)
169 RtlCopyUnicodeString(&typeinfo
->Type
,&ObjectHeader
->ObjectType
->TypeName
);
170 //This should be info from the object header, not the object type, right?
171 typeinfo
->TotalHandles
= ObjectHeader
-> HandleCount
;
172 typeinfo
->ReferenceCount
= ObjectHeader
-> RefCount
;
175 Status
= STATUS_NOT_IMPLEMENTED
;
178 case ObjectAllTypesInformation
:
179 Status
= STATUS_NOT_IMPLEMENTED
;
182 case ObjectHandleInformation
:
183 InfoLength
= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
);
184 if (Length
!= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
))
186 Status
= STATUS_INFO_LENGTH_MISMATCH
;
190 Status
= ObpQueryHandleAttributes (ObjectHandle
,
191 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION
)ObjectInformation
);
196 Status
= STATUS_INVALID_INFO_CLASS
;
200 ObDereferenceObject (Object
);
202 if (ReturnLength
!= NULL
)
203 *ReturnLength
= InfoLength
;
209 /**********************************************************************
211 * ObMakeTemporaryObject
224 ObMakeTemporaryObject(IN PVOID ObjectBody
)
226 POBJECT_HEADER ObjectHeader
;
228 ObjectHeader
= BODY_TO_HEADER(ObjectBody
);
229 ObjectHeader
->Permanent
= FALSE
;
233 /**********************************************************************
235 * NtMakeTemporaryObject
246 NtMakeTemporaryObject(IN HANDLE Handle
)
248 POBJECT_HEADER ObjectHeader
;
252 Status
= ObReferenceObjectByHandle(Handle
,
255 (KPROCESSOR_MODE
)KeGetPreviousMode(),
258 if (Status
!= STATUS_SUCCESS
)
263 ObjectHeader
= BODY_TO_HEADER(Object
);
264 ObjectHeader
->Permanent
= FALSE
;
266 ObDereferenceObject(Object
);
268 return STATUS_SUCCESS
;
272 /**********************************************************************
274 * NtMakePermanentObject
287 NtMakePermanentObject(IN HANDLE Handle
)
289 POBJECT_HEADER ObjectHeader
;
293 Status
= ObReferenceObjectByHandle(Handle
,
296 (KPROCESSOR_MODE
)KeGetPreviousMode(),
299 if (Status
!= STATUS_SUCCESS
)
304 ObjectHeader
= BODY_TO_HEADER(Object
);
305 ObjectHeader
->Permanent
= TRUE
;
307 ObDereferenceObject(Object
);
309 return STATUS_SUCCESS
;