sys: convert suitable ERESOURCE to FAST_MUTEX

This commit is contained in:
Bill Zissimopoulos 2022-06-10 15:52:17 +01:00
parent 2e441534a3
commit 26af6c9363
4 changed files with 37 additions and 30 deletions

View File

@ -412,7 +412,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
/* initialize our context table */ /* initialize our context table */
ExInitializeResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); ExInitializeResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource); ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource); ExInitializeFastMutex(&FsvolDeviceExtension->ContextTableMutex);
InitializeListHead(&FsvolDeviceExtension->ContextList); InitializeListHead(&FsvolDeviceExtension->ContextList);
RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable,
FspFsvolDeviceCompareContextByName, FspFsvolDeviceCompareContextByName,
@ -494,7 +494,6 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject)
* to enumerate and delete all entries in the ContextTable. * to enumerate and delete all entries in the ContextTable.
*/ */
ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource);
ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource); ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource);
ExDeleteResourceLite(&FsvolDeviceExtension->VolumeDeleteResource); ExDeleteResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
} }
@ -856,7 +855,7 @@ static NTSTATUS FspFsmupDeviceInit(PDEVICE_OBJECT DeviceObject)
FSP_FSMUP_DEVICE_EXTENSION *FsmupDeviceExtension = FspFsmupDeviceExtension(DeviceObject); FSP_FSMUP_DEVICE_EXTENSION *FsmupDeviceExtension = FspFsmupDeviceExtension(DeviceObject);
/* initialize our prefix table */ /* initialize our prefix table */
ExInitializeResourceLite(&FsmupDeviceExtension->PrefixTableResource); ExInitializeFastMutex(&FsmupDeviceExtension->PrefixTableMutex);
RtlInitializeUnicodePrefix(&FsmupDeviceExtension->PrefixTable); RtlInitializeUnicodePrefix(&FsmupDeviceExtension->PrefixTable);
RtlInitializeUnicodePrefix(&FsmupDeviceExtension->ClassTable); RtlInitializeUnicodePrefix(&FsmupDeviceExtension->ClassTable);
FsmupDeviceExtension->InitDonePfxTab = 1; FsmupDeviceExtension->InitDonePfxTab = 1;
@ -878,7 +877,6 @@ static VOID FspFsmupDeviceFini(PDEVICE_OBJECT DeviceObject)
*/ */
ASSERT(0 == RtlNextUnicodePrefix(&FsmupDeviceExtension->PrefixTable, TRUE)); ASSERT(0 == RtlNextUnicodePrefix(&FsmupDeviceExtension->PrefixTable, TRUE));
ASSERT(0 == RtlNextUnicodePrefix(&FsmupDeviceExtension->ClassTable, TRUE)); ASSERT(0 == RtlNextUnicodePrefix(&FsmupDeviceExtension->ClassTable, TRUE));
ExDeleteResourceLite(&FsmupDeviceExtension->PrefixTableResource);
} }
} }
@ -936,4 +934,4 @@ VOID FspDeviceDeleteAll(VOID)
FspDeviceDeleteList(DeviceObjects, DeviceObjectCount); FspDeviceDeleteList(DeviceObjects, DeviceObjectCount);
} }
ERESOURCE FspDeviceGlobalResource; FAST_MUTEX FspDeviceGlobalMutex;

View File

