preliminary comment out the self-modifying code for RtlPrefetchMemoryNonTemporal
[reactos.git] / reactos / ntoskrnl / ob / ntobj.c
index fdef59a..527ac5d 100644 (file)
@@ -1,20 +1,16 @@
-/* $Id: ntobj.c,v 1.16 2003/10/14 14:49:05 ekohl Exp $
+/* $Id$
  *
- * 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
+ * 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 <ddk/ntddk.h>
-#include <internal/ob.h>
-#include <internal/id.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
@@ -24,7 +20,7 @@
 /**********************************************************************
  * NAME                                                        EXPORTED
  *     NtSetInformationObject
- *     
+ *
  * DESCRIPTION
  *
  * ARGUMENTS
@@ -39,21 +35,21 @@ NtSetInformationObject (IN HANDLE ObjectHandle,
                        IN PVOID ObjectInformation,
                        IN ULONG Length)
 {
-#if 0
-  POBJECT_HEADER ObjectHeader;
   PVOID Object;
   NTSTATUS Status;
 
+  PAGED_CODE();
+
   if (ObjectInformationClass != ObjectHandleInformation)
     return STATUS_INVALID_INFO_CLASS;
 
-  if (Length != sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
+  if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
     return STATUS_INFO_LENGTH_MISMATCH;
 
   Status = ObReferenceObjectByHandle (ObjectHandle,
                                      0,
                                      NULL,
-                                     KeGetPreviousMode(),
+                                     (KPROCESSOR_MODE)KeGetPreviousMode (),
                                      &Object,
                                      NULL);
   if (!NT_SUCCESS (Status))
@@ -61,33 +57,19 @@ NtSetInformationObject (IN HANDLE ObjectHandle,
       return Status;
     }
 
-  ObjectHeader = BODY_TO_HEADER(Object);
-
-  /* FIXME: Change handle attributes here... */
+  Status = ObpSetHandleAttributes (ObjectHandle,
+                                  (POBJECT_HANDLE_ATTRIBUTE_INFORMATION)ObjectInformation);
 
-  ObDereferenceObject(Object);
+  ObDereferenceObject (Object);
 
   return Status;
-#endif
-
-  UNIMPLEMENTED;
 }
 
 
-/*Very, very, very new implementation. Test it!
-
-  Probably we should add meaning to QueryName in POBJECT_TYPE, no matter if we know
-  the correct parameters or not. For FILE_OBJECTs, it would probably look like the code
-  for ObjectNameInformation below. You give it a POBJECT and a PUNICODE_STRING, and it
-  returns the full path in the PUNICODE_STRING
-
-  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
@@ -101,19 +83,22 @@ NtQueryObject (IN HANDLE ObjectHandle,
               IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
               OUT PVOID ObjectInformation,
               IN ULONG Length,
-              OUT PULONG ReturnLength OPTIONAL)
+              OUT PULONG ResultLength  OPTIONAL)
 {
+  OBJECT_HANDLE_INFORMATION HandleInfo;
   POBJECT_HEADER ObjectHeader;
   ULONG InfoLength;
   PVOID Object;
   NTSTATUS Status;
 
+  PAGED_CODE();
+
   Status = ObReferenceObjectByHandle (ObjectHandle,
                                      0,
                                      NULL,
-                                     KeGetPreviousMode(),
+                                     (KPROCESSOR_MODE)KeGetPreviousMode(),
                                      &Object,
-                                     NULL);
+                                     &HandleInfo);
   if (!NT_SUCCESS (Status))
     {
       return Status;
@@ -134,23 +119,23 @@ NtQueryObject (IN HANDLE ObjectHandle,
            POBJECT_BASIC_INFORMATION BasicInfo;
 
            BasicInfo = (POBJECT_BASIC_INFORMATION)ObjectInformation;
-           BasicInfo->Attributes = 0; /* FIXME*/
-           BasicInfo->GrantedAccess = 0; /* FIXME*/
+           BasicInfo->Attributes = HandleInfo.HandleAttributes;
+           BasicInfo->GrantedAccess = HandleInfo.GrantedAccess;
            BasicInfo->HandleCount = ObjectHeader->HandleCount;
