Major refactoring: testing

This commit is contained in:
Bill Zissimopoulos 2015-12-23 23:51:05 -08:00
parent db1dc6fc91
commit b5da069d17
4 changed files with 41 additions and 5 deletions

View File

@ -49,7 +49,8 @@ static NTSTATUS FspFsvolCleanup(
{ {
PAGED_CODE(); PAGED_CODE();
return STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0;
return STATUS_SUCCESS;
} }
VOID FspFsvolCleanupComplete( VOID FspFsvolCleanupComplete(

View File

@ -46,7 +46,8 @@ static NTSTATUS FspFsvolClose(
{ {
PAGED_CODE(); PAGED_CODE();
return STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0;
return STATUS_SUCCESS;
} }
VOID FspFsvolCloseComplete( VOID FspFsvolCloseComplete(

View File

@ -65,7 +65,8 @@ static NTSTATUS FspFsvolCreate(
{ {
PAGED_CODE(); PAGED_CODE();
return STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = FILE_OPENED;
return STATUS_SUCCESS;
} }
NTSTATUS FspFsvolCreatePrepare( NTSTATUS FspFsvolCreatePrepare(

View File

@ -8,6 +8,7 @@
NTSTATUS FspVolumeCreate( NTSTATUS FspVolumeCreate(
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
static WORKER_THREAD_ROUTINE FspVolumeCreateRegisterMup;
VOID FspVolumeDelete( VOID FspVolumeDelete(
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
static WORKER_THREAD_ROUTINE FspVolumeDeleteDelayed; static WORKER_THREAD_ROUTINE FspVolumeDeleteDelayed;
@ -24,6 +25,7 @@ NTSTATUS FspVolumeWork(
#ifdef ALLOC_PRAGMA #ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspVolumeCreate) #pragma alloc_text(PAGE, FspVolumeCreate)
#pragma alloc_text(PAGE, FspVolumeCreateRegisterMup)
#pragma alloc_text(PAGE, FspVolumeDelete) #pragma alloc_text(PAGE, FspVolumeDelete)
#pragma alloc_text(PAGE, FspVolumeDeleteDelayed) #pragma alloc_text(PAGE, FspVolumeDeleteDelayed)
#pragma alloc_text(PAGE, FspVolumeMount) #pragma alloc_text(PAGE, FspVolumeMount)
@ -36,6 +38,13 @@ NTSTATUS FspVolumeWork(
#define PREFIXW L"" FSP_FSCTL_VOLUME_PARAMS_PREFIX #define PREFIXW L"" FSP_FSCTL_VOLUME_PARAMS_PREFIX
#define PREFIXW_SIZE (sizeof PREFIXW - sizeof(WCHAR)) #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( NTSTATUS FspVolumeCreate(
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
{ {
@ -60,6 +69,7 @@ NTSTATUS FspVolumeCreate(
PDEVICE_OBJECT FsvolDeviceObject; PDEVICE_OBJECT FsvolDeviceObject;
PDEVICE_OBJECT FsvrtDeviceObject; PDEVICE_OBJECT FsvrtDeviceObject;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension;
FSP_CREATE_VOLUME_REGISTER_MUP_WORK_ITEM RegisterMupWorkItem;
/* check parameters */ /* check parameters */
if (PREFIXW_SIZE + sizeof(FSP_FSCTL_VOLUME_PARAMS) * sizeof(WCHAR) > FileObject->FileName.Length) 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? */ /* do we need to register with MUP? */
if (0 == FsvrtDeviceObject) 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)) if (!NT_SUCCESS(Result))
{ {
FspDeviceRelease(FsvolDeviceObject); FspDeviceRelease(FsvolDeviceObject);
@ -171,6 +192,18 @@ NTSTATUS FspVolumeCreate(
return STATUS_SUCCESS; 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( VOID FspVolumeDelete(
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
{ {