return(Status);
}
+ FileObject->Flags = 0;
+
DeviceObject = IoGetAttachedDevice(DeviceObject);
DPRINT("DeviceObject %x\n", DeviceObject);
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
FileObject->FileName.Buffer = 0;
FileObject->FileName.Length = FileObject->FileName.MaximumLength = 0;
+ FileObject->Vpb = DeviceObject->Vpb;
}
else
{
&& (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT))
{
CPRINT("Device was wrong type\n");
+ KeBugCheck(0);
return(STATUS_UNSUCCESSFUL);
}
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",
DPRINT("FileObject %x DeviceObject %x\n",
FileObject,
DeviceObject);
- FileObject->Vpb = DeviceObject->Vpb;
FileObject->Type = InternalFileType;
FileObject->RelatedFileObject = NULL;
IoCreateStreamFileObject(PFILE_OBJECT FileObject,
PDEVICE_OBJECT DeviceObject)
{
- HANDLE FileHandle;
PFILE_OBJECT CreatedFileObject;
NTSTATUS Status;
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,
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);
}
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",
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; /* ?? */