From ebfabba56846ccbd66f0d84ebc3ed1f51a3f9290 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 22 Dec 2015 17:49:23 -0800 Subject: [PATCH] Major refactoring: WIP --- src/sys/fsctl.c | 6 +++-- src/sys/volume.c | 62 ++++++++++++++++++++---------------------------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 6f79f32a..b785caae 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -32,10 +32,12 @@ static NTSTATUS FspFsctlFileSystemControl( switch (IrpSp->Parameters.FileSystemControl.FsControlCode) { case FSP_FSCTL_VOLUME_NAME: - Result = FspVolumeGetName(DeviceObject, Irp, IrpSp); + if (0 != IrpSp->FileObject->FsContext2) + Result = FspVolumeGetName(DeviceObject, Irp, IrpSp); break; case FSP_FSCTL_TRANSACT: - Result = FspVolumeTransact(DeviceObject, Irp, IrpSp); + if (0 != IrpSp->FileObject->FsContext2) + Result = FspVolumeTransact(DeviceObject, Irp, IrpSp); break; } break; diff --git a/src/sys/volume.c b/src/sys/volume.c index 05817efb..a7099e0c 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -348,6 +348,7 @@ NTSTATUS FspVolumeGetName( ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IrpSp->MajorFunction); ASSERT(IRP_MN_USER_FS_REQUEST == IrpSp->MinorFunction); ASSERT(FSP_FSCTL_VOLUME_NAME == IrpSp->Parameters.FileSystemControl.FsControlCode); + ASSERT(0 != IrpSp->FileObject->FsContext2); /* check parameters */ ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength; @@ -375,35 +376,16 @@ NTSTATUS FspVolumeTransact( { PAGED_CODE(); - return STATUS_INVALID_DEVICE_REQUEST; -} - -NTSTATUS FspVolumeRedirQueryPathEx( - PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) -{ - PAGED_CODE(); - - return STATUS_INVALID_DEVICE_REQUEST; -} - -NTSTATUS FspVolumeWork( - PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) -{ - PAGED_CODE(); - - return STATUS_INVALID_DEVICE_REQUEST; -} - -#if 0 -static NTSTATUS FspFsctlTransact( - PDEVICE_OBJECT DeviceObject, 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(FSP_FSCTL_TRANSACT == IrpSp->Parameters.FileSystemControl.FsControlCode); + ASSERT(0 != IrpSp->FileObject->FsContext2); /* check parameters */ ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength; ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength; PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer; + PVOID MdlBuffer; if (0 != InputBufferLength && FSP_FSCTL_DEFAULT_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_RSP)) > InputBufferLength) return STATUS_INVALID_PARAMETER; @@ -412,20 +394,14 @@ static NTSTATUS FspFsctlTransact( return STATUS_BUFFER_TOO_SMALL; NTSTATUS Result; - PDEVICE_OBJECT FsvolDeviceObject; - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; - PVOID MdlBuffer; + PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); PUINT8 BufferEnd; FSP_FSCTL_TRANSACT_RSP *Response, *NextResponse; FSP_FSCTL_TRANSACT_REQ *Request, *PendingIrpRequest; PIRP ProcessIrp, PendingIrp; LARGE_INTEGER Timeout; - FsvolDeviceObject = FspFsvolDeviceObjectFromFileObject(IrpSp->FileObject); - if (0 == FsvolDeviceObject) - return STATUS_ACCESS_DENIED; - FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); - /* process any user-mode file system responses */ Response = SystemBuffer; BufferEnd = (PUINT8)SystemBuffer + InputBufferLength; @@ -506,15 +482,29 @@ static NTSTATUS FspFsctlTransact( PendingIrp = FspIoqNextPendingIrp(&FsvolDeviceExtension->Ioq, 0); if (0 == PendingIrp) break; - } Irp->IoStatus.Information = (PUINT8)Request - (PUINT8)MdlBuffer; - Result = STATUS_SUCCESS; - - return Result; + return STATUS_SUCCESS; } +NTSTATUS FspVolumeRedirQueryPathEx( + PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + +NTSTATUS FspVolumeWork( + PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + +#if 0 static NTSTATUS FspFsvolWork( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) {