sys: FspFsvolDevice{Lookup,Insert,Delete}Context: now require use of FsvolDeviceExtension Resource

This commit is contained in:
Bill Zissimopoulos 2015-12-05 00:29:47 -08:00
parent f0ee13b04c
commit b5cf090144
2 changed files with 23 additions and 23 deletions

View File

@ -47,9 +47,15 @@ VOID FspDeviceDeleteAll(VOID);
#pragma alloc_text(PAGE, FspFsvrtDeviceInit)
#pragma alloc_text(PAGE, FspFsvrtDeviceFini)
#pragma alloc_text(PAGE, FspFsvolDeviceInit)
//! #pragma alloc_text(PAGE, FspFsvolDeviceFini)
#pragma alloc_text(PAGE, FspFsvolDeviceFini)
#pragma alloc_text(PAGE, FspFsctlDeviceVolumeCreated)
#pragma alloc_text(PAGE, FspFsctlDeviceVolumeDeleted)
#pragma alloc_text(PAGE, FspFsvolDeviceLookupContext)
#pragma alloc_text(PAGE, FspFsvolDeviceInsertContext)
#pragma alloc_text(PAGE, FspFsvolDeviceDeleteContext)
#pragma alloc_text(PAGE, FspFsvolDeviceCompareElement)
#pragma alloc_text(PAGE, FspFsvolDeviceAllocateElement)
#pragma alloc_text(PAGE, FspFsvolDeviceFreeElement)
#pragma alloc_text(PAGE, FspDeviceCopyList)
#pragma alloc_text(PAGE, FspDeviceDeleteList)
#pragma alloc_text(PAGE, FspDeviceDeleteAll)
@ -214,26 +220,25 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ExInitializeFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
RtlInitializeGenericTableAvl(&FsvolDeviceExtension->GenericTable, 0, 0, 0, 0);
RtlInitializeGenericTableAvl(&FsvolDeviceExtension->GenericTable,
FspFsvolDeviceCompareElement, FspFsvolDeviceAllocateElement, FspFsvolDeviceFreeElement, 0);
return STATUS_SUCCESS;
}
static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
/*
* Enumerate and delete all entries in the GenericTable.
* There is no need to protect accesses to the table as we are in the device destructor.
*/
ExAcquireFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
FSP_DEVICE_GENERIC_TABLE_ELEMENT *Element;
while (0 != (Element = RtlGetElementGenericTableAvl(&FsvolDeviceExtension->GenericTable, 0)))
RtlDeleteElementGenericTableAvl(&FsvolDeviceExtension->GenericTable, &Element->Identifier);
ExReleaseFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
/*
* Dereference the virtual volume device so that it can now go away.
@ -307,36 +312,34 @@ VOID FspFsctlDeviceVolumeDeleted(PDEVICE_OBJECT DeviceObject)
PVOID FspFsvolDeviceLookupContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ASSERT(FspFsvolDeviceExtensionKind == FsvolDeviceExtension->Base.Kind);
ASSERT(ExIsResourceAcquiredExclusiveLite(&FsvolDeviceExtension->Base.Resource));
PVOID Result;
FSP_DEVICE_GENERIC_TABLE_ELEMENT *Result;
ExAcquireFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
Result = RtlLookupElementGenericTableAvl(&FsvolDeviceExtension->GenericTable, &Identifier);
ExReleaseFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
return Result;
return 0 != Result ? Result->Context : 0;
}
PVOID FspFsvolDeviceInsertContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier, PVOID Context,
PBOOLEAN PInserted)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ASSERT(FspFsvolDeviceExtensionKind == FsvolDeviceExtension->Base.Kind);
ASSERT(ExIsResourceAcquiredExclusiveLite(&FsvolDeviceExtension->Base.Resource));
FSP_DEVICE_GENERIC_TABLE_ELEMENT *Result, Element = { 0 };
Element.Identifier = Identifier;
Element.Context = Context;
ExAcquireFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
Result = RtlInsertElementGenericTableAvl(&FsvolDeviceExtension->GenericTable,
&Element, sizeof Element, PInserted);
ExReleaseFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
return 0 != Result ? Result->Context : 0;
}
@ -344,16 +347,15 @@ PVOID FspFsvolDeviceInsertContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier
VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier,
PBOOLEAN PDeleted)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
ASSERT(FspFsvolDeviceExtensionKind == FsvolDeviceExtension->Base.Kind);
ASSERT(ExIsResourceAcquiredExclusiveLite(&FsvolDeviceExtension->Base.Resource));
BOOLEAN Deleted;
ExAcquireFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
Deleted = RtlDeleteElementGenericTableAvl(&FsvolDeviceExtension->GenericTable, &Identifier);
ExReleaseFastMutex(&FsvolDeviceExtension->GenericTableFastMutex);
if (0 != PDeleted)
*PDeleted = Deleted;
@ -362,7 +364,7 @@ VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier,
static RTL_GENERIC_COMPARE_RESULTS NTAPI FspFsvolDeviceCompareElement(
PRTL_AVL_TABLE Table, PVOID FirstElement, PVOID SecondElement)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
if (FirstElement < SecondElement)
return GenericLessThan;
@ -376,16 +378,15 @@ static RTL_GENERIC_COMPARE_RESULTS NTAPI FspFsvolDeviceCompareElement(
static PVOID NTAPI FspFsvolDeviceAllocateElement(
PRTL_AVL_TABLE Table, CLONG ByteSize)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
/* allocate from non-paged pool because of fast mutex use */
return ExAllocatePoolWithTag(NonPagedPool, ByteSize, FSP_TAG);
return ExAllocatePoolWithTag(PagedPool, ByteSize, FSP_TAG);
}
static VOID NTAPI FspFsvolDeviceFreeElement(
PRTL_AVL_TABLE Table, PVOID Buffer)
{
// !PAGED_CODE(); /* because of fast mutex use in GenericTable */
PAGED_CODE();
ExFreePoolWithTag(Buffer, FSP_TAG);
}

View File

@ -304,7 +304,6 @@ typedef struct
{
FSP_DEVICE_EXTENSION Base;
PDEVICE_OBJECT FsvrtDeviceObject;
FAST_MUTEX GenericTableFastMutex;
RTL_AVL_TABLE GenericTable;
} FSP_FSVOL_DEVICE_EXTENSION;
static inline