X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=ntoskrnl%2Fio%2Fcreate.c;h=cf0553d61d393879696c4b3ae9ca3f9f387b55b3;hb=0e6151383411d7bb002280bcb1d3c366665e97fc;hp=2e4a562f8c55288a156edbf91c69643fb9c427d6;hpb=1465a77f01a8cc6abd3813d8ad410c5a64cf2c5a;p=reactos.git diff --git a/ntoskrnl/io/create.c b/ntoskrnl/io/create.c index 2e4a562..cf0553d 100644 --- a/ntoskrnl/io/create.c +++ b/ntoskrnl/io/create.c @@ -114,6 +114,7 @@ IopCreateFile(PVOID ObjectBody, FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN; FileObject->FileName.Buffer = 0; FileObject->FileName.Length = FileObject->FileName.MaximumLength = 0; + FileObject->Vpb = DeviceObject->Vpb; } else { @@ -126,6 +127,7 @@ IopCreateFile(PVOID ObjectBody, && (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT)) { CPRINT("Device was wrong type\n"); + KeBugCheck(0); return(STATUS_UNSUCCESSFUL); } @@ -144,12 +146,20 @@ IopCreateFile(PVOID ObjectBody, Status); return(Status); } + if (!DeviceObject->Vpb) + KeBugCheck(0); + if (DeviceObject->Vpb->DeviceObject->Vpb) + KeBugCheck(0); + DeviceObject->Vpb->DeviceObject->Vpb=DeviceObject->Vpb; + DeviceObject->Vpb->Flags |= VPB_MOUNTED; } + DeviceObject = DeviceObject->Vpb->DeviceObject; DPRINT("FsDeviceObject %lx\n", DeviceObject); } RtlCreateUnicodeString(&(FileObject->FileName), RemainingPath); + FileObject->Vpb = NULL; } DPRINT("FileObject->FileName %wZ\n", @@ -158,7 +168,6 @@ IopCreateFile(PVOID ObjectBody, DPRINT("FileObject %x DeviceObject %x\n", FileObject, DeviceObject); - FileObject->Vpb = DeviceObject->Vpb; FileObject->Type = InternalFileType; FileObject->RelatedFileObject = NULL; @@ -227,6 +236,15 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject, * FO_STREAM_FILE is according to W32 documentation. */ CreatedFileObject->Flags |= FO_STREAM_FILE; +#ifdef LIBCAPTIVE + /* We are fully single-threaded/single-processed; + * prevent at least IopDeleteFile()->...->IoIsOperationSynchronous() to return FALSE + */ + CreatedFileObject->Flags |= FO_SYNCHRONOUS_IO; +#endif /* LIBCAPTIVE */ + CreatedFileObject->FileName.Length=0; + CreatedFileObject->FileName.MaximumLength=0; + CreatedFileObject->FileName.Buffer=NULL; // shouldn't we initialize the lock event, and several other things here too? KeInitializeEvent(&CreatedFileObject->Event, NotificationEvent, FALSE); @@ -325,6 +343,7 @@ IoCreateFile(OUT PHANDLE FileHandle, PIO_STACK_LOCATION StackLoc; IO_STATUS_BLOCK IoSB; IO_SECURITY_CONTEXT SecurityContext; + ACCESS_STATE AccessState; DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, " "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n", @@ -357,8 +376,19 @@ IoCreateFile(OUT PHANDLE FileHandle, if( CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING ) FileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING; + FileObject->FsContext=NULL; + FileObject->FsContext2=NULL; + + RtlZeroMemory(&AccessState, sizeof(AccessState)); + AccessState.RemainingDesiredAccess=0; /* FIXME: Meaning? */ + AccessState.PreviouslyGrantedAccess=DesiredAccess; /* FIXME: Meaning? */ + /* 'OriginalDesiredAccess' is required during file create by ntfs.sys of NT-5.1sp1 + * W32 undocumented. + */ + AccessState.OriginalDesiredAccess=DesiredAccess; /* FIXME: Meaning? */ + SecurityContext.SecurityQos = NULL; /* ?? */ - SecurityContext.AccessState = NULL; /* ?? */ + SecurityContext.AccessState = &AccessState; SecurityContext.DesiredAccess = DesiredAccess; SecurityContext.FullCreateOptions = 0; /* ?? */