From 26af6c9363e4c358d0ce9aa756de2e3b90e13c58 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 10 Jun 2022 15:52:17 +0100 Subject: [PATCH] sys: convert suitable ERESOURCE to FAST_MUTEX --- src/sys/device.c | 8 +++----- src/sys/driver.c | 7 ++----- src/sys/driver.h | 32 ++++++++++++++++++++++---------- src/sys/mup.c | 20 ++++++++++---------- 4 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/sys/device.c b/src/sys/device.c index bd45915f..15cb89a3 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -412,7 +412,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) /* initialize our context table */ ExInitializeResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource); - ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource); + ExInitializeFastMutex(&FsvolDeviceExtension->ContextTableMutex); InitializeListHead(&FsvolDeviceExtension->ContextList); RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, FspFsvolDeviceCompareContextByName, @@ -494,7 +494,6 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject) * to enumerate and delete all entries in the ContextTable. */ - ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource); ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource); ExDeleteResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); } @@ -856,7 +855,7 @@ static NTSTATUS FspFsmupDeviceInit(PDEVICE_OBJECT DeviceObject) FSP_FSMUP_DEVICE_EXTENSION *FsmupDeviceExtension = FspFsmupDeviceExtension(DeviceObject); /* initialize our prefix table */ - ExInitializeResourceLite(&FsmupDeviceExtension->PrefixTableResource); + ExInitializeFastMutex(&FsmupDeviceExtension->PrefixTableMutex); RtlInitializeUnicodePrefix(&FsmupDeviceExtension->PrefixTable); RtlInitializeUnicodePrefix(&FsmupDeviceExtension->ClassTable); FsmupDeviceExtension->InitDonePfxTab = 1; @@ -878,7 +877,6 @@ static VOID FspFsmupDeviceFini(PDEVICE_OBJECT DeviceObject) */ ASSERT(0 == RtlNextUnicodePrefix(&FsmupDeviceExtension->PrefixTable, TRUE)); ASSERT(0 == RtlNextUnicodePrefix(&FsmupDeviceExtension->ClassTable, TRUE)); - ExDeleteResourceLite(&FsmupDeviceExtension->PrefixTableResource); } } @@ -936,4 +934,4 @@ VOID FspDeviceDeleteAll(VOID) FspDeviceDeleteList(DeviceObjects, DeviceObjectCount); } -ERESOURCE FspDeviceGlobalResource; +FAST_MUTEX FspDeviceGlobalMutex; diff --git a/src/sys/driver.c b/src/sys/driver.c index b0e5a036..c0f615d8 100644 --- a/src/sys/driver.c +++ b/src/sys/driver.c @@ -122,14 +122,13 @@ NTSTATUS DriverEntry( #pragma prefast(suppress:28175, "We are a filesystem: ok to access FastIoDispatch") DriverObject->FastIoDispatch = &FspFastIoDispatch; - BOOLEAN InitDoneGRes = FALSE, InitDoneSilo = FALSE, InitDonePsBuf = FALSE, + BOOLEAN InitDoneSilo = FALSE, InitDonePsBuf = FALSE, InitDoneTimers = FALSE, InitDoneDevices = FALSE; FspDriverObject = DriverObject; FspDriverMultiVersionInitialize(); - ExInitializeResourceLite(&FspDeviceGlobalResource); - InitDoneGRes = TRUE; + ExInitializeFastMutex(&FspDeviceGlobalMutex); Result = FspSiloInitialize(FspDriverInitializeDevices, FspDriverFinalizeDevices); if (!NT_SUCCESS(Result)) @@ -164,8 +163,6 @@ exit: FspProcessBufferFinalize(); if (InitDoneSilo) FspSiloFinalize(); - if (InitDoneGRes) - ExDeleteResourceLite(&FspDeviceGlobalResource); FSP_TRACE_FINI(); } diff --git a/src/sys/driver.h b/src/sys/driver.h index dc1362b0..19701468 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1214,7 +1214,7 @@ typedef struct ERESOURCE VolumeDeleteResource; BOOLEAN VolumeDeleted; ERESOURCE FileRenameResource; - ERESOURCE ContextTableResource; + FAST_MUTEX ContextTableMutex; LIST_ENTRY ContextList; RTL_AVL_TABLE ContextByNameTable; PVOID ContextByNameTableElementStorage; @@ -1244,7 +1244,7 @@ typedef struct { FSP_DEVICE_EXTENSION Base; UINT32 InitDonePfxTab:1; - ERESOURCE PrefixTableResource; + FAST_MUTEX PrefixTableMutex; UNICODE_PREFIX_TABLE PrefixTable; UNICODE_PREFIX_TABLE ClassTable; } FSP_FSMUP_DEVICE_EXTENSION; @@ -1374,13 +1374,13 @@ static inline VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject) { FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); - ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->ContextTableResource, TRUE); + ExAcquireFastMutexUnsafe(&FsvolDeviceExtension->ContextTableMutex); } static inline VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject) { FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); - ExReleaseResourceLite(&FsvolDeviceExtension->ContextTableResource); + ExReleaseFastMutexUnsafe(&FsvolDeviceExtension->ContextTableMutex); } NTSTATUS FspFsvolDeviceCopyContextList(PDEVICE_OBJECT DeviceObject, PVOID **PContexts, PULONG PContextCount); @@ -1434,6 +1434,18 @@ BOOLEAN FspFsvolDeviceVolumePrefixInString(PDEVICE_OBJECT DeviceObject, PUNICODE return RtlPrefixUnicodeString(&FspFsvolDeviceExtension(DeviceObject)->VolumePrefix, String, TRUE); } +static inline +VOID FspFsmupDeviceLockPrefixTable(PDEVICE_OBJECT DeviceObject) +{ + FSP_FSMUP_DEVICE_EXTENSION *FsmupDeviceExtension = FspFsmupDeviceExtension(DeviceObject); + ExAcquireFastMutexUnsafe(&FsmupDeviceExtension->PrefixTableMutex); +} +static inline +VOID FspFsmupDeviceUnlockPrefixTable(PDEVICE_OBJECT DeviceObject) +{ + FSP_FSMUP_DEVICE_EXTENSION *FsmupDeviceExtension = FspFsmupDeviceExtension(DeviceObject); + ExReleaseFastMutexUnsafe(&FsmupDeviceExtension->PrefixTableMutex); +} NTSTATUS FspDeviceCopyList( PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); VOID FspDeviceDeleteList( @@ -1448,14 +1460,14 @@ VOID FspDeviceStopTimer(PDEVICE_OBJECT DeviceObject); static inline VOID FspDeviceGlobalLock(VOID) { - extern ERESOURCE FspDeviceGlobalResource; - ExAcquireResourceExclusiveLite(&FspDeviceGlobalResource, TRUE); + extern FAST_MUTEX FspDeviceGlobalMutex; + ExAcquireFastMutexUnsafe(&FspDeviceGlobalMutex); } static inline VOID FspDeviceGlobalUnlock(VOID) { - extern ERESOURCE FspDeviceGlobalResource; - ExReleaseResourceLite(&FspDeviceGlobalResource); + extern FAST_MUTEX FspDeviceGlobalMutex; + ExReleaseFastMutexUnsafe(&FspDeviceGlobalMutex); } #define FspFsvolDeviceStatistics(DeviceObject)\ FspStatistics(FspFsvolDeviceExtension(DeviceObject)->Statistics) @@ -1596,7 +1608,7 @@ typedef struct FSP_FILE_NODE /* interlocked access */ LONG RefCount; UINT32 DeletePending; - /* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */ + /* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableMutex */ LONG ActiveCount; /* CREATE w/o CLOSE count */ LONG OpenCount; /* ContextTable ref count */ LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */ @@ -1960,7 +1972,7 @@ extern FAST_IO_DISPATCH FspFastIoDispatch; extern CACHE_MANAGER_CALLBACKS FspCacheManagerCallbacks; extern FSP_IOPREP_DISPATCH *FspIopPrepareFunction[]; extern FSP_IOCMPL_DISPATCH *FspIopCompleteFunction[]; -extern ERESOURCE FspDeviceGlobalResource; +extern FAST_MUTEX FspDeviceGlobalMutex; extern WCHAR FspFileDescDirectoryPatternMatchAll[]; extern const GUID FspMainFileOpenEcpGuid; extern ULONG FspProcessorCount; diff --git a/src/sys/mup.c b/src/sys/mup.c index 30fb5655..64d98a87 100644 --- a/src/sys/mup.c +++ b/src/sys/mup.c @@ -121,7 +121,7 @@ NTSTATUS FspMupRegister( Class->Name.Buffer = Class->Buffer; RtlCopyMemory(Class->Buffer, ClassName.Buffer, ClassName.Length); - ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); + FspFsmupDeviceLockPrefixTable(FsmupDeviceObject); Success = RtlInsertUnicodePrefix(&FsmupDeviceExtension->PrefixTable, &FsvolDeviceExtension->VolumePrefix, &FsvolDeviceExtension->VolumePrefixEntry); if (Success) @@ -144,7 +144,7 @@ NTSTATUS FspMupRegister( } else Result = STATUS_OBJECT_NAME_COLLISION; - ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); + FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject); exit: if (0 != Class) @@ -169,7 +169,7 @@ VOID FspMupUnregister( Result = FspMupGetClassName(&FsvolDeviceExtension->VolumePrefix, &ClassName); ASSERT(NT_SUCCESS(Result)); - ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); + FspFsmupDeviceLockPrefixTable(FsmupDeviceObject); PrefixEntry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable, &FsvolDeviceExtension->VolumePrefix, 0); if (0 != PrefixEntry) @@ -191,7 +191,7 @@ VOID FspMupUnregister( } } } - ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); + FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject); } PDEVICE_OBJECT FspMupGetFsvolDeviceObject( @@ -253,7 +253,7 @@ NTSTATUS FspMupHandleIrp( if (0 != FileObject->RelatedFileObject) FileObject = FileObject->RelatedFileObject; - ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); + FspFsmupDeviceLockPrefixTable(FsmupDeviceObject); PrefixEntry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable, &FileObject->FileName, 0); if (0 != PrefixEntry) @@ -263,7 +263,7 @@ NTSTATUS FspMupHandleIrp( FspDeviceReference(FsvolDeviceObject); DeviceDeref = TRUE; } - ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); + FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject); break; case IRP_MJ_DEVICE_CONTROL: @@ -419,19 +419,19 @@ static NTSTATUS FspMupRedirQueryPathEx( return STATUS_BAD_NETWORK_PATH; Result = STATUS_BAD_NETWORK_PATH; - ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); + FspFsmupDeviceLockPrefixTable(FsmupDeviceObject); Entry = RtlFindUnicodePrefix(&FsmupDeviceExtension->ClassTable, &ClassName, 0); if (0 != Entry) { QueryPathResponse->LengthAccepted = ClassName.Length; Result = STATUS_SUCCESS; } - ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); + FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject); #else FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; Result = STATUS_BAD_NETWORK_PATH; - ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); + FspFsmupDeviceLockPrefixTable(FsmupDeviceObject); Entry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable, &QueryPathRequest->PathName, 0); if (0 != Entry) @@ -450,7 +450,7 @@ static NTSTATUS FspMupRedirQueryPathEx( } } } - ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); + FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject); #endif return Result;