mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
Major refactoring: testing
This commit is contained in:
parent
59188a9ab0
commit
c330eaec54
@ -182,8 +182,9 @@ VOID FspVolumeDelete(
|
|||||||
|
|
||||||
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;
|
||||||
|
|
||||||
/* acquire our DeleteResource */
|
/* acquire the volume device DeleteResource */
|
||||||
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->DeleteResource, TRUE);
|
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->DeleteResource, TRUE);
|
||||||
|
|
||||||
/* stop the I/O queue */
|
/* stop the I/O queue */
|
||||||
@ -216,6 +217,14 @@ VOID FspVolumeDelete(
|
|||||||
DeleteDly = 2 <= OldVpb->ReferenceCount;
|
DeleteDly = 2 <= OldVpb->ReferenceCount;
|
||||||
}
|
}
|
||||||
IoReleaseVpbSpinLock(Irql);
|
IoReleaseVpbSpinLock(Irql);
|
||||||
|
#pragma prefast(pop)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Release the virtual disk object. This is safe to do here because the volume device
|
||||||
|
* keeps an extra reference to the virtual disk object using ObReferenceObject.
|
||||||
|
*/
|
||||||
|
FspDeviceRelease(FsvrtDeviceObject);
|
||||||
|
|
||||||
if (DeleteVpb)
|
if (DeleteVpb)
|
||||||
{
|
{
|
||||||
/* no more references to the old VPB; delete now! */
|
/* no more references to the old VPB; delete now! */
|
||||||
@ -224,23 +233,15 @@ VOID FspVolumeDelete(
|
|||||||
}
|
}
|
||||||
else if (!DeleteDly)
|
else if (!DeleteDly)
|
||||||
{
|
{
|
||||||
/* there is only the reference from FspVolumeMount */
|
/* there is only the reference from FspVolumeMount; release it! */
|
||||||
FspFreeExternal(OldVpb);
|
FspFreeExternal(OldVpb);
|
||||||
FsvolDeviceExtension->SwapVpb = 0;
|
FsvolDeviceExtension->SwapVpb = 0;
|
||||||
FspDeviceRelease(FsvolDeviceObject);
|
FspDeviceRelease(FsvolDeviceObject);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* keep VPB around for delayed delete */
|
|
||||||
FsvolDeviceExtension->SwapVpb = OldVpb;
|
|
||||||
#pragma prefast(pop)
|
|
||||||
|
|
||||||
/* release the virtual disk and volume device objects */
|
|
||||||
FspDeviceRelease(FsvrtDeviceObject);
|
|
||||||
FspDeviceRelease(FsvolDeviceObject);
|
|
||||||
|
|
||||||
/* are we doing delayed delete of VPB and volume device object? */
|
|
||||||
if (DeleteDly)
|
|
||||||
{
|
{
|
||||||
|
/* VPB has extra references; we must do a delayed delete of the volume device */
|
||||||
|
FsvolDeviceExtension->SwapVpb = OldVpb;
|
||||||
DelayTimeout.QuadPart = 300/*ms*/ * -10000;
|
DelayTimeout.QuadPart = 300/*ms*/ * -10000;
|
||||||
FspInitializeWorkItemWithDelay(&FsvolDeviceExtension->DeleteVolumeWorkItem,
|
FspInitializeWorkItemWithDelay(&FsvolDeviceExtension->DeleteVolumeWorkItem,
|
||||||
FspVolumeDeleteDelayed, FsvolDeviceObject);
|
FspVolumeDeleteDelayed, FsvolDeviceObject);
|
||||||
@ -253,13 +254,13 @@ VOID FspVolumeDelete(
|
|||||||
|
|
||||||
FsRtlDeregisterUncProvider(MupHandle);
|
FsRtlDeregisterUncProvider(MupHandle);
|
||||||
FsvolDeviceExtension->MupHandle = 0;
|
FsvolDeviceExtension->MupHandle = 0;
|
||||||
|
|
||||||
/* release the volume device object */
|
|
||||||
FspDeviceRelease(FsvolDeviceObject);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* release the DeleteResource */
|
/* release the volume device DeleteResource */
|
||||||
ExReleaseResourceLite(&FsvolDeviceExtension->DeleteResource);
|
ExReleaseResourceLite(&FsvolDeviceExtension->DeleteResource);
|
||||||
|
|
||||||
|
/* release the volume device object */
|
||||||
|
FspDeviceRelease(FsvolDeviceObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FspVolumeDeleteDelayed(PVOID Context)
|
static VOID FspVolumeDeleteDelayed(PVOID Context)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user