@ -122,14 +122,13 @@ NTSTATUS DriverEntry(
#pragma prefast(suppress:28175, "We are a filesystem: ok to access FastIoDispatch") #pragma prefast(suppress:28175, "We are a filesystem: ok to access FastIoDispatch")
DriverObject->FastIoDispatch = &FspFastIoDispatch; DriverObject->FastIoDispatch = &FspFastIoDispatch;
BOOLEAN InitDoneGRes = FALSE, InitDoneSilo = FALSE, InitDonePsBuf = FALSE, BOOLEAN InitDoneSilo = FALSE, InitDonePsBuf = FALSE,
InitDoneTimers = FALSE, InitDoneDevices = FALSE; InitDoneTimers = FALSE, InitDoneDevices = FALSE;
FspDriverObject = DriverObject; FspDriverObject = DriverObject;
FspDriverMultiVersionInitialize(); FspDriverMultiVersionInitialize();
ExInitializeResourceLite(&FspDeviceGlobalResource); ExInitializeFastMutex(&FspDeviceGlobalMutex);
InitDoneGRes = TRUE;
Result = FspSiloInitialize(FspDriverInitializeDevices, FspDriverFinalizeDevices); Result = FspSiloInitialize(FspDriverInitializeDevices, FspDriverFinalizeDevices);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
@ -164,8 +163,6 @@ exit:
FspProcessBufferFinalize(); FspProcessBufferFinalize();
if (InitDoneSilo) if (InitDoneSilo)
FspSiloFinalize(); FspSiloFinalize();
if (InitDoneGRes)
ExDeleteResourceLite(&FspDeviceGlobalResource);
FSP_TRACE_FINI(); FSP_TRACE_FINI();
} }

View File

