Respect OBJ_OPENIF flag in ObCreateObject
[reactos.git] / reactos / ntoskrnl / ob / namespc.c
index bb5dc61..99a635c 100644 (file)
@@ -1,23 +1,16 @@
-/* $Id: namespc.c,v 1.41 2003/10/07 14:01:15 ekohl Exp $
+/* $Id$
  *
  * COPYRIGHT:      See COPYING in the top level directory
  * PROJECT:        ReactOS kernel
  * FILE:           ntoskrnl/ob/namespc.c
  * PURPOSE:        Manages the system namespace
- * PROGRAMMER:     David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- *                 22/05/98: Created
+ * 
+ * PROGRAMMERS:    David Welch (welch@mcmail.com)
  */
 
 /* INCLUDES ***************************************************************/
 
-#include <limits.h>
-#define NTOS_MODE_KERNEL
-#include <ntos.h>
-#include <internal/ob.h>
-#include <internal/io.h>
-#include <internal/pool.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
@@ -28,6 +21,8 @@ POBJECT_TYPE ObDirectoryType = NULL;
 POBJECT_TYPE ObTypeObjectType = NULL;
 
 PDIRECTORY_OBJECT NameSpaceRoot = NULL;
+ /* FIXME: Move this somewhere else once devicemap support is in */
+PDEVICE_MAP ObSystemDeviceMap = NULL;
 
 static GENERIC_MAPPING ObpDirectoryMapping = {
        STANDARD_RIGHTS_READ|DIRECTORY_QUERY|DIRECTORY_TRAVERSE,
@@ -60,10 +55,12 @@ ObReferenceObjectByName(PUNICODE_STRING ObjectPath,
    UNICODE_STRING RemainingPath;
    OBJECT_ATTRIBUTES ObjectAttributes;
    NTSTATUS Status;
+   
+   PAGED_CODE();
 
    InitializeObjectAttributes(&ObjectAttributes,
                              ObjectPath,
-                             Attributes,
+                             Attributes | OBJ_OPENIF,
                              NULL,
                              NULL);
    Status = ObFindObject(&ObjectAttributes,
@@ -83,7 +80,7 @@ CHECKPOINT;
 DPRINT("Object %p\n", Object);
        *ObjectPtr = NULL;
        RtlFreeUnicodeString (&RemainingPath);
-       return(STATUS_UNSUCCESSFUL);
+       return(STATUS_OBJECT_NAME_NOT_FOUND);
      }
    *ObjectPtr = Object;
    RtlFreeUnicodeString (&RemainingPath);
@@ -131,6 +128,8 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
    UNICODE_STRING RemainingPath;
    PVOID Object = NULL;
    NTSTATUS Status;
+   
+   PAGED_CODE();
 
    DPRINT("ObOpenObjectByName(...)\n");
 
@@ -163,7 +162,29 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
    return Status;
 }
 
-
+VOID
+STDCALL
+ObQueryDeviceMapInformation(PEPROCESS Process,
+                           PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo)
+{
+       //KIRQL OldIrql ;
+       
+       /*
+        * FIXME: This is an ugly hack for now, to always return the System Device Map
+        * instead of returning the Process Device Map. Not important yet since we don't use it
+        */
+          
+        /* FIXME: Acquire the DeviceMap Spinlock */
+        // KeAcquireSpinLock(DeviceMap->Lock, &OldIrql);
+        
+        /* Make a copy */
+        DeviceMapInfo->Query.DriveMap = ObSystemDeviceMap->DriveMap;
+        RtlMoveMemory(DeviceMapInfo->Query.DriveType, ObSystemDeviceMap->DriveType, sizeof(ObSystemDeviceMap->DriveType));
+        
+        /* FIXME: Release the DeviceMap Spinlock */
+        // KeReleasepinLock(DeviceMap->Lock, OldIrql);
+}       
+        
 VOID
 ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent,
                     POBJECT_HEADER Header,
@@ -178,7 +199,7 @@ ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent,
 {
   KIRQL oldlvl;
 
-  RtlCreateUnicodeString(&Header->Name, Name);
+  RtlpCreateUnicodeString(&Header->Name, Name, NonPagedPool);
   Header->Parent = Parent;
 
   KeAcquireSpinLock(&Parent->Lock, &oldlvl);
@@ -339,7 +360,7 @@ ObpCreateDirectory(PVOID ObjectBody,
 }
 
 
-VOID
+VOID INIT_FUNCTION
 ObInit(VOID)
 /*
  * FUNCTION: Initialize the object manager namespace
@@ -347,6 +368,10 @@ ObInit(VOID)
 {
   OBJECT_ATTRIBUTES ObjectAttributes;
   UNICODE_STRING Name;
+  SECURITY_DESCRIPTOR SecurityDescriptor;
+
+  /* Initialize the security descriptor cache */
+  ObpInitSdCache();
 
   /* create 'directory' object type */
   ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
@@ -354,8 +379,8 @@ ObInit(VOID)
   ObDirectoryType->Tag = TAG('D', 'I', 'R', 'T');
   ObDirectoryType->TotalObjects = 0;
   ObDirectoryType->TotalHandles = 0;
-  ObDirectoryType->MaxObjects = ULONG_MAX;
-  ObDirectoryType->MaxHandles = ULONG_MAX;
+  ObDirectoryType->PeakObjects = 0;
+  ObDirectoryType->PeakHandles = 0;
   ObDirectoryType->PagedPoolCharge = 0;
   ObDirectoryType->NonpagedPoolCharge = sizeof(DIRECTORY_OBJECT);
   ObDirectoryType->Mapping = &ObpDirectoryMapping;
@@ -369,8 +394,8 @@ ObInit(VOID)
   ObDirectoryType->OkayToClose = NULL;
   ObDirectoryType->Create = ObpCreateDirectory;
   ObDirectoryType->DuplicationNotify = NULL;
-  
-  RtlInitUnicodeStringFromLiteral(&ObDirectoryType->TypeName,
+
+  RtlInitUnicodeString(&ObDirectoryType->TypeName,
                       L"Directory");
 
   /* create 'type' object type*/
@@ -379,8 +404,8 @@ ObInit(VOID)
   ObTypeObjectType->Tag = TAG('T', 'y', 'p', 'T');
   ObTypeObjectType->TotalObjects = 0;
   ObTypeObjectType->TotalHandles = 0;
-  ObTypeObjectType->MaxObjects = ULONG_MAX;
-  ObTypeObjectType->MaxHandles = ULONG_MAX;
+  ObTypeObjectType->PeakObjects = 0;
+  ObTypeObjectType->PeakHandles = 0;
   ObTypeObjectType->PagedPoolCharge = 0;
   ObTypeObjectType->NonpagedPoolCharge = sizeof(TYPE_OBJECT);
   ObTypeObjectType->Mapping = &ObpTypeMapping;
@@ -394,14 +419,36 @@ ObInit(VOID)
   ObTypeObjectType->OkayToClose = NULL;
   ObTypeObjectType->Create = NULL;
   ObTypeObjectType->DuplicationNotify = NULL;
-  
-  RtlInitUnicodeStringFromLiteral(&ObTypeObjectType->TypeName,
+
+  RtlInitUnicodeString(&ObTypeObjectType->TypeName,
                       L"ObjectType");
 
-  /* create root directory */
+  /* Create security descriptor */
+  RtlCreateSecurityDescriptor(&SecurityDescriptor,
+                             SECURITY_DESCRIPTOR_REVISION1);
+
+  RtlSetOwnerSecurityDescriptor(&SecurityDescriptor,
+                               SeAliasAdminsSid,
+                               FALSE);
+
+  RtlSetGroupSecurityDescriptor(&SecurityDescriptor,
+                               SeLocalSystemSid,
+                               FALSE);
+
+  RtlSetDaclSecurityDescriptor(&SecurityDescriptor,
+                              TRUE,
+                              SePublicDefaultDacl,
+                              FALSE);
+
+  /* Create root directory */
+  InitializeObjectAttributes(&ObjectAttributes,
+                            NULL,
+                            OBJ_PERMANENT,
+                            NULL,
+                            &SecurityDescriptor);
   ObCreateObject(KernelMode,
                 ObDirectoryType,
-                NULL,
+                &ObjectAttributes,
                 KernelMode,
                 NULL,
                 sizeof(DIRECTORY_OBJECT),
@@ -409,14 +456,14 @@ ObInit(VOID)
                 0,
                 (PVOID*)&NameSpaceRoot);
 
-  /* create '\ObjectTypes' directory */
-  RtlInitUnicodeStringFromLiteral(&Name,
+  /* Create '\ObjectTypes' directory */
+  RtlRosInitUnicodeStringFromLiteral(&Name,
                       L"\\ObjectTypes");
   InitializeObjectAttributes(&ObjectAttributes,
                             &Name,
                             OBJ_PERMANENT,
                             NULL,
-                            NULL);
+                            &SecurityDescriptor);
   ObCreateObject(KernelMode,
                 ObDirectoryType,
                 &ObjectAttributes,
@@ -432,9 +479,10 @@ ObInit(VOID)
 
   /* Create 'symbolic link' object type */
   ObInitSymbolicLinkImplementation();
-
-  /* Create 'section' object type */
-  ObpCreateTypeObject(MmSectionObjectType);
+  
+  /* FIXME: Hack Hack! */
+  ObSystemDeviceMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ObSystemDeviceMap), TAG('O', 'b', 'D', 'm'));
+  RtlZeroMemory(ObSystemDeviceMap, sizeof(*ObSystemDeviceMap));
 }