mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
sys: FSP_FSVOL_DEVICE_EXTENSION::VolumeDeleteResource
This commit is contained in:
parent
18842682c8
commit
805742f306
@ -410,6 +410,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
|
|||||||
FsvolDeviceExtension->InitDoneStat = 1;
|
FsvolDeviceExtension->InitDoneStat = 1;
|
||||||
|
|
||||||
/* initialize our context table */
|
/* initialize our context table */
|
||||||
|
ExInitializeResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
|
||||||
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
|
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
|
||||||
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource);
|
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource);
|
||||||
InitializeListHead(&FsvolDeviceExtension->ContextList);
|
InitializeListHead(&FsvolDeviceExtension->ContextList);
|
||||||
@ -495,6 +496,7 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject)
|
|||||||
|
|
||||||
ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource);
|
ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource);
|
||||||
ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource);
|
ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource);
|
||||||
|
ExDeleteResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* is there a virtual disk? */
|
/* is there a virtual disk? */
|
||||||
|
@ -1211,6 +1211,8 @@ typedef struct
|
|||||||
KSPIN_LOCK ExpirationLock;
|
KSPIN_LOCK ExpirationLock;
|
||||||
WORK_QUEUE_ITEM ExpirationWorkItem;
|
WORK_QUEUE_ITEM ExpirationWorkItem;
|
||||||
BOOLEAN ExpirationInProgress;
|
BOOLEAN ExpirationInProgress;
|
||||||
|
ERESOURCE VolumeDeleteResource;
|
||||||
|
BOOLEAN VolumeDeleted;
|
||||||
ERESOURCE FileRenameResource;
|
ERESOURCE FileRenameResource;
|
||||||
ERESOURCE ContextTableResource;
|
ERESOURCE ContextTableResource;
|
||||||
LIST_ENTRY ContextList;
|
LIST_ENTRY ContextList;
|
||||||
|
@ -369,6 +369,9 @@ VOID FspVolumeDelete(
|
|||||||
ULONG FileNodeCount, Index;
|
ULONG FileNodeCount, Index;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE);
|
||||||
|
FsvolDeviceExtension->VolumeDeleted = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we have an fsvrt that is a mountdev, finalize it now! Finalizing a mountdev
|
* If we have an fsvrt that is a mountdev, finalize it now! Finalizing a mountdev
|
||||||
* involves interaction with the MountManager, which tries to open our devices.
|
* involves interaction with the MountManager, which tries to open our devices.
|
||||||
@ -403,6 +406,8 @@ VOID FspVolumeDelete(
|
|||||||
FspFileNodeDeleteList(FileNodes, FileNodeCount);
|
FspFileNodeDeleteList(FileNodes, FileNodeCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
|
||||||
|
|
||||||
FspDeviceDereference(FsvolDeviceObject);
|
FspDeviceDereference(FsvolDeviceObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1184,6 +1189,14 @@ NTSTATUS FspVolumeNotify(
|
|||||||
if (!FspDeviceReference(FsvolDeviceObject))
|
if (!FspDeviceReference(FsvolDeviceObject))
|
||||||
return STATUS_CANCELLED;
|
return STATUS_CANCELLED;
|
||||||
|
|
||||||
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
||||||
|
ExAcquireResourceSharedLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE);
|
||||||
|
if (FsvolDeviceExtension->VolumeDeleted)
|
||||||
|
{
|
||||||
|
Result = STATUS_CANCELLED;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
NotifyWorkItem = FspAllocNonPaged(
|
NotifyWorkItem = FspAllocNonPaged(
|
||||||
FIELD_OFFSET(FSP_VOLUME_NOTIFY_WORK_ITEM, InputBuffer) + InputBufferLength);
|
FIELD_OFFSET(FSP_VOLUME_NOTIFY_WORK_ITEM, InputBuffer) + InputBufferLength);
|
||||||
if (0 == NotifyWorkItem)
|
if (0 == NotifyWorkItem)
|
||||||
@ -1205,6 +1218,9 @@ NTSTATUS FspVolumeNotify(
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExSetResourceOwnerPointer(&FsvolDeviceExtension->VolumeDeleteResource,
|
||||||
|
(PVOID)((UINT_PTR)NotifyWorkItem | 3));
|
||||||
|
|
||||||
ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem);
|
ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem);
|
||||||
NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject;
|
NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject;
|
||||||
|
|
||||||
@ -1216,6 +1232,8 @@ fail:
|
|||||||
if (0 != NotifyWorkItem)
|
if (0 != NotifyWorkItem)
|
||||||
FspFree(NotifyWorkItem);
|
FspFree(NotifyWorkItem);
|
||||||
|
|
||||||
|
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
|
||||||
|
|
||||||
FspDeviceDereference(FsvolDeviceObject);
|
FspDeviceDereference(FsvolDeviceObject);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
@ -1365,6 +1383,9 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0)
|
|||||||
ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex);
|
ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExReleaseResourceForThreadLite(&FsvolDeviceExtension->VolumeDeleteResource,
|
||||||
|
(ERESOURCE_THREAD)((UINT_PTR)NotifyWorkItem | 3));
|
||||||
|
|
||||||
FspDeviceDereference(FsvolDeviceObject);
|
FspDeviceDereference(FsvolDeviceObject);
|
||||||
|
|
||||||
FsRtlExitFileSystem();
|
FsRtlExitFileSystem();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user