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>
21 /* FUNCTIONS ************************************************************/
25 NtSetInformationObject (
26 IN HANDLE ObjectHandle,
27 IN CINT ObjectInformationClass,
28 IN PVOID ObjectInformation,
39 POBJECT_HEADER ObjectHeader,
40 PUNICODE_STRING string)
41 /* So, what's the purpose of this function?
42 It will take any OBJECT_HEADER and traverse the Parent structure up to the root
43 and form the name, i.e. this will only work on objects where the Parent/Name fields
44 have any meaning (not files) */
47 if (ObjectHeader->Parent)
49 status = internalNameBuilder(BODY_TO_HEADER(ObjectHeader->Parent),string);
50 if (status != STATUS_SUCCESS)
55 if (ObjectHeader->Name.Buffer)
57 status = RtlAppendUnicodeToString(string, L"\\");
58 if (status != STATUS_SUCCESS) return status;
59 return RtlAppendUnicodeStringToString(string, &ObjectHeader->Name);
61 return STATUS_SUCCESS;
67 IN HANDLE ObjectHandle,
68 IN CINT ObjectInformationClass,
69 OUT PVOID ObjectInformation,
71 OUT PULONG ResultLength
73 /*Very, very, very new implementation. Test it!
75 Probably we should add meaning to QueryName in POBJECT_TYPE, no matter if we know
76 the correct parameters or not. For FILE_OBJECTs, it would probably look like the code
77 for ObjectNameInformation below. You give it a POBJECT and a PUNICODE_STRING, and it
78 returns the full path in the PUNICODE_STRING
80 If we don't do it this way, we should anyway add switches and separate functions to handle
81 the different object types*/
83 POBJECT_NAME_INFORMATION nameinfo;
84 POBJECT_TYPE_INFORMATION typeinfo;
85 PFILE_NAME_INFORMATION filenameinfo;
88 POBJECT_HEADER ObjectHeader;
91 Status = ObReferenceObjectByHandle(ObjectHandle,
97 if (Status != STATUS_SUCCESS)
102 ObjectHeader = BODY_TO_HEADER(Object);
104 switch (ObjectInformationClass)
106 case ObjectNameInformation:
107 if (Length!=sizeof(OBJECT_NAME_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE;
108 nameinfo = (POBJECT_NAME_INFORMATION)ObjectInformation;
109 (*ResultLength)=Length;
111 if (ObjectHeader->Type==InternalFileType) // FIXME: Temporary QueryName implementation, or at least separate functions
113 fileob = (PFILE_OBJECT) Object;
114 Status = internalNameBuilder(BODY_TO_HEADER(fileob->DeviceObject->Vpb->RealDevice), &nameinfo->Name);
116 if (Status != STATUS_SUCCESS)
118 ObDereferenceObject(Object);
121 filenameinfo = ExAllocatePool(NonPagedPool,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG));
122 IoQueryFileInformation(fileob,FileNameInformation,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG), filenameinfo,NULL);
124 Status = RtlAppendUnicodeToString(&(nameinfo->Name), filenameinfo->FileName);
126 ExFreePool( filenameinfo);
127 ObDereferenceObject(Object);
131 if (ObjectHeader->Name.Buffer) // If it's got a name there, we can probably just make the full path through Name and Parent
133 Status = internalNameBuilder(ObjectHeader, &nameinfo->Name);
134 ObDereferenceObject(Object);
137 ObDereferenceObject(Object);
138 return STATUS_NOT_IMPLEMENTED;
139 case ObjectTypeInformation:
140 typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
141 if (Length!=sizeof(OBJECT_TYPE_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE;
143 // FIXME: Is this supposed to only be the header's Name field?
144 // Can somebody check/verify this?
145 RtlCopyUnicodeString(&typeinfo->Name,&ObjectHeader->Name);
147 if (Status != STATUS_SUCCESS)
149 ObDereferenceObject(Object);
153 RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName);
154 //This should be info from the object header, not the object type, right?
155 typeinfo->TotalHandles = ObjectHeader-> HandleCount;
156 typeinfo->ReferenceCount = ObjectHeader -> RefCount;
158 ObDereferenceObject(Object);
161 ObDereferenceObject(Object);
162 return STATUS_NOT_IMPLEMENTED;
167 ObMakeTemporaryObject (PVOID ObjectBody)
169 POBJECT_HEADER ObjectHeader;
171 ObjectHeader = BODY_TO_HEADER(ObjectBody);
172 ObjectHeader->Permanent = FALSE;
176 /**********************************************************************
178 * NtMakeTemporaryObject
190 NtMakeTemporaryObject (
196 POBJECT_HEADER ObjectHeader;
198 Status = ObReferenceObjectByHandle(
206 if (Status != STATUS_SUCCESS)
211 ObjectHeader = BODY_TO_HEADER(Object);
212 ObjectHeader->Permanent = FALSE;
214 ObDereferenceObject(Object);
216 return STATUS_SUCCESS;