- 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
/* 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);
#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;
NTSTATUS
FatInitializeVcb(
+ IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN PDEVICE_OBJECT TargetDeviceObject,
IN PVPB Vpb);
}
NTSTATUS
-FatInitializeVcb(IN PVCB Vcb,
+FatInitializeVcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb,
IN PDEVICE_OBJECT TargetDeviceObject,
IN PVPB Vpb)
{
/* 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:
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 */