- Fix compile issues caused by previous patch.
[reactos.git] / reactos / ntoskrnl / ob / ntobj.c
index 40ff676..527ac5d 100644 (file)
@@ -1,12 +1,11 @@
 /* $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 *****************************************************************/
@@ -21,7 +20,7 @@
 /**********************************************************************
  * NAME                                                        EXPORTED
  *     NtSetInformationObject
- *     
+ *
  * DESCRIPTION
  *
  * ARGUMENTS
@@ -39,6 +38,8 @@ NtSetInformationObject (IN HANDLE ObjectHandle,
   PVOID Object;
   NTSTATUS Status;
 
+  PAGED_CODE();
+
   if (ObjectInformationClass != ObjectHandleInformation)
     return STATUS_INVALID_INFO_CLASS;
 
@@ -90,6 +91,8 @@ NtQueryObject (IN HANDLE ObjectHandle,
   PVOID Object;
   NTSTATUS Status;
 
+  PAGED_CODE();
+
   Status = ObReferenceObjectByHandle (ObjectHandle,
                                      0,
                                      NULL,
@@ -119,13 +122,13 @@ NtQueryObject (IN HANDLE ObjectHandle,
            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;
@@ -166,10 +169,10 @@ 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;
@@ -206,9 +209,39 @@ NtQueryObject (IN HANDLE ObjectHandle,
 }
 
 
+/**********************************************************************
+ * 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
  *
@@ -223,10 +256,7 @@ NtQueryObject (IN HANDLE ObjectHandle,
 VOID STDCALL
 ObMakeTemporaryObject(IN PVOID ObjectBody)
 {
-  POBJECT_HEADER ObjectHeader;
-
-  ObjectHeader = BODY_TO_HEADER(ObjectBody);
-  ObjectHeader->Permanent = FALSE;
+  ObpSetPermanentObject (ObjectBody, FALSE);
 }
 
 
@@ -245,25 +275,25 @@ ObMakeTemporaryObject(IN PVOID ObjectBody)
 NTSTATUS STDCALL
 NtMakeTemporaryObject(IN HANDLE ObjectHandle)
 {
-  POBJECT_HEADER ObjectHeader;
-  PVOID Object;
+  PVOID ObjectBody;
   NTSTATUS Status;
 
+  PAGED_CODE();
+
   Status = ObReferenceObjectByHandle(ObjectHandle,
                                     0,
                                     NULL,
                                     (KPROCESSOR_MODE)KeGetPreviousMode(),
-                                    &Object,
+                                    &ObjectBody,
                                     NULL);
   if (Status != STATUS_SUCCESS)
     {
       return Status;
     }
 
-  ObjectHeader = BODY_TO_HEADER(Object);
-  ObjectHeader->Permanent = FALSE;
+  ObpSetPermanentObject (ObjectBody, FALSE);
 
-  ObDereferenceObject(Object);
+  ObDereferenceObject(ObjectBody);
 
   return STATUS_SUCCESS;
 }
@@ -271,7 +301,7 @@ NtMakeTemporaryObject(IN HANDLE ObjectHandle)
 
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     NtMakePermanentObject
+ *     NtMakePermanentObject/1
  *
  * DESCRIPTION
  *
@@ -286,25 +316,25 @@ NtMakeTemporaryObject(IN HANDLE ObjectHandle)
 NTSTATUS STDCALL
 NtMakePermanentObject(IN HANDLE ObjectHandle)
 {
-  POBJECT_HEADER ObjectHeader;
-  PVOID Object;
+  PVOID ObjectBody;
   NTSTATUS Status;
 
+  PAGED_CODE();
+
   Status = ObReferenceObjectByHandle(ObjectHandle,
                                     0,
                                     NULL,
                                     (KPROCESSOR_MODE)KeGetPreviousMode(),
-                                    &Object,
+                                    &ObjectBody,
                                     NULL);
   if (Status != STATUS_SUCCESS)
     {
       return Status;
     }
 
-  ObjectHeader = BODY_TO_HEADER(Object);
-  ObjectHeader->Permanent = TRUE;
+  ObpSetPermanentObject (ObjectBody, TRUE);
 
-  ObDereferenceObject(Object);
+  ObDereferenceObject(ObjectBody);
 
   return STATUS_SUCCESS;
 }