branch update for HEAD-2003091401
[reactos.git] / ntoskrnl / ob / ntobj.c
index cb3fda8..d59b705 100644 (file)
 #define NDEBUG
 #include <internal/debug.h>
 
+
 /* FUNCTIONS ************************************************************/
 
 #ifndef LIBCAPTIVE
 
-NTSTATUS
-STDCALL
-NtSetInformationObject (
-       IN      HANDLE  ObjectHandle,
-       IN      CINT    ObjectInformationClass,
-       IN      PVOID   ObjectInformation,
-       IN      ULONG   Length
-       )
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtSetInformationObject
+ *     
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+NTSTATUS STDCALL
+NtSetInformationObject (IN HANDLE ObjectHandle,
+                       IN CINT ObjectInformationClass,
+                       IN PVOID ObjectInformation,
+                       IN ULONG Length)
 {
-       UNIMPLEMENTED;
+  UNIMPLEMENTED;
 }
 
 #endif /* LIBCAPTIVE */
@@ -66,15 +76,6 @@ PUNICODE_STRING string)
 
 #ifndef LIBCAPTIVE
 
-NTSTATUS
-STDCALL
-NtQueryObject (
-       IN      HANDLE  ObjectHandle,
-       IN      CINT    ObjectInformationClass,
-       OUT     PVOID   ObjectInformation,
-       IN      ULONG   Length,
-       OUT     PULONG  ResultLength
-       )
 /*Very, very, very new implementation. Test it!
 
   Probably we should add meaning to QueryName in POBJECT_TYPE, no matter if we know
@@ -84,95 +85,103 @@ NtQueryObject (
 
   If we don't do it this way, we should anyway add switches and separate functions to handle
   the different object types*/
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtQueryObject
+ *     
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+NTSTATUS STDCALL
+NtQueryObject (IN HANDLE ObjectHandle,
+              IN CINT ObjectInformationClass,
+              OUT PVOID ObjectInformation,
+              IN ULONG Length,
+              OUT PULONG ReturnLength)
 {
-  POBJECT_NAME_INFORMATION nameinfo;
   POBJECT_TYPE_INFORMATION typeinfo;
-  PFILE_NAME_INFORMATION filenameinfo;
-  PVOID                Object;
-  NTSTATUS     Status;  
-  POBJECT_HEADER       ObjectHeader;
-  PFILE_OBJECT    fileob;
-  
-  Status = ObReferenceObjectByHandle(ObjectHandle,
-                                    0,
-                                    NULL,
-                                    KernelMode,
-                                    &Object,
-                                    NULL);
-  if (Status != STATUS_SUCCESS)
+  POBJECT_HEADER ObjectHeader;
+  PVOID Object;
+  NTSTATUS Status;
+
+  Status = ObReferenceObjectByHandle (ObjectHandle,
+                                     0,
+                                     NULL,
+                                     KeGetPreviousMode(),
+                                     &Object,
+                                     NULL);
+  if (!NT_SUCCESS (Status))
     {
       return Status;
     }
-  
+
   ObjectHeader = BODY_TO_HEADER(Object);
-  
+
   switch (ObjectInformationClass)
     {
-    case ObjectNameInformation:
-      if (Length!=sizeof(OBJECT_NAME_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE;
-      nameinfo = (POBJECT_NAME_INFORMATION)ObjectInformation;
-      (*ResultLength)=Length;          
-      
-      if (ObjectHeader->Type==InternalFileType)  // FIXME: Temporary QueryName implementation, or at least separate functions
-       {
-         fileob = (PFILE_OBJECT) Object;
-         Status = internalNameBuilder(BODY_TO_HEADER(fileob->DeviceObject->Vpb->RealDevice), &nameinfo->Name);
-         
-         if (Status != STATUS_SUCCESS)
-           {
-             ObDereferenceObject(Object);
-             return Status;
-           }
-         filenameinfo = ExAllocatePool(NonPagedPool,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG));
-         IoQueryFileInformation(fileob,FileNameInformation,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG), filenameinfo,NULL);
-         
-         Status = RtlAppendUnicodeToString(&(nameinfo->Name), filenameinfo->FileName);
-         
-         ExFreePool( filenameinfo);
-         ObDereferenceObject(Object);
-         return Status;
-       }
-      else
-       if (ObjectHeader->Name.Buffer) // If it's got a name there, we can probably just make the full path through Name and Parent
+      case ObjectNameInformation:
+       Status = ObQueryNameString (Object,
+                                   (POBJECT_NAME_INFORMATION)ObjectInformation,
+                                   Length,
+                                   ReturnLength);
+       break;
+
+      case ObjectTypeInformation:
+       typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
+       if (Length!=sizeof(OBJECT_TYPE_INFORMATION))
+         return STATUS_INVALID_BUFFER_SIZE;
+
+       // FIXME: Is this supposed to only be the header's Name field?
+       // Can somebody check/verify this?
+       RtlCopyUnicodeString(&typeinfo->Name,&ObjectHeader->Name);
+
+       if (Status != STATUS_SUCCESS)
          {
-           Status = internalNameBuilder(ObjectHeader, &nameinfo->Name);
-           ObDereferenceObject(Object);
-           return Status;
+           break;
          }
-      ObDereferenceObject(Object);
-      return STATUS_NOT_IMPLEMENTED;
-    case ObjectTypeInformation:
-      typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
-      if (Length!=sizeof(OBJECT_TYPE_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE;
-      
-      // FIXME: Is this supposed to only be the header's Name field?
-      // Can somebody check/verify this?
-      RtlCopyUnicodeString(&typeinfo->Name,&ObjectHeader->Name);
-      
-      if (Status != STATUS_SUCCESS)
-       {
-         ObDereferenceObject(Object);
-         return Status;
-       }
-      
-      RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName);
-      //This should be info from the object header, not the object type, right?                        
-      typeinfo->TotalHandles = ObjectHeader-> HandleCount; 
-      typeinfo->ReferenceCount = ObjectHeader -> RefCount;
-      
-      ObDereferenceObject(Object);
-      return Status;
-    default:
-      ObDereferenceObject(Object);
-      return STATUS_NOT_IMPLEMENTED;
+
+       RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName);
+       //This should be info from the object header, not the object type, right?
+       typeinfo->TotalHandles = ObjectHeader-> HandleCount;
+       typeinfo->ReferenceCount = ObjectHeader -> RefCount;
+       break;
+
+      default:
+       Status = STATUS_NOT_IMPLEMENTED;
+       break;
     }
+
+  ObDereferenceObject(Object);
+
+  return Status;
 }
 
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     ObMakeTemporaryObject
+ *     
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
 VOID STDCALL
