From a7a526351f24913bbde64bf84fe7421d17d94edd Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 9 Jun 2022 10:07:43 +0100 Subject: [PATCH] sys: keep extra fsvol device reference Reference an fsvol device at CREATE time and dereference at CLOSE time, to ensure that fsvol remains around for DeviceIoControl operations done after CLEANUP. --- src/sys/close.c | 3 +++ src/sys/create.c | 4 ++++ src/sys/volume.c | 1 - 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sys/close.c b/src/sys/close.c index 7e146536..b92d6e42 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -43,6 +43,9 @@ static NTSTATUS FspFsctlClose( { PAGED_CODE(); + if (0 != IrpSp->FileObject->FsContext2) + FspDeviceDereference(IrpSp->FileObject->FsContext2); + Irp->IoStatus.Information = 0; return STATUS_SUCCESS; } diff --git a/src/sys/create.c b/src/sys/create.c index 03e47806..34303256 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -116,7 +116,11 @@ static NTSTATUS FspFsctlCreate( if (0 == FileObject->RelatedFileObject && PREFIXW_SIZE <= FileObject->FileName.Length && RtlEqualMemory(PREFIXW, FileObject->FileName.Buffer, PREFIXW_SIZE)) + { Result = FspVolumeCreate(DeviceObject, Irp, IrpSp); + if (NT_SUCCESS(Result) && 0 != IrpSp->FileObject->FsContext2) + FspDeviceReference(IrpSp->FileObject->FsContext2); + } else { Result = STATUS_SUCCESS; diff --git a/src/sys/volume.c b/src/sys/volume.c index 7cd87654..6928d065 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -417,7 +417,6 @@ static VOID FspVolumeDeleteNoLock( PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); - IrpSp->FileObject->FsContext2 = 0; /* stop the I/O queue */ FspIoqStop(FsvolDeviceExtension->Ioq, TRUE);