3bea93162a35d382436cceb6d7448a0f7e46d389
[reactos.git] / reactos / ntoskrnl / ob / ntobj.c
1 /* $Id: ntobj.c,v 1.20 2004/07/17 03:06:01 ion Exp $
2 *
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)
8 * UPDATE HISTORY:
9 * 10/06/98: Created
10 */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/id.h>
17
18 #define NDEBUG
19 #include <internal/debug.h>
20
21
22 /* FUNCTIONS ************************************************************/
23
24 /**********************************************************************
25 * NAME EXPORTED
26 * NtSetInformationObject
27 *
28 * DESCRIPTION
29 *
30 * ARGUMENTS
31 *
32 * RETURN VALUE
33 *
34 * REVISIONS
35 */
36 NTSTATUS STDCALL
37 NtSetInformationObject (IN HANDLE ObjectHandle,
38 IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
39 IN PVOID ObjectInformation,
40 IN ULONG Length)
41 {
42 PVOID Object;
43 NTSTATUS Status;
44
45 if (ObjectInformationClass != ObjectHandleInformation)
46 return STATUS_INVALID_INFO_CLASS;
47
48 if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
49 return STATUS_INFO_LENGTH_MISMATCH;
50
51 Status = ObReferenceObjectByHandle (ObjectHandle,
52 0,
53 NULL,
54 (KPROCESSOR_MODE)KeGetPreviousMode (),
55 &Object,
56 NULL);
57 if (!NT_SUCCESS (Status))
58 {
59 return Status;
60 }
61
62 Status = ObpSetHandleAttributes (ObjectHandle,
63 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION)ObjectInformation);
64
65 ObDereferenceObject (Object);
66
67 return Status;
68 }
69
70
71 /**********************************************************************
72 * NAME EXPORTED
73 * NtQueryObject
74 *
75 * DESCRIPTION
76 *
77 * ARGUMENTS
78 *
79 * RETURN VALUE
80 *
81 * REVISIONS
82 */
83 NTSTATUS STDCALL
84 NtQueryObject (IN HANDLE ObjectHandle,
85 IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
86 OUT PVOID ObjectInformation,
87 IN ULONG Length,
88 OUT PULONG ReturnLength OPTIONAL)
89 {
90 OBJECT_HANDLE_INFORMATION HandleInfo;
91 POBJECT_HEADER ObjectHeader;
92 ULONG InfoLength;
93 PVOID Object;
94 NTSTATUS Status;
95
96 Status = ObReferenceObjectByHandle (ObjectHandle,
97 0,
98 NULL,
99 (KPROCESSOR_MODE)KeGetPreviousMode(),
100 &Object,
101 &HandleInfo);
102 if (!NT_SUCCESS (Status))
103 {
104 return Status;
105 }
106
107 ObjectHeader = BODY_TO_HEADER(Object);
108
109 switch (ObjectInformationClass)
110 {
111 case ObjectBasicInformation:
112 InfoLength = sizeof(OBJECT_BASIC_INFORMATION);
113 if (Length != sizeof(OBJECT_BASIC_INFORMATION))
114 {
115 Status = STATUS_INFO_LENGTH_MISMATCH;
116 }
117 else
118 {
119 POBJECT_BASIC_INFORMATION BasicInfo;
120
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)
132 {
133 BasicInfo->CreateTime.QuadPart =
134 ((PSYMLINK_OBJECT)Object)->CreateTime.QuadPart;
135 }
136 else
137 {
138 #if defined(__GNUC__)
139 BasicInfo->CreateTime.QuadPart = 0ULL;
140 #else
141 BasicInfo->CreateTime.QuadPart = 0;
142 #endif
143 }
144 Status = STATUS_SUCCESS;
145 }
146 break;
147
148 case ObjectNameInformation:
149 Status = ObQueryNameString (Object,
150 (POBJECT_NAME_INFORMATION)ObjectInformation,
151 Length,
152 &InfoLength);
153 break;
154
155 case ObjectTypeInformation:
156 #if 0
157 // InfoLength =
158 if (Length != sizeof(OBJECT_TYPE_INFORMATION))
159 {
160 Status = STATUS_INVALID_BUFFER_SIZE;
161 }
162 else
163 {
164 POBJECT_TYPE_INFORMATION TypeInfo;
165
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);
170
171 if (Status != STATUS_SUCCESS)
172 {
173 break;
174 }
175
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;
180 }
181 #endif
182 Status = STATUS_NOT_IMPLEMENTED;
183 break;
184
185 case ObjectAllTypesInformation:
186 Status = STATUS_NOT_IMPLEMENTED;
187 break;
188
189 case ObjectHandleInformation:
190 InfoLength = sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION);
191 if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
192 {
193 Status = STATUS_INFO_LENGTH_MISMATCH;
194 }
195 else
196 {
197 Status = ObpQueryHandleAttributes (ObjectHandle,
198 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION)ObjectInformation);
199 }
200 break;
201
202 default:
203 Status = STATUS_INVALID_INFO_CLASS;
204 break;
205 }
206
207 ObDereferenceObject (Object);
208
209 if (ReturnLength != NULL)
210 *ReturnLength = InfoLength;
211
212 return Status;
213 }
214
215
216 /**********************************************************************
217 * NAME EXPORTED
218 * ObMakeTemporaryObject
219 *
220 * DESCRIPTION
221 *
222 * ARGUMENTS
223 *
224 * RETURN VALUE
225 *
226 * REVISIONS
227 *
228 * @implemented
229 */
230 VOID STDCALL
231 ObMakeTemporaryObject (IN PVOID ObjectBody)
232 {
233 POBJECT_HEADER ObjectHeader;
234
235 ObjectHeader = BODY_TO_HEADER(ObjectBody);
236 ObjectHeader->Permanent = FALSE;
237 }
238
239
240 /**********************************************************************
241 * NAME EXPORTED
242 * NtMakeTemporaryObject
243 *
244 * DESCRIPTION
245 *
246 * ARGUMENTS
247 *
248 * RETURN VALUE
249 *
250 * REVISIONS
251 */
252 NTSTATUS STDCALL
253 NtMakeTemporaryObject (IN HANDLE Handle)
254 {
255 POBJECT_HEADER ObjectHeader;
256 PVOID Object;
257 NTSTATUS Status;
258
259 Status = ObReferenceObjectByHandle(Handle,
260 0,
261 NULL,
262 (KPROCESSOR_MODE)KeGetPreviousMode(),
263 & Object,
264 NULL);
265 if (Status != STATUS_SUCCESS)
266 {
267 return Status;
268 }
269
270 ObjectHeader = BODY_TO_HEADER(Object);
271 ObjectHeader->Permanent = FALSE;
272
273 ObDereferenceObject(Object);
274
275 return STATUS_SUCCESS;
276 }
277
278 /*
279 * @unimplemented
280 */
281 NTSTATUS
282 STDCALL
283 NtMakePermanentObject(
284 IN HANDLE Object
285 )
286 {
287 UNIMPLEMENTED;
288 return STATUS_NOT_IMPLEMENTED;
289 }
290
291
292 /* EOF */