diff --git a/src/sys/driver.h b/src/sys/driver.h index 0348f17b..b6c2ad30 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1283,6 +1283,41 @@ VOID FspDeviceDelete(PDEVICE_OBJECT DeviceObject); BOOLEAN FspDeviceReference(PDEVICE_OBJECT DeviceObject); VOID FspDeviceDereference(PDEVICE_OBJECT DeviceObject); 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) { FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); diff --git a/src/sys/volume.c b/src/sys/volume.c index b0390dd3..5847d779 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -369,7 +369,7 @@ VOID FspVolumeDelete( ULONG FileNodeCount, Index; NTSTATUS Result; - ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE); + FspFsvolDeviceVolumeDeleteAcquireExclusive(FsvolDeviceObject); FsvolDeviceExtension->VolumeDeleted = TRUE; /* @@ -406,7 +406,7 @@ VOID FspVolumeDelete( FspFileNodeDeleteList(FileNodes, FileNodeCount); } - ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); + FspFsvolDeviceVolumeDeleteRelease(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject); } @@ -1189,9 +1189,8 @@ NTSTATUS FspVolumeNotify( if (!FspDeviceReference(FsvolDeviceObject)) return STATUS_CANCELLED; - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); - ExAcquireResourceSharedLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE); - if (FsvolDeviceExtension->VolumeDeleted) + FspFsvolDeviceVolumeDeleteAcquireShared(FsvolDeviceObject); + if (FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeDeleted) { Result = STATUS_CANCELLED; goto fail; @@ -1218,8 +1217,7 @@ NTSTATUS FspVolumeNotify( goto fail; } - ExSetResourceOwnerPointer(&FsvolDeviceExtension->VolumeDeleteResource, - (PVOID)((UINT_PTR)NotifyWorkItem | 3)); + FspFsvolDeviceVolumeDeleteSetOwner(FsvolDeviceObject, NotifyWorkItem); ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem); NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject; @@ -1232,7 +1230,7 @@ fail: if (0 != NotifyWorkItem) FspFree(NotifyWorkItem); - ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); + FspFsvolDeviceVolumeDeleteRelease(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject); @@ -1383,8 +1381,7 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0) ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex); } - ExReleaseResourceForThreadLite(&FsvolDeviceExtension->VolumeDeleteResource, - (ERESOURCE_THREAD)((UINT_PTR)NotifyWorkItem | 3)); + FspFsvolDeviceVolumeDeleteReleaseOwner(FsvolDeviceObject, NotifyWorkItem); FspDeviceDereference(FsvolDeviceObject);