mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 17:32:29 -05:00
Major refactoring: testing
This commit is contained in:
parent
db1dc6fc91
commit
b5da069d17
@ -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(
|
||||||
|
@ -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(
|
||||||
|
@ -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(
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user