From 322cd3e113c1d38d4e5c33cf4828c296cfd1f2b1 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Fri, 8 Apr 2005 20:38:08 +0000 Subject: [PATCH] - Don't allow to create objects in the nt name space for twice. - Create a stream file object in IoCreateFile if a deviceobject is opening. svn path=/trunk/; revision=14558 --- reactos/ntoskrnl/io/create.c | 85 +++++++++++++++++++++++++++--------- reactos/ntoskrnl/ob/object.c | 15 ++++--- 2 files changed, 75 insertions(+), 25 deletions(-) diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index 08d46b0efbc..b8770905e49 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -238,7 +238,15 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject, DPRINT("DeviceObject %x\n", DeviceObject); - CreatedFileObject->DeviceObject = DeviceObject->Vpb->DeviceObject; + if (DeviceObject->Vpb && + DeviceObject->Vpb->DeviceObject) + { + CreatedFileObject->DeviceObject = DeviceObject->Vpb->DeviceObject; + } + else + { + CreatedFileObject->DeviceObject = DeviceObject; + } CreatedFileObject->Vpb = DeviceObject->Vpb; CreatedFileObject->Type = IO_TYPE_FILE; CreatedFileObject->Flags |= FO_DIRECT_DEVICE_OPEN; @@ -337,11 +345,12 @@ IoCreateFile(OUT PHANDLE FileHandle, IN ULONG Options) { PFILE_OBJECT FileObject; + PDEVICE_OBJECT DeviceObject = NULL; PIRP Irp; PIO_STACK_LOCATION StackLoc; IO_SECURITY_CONTEXT SecurityContext; KPROCESSOR_MODE AccessMode; - HANDLE LocalFileHandle; + HANDLE LocalHandle; IO_STATUS_BLOCK LocalIoStatusBlock; LARGE_INTEGER SafeAllocationSize; PVOID SystemEaBuffer = NULL; @@ -357,7 +366,7 @@ IoCreateFile(OUT PHANDLE FileHandle, if (IoStatusBlock == NULL || FileHandle == NULL) return STATUS_ACCESS_VIOLATION; - LocalFileHandle = 0; + LocalHandle = 0; if(Options & IO_NO_PARAMETER_CHECKING) AccessMode = KernelMode; @@ -433,21 +442,57 @@ IoCreateFile(OUT PHANDLE FileHandle, DPRINT1("FIXME: IO_CHECK_CREATE_PARAMETERS not yet supported!\n"); } - Status = ObCreateObject(AccessMode, - IoFileObjectType, - ObjectAttributes, - AccessMode, - NULL, - sizeof(FILE_OBJECT), - 0, - 0, - (PVOID*)&FileObject); - if (!NT_SUCCESS(Status)) - { + if (CreateDisposition == FILE_OPEN || + CreateDisposition == FILE_OPEN_IF) + { + Status = ObOpenObjectByName(ObjectAttributes, + NULL, + NULL, + AccessMode, + DesiredAccess, + NULL, + &LocalHandle); + if (NT_SUCCESS(Status)) + { + Status = ObReferenceObjectByHandle(LocalHandle, + DesiredAccess, + NULL, + AccessMode, + (PVOID*)&DeviceObject, + NULL); + ObDereferenceObject (DeviceObject); + if (!NT_SUCCESS(Status)) + { + return Status; + } + if (BODY_TO_HEADER(DeviceObject)->ObjectType != IoDeviceObjectType) + { + ZwClose(LocalHandle); + return STATUS_OBJECT_NAME_COLLISION; + } + FileObject = IoCreateStreamFileObject(NULL, DeviceObject); + ZwClose(LocalHandle); + } + } + + + if (DeviceObject == NULL) + { + Status = ObCreateObject(AccessMode, + IoFileObjectType, + ObjectAttributes, + AccessMode, + NULL, + sizeof(FILE_OBJECT), + 0, + 0, + (PVOID*)&FileObject); + if (!NT_SUCCESS(Status)) + { DPRINT("ObCreateObject() failed! (Status %lx)\n", Status); return Status; - } - + } + } RtlMapGenericMask(&DesiredAccess, BODY_TO_HEADER(FileObject)->ObjectType->Mapping); @@ -456,7 +501,7 @@ IoCreateFile(OUT PHANDLE FileHandle, DesiredAccess, 0, NULL, - &LocalFileHandle); + &LocalHandle); if (!NT_SUCCESS(Status)) { DPRINT("ObInsertObject() failed! (Status %lx)\n", Status); @@ -494,7 +539,7 @@ IoCreateFile(OUT PHANDLE FileHandle, Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE); if (Irp == NULL) { - ZwClose(LocalFileHandle); + ZwClose(LocalHandle); return STATUS_UNSUCCESSFUL; } @@ -574,13 +619,13 @@ IoCreateFile(OUT PHANDLE FileHandle, FileObject->DeviceObject = NULL; FileObject->Vpb = NULL; - ZwClose(LocalFileHandle); + ZwClose(LocalHandle); } else { _SEH_TRY { - *FileHandle = LocalFileHandle; + *FileHandle = LocalHandle; *IoStatusBlock = LocalIoStatusBlock; } _SEH_HANDLE diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index 44a69c141e9..79c33949181 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -705,6 +705,16 @@ ObCreateObject (IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL, DPRINT1("ObFindObject() failed! (Status 0x%x)\n", Status); return Status; } + if (Parent != NULL) + { + ParentHeader = BODY_TO_HEADER(Parent); + } + if (ParentHeader && + RemainingPath.Buffer == NULL) + { + ObDereferenceObject(Parent); + return STATUS_OBJECT_NAME_COLLISION; + } } else { @@ -749,11 +759,6 @@ ObCreateObject (IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL, RtlInitUnicodeString(&(Header->Name),NULL); DPRINT("Getting Parent and adding entry\n"); - if (Parent != NULL) - { - ParentHeader = BODY_TO_HEADER(Parent); - } - if (ParentHeader != NULL && ParentHeader->ObjectType == ObDirectoryType && RemainingPath.Buffer != NULL)