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); }
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; }
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; }