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.
This commit is contained in:
Bill Zissimopoulos 2022-06-09 10:07:43 +01:00
parent 22bf0b09ef
commit a7a526351f
3 changed files with 7 additions and 1 deletions

View File

@ -43,6 +43,9 @@ static NTSTATUS FspFsctlClose(
{ {
PAGED_CODE(); PAGED_CODE();
if (0 != IrpSp->FileObject->FsContext2)
FspDeviceDereference(IrpSp->FileObject->FsContext2);
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View File

@ -116,7 +116,11 @@ static NTSTATUS FspFsctlCreate(
if (0 == FileObject->RelatedFileObject && if (0 == FileObject->RelatedFileObject &&
PREFIXW_SIZE <= FileObject->FileName.Length && PREFIXW_SIZE <= FileObject->FileName.Length &&
RtlEqualMemory(PREFIXW, FileObject->FileName.Buffer, PREFIXW_SIZE)) RtlEqualMemory(PREFIXW, FileObject->FileName.Buffer, PREFIXW_SIZE))
{
Result = FspVolumeCreate(DeviceObject, Irp, IrpSp); Result = FspVolumeCreate(DeviceObject, Irp, IrpSp);
if (NT_SUCCESS(Result) && 0 != IrpSp->FileObject->FsContext2)
FspDeviceReference(IrpSp->FileObject->FsContext2);
}
else else
{ {
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;

View File

@ -417,7 +417,6 @@ static VOID FspVolumeDeleteNoLock(
PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2; PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
IrpSp->FileObject->FsContext2 = 0;
/* stop the I/O queue */ /* stop the I/O queue */
FspIoqStop(FsvolDeviceExtension->Ioq, TRUE); FspIoqStop(FsvolDeviceExtension->Ioq, TRUE);