[fastfat_new]

- Acquire global lock before touching FatGlobalData structure.
- Initialize global VCB list, fixes a crash at volume mounting.
- Loading goes up to volume mounting, an attempt to query information and open a file.

svn path=/trunk/; revision=43194
This commit is contained in:
Aleksey Bragin 2009-09-27 20:24:22 +00:00
parent ef64669349
commit 7245b3c04b
4 changed files with 32 additions and 3 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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:

View file

@ -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 */