- Delete named objects from the namespace when the last handle is
closed, unless the object is a permanent object
- IoCreateDevice should create a permanent object for named devices
Modified: trunk/reactos/ntoskrnl/include/internal/ob.h
Modified: trunk/reactos/ntoskrnl/io/device.c
Modified: trunk/reactos/ntoskrnl/ob/handle.c
Modified: trunk/reactos/ntoskrnl/ob/object.c
_____
Modified: trunk/reactos/ntoskrnl/include/internal/ob.h
--- trunk/reactos/ntoskrnl/include/internal/ob.h 2005-04-19
15:06:18 UTC (rev 14702)
+++ trunk/reactos/ntoskrnl/include/internal/ob.h 2005-04-19
17:12:03 UTC (rev 14703)
@@ -272,7 +272,6 @@
PVOID* ReturnedObject,
PUNICODE_STRING RemainingPath,
POBJECT_TYPE ObjectType);
-VOID ObDeleteHandleTable(struct _EPROCESS* Process);
NTSTATUS
ObpQueryHandleAttributes(HANDLE Handle,
_____
Modified: trunk/reactos/ntoskrnl/io/device.c
--- trunk/reactos/ntoskrnl/io/device.c 2005-04-19 15:06:18 UTC (rev
14702)
+++ trunk/reactos/ntoskrnl/io/device.c 2005-04-19 17:12:03 UTC (rev
14703)
@@ -385,9 +385,15 @@
/* 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);
_____
Modified: trunk/reactos/ntoskrnl/ob/handle.c
--- trunk/reactos/ntoskrnl/ob/handle.c 2005-04-19 15:06:18 UTC (rev
14702)
+++ trunk/reactos/ntoskrnl/ob/handle.c 2005-04-19 17:12:03 UTC (rev
14703)
@@ -48,13 +48,6 @@
/* FUNCTIONS
***************************************************************/
-VOID
-STDCALL
-ObKillProcess(PEPROCESS Process)
-{
- ObDeleteHandleTable(Process);
-}
-
static VOID
ObpDecrementHandleCount(PVOID ObjectBody)
{
@@ -71,6 +64,15 @@
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 @@
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
+STDCALL
+ObKillProcess(PEPROCESS Process)
+{
+ PAGED_CODE();
+
+ ExDestroyHandleTable(Process->ObjectTable,
+ DeleteHandleCallback,
+ Process);
+}
+
+
NTSTATUS
ObCreateHandle(PEPROCESS Process,
PVOID ObjectBody,
_____
Modified: trunk/reactos/ntoskrnl/ob/object.c
--- trunk/reactos/ntoskrnl/ob/object.c 2005-04-19 15:06:18 UTC (rev
14702)
+++ trunk/reactos/ntoskrnl/ob/object.c 2005-04-19 17:12:03 UTC (rev
14703)
@@ -1021,6 +1021,7 @@
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 @@
ObjectHeader->HandleCount);
KEBUGCHECK(0);
}
+#endif
switch (KeGetCurrentIrql ())