- Move FSCTL_GET_NTFS_VOLUME_DATA implementation in its own function GetNfsVolumeData(), so remove it from NtfsUserFsRequest()
- Add support for FSCTL_GET_NTFS_FILE_RECORD in NtfsUserFsRequest()
- Implement GetNtfsFileRecord() which returns a file record. Not fully sure about its implementation, this is to be checked.

This does not really improve the nfi situation in any kind yet...

CORE-8725

svn path=/trunk/; revision=65145
This commit is contained in:
Pierre Schweitzer 2014-10-31 14:21:35 +00:00
parent 6635caf5c4
commit c9d1d86d84

View file

@ -528,30 +528,21 @@ NtfsVerifyVolume(PDEVICE_OBJECT DeviceObject,
static
NTSTATUS
NtfsUserFsRequest(PDEVICE_OBJECT DeviceObject,
GetNfsVolumeData(PDEVICE_EXTENSION DeviceExt,
PIRP Irp)
{
NTSTATUS Status;
PIO_STACK_LOCATION Stack;
PDEVICE_EXTENSION DeviceExt;
PNTFS_VOLUME_DATA_BUFFER DataBuffer;
PNTFS_ATTR_RECORD Attribute;
DPRINT1("NtfsUserFsRequest(%p, %p)\n", DeviceObject, Irp);
Stack = IoGetCurrentIrpStackLocation(Irp);
switch (Stack->Parameters.FileSystemControl.FsControlCode)
{
case FSCTL_GET_NTFS_VOLUME_DATA:
DeviceExt = DeviceObject->DeviceExtension;
DataBuffer = (PNTFS_VOLUME_DATA_BUFFER)Irp->UserBuffer;
Stack = IoGetCurrentIrpStackLocation(Irp);
if (Stack->Parameters.FileSystemControl.OutputBufferLength < sizeof(NTFS_VOLUME_DATA_BUFFER) ||
Irp->UserBuffer == NULL)
{
DPRINT1("Invalid output! %d %p\n", Stack->Parameters.FileSystemControl.OutputBufferLength, Irp->UserBuffer);
Status = STATUS_INVALID_PARAMETER;
break;
return STATUS_INVALID_PARAMETER;
}
DataBuffer->VolumeSerialNumber.QuadPart = DeviceExt->NtfsInfo.SerialNumber;
@ -592,7 +583,96 @@ NtfsUserFsRequest(PDEVICE_OBJECT DeviceObject,
ExtendedData->MinorVersion = DeviceExt->NtfsInfo.MinorVersion;
}
Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
static
NTSTATUS
GetNtfsFileRecord(PDEVICE_EXTENSION DeviceExt,
PIRP Irp)
{
NTSTATUS Status;
PIO_STACK_LOCATION Stack;
PNTFS_FILE_RECORD_INPUT_BUFFER InputBuffer;
PFILE_RECORD_HEADER FileRecord;
PNTFS_FILE_RECORD_OUTPUT_BUFFER OutputBuffer;
ULONGLONG MFTRecord;
Stack = IoGetCurrentIrpStackLocation(Irp);
if (Stack->Parameters.FileSystemControl.InputBufferLength < sizeof(NTFS_FILE_RECORD_INPUT_BUFFER) ||
Irp->AssociatedIrp.SystemBuffer == NULL)
{
DPRINT1("Invalid input! %d %p\n", Stack->Parameters.FileSystemControl.InputBufferLength, Irp->AssociatedIrp.SystemBuffer);
return STATUS_INVALID_PARAMETER;
}
if (Stack->Parameters.FileSystemControl.OutputBufferLength < sizeof(NTFS_FILE_RECORD_OUTPUT_BUFFER) ||
Irp->AssociatedIrp.SystemBuffer == NULL)
{
DPRINT1("Invalid output! %d %p\n", Stack->Parameters.FileSystemControl.OutputBufferLength, Irp->AssociatedIrp.SystemBuffer);
return STATUS_BUFFER_TOO_SMALL;
}
FileRecord = ExAllocatePoolWithTag(NonPagedPool,
DeviceExt->NtfsInfo.BytesPerFileRecord,
TAG_NTFS);
if (FileRecord == NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
InputBuffer = (PNTFS_FILE_RECORD_INPUT_BUFFER)Irp->AssociatedIrp.SystemBuffer;
MFTRecord = InputBuffer->FileReferenceNumber.QuadPart;
Status = ReadFileRecord(DeviceExt, MFTRecord, FileRecord);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed reading record: %I64x\n", MFTRecord);
ExFreePoolWithTag(FileRecord, TAG_NTFS);
return Status;
}
if (Stack->Parameters.FileSystemControl.OutputBufferLength < (FIELD_OFFSET(NTFS_FILE_RECORD_OUTPUT_BUFFER, FileRecordBuffer) + FileRecord->BytesInUse))
{
DPRINT1("Buffer too small: %lu vs %lu\n", Stack->Parameters.FileSystemControl.OutputBufferLength, FileRecord->BytesInUse);
ExFreePoolWithTag(FileRecord, TAG_NTFS);
return STATUS_BUFFER_TOO_SMALL;
}
OutputBuffer = (PNTFS_FILE_RECORD_OUTPUT_BUFFER)Irp->AssociatedIrp.SystemBuffer;
OutputBuffer->FileReferenceNumber.QuadPart = MFTRecord;
OutputBuffer->FileRecordLength = FileRecord->BytesInUse;
RtlCopyMemory(OutputBuffer->FileRecordBuffer, FileRecord, FileRecord->BytesInUse);
ExFreePoolWithTag(FileRecord, TAG_NTFS);
return STATUS_SUCCESS;
}
static
NTSTATUS
NtfsUserFsRequest(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
NTSTATUS Status;
PIO_STACK_LOCATION Stack;
PDEVICE_EXTENSION DeviceExt;
DPRINT1("NtfsUserFsRequest(%p, %p)\n", DeviceObject, Irp);
Stack = IoGetCurrentIrpStackLocation(Irp);
DeviceExt = DeviceObject->DeviceExtension;
switch (Stack->Parameters.FileSystemControl.FsControlCode)
{
case FSCTL_GET_NTFS_VOLUME_DATA:
Status = GetNfsVolumeData(DeviceExt, Irp);
break;
case FSCTL_GET_NTFS_FILE_RECORD:
Status = GetNtfsFileRecord(DeviceExt, Irp);
break;
default: