Exemple #1
0
NTSTATUS STDCALL
NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
                           PIRP Irp)
{
  FS_INFORMATION_CLASS FsInformationClass;
  PIO_STACK_LOCATION Stack;
  NTSTATUS Status = STATUS_SUCCESS;
  PVOID SystemBuffer;
  ULONG BufferLength;

  DPRINT("NtfsQueryVolumeInformation() called\n");

  Stack = IoGetCurrentIrpStackLocation(Irp);
  FsInformationClass = Stack->Parameters.QueryVolume.FsInformationClass;
  BufferLength = Stack->Parameters.QueryVolume.Length;
  SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
  RtlZeroMemory(SystemBuffer, BufferLength);

  DPRINT("FsInformationClass %d\n", FsInformationClass);
  DPRINT("SystemBuffer %p\n", SystemBuffer);

  switch (FsInformationClass)
  {
    case FileFsVolumeInformation:
      Status = NtfsGetFsVolumeInformation(DeviceObject,
                                          SystemBuffer,
                                          &BufferLength);
      break;

    case FileFsAttributeInformation:
      Status = NtfsGetFsAttributeInformation(DeviceObject->DeviceExtension,
                                             SystemBuffer,
                                             &BufferLength);
      break;

    case FileFsSizeInformation:
      Status = NtfsGetFsSizeInformation(DeviceObject,
                                        SystemBuffer,
                                        &BufferLength);
      break;

    case FileFsDeviceInformation:
      Status = NtfsGetFsDeviceInformation(SystemBuffer,
                                          &BufferLength);
      break;

    default:
      Status = STATUS_NOT_SUPPORTED;
  }

  Irp->IoStatus.Status = Status;
  if (NT_SUCCESS(Status))
    Irp->IoStatus.Information =
      Stack->Parameters.QueryVolume.Length - BufferLength;
  else
    Irp->IoStatus.Information = 0;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);

  return(Status);
}
Exemple #2
0
NTSTATUS
NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext)
{
  PIRP Irp;
  PDEVICE_OBJECT DeviceObject;
  FS_INFORMATION_CLASS FsInformationClass;
  PIO_STACK_LOCATION Stack;
  NTSTATUS Status = STATUS_SUCCESS;
  PVOID SystemBuffer;
  ULONG BufferLength;

  DPRINT("NtfsQueryVolumeInformation() called\n");

  ASSERT(IrpContext);

  Irp = IrpContext->Irp;
  DeviceObject = IrpContext->DeviceObject;
  Stack = IoGetCurrentIrpStackLocation(Irp);
  FsInformationClass = Stack->Parameters.QueryVolume.FsInformationClass;
  BufferLength = Stack->Parameters.QueryVolume.Length;
  SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
  RtlZeroMemory(SystemBuffer, BufferLength);

  DPRINT("FsInformationClass %d\n", FsInformationClass);
  DPRINT("SystemBuffer %p\n", SystemBuffer);

  switch (FsInformationClass)
  {
    case FileFsVolumeInformation:
      Status = NtfsGetFsVolumeInformation(DeviceObject,
                                          SystemBuffer,
                                          &BufferLength);
      break;

    case FileFsAttributeInformation:
      Status = NtfsGetFsAttributeInformation(DeviceObject->DeviceExtension,
                                             SystemBuffer,
                                             &BufferLength);
      break;

    case FileFsSizeInformation:
      Status = NtfsGetFsSizeInformation(DeviceObject,
                                        SystemBuffer,
                                        &BufferLength);
      break;

    case FileFsDeviceInformation:
      Status = NtfsGetFsDeviceInformation(SystemBuffer,
                                          &BufferLength);
      break;

    default:
      Status = STATUS_NOT_SUPPORTED;
  }

  if (NT_SUCCESS(Status))
    Irp->IoStatus.Information =
      Stack->Parameters.QueryVolume.Length - BufferLength;
  else
    Irp->IoStatus.Information = 0;

  return Status;
}
Exemple #3
0
NTSTATUS
NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext)
{
    PIRP Irp;
    PDEVICE_OBJECT DeviceObject;
    FS_INFORMATION_CLASS FsInformationClass;
    PIO_STACK_LOCATION Stack;
    NTSTATUS Status = STATUS_SUCCESS;
    PVOID SystemBuffer;
    ULONG BufferLength;
    PDEVICE_EXTENSION DeviceExt;

    DPRINT("NtfsQueryVolumeInformation() called\n");

    ASSERT(IrpContext);

    Irp = IrpContext->Irp;
    DeviceObject = IrpContext->DeviceObject;
    DeviceExt = DeviceObject->DeviceExtension;
    Stack = IrpContext->Stack;

    if (!ExAcquireResourceSharedLite(&DeviceExt->DirResource,
                                     BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
    {
        return NtfsMarkIrpContextForQueue(IrpContext);
    }

    FsInformationClass = Stack->Parameters.QueryVolume.FsInformationClass;
    BufferLength = Stack->Parameters.QueryVolume.Length;
    SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
    RtlZeroMemory(SystemBuffer, BufferLength);

    DPRINT("FsInformationClass %d\n", FsInformationClass);
    DPRINT("SystemBuffer %p\n", SystemBuffer);

    switch (FsInformationClass)
    {
        case FileFsVolumeInformation:
            Status = NtfsGetFsVolumeInformation(DeviceObject,
                                                SystemBuffer,
                                                &BufferLength);
            break;

        case FileFsAttributeInformation:
            Status = NtfsGetFsAttributeInformation(DeviceObject->DeviceExtension,
                                                   SystemBuffer,
                                                   &BufferLength);
            break;

        case FileFsSizeInformation:
            Status = NtfsGetFsSizeInformation(DeviceObject,
                                              SystemBuffer,
                                              &BufferLength);
            break;

        case FileFsDeviceInformation:
            Status = NtfsGetFsDeviceInformation(DeviceObject,
                                                SystemBuffer,
                                                &BufferLength);
            break;

        default:
            Status = STATUS_NOT_SUPPORTED;
    }

    ExReleaseResourceLite(&DeviceExt->DirResource);

    if (NT_SUCCESS(Status))
        Irp->IoStatus.Information =
            Stack->Parameters.QueryVolume.Length - BufferLength;
    else
        Irp->IoStatus.Information = 0;

    return Status;
}