-ObMakeTemporaryObject (PVOID   ObjectBody)
+ObMakeTemporaryObject (IN PVOID ObjectBody)
 {
-  POBJECT_HEADER       ObjectHeader;
-  
+  POBJECT_HEADER ObjectHeader;
+
   ObjectHeader = BODY_TO_HEADER(ObjectBody);
   ObjectHeader->Permanent = FALSE;
 }
@@ -192,33 +201,29 @@ ObMakeTemporaryObject (PVOID      ObjectBody)
  */
 NTSTATUS
 STDCALL
-NtMakeTemporaryObject (
-       HANDLE  Handle
-       )
+NtMakeTemporaryObject (IN HANDLE Handle)
 {
-       PVOID           Object;
-       NTSTATUS        Status;  
-       POBJECT_HEADER  ObjectHeader;
-   
-       Status = ObReferenceObjectByHandle(
-                       Handle,
-                       0,
-                       NULL,
-                       KernelMode,
-                       & Object,
-                       NULL
-                       );
-       if (Status != STATUS_SUCCESS)
-       {
-               return Status;
-       }
+  POBJECT_HEADER ObjectHeader;
+  PVOID Object;
+  NTSTATUS Status;
 
-       ObjectHeader = BODY_TO_HEADER(Object);
-       ObjectHeader->Permanent = FALSE;
-   
-       ObDereferenceObject(Object);
-   
-       return STATUS_SUCCESS;
+  Status = ObReferenceObjectByHandle(Handle,
+                                    0,
+                                    NULL,
+                                    KernelMode,
+                                    & Object,
+                                    NULL);
+  if (Status != STATUS_SUCCESS)
+    {
+      return Status;
+    }
+
+  ObjectHeader = BODY_TO_HEADER(Object);
+  ObjectHeader->Permanent = FALSE;
+
+  ObDereferenceObject(Object);
+
+  return STATUS_SUCCESS;
 }
 
 #endif /* LIBCAPTIVE */