sys: FSP_FSVOL_DEVICE_EXTENSION::VolumeDeleteResource

This commit is contained in:
Bill Zissimopoulos 2022-06-10 14:46:10 +01:00
parent 805742f306
commit 66f3620808
2 changed files with 42 additions and 10 deletions

View File

@ -1283,6 +1283,41 @@ VOID FspDeviceDelete(PDEVICE_OBJECT DeviceObject);
BOOLEAN FspDeviceReference(PDEVICE_OBJECT DeviceObject); BOOLEAN FspDeviceReference(PDEVICE_OBJECT DeviceObject);
VOID FspDeviceDereference(PDEVICE_OBJECT DeviceObject); VOID FspDeviceDereference(PDEVICE_OBJECT DeviceObject);
static inline static inline
VOID FspFsvolDeviceVolumeDeleteAcquireShared(PDEVICE_OBJECT DeviceObject)
{
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ExAcquireResourceSharedLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE);
}
static inline
VOID FspFsvolDeviceVolumeDeleteAcquireExclusive(PDEVICE_OBJECT DeviceObject)
{
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE);
}
static inline
VOID FspFsvolDeviceVolumeDeleteSetOwner(PDEVICE_OBJECT DeviceObject, PVOID Owner)
{
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
Owner = (PVOID)((UINT_PTR)Owner | 3);
ExSetResourceOwnerPointer(&FsvolDeviceExtension->VolumeDeleteResource, Owner);
}
static inline
VOID FspFsvolDeviceVolumeDeleteRelease(PDEVICE_OBJECT DeviceObject)
{
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
}
static inline
VOID FspFsvolDeviceVolumeDeleteReleaseOwner(PDEVICE_OBJECT DeviceObject, PVOID Owner)
{
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
Owner = (PVOID)((UINT_PTR)Owner | 3);
if (ExIsResourceAcquiredLite(&FsvolDeviceExtension->VolumeDeleteResource))
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
else
ExReleaseResourceForThreadLite(&FsvolDeviceExtension->VolumeDeleteResource, (ERESOURCE_THREAD)Owner);
}
static inline
VOID FspFsvolDeviceFileRenameAcquireShared(PDEVICE_OBJECT DeviceObject) VOID FspFsvolDeviceFileRenameAcquireShared(PDEVICE_OBJECT DeviceObject)
{ {
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);

View File

@ -369,7 +369,7 @@ VOID FspVolumeDelete(
ULONG FileNodeCount, Index; ULONG FileNodeCount, Index;
NTSTATUS Result; NTSTATUS Result;
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE); FspFsvolDeviceVolumeDeleteAcquireExclusive(FsvolDeviceObject);
FsvolDeviceExtension->VolumeDeleted = TRUE; FsvolDeviceExtension->VolumeDeleted = TRUE;
/* /*
@ -406,7 +406,7 @@ VOID FspVolumeDelete(
FspFileNodeDeleteList(FileNodes, FileNodeCount); FspFileNodeDeleteList(FileNodes, FileNodeCount);
} }
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); FspFsvolDeviceVolumeDeleteRelease(FsvolDeviceObject);
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);
} }
@ -1189,9 +1189,8 @@ NTSTATUS FspVolumeNotify(
if (!FspDeviceReference(FsvolDeviceObject)) if (!FspDeviceReference(FsvolDeviceObject))
return STATUS_CANCELLED; return STATUS_CANCELLED;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); FspFsvolDeviceVolumeDeleteAcquireShared(FsvolDeviceObject);
ExAcquireResourceSharedLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE); if (FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeDeleted)
if (FsvolDeviceExtension->VolumeDeleted)
{ {
Result = STATUS_CANCELLED; Result = STATUS_CANCELLED;
goto fail; goto fail;
@ -1218,8 +1217,7 @@ NTSTATUS FspVolumeNotify(
goto fail; goto fail;
} }
ExSetResourceOwnerPointer(&FsvolDeviceExtension->VolumeDeleteResource, FspFsvolDeviceVolumeDeleteSetOwner(FsvolDeviceObject, NotifyWorkItem);
(PVOID)((UINT_PTR)NotifyWorkItem | 3));
ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem); ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem);
NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject; NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject;
@ -1232,7 +1230,7 @@ fail:
if (0 != NotifyWorkItem) if (0 != NotifyWorkItem)
FspFree(NotifyWorkItem); FspFree(NotifyWorkItem);
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); FspFsvolDeviceVolumeDeleteRelease(FsvolDeviceObject);
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);
@ -1383,8 +1381,7 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0)
ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex); ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex);
} }
ExReleaseResourceForThreadLite(&FsvolDeviceExtension->VolumeDeleteResource, FspFsvolDeviceVolumeDeleteReleaseOwner(FsvolDeviceObject, NotifyWorkItem);
(ERESOURCE_THREAD)((UINT_PTR)NotifyWorkItem | 3));
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);