From f5fde4c0bb3c47f942e1e981e48a16c0d30c1bde Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sat, 22 Jun 2019 15:18:16 -0700 Subject: [PATCH] sys: FspVolumeTransactFsext --- src/sys/driver.h | 2 ++ src/sys/fsctl.c | 22 +--------------------- src/sys/volume.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/sys/driver.h b/src/sys/driver.h index 73e20fd3..01ad8784 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1242,6 +1242,8 @@ NTSTATUS FspVolumeGetNameList( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); NTSTATUS FspVolumeTransact( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); +NTSTATUS FspVolumeTransactFsext( + PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); NTSTATUS FspVolumeStop( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); NTSTATUS FspVolumeWork( diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 2d90ebb8..781052d3 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -99,27 +99,7 @@ static NTSTATUS FspFsctlFileSystemControl( break; default: if (0 != IrpSp->FileObject->FsContext2) - { - PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2; - if (!FspDeviceReference(FsvolDeviceObject)) - { - Result = STATUS_CANCELLED; - break; - } - - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension( - FsvolDeviceObject); - if (IrpSp->Parameters.FileSystemControl.FsControlCode == - FsvolDeviceExtension->VolumeParams.FsextControlCode) - { - FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( - FsvolDeviceExtension->VolumeParams.FsextControlCode, 0); - if (0 != Provider) - Result = Provider->DeviceTransact(FsvolDeviceObject, Irp); - } - - FspDeviceDereference(FsvolDeviceObject); - } + Result = FspVolumeTransactFsext(FsctlDeviceObject, Irp, IrpSp); break; } break; diff --git a/src/sys/volume.c b/src/sys/volume.c index 7e9ae3b0..5f781520 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -42,6 +42,8 @@ static NTSTATUS FspVolumeGetNameListNoLock( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); NTSTATUS FspVolumeTransact( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); +NTSTATUS FspVolumeTransactFsext( + PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); NTSTATUS FspVolumeStop( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); NTSTATUS FspVolumeWork( @@ -59,6 +61,7 @@ NTSTATUS FspVolumeWork( #pragma alloc_text(PAGE, FspVolumeGetNameList) #pragma alloc_text(PAGE, FspVolumeGetNameListNoLock) #pragma alloc_text(PAGE, FspVolumeTransact) +#pragma alloc_text(PAGE, FspVolumeTransactFsext) #pragma alloc_text(PAGE, FspVolumeStop) #pragma alloc_text(PAGE, FspVolumeWork) #endif @@ -914,6 +917,34 @@ exit: return Result; } +NTSTATUS FspVolumeTransactFsext( + PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) +{ + PAGED_CODE(); + + ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IrpSp->MajorFunction); + ASSERT(IRP_MN_USER_FS_REQUEST == IrpSp->MinorFunction); + ASSERT(0 != IrpSp->FileObject->FsContext2); + + PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2; + if (!FspDeviceReference(FsvolDeviceObject)) + return STATUS_CANCELLED; + + NTSTATUS Result = STATUS_INVALID_DEVICE_REQUEST; + if (IrpSp->Parameters.FileSystemControl.FsControlCode == + FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeParams.FsextControlCode) + { + FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( + IrpSp->Parameters.FileSystemControl.FsControlCode, 0); + if (0 != Provider) + Result = Provider->DeviceTransact(FsvolDeviceObject, Irp); + } + + FspDeviceDereference(FsvolDeviceObject); + + return Result; +} + NTSTATUS FspVolumeStop( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) {