mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 09:23:37 -05:00
Major refactoring: testing
This commit is contained in:
parent
db1dc6fc91
commit
b5da069d17
@ -49,7 +49,8 @@ static NTSTATUS FspFsvolCleanup(
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
return STATUS_INVALID_DEVICE_REQUEST;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID FspFsvolCleanupComplete(
|
||||
|
@ -46,7 +46,8 @@ static NTSTATUS FspFsvolClose(
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
return STATUS_INVALID_DEVICE_REQUEST;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID FspFsvolCloseComplete(
|
||||
|
@ -65,7 +65,8 @@ static NTSTATUS FspFsvolCreate(
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
return STATUS_INVALID_DEVICE_REQUEST;
|
||||
Irp->IoStatus.Information = FILE_OPENED;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS FspFsvolCreatePrepare(
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user