1 /* $Id: ntobj.c,v 1.20 2004/07/17 03:06:01 ion 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 #if defined(__GNUC__)
139 BasicInfo
->CreateTime
.QuadPart
= 0ULL;
141 BasicInfo
->CreateTime
.QuadPart
= 0;
144 Status
= STATUS_SUCCESS
;
148 case ObjectNameInformation
:
149 Status
= ObQueryNameString (Object
,
150 (POBJECT_NAME_INFORMATION
)ObjectInformation
,
155 case ObjectTypeInformation
:
158 if (Length
!= sizeof(OBJECT_TYPE_INFORMATION
))
160 Status
= STATUS_INVALID_BUFFER_SIZE
;
164 POBJECT_TYPE_INFORMATION TypeInfo
;
166 TypeInfo
= (POBJECT_TYPE_INFORMATION
)ObjectInformation
;
167 // FIXME: Is this supposed to only be the header's Name field?
168 // Can somebody check/verify this?
169 RtlCopyUnicodeString(&typeinfo
->Name
,&ObjectHeader
->Name
);
171 if (Status
!= STATUS_SUCCESS
)
176 RtlCopyUnicodeString(&typeinfo
->Type
,&ObjectHeader
->ObjectType
->TypeName
);
177 //This should be info from the object header, not the object type, right?
178 typeinfo
->TotalHandles
= ObjectHeader
-> HandleCount
;
179 typeinfo
->ReferenceCount
= ObjectHeader
-> RefCount
;
182 Status
= STATUS_NOT_IMPLEMENTED
;
185 case ObjectAllTypesInformation
:
186 Status
= STATUS_NOT_IMPLEMENTED
;
189 case ObjectHandleInformation
:
190 InfoLength
= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
);
191 if (Length
!= sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION
))
193 Status
= STATUS_INFO_LENGTH_MISMATCH
;
197 Status
= ObpQueryHandleAttributes (ObjectHandle
,
198 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION
)ObjectInformation
);
203 Status
= STATUS_INVALID_INFO_CLASS
;
207 ObDereferenceObject (Object
);
209 if (ReturnLength
!= NULL
)
210 *ReturnLength
= InfoLength
;
216 /**********************************************************************
218 * ObMakeTemporaryObject
231 ObMakeTemporaryObject (IN PVOID ObjectBody
)
233 POBJECT_HEADER ObjectHeader
;
235 ObjectHeader
= BODY_TO_HEADER(ObjectBody
);
236 ObjectHeader
->Permanent
= FALSE
;
240 /**********************************************************************
242 * NtMakeTemporaryObject
253 NtMakeTemporaryObject (IN HANDLE Handle
)
255 POBJECT_HEADER ObjectHeader
;
259 Status
= ObReferenceObjectByHandle(Handle
,
262 (KPROCESSOR_MODE
)KeGetPreviousMode(),
265 if (Status
!= STATUS_SUCCESS
)
270 ObjectHeader
= BODY_TO_HEADER(Object
);
271 ObjectHeader
->Permanent
= FALSE
;
273 ObDereferenceObject(Object
);
275 return STATUS_SUCCESS
;
283 NtMakePermanentObject(
288 return STATUS_NOT_IMPLEMENTED
;