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