From b5da069d17ab3fc2fa0382b946406fa63f52b956 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 23 Dec 2015 23:51:05 -0800 Subject: [PATCH] Major refactoring: testing --- src/sys/cleanup.c | 3 ++- src/sys/close.c | 3 ++- src/sys/create.c | 3 ++- src/sys/volume.c | 37 +++++++++++++++++++++++++++++++++++-- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index 5cf75bb5..6e4f15a0 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -49,7 +49,8 @@ static NTSTATUS FspFsvolCleanup( { PAGED_CODE(); - return STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = 0; + return STATUS_SUCCESS; } VOID FspFsvolCleanupComplete( diff --git a/src/sys/close.c b/src/sys/close.c index 384534b2..30f50c58 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -46,7 +46,8 @@ static NTSTATUS FspFsvolClose( { PAGED_CODE(); - return STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = 0; + return STATUS_SUCCESS; } VOID FspFsvolCloseComplete( diff --git a/src/sys/create.c b/src/sys/create.c index 817910f8..6b8250e5 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -65,7 +65,8 @@ static NTSTATUS FspFsvolCreate( { PAGED_CODE(); - return STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = FILE_OPENED; + return STATUS_SUCCESS; } NTSTATUS FspFsvolCreatePrepare( diff --git a/src/sys/volume.c b/src/sys/volume.c index ed748a36..428d2031 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -8,6 +8,7 @@ NTSTATUS FspVolumeCreate( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); +static WORKER_THREAD_ROUTINE FspVolumeCreateRegisterMup; VOID FspVolumeDelete( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); static WORKER_THREAD_ROUTINE FspVolumeDeleteDelayed; @@ -24,6 +25,7 @@ NTSTATUS FspVolumeWork( #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspVolumeCreate) +#pragma alloc_text(PAGE, FspVolumeCreateRegisterMup) #pragma alloc_text(PAGE, FspVolumeDelete) #pragma alloc_text(PAGE, FspVolumeDeleteDelayed) #pragma alloc_text(PAGE, FspVolumeMount) @@ -36,6 +38,13 @@ NTSTATUS FspVolumeWork( #define PREFIXW L"" FSP_FSCTL_VOLUME_PARAMS_PREFIX #define PREFIXW_SIZE (sizeof PREFIXW - sizeof(WCHAR)) +typedef struct +{ + PDEVICE_OBJECT FsvolDeviceObject; + NTSTATUS Result; + FSP_SYNCHRONOUS_WORK_ITEM SynchronousWorkItem; +} FSP_CREATE_VOLUME_REGISTER_MUP_WORK_ITEM; + NTSTATUS FspVolumeCreate( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) { @@ -60,6 +69,7 @@ NTSTATUS FspVolumeCreate( PDEVICE_OBJECT FsvolDeviceObject; PDEVICE_OBJECT FsvrtDeviceObject; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; + FSP_CREATE_VOLUME_REGISTER_MUP_WORK_ITEM RegisterMupWorkItem; /* check parameters */ if (PREFIXW_SIZE + sizeof(FSP_FSCTL_VOLUME_PARAMS) * sizeof(WCHAR) > FileObject->FileName.Length) @@ -155,8 +165,19 @@ NTSTATUS FspVolumeCreate( /* do we need to register with MUP? */ if (0 == FsvrtDeviceObject) { - Result = FsRtlRegisterUncProviderEx(&FsvolDeviceExtension->MupHandle, - &FsvolDeviceExtension->VolumeName, FsvolDeviceObject, 0); + /* + * Turns out we cannot call FsRtlRegisterUncProviderEx when the PreviousMode + * is UserMode! So we need to somehow switch to KernelMode prior to issuing + * the FsRtlRegisterUncProviderEx call. There seems to be no straightforward + * way to switch the PreviousMode (no ExSetPreviousMode). So we do it indirectly + * by executing a synchronous work item (FspExecuteSynchronousWorkItem). + */ + RtlZeroMemory(&RegisterMupWorkItem, sizeof RegisterMupWorkItem); + RegisterMupWorkItem.FsvolDeviceObject = FsvolDeviceObject; + FspInitializeSynchronousWorkItem(&RegisterMupWorkItem.SynchronousWorkItem, + FspVolumeCreateRegisterMup, &RegisterMupWorkItem); + FspExecuteSynchronousWorkItem(&RegisterMupWorkItem.SynchronousWorkItem); + Result = RegisterMupWorkItem.Result; if (!NT_SUCCESS(Result)) { FspDeviceRelease(FsvolDeviceObject); @@ -171,6 +192,18 @@ NTSTATUS FspVolumeCreate( return STATUS_SUCCESS; } +static VOID FspVolumeCreateRegisterMup(PVOID Context) +{ + PAGED_CODE(); + + FSP_CREATE_VOLUME_REGISTER_MUP_WORK_ITEM *RegisterMupWorkItem = Context; + PDEVICE_OBJECT FsvolDeviceObject = RegisterMupWorkItem->FsvolDeviceObject; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); + + RegisterMupWorkItem->Result = FsRtlRegisterUncProviderEx(&FsvolDeviceExtension->MupHandle, + &FsvolDeviceExtension->VolumeName, FsvolDeviceObject, 0); +} + VOID FspVolumeDelete( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) {