diff --git a/src/sys/device.c b/src/sys/device.c index c56f97c9..7f332c8a 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -204,6 +204,14 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject) { PAGED_CODE(); + + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); + + /* + * Dereference the virtual volume device so that it can now go away. + */ + if (0 != FsvolDeviceExtension->FsvrtDeviceObject) + ObDereferenceObject(FsvolDeviceExtension->FsvrtDeviceObject); } BOOLEAN FspDeviceRetain(PDEVICE_OBJECT DeviceObject) diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index a430a931..3e41ab3a 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -230,6 +230,12 @@ static NTSTATUS FspFsctlMountVolume( &FsvolDeviceObject); if (NT_SUCCESS(Result)) { + /* + * Reference the virtual volume device so that it will not go away while the + * file system device object is alive! + */ + ObReferenceObject(FsvrtDeviceObject); + #pragma prefast(suppress:28175, "We are a filesystem: ok to access SectorSize") FsvolDeviceObject->SectorSize = FsvrtDeviceExtension->VolumeParams.SectorSize; FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);