X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=ntoskrnl%2Fio%2Fcreate.c;h=cf0553d61d393879696c4b3ae9ca3f9f387b55b3;hb=0e6151383411d7bb002280bcb1d3c366665e97fc;hp=b9ceb1b2336b7436f27a8d0cd1847296d5fc5ccb;hpb=ebde29e23f7be542dc5c85f9b379a8a09678ec3e;p=reactos.git diff --git a/ntoskrnl/io/create.c b/ntoskrnl/io/create.c index b9ceb1b..cf0553d 100644 --- a/ntoskrnl/io/create.c +++ b/ntoskrnl/io/create.c @@ -104,6 +104,8 @@ IopCreateFile(PVOID ObjectBody, return(Status); } + FileObject->Flags = 0; + DeviceObject = IoGetAttachedDevice(DeviceObject); DPRINT("DeviceObject %x\n", DeviceObject); @@ -112,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 { @@ -124,6 +127,7 @@ IopCreateFile(PVOID ObjectBody, && (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT)) { CPRINT("Device was wrong type\n"); + KeBugCheck(0); return(STATUS_UNSUCCESSFUL); } @@ -142,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", @@ -156,13 +168,12 @@ IopCreateFile(PVOID ObjectBody, DPRINT("FileObject %x DeviceObject %x\n", FileObject, DeviceObject); - FileObject->Vpb = DeviceObject->Vpb; FileObject->Type = InternalFileType; + FileObject->RelatedFileObject = NULL; return(STATUS_SUCCESS); } -#ifndef LIBCAPTIVE /********************************************************************** * NAME EXPORTED @@ -188,7 +199,6 @@ PFILE_OBJECT STDCALL IoCreateStreamFileObject(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject) { - HANDLE FileHandle; PFILE_OBJECT CreatedFileObject; NTSTATUS Status; @@ -197,7 +207,10 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject, assert_irql(PASSIVE_LEVEL); - Status = ObCreateObject(&FileHandle, + /* We don't need any 'Handle' therefore pass 1st parameter as NULL and it + * will not be created by ObCreateObject() at all. + */ + Status = ObCreateObject(NULL, STANDARD_RIGHTS_REQUIRED, NULL, IoFileObjectType, @@ -219,17 +232,26 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject, CreatedFileObject->DeviceObject = DeviceObject->Vpb->DeviceObject; CreatedFileObject->Vpb = DeviceObject->Vpb; CreatedFileObject->Type = InternalFileType; - CreatedFileObject->Flags |= FO_DIRECT_DEVICE_OPEN; + /* Why was FO_DIRECT_DEVICE_OPEN used here before? + * 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); - ZwClose(FileHandle); - return(CreatedFileObject); } -#endif /* LIBCAPTIVE */ /********************************************************************** * NAME EXPORTED @@ -321,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", @@ -353,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; /* ?? */