-           BasicInfo->PointerCount = ObjectHeader->RefCount;
+           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->ObjectType == ObSymbolicLinkType)
+           if (ObjectHeader->Type == ObSymbolicLinkType)
              {
                BasicInfo->CreateTime.QuadPart =
                  ((PSYMLINK_OBJECT)Object)->CreateTime.QuadPart;
              }
            else
              {
-               BasicInfo->CreateTime.QuadPart = 0ULL;
+               BasicInfo->CreateTime.QuadPart = (ULONGLONG)0;
              }
            Status = STATUS_SUCCESS;
          }
@@ -164,6 +149,7 @@ NtQueryObject (IN HANDLE ObjectHandle,
        break;
 
       case ObjectTypeInformation:
+#if 0
 //     InfoLength =
        if (Length != sizeof(OBJECT_TYPE_INFORMATION))
          {
@@ -171,9 +157,9 @@ NtQueryObject (IN HANDLE ObjectHandle,
          }
        else
          {
-           POBJECT_TYPE_INFORMATION typeinfo;
+           POBJECT_TYPE_INFORMATION TypeInfo;
 
-       typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
+           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);
@@ -183,11 +169,13 @@ NtQueryObject (IN HANDLE ObjectHandle,
            break;
          }
 
-       RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName);
+       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 -> RefCount;
+       typeinfo->ReferenceCount = ObjectHeader -> PointerCount;
          }
+#endif
+       Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case ObjectAllTypesInformation:
@@ -195,7 +183,16 @@ NtQueryObject (IN HANDLE ObjectHandle,
        break;
 
       case ObjectHandleInformation:
-       Status = STATUS_NOT_IMPLEMENTED;
+       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:
@@ -203,19 +200,49 @@ NtQueryObject (IN HANDLE ObjectHandle,
        break;
     }
 
-  ObDereferenceObject(Object);
+  ObDereferenceObject (Object);
 
-  if (ReturnLength != NULL)
-    *ReturnLength = InfoLength;
+  if (ResultLength != NULL)
+    *ResultLength = InfoLength;
 
   return Status;
 }
 
 
+/**********************************************************************
+ * 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);
+  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);
+     }
+  }
+}
+
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     ObMakeTemporaryObject
- *     
+ *     ObMakeTemporaryObject/1
+ *
  * DESCRIPTION
  *
  * ARGUMENTS
@@ -227,19 +254,16 @@ NtQueryObject (IN HANDLE ObjectHandle,
  * @implemented
  */
 VOID STDCALL
-ObMakeTemporaryObject (IN PVOID ObjectBody)
+ObMakeTemporaryObject(IN PVOID ObjectBody)
 {
-  POBJECT_HEADER ObjectHeader;
-
-  ObjectHeader = BODY_TO_HEADER(ObjectBody);
-  ObjectHeader->Permanent = FALSE;
+  ObpSetPermanentObject (ObjectBody, FALSE);
 }
 
 
 /**********************************************************************
  * NAME                                                        EXPORTED
  *     NtMakeTemporaryObject
- *     
+ *
  * DESCRIPTION
  *
  * ARGUMENTS
@@ -249,27 +273,68 @@ ObMakeTemporaryObject (IN PVOID ObjectBody)
  * REVISIONS
  */
 NTSTATUS STDCALL
-NtMakeTemporaryObject (IN HANDLE Handle)
+NtMakeTemporaryObject(IN HANDLE ObjectHandle)
 {
-  POBJECT_HEADER ObjectHeader;
-  PVOID Object;
+  PVOID ObjectBody;
   NTSTATUS Status;
 
-  Status = ObReferenceObjectByHandle(Handle,
+  PAGED_CODE();
+
+  Status = ObReferenceObjectByHandle(ObjectHandle,
                                     0,
                                     NULL,
-                                    KeGetPreviousMode(),
-                                    & Object,
+                                    (KPROCESSOR_MODE)KeGetPreviousMode(),
+                                    &ObjectBody,
                                     NULL);
   if (Status != STATUS_SUCCESS)
     {
       return Status;
     }
 
-  ObjectHeader = BODY_TO_HEADER(Object);
-  ObjectHeader->Permanent = FALSE;
+  ObpSetPermanentObject (ObjectBody, FALSE);
+
+  ObDereferenceObject(ObjectBody);
+
+  return STATUS_SUCCESS;
+}
+
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtMakePermanentObject/1
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
+NTSTATUS STDCALL
+NtMakePermanentObject(IN HANDLE ObjectHandle)
+{
+  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(Object);
+  ObDereferenceObject(ObjectBody);
 
   return STATUS_SUCCESS;
 }