mirror of
https://github.com/reactos/reactos.git
synced 2024-07-28 07:08:59 +00:00
[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:
parent
ef64669349
commit
7245b3c04b
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue