Implement NtMakePermanentObject().
[reactos.git] / reactos / ntoskrnl / ob / ntobj.c
1 /* $Id: ntobj.c,v 1.21 2004/07/17 12:08:21 ekohl 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 BasicInfo->CreateTime.QuadPart = (ULONGLONG)0;
139 }
140 Status = STATUS_SUCCESS;
141 }
142 break;
143
144 case ObjectNameInformation:
145 Status = ObQueryNameString (Object,
146 (POBJECT_NAME_INFORMATION)ObjectInformation,
147 Length,
148 &InfoLength);
149 break;
150
151 case ObjectTypeInformation:
152 #if 0
153 // InfoLength =
154 if (Length != sizeof(OBJECT_TYPE_INFORMATION))
155 {
156 Status = STATUS_INVALID_BUFFER_SIZE;
157 }
158 else
159 {
160 POBJECT_TYPE_INFORMATION TypeInfo;
161
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);
166
167 if (Status != STATUS_SUCCESS)
168 {
169 break;
170 }
171
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;
176 }
177 #endif
178 Status = STATUS_NOT_IMPLEMENTED;
179 break;
180
181 case ObjectAllTypesInformation:
182 Status = STATUS_NOT_IMPLEMENTED;
183 break;
184
185 case ObjectHandleInformation:
186 InfoLength = sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION);
187 if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
188 {
189 Status = STATUS_INFO_LENGTH_MISMATCH;
190 }
191 else
192 {
193 Status = ObpQueryHandleAttributes (ObjectHandle,
194 (POBJECT_HANDLE_ATTRIBUTE_INFORMATION)ObjectInformation);
195 }
196 break;
197
198 default:
199 Status = STATUS_INVALID_INFO_CLASS;
200 break;
201 }
202
203 ObDereferenceObject (Object);
204
205 if (ReturnLength != NULL)
206 *ReturnLength = InfoLength;
207
208 return Status;
209 }
210
211
212 /**********************************************************************
213 * NAME EXPORTED
214 * ObMakeTemporaryObject
215 *
216 * DESCRIPTION
217 *
218 * ARGUMENTS
219 *
220 * RETURN VALUE
221 *
222 * REVISIONS
223 *
224 * @implemented
225 */
226 VOID STDCALL
227 ObMakeTemporaryObject(IN PVOID ObjectBody)
228 {
229 POBJECT_HEADER ObjectHeader;
230
231 ObjectHeader = BODY_TO_HEADER(ObjectBody);
232 ObjectHeader->Permanent = FALSE;
233 }
234
235
236 /**********************************************************************
237 * NAME EXPORTED
238 * NtMakeTemporaryObject
239 *
240 * DESCRIPTION
241 *
242 * ARGUMENTS
243 *
244 * RETURN VALUE
245 *
246 * REVISIONS
247 */
248 NTSTATUS STDCALL
249 NtMakeTemporaryObject(IN HANDLE Handle)
250 {
251 POBJECT_HEADER ObjectHeader;
252 PVOID Object;
253 NTSTATUS Status;
254
255 Status = ObReferenceObjectByHandle(Handle,
256 0,
257 NULL,
258 (KPROCESSOR_MODE)KeGetPreviousMode(),
259 &Object,
260 NULL);
261 if (Status != STATUS_SUCCESS)
262 {
263 return Status;
264 }
265
266 ObjectHeader = BODY_TO_HEADER(Object);
267 ObjectHeader->Permanent = FALSE;
268
269 ObDereferenceObject(Object);
270
271 return STATUS_SUCCESS;
272 }
273
274
275 /**********************************************************************
276 * NAME EXPORTED
277 * NtMakePermanentObject
278 *
279 * DESCRIPTION
280 *
281 * ARGUMENTS
282 *
283 * RETURN VALUE
284 *
285 * REVISIONS
286 */
287 NTSTATUS STDCALL
288 NtMakePermanentObject(IN HANDLE Handle)
289 {
290 POBJECT_HEADER ObjectHeader;
291 PVOID Object;
292 NTSTATUS Status;
293
294 Status = ObReferenceObjectByHandle(Handle,
295 0,
296 NULL,
297 (KPROCESSOR_MODE)KeGetPreviousMode(),
298 &Object,
299 NULL);
300 if (Status != STATUS_SUCCESS)
301 {
302 return Status;
303 }
304
305 ObjectHeader = BODY_TO_HEADER(Object);
306 ObjectHeader->Permanent = TRUE;
307
308 ObDereferenceObject(Object);
309
310 return STATUS_SUCCESS;
311 }
312
313 /* EOF */