Respect OBJ_OPENIF flag in ObCreateObject
[reactos.git] / reactos / ntoskrnl / ob / namespc.c
index 30e0313..99a635c 100644 (file)
@@ -1,12 +1,11 @@
-/* $Id: namespc.c,v 1.48 2004/09/05 22:25:36 hbirr 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 ***************************************************************/
@@ -22,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,
@@ -54,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,
@@ -125,6 +128,8 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
    UNICODE_STRING RemainingPath;
    PVOID Object = NULL;
    NTSTATUS Status;
+   
+   PAGED_CODE();
 
    DPRINT("ObOpenObjectByName(...)\n");
 
@@ -157,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,
@@ -172,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);
@@ -352,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;
@@ -368,7 +395,7 @@ ObInit(VOID)
   ObDirectoryType->Create = ObpCreateDirectory;
   ObDirectoryType->DuplicationNotify = NULL;
 
-  RtlRosInitUnicodeStringFromLiteral(&ObDirectoryType->TypeName,
+  RtlInitUnicodeString(&ObDirectoryType->TypeName,
                       L"Directory");
 
   /* create 'type' object type*/
@@ -377,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;
@@ -393,7 +420,7 @@ ObInit(VOID)
   ObTypeObjectType->Create = NULL;
   ObTypeObjectType->DuplicationNotify = NULL;
 
-  RtlRosInitUnicodeStringFromLiteral(&ObTypeObjectType->TypeName,
+  RtlInitUnicodeString(&ObTypeObjectType->TypeName,
                       L"ObjectType");
 
   /* Create security descriptor */
@@ -452,6 +479,10 @@ ObInit(VOID)
 
   /* Create 'symbolic link' object type */
   ObInitSymbolicLinkImplementation();
+  
+  /* FIXME: Hack Hack! */
+  ObSystemDeviceMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ObSystemDeviceMap), TAG('O', 'b', 'D', 'm'));
+  RtlZeroMemory(ObSystemDeviceMap, sizeof(*ObSystemDeviceMap));
 }