Allow opening the NTFS volume in NtfsCreateFile()

svn path=/trunk/; revision=64290
This commit is contained in:
Pierre Schweitzer 2014-09-25 20:21:34 +00:00
parent b143976e60
commit 52858fdcec

View file

@ -159,7 +159,7 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject,
PIO_STACK_LOCATION Stack; PIO_STACK_LOCATION Stack;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
ULONG RequestedDisposition; ULONG RequestedDisposition;
// ULONG RequestedOptions; ULONG RequestedOptions;
// PFCB Fcb; // PFCB Fcb;
// PWSTR FileName; // PWSTR FileName;
NTSTATUS Status; NTSTATUS Status;
@ -172,12 +172,13 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject,
ASSERT(Stack); ASSERT(Stack);
RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff); RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff);
// RequestedOptions = RequestedOptions = Stack->Parameters.Create.Options & FILE_VALID_OPTION_FLAGS;
// Stack->Parameters.Create.Options & FILE_VALID_OPTION_FLAGS;
// PagingFileCreate = (Stack->Flags & SL_OPEN_PAGING_FILE) ? TRUE : FALSE; // PagingFileCreate = (Stack->Flags & SL_OPEN_PAGING_FILE) ? TRUE : FALSE;
// if ((RequestedOptions & FILE_DIRECTORY_FILE) if (RequestedOptions & FILE_DIRECTORY_FILE &&
// && RequestedDisposition == FILE_SUPERSEDE) RequestedDisposition == FILE_SUPERSEDE)
// return STATUS_INVALID_PARAMETER; {
return STATUS_INVALID_PARAMETER;
}
FileObject = Stack->FileObject; FileObject = Stack->FileObject;
@ -188,6 +189,28 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject,
return STATUS_ACCESS_DENIED; return STATUS_ACCESS_DENIED;
} }
/* This a open operation for the volume itself */
if (FileObject->FileName.Length == 0 &&
(FileObject->RelatedFileObject == NULL || FileObject->RelatedFileObject->FsContext2 != NULL))
{
if (RequestedDisposition != FILE_OPEN &&
RequestedDisposition != FILE_OPEN_IF)
{
return STATUS_ACCESS_DENIED;
}
if (RequestedOptions & FILE_DIRECTORY_FILE)
{
return STATUS_NOT_A_DIRECTORY;
}
NtfsAttachFCBToFileObject(DeviceExt, DeviceExt->VolumeFcb, FileObject);
DeviceExt->VolumeFcb->RefCount++;
Irp->IoStatus.Information = FILE_OPENED;
return STATUS_SUCCESS;
}
Status = NtfsOpenFile(DeviceExt, Status = NtfsOpenFile(DeviceExt,
FileObject, FileObject,
FileObject->FileName.Buffer); FileObject->FileName.Buffer);