diff --git a/reactos/drivers/filesystems/fastfat_new/fastfat.c b/reactos/drivers/filesystems/fastfat_new/fastfat.c index 4be706d9b46..c4cc26e3f96 100644 --- a/reactos/drivers/filesystems/fastfat_new/fastfat.c +++ b/reactos/drivers/filesystems/fastfat_new/fastfat.c @@ -108,6 +108,9 @@ DriverEntry(PDRIVER_OBJECT DriverObject, /* Initialize synchronization resource for the global data */ ExInitializeResourceLite(&FatGlobalData.Resource); + /* Initialize global VCB list */ + InitializeListHead(&FatGlobalData.VcbListHead); + /* Register and reference our filesystem */ IoRegisterFileSystem(DeviceObject); ObReferenceObject(DeviceObject); diff --git a/reactos/drivers/filesystems/fastfat_new/fastfat.h b/reactos/drivers/filesystems/fastfat_new/fastfat.h index becad682f39..e8b0edf3c62 100644 --- a/reactos/drivers/filesystems/fastfat_new/fastfat.h +++ b/reactos/drivers/filesystems/fastfat_new/fastfat.h @@ -13,6 +13,27 @@ #define TAG_FCB 'BCFV' #define TAG_IRP 'PRIV' #define TAG_VFAT 'TAFV' + + +/* Global resource acquire/release */ +#define FatAcquireExclusiveGlobal(IrpContext) \ +( \ + ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \ + (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \ +) + +#define FatAcquireSharedGlobal(IrpContext) \ +( \ + ExAcquireResourceSharedLite(&FatGlobalData.Resource, \ + (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \ +) + +#define FatReleaseGlobal(IrpContext) \ +{ \ + ExReleaseResourceLite(&(FatGlobalData.Resource)); \ +} + + /* ------------------------------------------------------ shutdown.c */ DRIVER_DISPATCH FatShutdown; @@ -145,6 +166,7 @@ FatPinNextPage( NTSTATUS FatInitializeVcb( + IN PFAT_IRP_CONTEXT IrpContext, IN PVCB Vcb, IN PDEVICE_OBJECT TargetDeviceObject, IN PVPB Vpb); diff --git a/reactos/drivers/filesystems/fastfat_new/fat.c b/reactos/drivers/filesystems/fastfat_new/fat.c index 29b6f7558fc..6722ea0bd7d 100644 --- a/reactos/drivers/filesystems/fastfat_new/fat.c +++ b/reactos/drivers/filesystems/fastfat_new/fat.c @@ -445,7 +445,8 @@ FatiInitializeVcb(PVCB Vcb) } NTSTATUS -FatInitializeVcb(IN PVCB Vcb, +FatInitializeVcb(IN PFAT_IRP_CONTEXT IrpContext, + IN PVCB Vcb, IN PDEVICE_OBJECT TargetDeviceObject, IN PVPB Vpb) { @@ -533,8 +534,11 @@ FatInitializeVcb(IN PVCB Vcb, /* Call helper function */ FatiInitializeVcb(Vcb); - /* Add this Vcb to grobal Vcb list. */ + /* Add this Vcb to global Vcb list */ + (VOID)FatAcquireExclusiveGlobal(IrpContext); InsertTailList(&FatGlobalData.VcbListHead, &Vcb->VcbLinks); + FatReleaseGlobal(IrpContext); + return STATUS_SUCCESS; FatInitializeVcbCleanup: diff --git a/reactos/drivers/filesystems/fastfat_new/fsctl.c b/reactos/drivers/filesystems/fastfat_new/fsctl.c index 3dec2248922..be5edc6293b 100644 --- a/reactos/drivers/filesystems/fastfat_new/fsctl.c +++ b/reactos/drivers/filesystems/fastfat_new/fsctl.c @@ -121,7 +121,7 @@ FatMountVolume(PFAT_IRP_CONTEXT IrpContext, Vpb->DeviceObject = (PDEVICE_OBJECT)VolumeDevice; /* Initialize VCB for this volume */ - Status = FatInitializeVcb(&VolumeDevice->Vcb, TargetDeviceObject, Vpb); + Status = FatInitializeVcb(IrpContext, &VolumeDevice->Vcb, TargetDeviceObject, Vpb); if (!NT_SUCCESS(Status)) goto FatMountVolumeCleanup; /* Keep trace of media changes */