- 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. Modified: trunk/reactos/ntoskrnl/io/create.c Modified: trunk/reactos/ntoskrnl/ob/object.c _____
Modified: trunk/reactos/ntoskrnl/io/create.c --- trunk/reactos/ntoskrnl/io/create.c 2005-04-08 20:29:30 UTC (rev 14557) +++ trunk/reactos/ntoskrnl/io/create.c 2005-04-08 20:38:08 UTC (rev 14558) @@ -238,7 +238,15 @@
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 @@ 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 @@ 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 @@ 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 @@ DesiredAccess, 0, NULL, - &LocalFileHandle); + &LocalHandle); if (!NT_SUCCESS(Status)) { DPRINT("ObInsertObject() failed! (Status %lx)\n", Status); @@ -494,7 +539,7 @@ Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE); if (Irp == NULL) { - ZwClose(LocalFileHandle); + ZwClose(LocalHandle); return STATUS_UNSUCCESSFUL; }
@@ -574,13 +619,13 @@ FileObject->DeviceObject = NULL; FileObject->Vpb = NULL;
- ZwClose(LocalFileHandle); + ZwClose(LocalHandle); } else { _SEH_TRY { - *FileHandle = LocalFileHandle; + *FileHandle = LocalHandle; *IoStatusBlock = LocalIoStatusBlock; } _SEH_HANDLE _____
Modified: trunk/reactos/ntoskrnl/ob/object.c --- trunk/reactos/ntoskrnl/ob/object.c 2005-04-08 20:29:30 UTC (rev 14557) +++ trunk/reactos/ntoskrnl/ob/object.c 2005-04-08 20:38:08 UTC (rev 14558) @@ -705,6 +705,16 @@
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 @@ 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)