PVOID* ReturnedObject,
PUNICODE_STRING RemainingPath,
POBJECT_TYPE ObjectType);
-VOID ObDeleteHandleTable(struct _EPROCESS* Process);
NTSTATUS
ObpQueryHandleAttributes(HANDLE Handle,
/* 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);
/* FUNCTIONS ***************************************************************/
-VOID
-STDCALL
-ObKillProcess(PEPROCESS Process)
-{
- ObDeleteHandleTable(Process);
-}
-
static VOID
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);
}
}
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,
}
+VOID
+STDCALL
+ObKillProcess(PEPROCESS Process)
+{
+ PAGED_CODE();
+
+ ExDestroyHandleTable(Process->ObjectTable,
+ DeleteHandleCallback,
+ Process);
+}
+
+
NTSTATUS
ObCreateHandle(PEPROCESS Process,
PVOID ObjectBody,
ObpDeleteObjectDpcLevel(IN POBJECT_HEADER ObjectHeader,
IN LONG OldRefCount)
{
+#if 0
if (ObjectHeader->RefCount < 0)
{
CPRINT("Object %p/%p has invalid reference count (%d)\n",
ObjectHeader->HandleCount);
KEBUGCHECK(0);
}
+#endif
switch (KeGetCurrentIrql ())