@ -1214,7 +1214,7 @@ typedef struct
ERESOURCE VolumeDeleteResource; ERESOURCE VolumeDeleteResource;
BOOLEAN VolumeDeleted; BOOLEAN VolumeDeleted;
ERESOURCE FileRenameResource; ERESOURCE FileRenameResource;
ERESOURCE ContextTableResource; FAST_MUTEX ContextTableMutex;
LIST_ENTRY ContextList; LIST_ENTRY ContextList;
RTL_AVL_TABLE ContextByNameTable; RTL_AVL_TABLE ContextByNameTable;
PVOID ContextByNameTableElementStorage; PVOID ContextByNameTableElementStorage;
@ -1244,7 +1244,7 @@ typedef struct
{ {
FSP_DEVICE_EXTENSION Base; FSP_DEVICE_EXTENSION Base;
UINT32 InitDonePfxTab:1; UINT32 InitDonePfxTab:1;
ERESOURCE PrefixTableResource; FAST_MUTEX PrefixTableMutex;
UNICODE_PREFIX_TABLE PrefixTable; UNICODE_PREFIX_TABLE PrefixTable;
UNICODE_PREFIX_TABLE ClassTable; UNICODE_PREFIX_TABLE ClassTable;
} FSP_FSMUP_DEVICE_EXTENSION; } FSP_FSMUP_DEVICE_EXTENSION;
@ -1374,13 +1374,13 @@ static inline
VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject) VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject)
{ {
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->ContextTableResource, TRUE); ExAcquireFastMutexUnsafe(&FsvolDeviceExtension->ContextTableMutex);
} }
static inline static inline
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject) VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject)
{ {
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ExReleaseResourceLite(&FsvolDeviceExtension->ContextTableResource); ExReleaseFastMutexUnsafe(&FsvolDeviceExtension->ContextTableMutex);
} }
NTSTATUS FspFsvolDeviceCopyContextList(PDEVICE_OBJECT DeviceObject, NTSTATUS FspFsvolDeviceCopyContextList(PDEVICE_OBJECT DeviceObject,
PVOID **PContexts, PULONG PContextCount); PVOID **PContexts, PULONG PContextCount);
@ -1434,6 +1434,18 @@ BOOLEAN FspFsvolDeviceVolumePrefixInString(PDEVICE_OBJECT DeviceObject, PUNICODE
return RtlPrefixUnicodeString(&FspFsvolDeviceExtension(DeviceObject)->VolumePrefix, String, return RtlPrefixUnicodeString(&FspFsvolDeviceExtension(DeviceObject)->VolumePrefix, String,
TRUE); 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( NTSTATUS FspDeviceCopyList(
PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount);
VOID FspDeviceDeleteList( VOID FspDeviceDeleteList(
@ -1448,14 +1460,14 @@ VOID FspDeviceStopTimer(PDEVICE_OBJECT DeviceObject);
static inline static inline
VOID FspDeviceGlobalLock(VOID) VOID FspDeviceGlobalLock(VOID)
{ {
extern ERESOURCE FspDeviceGlobalResource; extern FAST_MUTEX FspDeviceGlobalMutex;
ExAcquireResourceExclusiveLite(&FspDeviceGlobalResource, TRUE); ExAcquireFastMutexUnsafe(&FspDeviceGlobalMutex);
} }
static inline static inline
VOID FspDeviceGlobalUnlock(VOID) VOID FspDeviceGlobalUnlock(VOID)
{ {
extern ERESOURCE FspDeviceGlobalResource; extern FAST_MUTEX FspDeviceGlobalMutex;
ExReleaseResourceLite(&FspDeviceGlobalResource); ExReleaseFastMutexUnsafe(&FspDeviceGlobalMutex);
} }
#define FspFsvolDeviceStatistics(DeviceObject)\ #define FspFsvolDeviceStatistics(DeviceObject)\
FspStatistics(FspFsvolDeviceExtension(DeviceObject)->Statistics) FspStatistics(FspFsvolDeviceExtension(DeviceObject)->Statistics)
@ -1596,7 +1608,7 @@ typedef struct FSP_FILE_NODE
/* interlocked access */ /* interlocked access */
LONG RefCount; LONG RefCount;
UINT32 DeletePending; UINT32 DeletePending;
/* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */ /* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableMutex */
LONG ActiveCount; /* CREATE w/o CLOSE count */ LONG ActiveCount; /* CREATE w/o CLOSE count */
LONG OpenCount; /* ContextTable ref count */ LONG OpenCount; /* ContextTable ref count */
LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */ LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */
@ -1960,7 +1972,7 @@ extern FAST_IO_DISPATCH FspFastIoDispatch;
extern CACHE_MANAGER_CALLBACKS FspCacheManagerCallbacks; extern CACHE_MANAGER_CALLBACKS FspCacheManagerCallbacks;
extern FSP_IOPREP_DISPATCH *FspIopPrepareFunction[]; extern FSP_IOPREP_DISPATCH *FspIopPrepareFunction[];
extern FSP_IOCMPL_DISPATCH *FspIopCompleteFunction[]; extern FSP_IOCMPL_DISPATCH *FspIopCompleteFunction[];
extern ERESOURCE FspDeviceGlobalResource; extern FAST_MUTEX FspDeviceGlobalMutex;
extern WCHAR FspFileDescDirectoryPatternMatchAll[]; extern WCHAR FspFileDescDirectoryPatternMatchAll[];
extern const GUID FspMainFileOpenEcpGuid; extern const GUID FspMainFileOpenEcpGuid;
extern ULONG FspProcessorCount; extern ULONG FspProcessorCount;

View File

@ -121,7 +121,7 @@ NTSTATUS FspMupRegister(
Class->Name.Buffer = Class->Buffer; Class->Name.Buffer = Class->Buffer;
RtlCopyMemory(Class->Buffer, ClassName.Buffer, ClassName.Length); RtlCopyMemory(Class->Buffer, ClassName.Buffer, ClassName.Length);
ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); FspFsmupDeviceLockPrefixTable(FsmupDeviceObject);
Success = RtlInsertUnicodePrefix(&FsmupDeviceExtension->PrefixTable, Success = RtlInsertUnicodePrefix(&FsmupDeviceExtension->PrefixTable,
&FsvolDeviceExtension->VolumePrefix, &FsvolDeviceExtension->VolumePrefixEntry); &FsvolDeviceExtension->VolumePrefix, &FsvolDeviceExtension->VolumePrefixEntry);
if (Success) if (Success)
@ -144,7 +144,7 @@ NTSTATUS FspMupRegister(
} }
else else
Result = STATUS_OBJECT_NAME_COLLISION; Result = STATUS_OBJECT_NAME_COLLISION;
ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject);
exit: exit:
if (0 != Class) if (0 != Class)
@ -169,7 +169,7 @@ VOID FspMupUnregister(
Result = FspMupGetClassName(&FsvolDeviceExtension->VolumePrefix, &ClassName); Result = FspMupGetClassName(&FsvolDeviceExtension->VolumePrefix, &ClassName);
ASSERT(NT_SUCCESS(Result)); ASSERT(NT_SUCCESS(Result));
ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); FspFsmupDeviceLockPrefixTable(FsmupDeviceObject);
PrefixEntry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable, PrefixEntry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable,
&FsvolDeviceExtension->VolumePrefix, 0); &FsvolDeviceExtension->VolumePrefix, 0);
if (0 != PrefixEntry) if (0 != PrefixEntry)
@ -191,7 +191,7 @@ VOID FspMupUnregister(
} }
} }
} }
ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject);
} }
PDEVICE_OBJECT FspMupGetFsvolDeviceObject( PDEVICE_OBJECT FspMupGetFsvolDeviceObject(
@ -253,7 +253,7 @@ NTSTATUS FspMupHandleIrp(
if (0 != FileObject->RelatedFileObject) if (0 != FileObject->RelatedFileObject)
FileObject = FileObject->RelatedFileObject; FileObject = FileObject->RelatedFileObject;
ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); FspFsmupDeviceLockPrefixTable(FsmupDeviceObject);
PrefixEntry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable, PrefixEntry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable,
&FileObject->FileName, 0); &FileObject->FileName, 0);
if (0 != PrefixEntry) if (0 != PrefixEntry)
@ -263,7 +263,7 @@ NTSTATUS FspMupHandleIrp(
FspDeviceReference(FsvolDeviceObject); FspDeviceReference(FsvolDeviceObject);
DeviceDeref = TRUE; DeviceDeref = TRUE;
} }
ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject);
break; break;
case IRP_MJ_DEVICE_CONTROL: case IRP_MJ_DEVICE_CONTROL:
@ -419,19 +419,19 @@ static NTSTATUS FspMupRedirQueryPathEx(
return STATUS_BAD_NETWORK_PATH; return STATUS_BAD_NETWORK_PATH;
Result = STATUS_BAD_NETWORK_PATH; Result = STATUS_BAD_NETWORK_PATH;
ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); FspFsmupDeviceLockPrefixTable(FsmupDeviceObject);
Entry = RtlFindUnicodePrefix(&FsmupDeviceExtension->ClassTable, &ClassName, 0); Entry = RtlFindUnicodePrefix(&FsmupDeviceExtension->ClassTable, &ClassName, 0);
if (0 != Entry) if (0 != Entry)
{ {
QueryPathResponse->LengthAccepted = ClassName.Length; QueryPathResponse->LengthAccepted = ClassName.Length;
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
} }
ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject);
#else #else
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension;
Result = STATUS_BAD_NETWORK_PATH; Result = STATUS_BAD_NETWORK_PATH;
ExAcquireResourceExclusiveLite(&FsmupDeviceExtension->PrefixTableResource, TRUE); FspFsmupDeviceLockPrefixTable(FsmupDeviceObject);
Entry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable, Entry = RtlFindUnicodePrefix(&FsmupDeviceExtension->PrefixTable,
&QueryPathRequest->PathName, 0); &QueryPathRequest->PathName, 0);
if (0 != Entry) if (0 != Entry)
@ -450,7 +450,7 @@ static NTSTATUS FspMupRedirQueryPathEx(
} }
} }
} }
ExReleaseResourceLite(&FsmupDeviceExtension->PrefixTableResource); FspFsmupDeviceUnlockPrefixTable(FsmupDeviceObject);
#endif #endif
return Result; return Result;