- 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 ())