- Delete named objects from the namespace when the last handle is closed, unless...
authorThomas Bluemel <thomas@reactsoft.com>
Tue, 19 Apr 2005 17:12:03 +0000 (17:12 +0000)
committerThomas Bluemel <thomas@reactsoft.com>
Tue, 19 Apr 2005 17:12:03 +0000 (17:12 +0000)
- IoCreateDevice should create a permanent object for named devices

svn path=/trunk/; revision=14703

reactos/ntoskrnl/include/internal/ob.h
reactos/ntoskrnl/io/device.c
reactos/ntoskrnl/ob/handle.c
reactos/ntoskrnl/ob/object.c

index 255765f..4efc22f 100644 (file)
@@ -272,7 +272,6 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
                      PVOID* ReturnedObject,
                      PUNICODE_STRING RemainingPath,
                      POBJECT_TYPE ObjectType);
-VOID ObDeleteHandleTable(struct _EPROCESS* Process);
 
 NTSTATUS
 ObpQueryHandleAttributes(HANDLE Handle,
index 0eb7919..7e42117 100644 (file)
@@ -385,9 +385,15 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject,
     /* Initialize the Object Attributes */
     InitializeObjectAttributes(&ObjectAttributes, DeviceName, 0, NULL, NULL);
     
-    /* Honour exclusive flag */
+    /* Honor exclusive flag */
     ObjectAttributes.Attributes |= OBJ_EXCLUSIVE;
     
+    /* Create a permanent object for named devices */
+    if (DeviceName != NULL)
+    {
+        ObjectAttributes.Attributes |= OBJ_PERMANENT;
+    }
+    
     /* Align the Extension Size to 8-bytes */
     AlignedDeviceExtensionSize = (DeviceExtensionSize + 7) &~ 7;
     DPRINT("AlignedDeviceExtensionSize %x\n", AlignedDeviceExtensionSize);
index 3756959..6066db5 100644 (file)
@@ -48,13 +48,6 @@ PHANDLE_TABLE ObpKernelHandleTable = NULL;
 
 /* FUNCTIONS ***************************************************************/
 
-VOID
-STDCALL
-ObKillProcess(PEPROCESS Process)
-{
-    ObDeleteHandleTable(Process);
-}
-
 static VOID
 ObpDecrementHandleCount(PVOID ObjectBody)
 {
@@ -71,6 +64,15 @@ ObpDecrementHandleCount(PVOID ObjectBody)
 
   if(NewHandleCount == 0)
   {
+    if(ObjectHeader->Parent != NULL && !ObjectHeader->Permanent)
+    {
+      /* delete the object from the namespace when the last handle got closed.
+         Only do this if it's actually been inserted into the namespace and
+         if it's not a permanent object. */
+      ObpRemoveEntryDirectory(ObjectHeader);
+    }
+    
+    /* remove the keep-alive reference */
     ObDereferenceObject(ObjectBody);
   }
 }
@@ -519,18 +521,6 @@ DeleteHandleCallback(PHANDLE_TABLE HandleTable,
   ObpDecrementHandleCount(ObjectBody);
 }
 
-VOID ObDeleteHandleTable(PEPROCESS Process)
-/*
- * FUNCTION: Deletes the handle table associated with a process
- */
-{
-   PAGED_CODE();
-
-   ExDestroyHandleTable(Process->ObjectTable,
-                        DeleteHandleCallback,
-                        Process);
-}
-
 static BOOLEAN STDCALL
 DuplicateHandleCallback(PHANDLE_TABLE HandleTable,
                         PHANDLE_TABLE_ENTRY HandleTableEntry,
@@ -583,6 +573,18 @@ VOID ObCreateHandleTable(PEPROCESS Parent,
 }
 
 
+VOID
+STDCALL
+ObKillProcess(PEPROCESS Process)
+{
+   PAGED_CODE();
+
+   ExDestroyHandleTable(Process->ObjectTable,
+                        DeleteHandleCallback,
+                        Process);
+}
+
+
 NTSTATUS
 ObCreateHandle(PEPROCESS Process,
               PVOID ObjectBody,
index b128e9e..d2e686d 100644 (file)
@@ -1021,6 +1021,7 @@ STATIC NTSTATUS
 ObpDeleteObjectDpcLevel(IN POBJECT_HEADER ObjectHeader,
                        IN LONG OldRefCount)
 {
+#if 0
   if (ObjectHeader->RefCount < 0)
     {
       CPRINT("Object %p/%p has invalid reference count (%d)\n",
@@ -1036,6 +1037,7 @@ ObpDeleteObjectDpcLevel(IN POBJECT_HEADER ObjectHeader,
             ObjectHeader->HandleCount);
       KEBUGCHECK(0);
     }
+#endif
 
   
   switch (KeGetCurrentIrql ())