preliminary comment out the self-modifying code for RtlPrefetchMemoryNonTemporal
[reactos.git] / reactos / ntoskrnl / ob / ntobj.c
index 1ef60c8..527ac5d 100644 (file)
-/*
- * COPYRIGHT:     See COPYING in the top level directory
- * PROJECT:       ReactOS kernel
- * FILE:          ntoskrnl/ob/ntobj.c
- * PURPOSE:       User mode interface to object manager
- * PROGRAMMER:    David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- *               10/06/98: Created
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/ob/ntobj.c
+ * PURPOSE:         User mode interface to object manager
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
 /* INCLUDES *****************************************************************/
 
-#include <wchar.h>
-#include <ddk/ntddk.h>
-#include <internal/ob.h>
-#include <string.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
+
 /* FUNCTIONS ************************************************************/
 
-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 OBJECT_INFORMATION_CLASS ObjectInformationClass,
+                       IN PVOID ObjectInformation,
+                       IN ULONG Length)
 {
-   return(ZwSetInformationObject(ObjectHandle,
-                                ObjectInformationClass,
-                                ObjectInformation,
-                                Length));
-}
+  PVOID Object;
+  NTSTATUS Status;
 
-NTSTATUS STDCALL ZwSetInformationObject(IN HANDLE ObjectHandle,
-                                       IN CINT ObjectInformationClass,
-                                       IN PVOID ObjectInformation,
-                                       IN ULONG Length)
-{
-   UNIMPLEMENTED;
-}
+  PAGED_CODE();
 
-NTSTATUS STDCALL NtQueryObject(IN HANDLE ObjectHandle,
-                              IN CINT ObjectInformationClass,
-                              OUT PVOID ObjectInformation,
-                              IN ULONG Length,
-                              OUT PULONG ResultLength)
-{
-   return(ZwQueryObject(ObjectHandle,
-                       ObjectInformationClass,
-                       ObjectInformation,
-                       Length,
-                       ResultLength));
+  if (ObjectInformationClass != ObjectHandleInformation)
+    return STATUS_INVALID_INFO_CLASS;
+
+  if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
+    return STATUS_INFO_LENGTH_MISMATCH;
+
+  Status = ObReferenceObjectByHandle (ObjectHandle,
+                                     0,
+                                     NULL,
+                                     (KPROCESSOR_MODE)KeGetPreviousMode (),
+                                     &Object,
+                                     NULL);
+  if (!NT_SUCCESS (Status))
+    {
+      return Status;
+    }
+
+  Status = ObpSetHandleAttributes (ObjectHandle,
+                                  (POBJECT_HANDLE_ATTRIBUTE_INFORMATION)ObjectInformation);
+
+  ObDereferenceObject (Object);
+
+  return Status;
 }
 
-NTSTATUS STDCALL ZwQueryObject(IN HANDLE ObjectHandle,
-                              IN CINT ObjectInformationClass,
-                              OUT PVOID ObjectInformation,
-                              IN ULONG Length,
-                              OUT PULONG ResultLength)
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtQueryObject
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+NTSTATUS STDCALL
+NtQueryObject (IN HANDLE ObjectHandle,
+              IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
+              OUT PVOID ObjectInformation,
+              IN ULONG Length,
+              OUT PULONG ResultLength  OPTIONAL)
 {
-   UNIMPLEMENTED
+  OBJECT_HANDLE_INFORMATION HandleInfo;
+  POBJECT_HEADER ObjectHeader;
+  ULONG InfoLength;
+  PVOID Object;
+  NTSTATUS Status;
+
+  PAGED_CODE();
+
+  Status = ObReferenceObjectByHandle (ObjectHandle,
+                                     0,
+                                     NULL,
+                                     (KPROCESSOR_MODE)KeGetPreviousMode(),
+                                     &Object,
+                                     &HandleInfo);
+  if (!NT_SUCCESS (Status))
+    {
+      return Status;
+    }
+
+  ObjectHeader = BODY_TO_HEADER(Object);
+
+  switch (ObjectInformationClass)
+    {
+      case ObjectBasicInformation:
+       InfoLength = sizeof(OBJECT_BASIC_INFORMATION);
+       if (Length != sizeof(OBJECT_BASIC_INFORMATION))
+         {
+           Status = STATUS_INFO_LENGTH_MISMATCH;
+         }
+       else
+         {
+           POBJECT_BASIC_INFORMATION BasicInfo;
+
+           BasicInfo = (POBJECT_BASIC_INFORMATION)ObjectInformation;
+           BasicInfo->Attributes = HandleInfo.HandleAttributes;
+           BasicInfo->GrantedAccess = HandleInfo.GrantedAccess;
+           BasicInfo->HandleCount = ObjectHeader->HandleCount;
+           BasicInfo->PointerCount = ObjectHeader->PointerCount;
+           BasicInfo->PagedPoolUsage = 0; /* FIXME*/
+           BasicInfo->NonPagedPoolUsage = 0; /* FIXME*/
+           BasicInfo->NameInformationLength = 0; /* FIXME*/
+           BasicInfo->TypeInformationLength = 0; /* FIXME*/
+           BasicInfo->SecurityDescriptorLength = 0; /* FIXME*/
+           if (ObjectHeader->Type == ObSymbolicLinkType)
+             {
+               BasicInfo->CreateTime.QuadPart =
+                 ((PSYMLINK_OBJECT)Object)->CreateTime.QuadPart;
+             }
+           else
+             {
+               BasicInfo->CreateTime.QuadPart = (ULONGLONG)0;
+             }
+           Status = STATUS_SUCCESS;
+         }
+       break;
+
+      case ObjectNameInformation:
+       Status = ObQueryNameString (Object,
+                                   (POBJECT_NAME_INFORMATION)ObjectInformation,
+                                   Length,
+                                   &InfoLength);
+       break;
+
+      case ObjectTypeInformation:
+#if 0
+//     InfoLength =
+       if (Length != sizeof(OBJECT_TYPE_INFORMATION))
+         {
+           Status = STATUS_INVALID_BUFFER_SIZE;
+         }
+       else
+         {
+           POBJECT_TYPE_INFORMATION TypeInfo;
+
+           TypeInfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
+       // 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)
+         {
+           break;
+         }
+
+       RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->Type->TypeName);
+       //This should be info from the object header, not the object type, right?
+       typeinfo->TotalHandles = ObjectHeader-> HandleCount;
+       typeinfo->ReferenceCount = ObjectHeader -> PointerCount;
+         }
+#endif
+       Status = STATUS_NOT_IMPLEMENTED;
+       break;
+
+      case ObjectAllTypesInformation:
+       Status = STATUS_NOT_IMPLEMENTED;
+       break;
+
+      case ObjectHandleInformation:
+       InfoLength = sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION);
+       if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
+         {
+           Status = STATUS_INFO_LENGTH_MISMATCH;
+         }
+       else
+         {
+           Status = ObpQueryHandleAttributes (ObjectHandle,
+                                              (POBJECT_HANDLE_ATTRIBUTE_INFORMATION)ObjectInformation);
+         }
+       break;
+
+      default:
+       Status = STATUS_INVALID_INFO_CLASS;
+       break;
+    }
+
+  ObDereferenceObject (Object);
+
+  if (ResultLength != NULL)
+    *ResultLength = InfoLength;
+
+  return Status;
 }
 
