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 ************************************************************/
27 NtSetInformationObject (
28 IN HANDLE ObjectHandle,
29 IN CINT ObjectInformationClass,
30 IN PVOID ObjectInformation,
37 #endif /* LIBCAPTIVE */
42 POBJECT_HEADER ObjectHeader,
43 PUNICODE_STRING string)
44 /* So, what's the purpose of this function?
45 It will take any OBJECT_HEADER and traverse the Parent structure up to the root
46 and form the name, i.e. this will only work on objects where the Parent/Name fields
47 have any meaning (not files) */
50 if (ObjectHeader->Parent)
52 status = internalNameBuilder(BODY_TO_HEADER(ObjectHeader->Parent),string);
53 if (status != STATUS_SUCCESS)
58 if (ObjectHeader->Name.Buffer)
60 status = RtlAppendUnicodeToString(string, L"\\");
61 if (status != STATUS_SUCCESS) return status;
62 return RtlAppendUnicodeStringToString(string, &ObjectHeader->Name);
64 return STATUS_SUCCESS;
72 IN HANDLE ObjectHandle,
73 IN CINT ObjectInformationClass,
74 OUT PVOID ObjectInformation,
76 OUT PULONG ResultLength
78 /*Very, very, very new implementation. Test it!
80 Probably we should add meaning to QueryName in POBJECT_TYPE, no matter if we know
81 the correct parameters or not. For FILE_OBJECTs, it would probably look like the code
82 for ObjectNameInformation below. You give it a POBJECT and a PUNICODE_STRING, and it
83 returns the full path in the PUNICODE_STRING
85 If we don't do it this way, we should anyway add switches and separate functions to handle
86 the different object types*/
88 POBJECT_NAME_INFORMATION nameinfo;
89 POBJECT_TYPE_INFORMATION typeinfo;
90 PFILE_NAME_INFORMATION filenameinfo;
93 POBJECT_HEADER ObjectHeader;
96 Status = ObReferenceObjectByHandle(ObjectHandle,
102 if (Status != STATUS_SUCCESS)
107 ObjectHeader = BODY_TO_HEADER(Object);
109 switch (ObjectInformationClass)
111 case ObjectNameInformation:
112 if (Length!=sizeof(OBJECT_NAME_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE;
113 nameinfo = (POBJECT_NAME_INFORMATION)ObjectInformation;
114 (*ResultLength)=Length;
116 if (ObjectHeader->Type==InternalFileType) // FIXME: Temporary QueryName implementation, or at least separate functions
118 fileob = (PFILE_OBJECT) Object;
119 Status = internalNameBuilder(BODY_TO_HEADER(fileob->DeviceObject->Vpb->RealDevice), &nameinfo->Name);
121 if (Status != STATUS_SUCCESS)
123 ObDereferenceObject(Object);
126 filenameinfo = ExAllocatePool(NonPagedPool,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG));
127 IoQueryFileInformation(fileob,FileNameInformation,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG), filenameinfo,NULL);
129 Status = RtlAppendUnicodeToString(&(nameinfo->Name), filenameinfo->FileName);
131 ExFreePool( filenameinfo);
132 ObDereferenceObject(Object);
136 if (ObjectHeader->Name.Buffer) // If it's got a name there, we can probably just make the full path through Name and Parent
138 Status = internalNameBuilder(ObjectHeader, &nameinfo->Name);
139 ObDereferenceObject(Object);
142 ObDereferenceObject(Object);
143 return STATUS_NOT_IMPLEMENTED;
144 case ObjectTypeInformation:
145 typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
146 if (Length!=sizeof(OBJECT_TYPE_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE;
148 // FIXME: Is this supposed to only be the header's Name field?
149 // Can somebody check/verify this?
150 RtlCopyUnicodeString(&typeinfo->Name,&ObjectHeader->Name);
152 if (Status != STATUS_SUCCESS)
154 ObDereferenceObject(Object);
158 RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName);
159 //This should be info from the object header, not the object type, right?
160 typeinfo->TotalHandles = ObjectHeader-> HandleCount;
161 typeinfo->ReferenceCount = ObjectHeader -> RefCount;
163 ObDereferenceObject(Object);
166 ObDereferenceObject(Object);
167 return STATUS_NOT_IMPLEMENTED;
172 ObMakeTemporaryObject (PVOID ObjectBody)
174 POBJECT_HEADER ObjectHeader;
176 ObjectHeader = BODY_TO_HEADER(ObjectBody);
177 ObjectHeader->Permanent = FALSE;
181 /**********************************************************************
183 * NtMakeTemporaryObject
195 NtMakeTemporaryObject (
201 POBJECT_HEADER ObjectHeader;
203 Status = ObReferenceObjectByHandle(
211 if (Status != STATUS_SUCCESS)
216 ObjectHeader = BODY_TO_HEADER(Object);
217 ObjectHeader->Permanent = FALSE;
219 ObDereferenceObject(Object);
221 return STATUS_SUCCESS;
224 #endif /* LIBCAPTIVE */