-VOID ObMakeTemporaryObject(PVOID ObjectBody)
+
+/**********************************************************************
+ * NAME                                                        PRIVATE
+ *     ObpSetPermanentObject/2
+ *
+ * DESCRIPTION
+ *     Fast general purpose routine to set an object's permanent
+ *     attribute, given a  pointer to the object's body.
+ */
+VOID FASTCALL
+ObpSetPermanentObject (IN PVOID ObjectBody, IN BOOLEAN Permanent)
 {
-   POBJECT_HEADER ObjectHeader;
-   
-   ObjectHeader = BODY_TO_HEADER(ObjectBody);
-   ObjectHeader->Permanent = FALSE;
+  POBJECT_HEADER ObjectHeader;
+
+  ObjectHeader = BODY_TO_HEADER(ObjectBody);
+  ASSERT (ObjectHeader->PointerCount > 0);
+  if (Permanent)
+  {
+     ObjectHeader->Flags |= OB_FLAG_PERMANENT;
+  }
+  else
+  {
+     ObjectHeader->Flags &= ~OB_FLAG_PERMANENT;
+     if (ObjectHeader->HandleCount == 0 && HEADER_TO_OBJECT_NAME(ObjectHeader)->Directory)
+     {
+        /* Remove the object from the namespace */
+        ObpRemoveEntryDirectory(ObjectHeader);
+     }
+  }
 }
 
-NTSTATUS NtMakeTemporaryObject(HANDLE Handle)
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     ObMakeTemporaryObject/1
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
+VOID STDCALL
+ObMakeTemporaryObject(IN PVOID ObjectBody)
 {
-   return(ZwMakeTemporaryObject(Handle));
+  ObpSetPermanentObject (ObjectBody, FALSE);
 }
 
-NTSTATUS ZwMakeTemporaryObject(HANDLE Handle)
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtMakeTemporaryObject
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+NTSTATUS STDCALL
+NtMakeTemporaryObject(IN HANDLE ObjectHandle)
 {
-   PVOID Object;
-   NTSTATUS Status;  
-   POBJECT_HEADER ObjectHeader;
-   
-   Status = ObReferenceObjectByHandle(Handle,
-                                     0,
-                                     NULL,
-                                     KernelMode,
-                                     &Object,
-                                     NULL);
-   if (Status != STATUS_SUCCESS)
-     {
-       return(Status);
-     }
+  PVOID ObjectBody;
+  NTSTATUS Status;
+
+  PAGED_CODE();
+
+  Status = ObReferenceObjectByHandle(ObjectHandle,
+                                    0,
+                                    NULL,
+                                    (KPROCESSOR_MODE)KeGetPreviousMode(),
+                                    &ObjectBody,
+                                    NULL);
+  if (Status != STATUS_SUCCESS)
+    {
+      return Status;
+    }
+
+  ObpSetPermanentObject (ObjectBody, FALSE);
+
+  ObDereferenceObject(ObjectBody);
 
-   ObjectHeader = BODY_TO_HEADER(Object);
-   ObjectHeader->Permanent = FALSE;
-   
-   ObDereferenceObject(Object);
-   
-   return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
-NTSTATUS NtClose(HANDLE Handle)
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtMakePermanentObject/1
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
+NTSTATUS STDCALL
+NtMakePermanentObject(IN HANDLE ObjectHandle)
 {
-   return(ZwClose(Handle));
+  PVOID ObjectBody;
+  NTSTATUS Status;
+
+  PAGED_CODE();
+
+  Status = ObReferenceObjectByHandle(ObjectHandle,
+                                    0,
+                                    NULL,
+                                    (KPROCESSOR_MODE)KeGetPreviousMode(),
+                                    &ObjectBody,
+                                    NULL);
+  if (Status != STATUS_SUCCESS)
+    {
+      return Status;
+    }
+
+  ObpSetPermanentObject (ObjectBody, TRUE);
+
+  ObDereferenceObject(ObjectBody);
+
+  return STATUS_SUCCESS;
 }
 
+/* EOF */