From a2329a46e9ddaf9a246ba3b913e0cde1549fe3f2 Mon Sep 17 00:00:00 2001 From: David Welch Date: Thu, 1 Mar 2001 07:48:17 +0000 Subject: [PATCH] Fixed from Carl Nettelblad svn path=/trunk/; revision=1653 --- reactos/drivers/fs/vfat/fat.c | 111 ++++++++++++++++++++++++------- reactos/drivers/fs/vfat/volume.c | 24 +++---- 2 files changed, 99 insertions(+), 36 deletions(-) diff --git a/reactos/drivers/fs/vfat/fat.c b/reactos/drivers/fs/vfat/fat.c index 36c51753fcd..1f5fdf67471 100644 --- a/reactos/drivers/fs/vfat/fat.c +++ b/reactos/drivers/fs/vfat/fat.c @@ -1,5 +1,5 @@ /* - * $Id: fat.c,v 1.18 2001/02/06 20:17:35 dwelch Exp $ + * $Id: fat.c,v 1.19 2001/03/01 07:48:17 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,7 +15,7 @@ #include #include -#define NDEBUG +#define NDEBUGN #include #include "vfat.h" @@ -75,8 +75,7 @@ Fat16GetNextCluster (PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster) /* - * FUNCTION: Retrieve the next FAT16 cluster from the FAT table from the - * in-memory FAT + * FUNCTION: Retrieve the next FAT16 cluster from the FAT table */ { PVOID BaseAddress; @@ -169,10 +168,10 @@ Fat12GetNextCluster (PDEVICE_EXTENSION DeviceExt, Entry = (CBlock[FATOffset] >> 4); Entry |= (CBlock[FATOffset+1] << 4); } - DPRINT("Entry %x\n",Entry); +// DPRINT("Entry %x\n",Entry); if (Entry >= 0xff8 && Entry <= 0xfff) Entry = 0xffffffff; - DPRINT("Returning %x\n",Entry); +// DPRINT("Returning %x\n",Entry); *NextCluster = Entry; CcReleaseCacheSegment(DeviceExt->Fat12StorageBcb, CacheSeg, TRUE); return(STATUS_SUCCESS); @@ -256,6 +255,7 @@ FAT12FindAvailableCluster (PDEVICE_EXTENSION DeviceExt, PULONG Cluster) BOOLEAN Valid; PCACHE_SEGMENT CacheSeg; NTSTATUS Status; + ULONG numberofclusters; *Cluster = 0; @@ -282,7 +282,9 @@ FAT12FindAvailableCluster (PDEVICE_EXTENSION DeviceExt, PULONG Cluster) } CBlock = (PUCHAR)BaseAddress; - for (i = 2; i < ((DeviceExt->Boot->FATSectors * 512 * 8) / 12); i++) + numberofclusters = ((DeviceExt->Boot->Sectors ? DeviceExt->Boot->Sectors : DeviceExt->Boot->SectorsHuge)-DeviceExt->dataStart)/DeviceExt->Boot->SectorsPerCluster+2; + + for (i = 2; i < numberofclusters; i++) { FATOffset = (i * 12) / 8; if ((i % 2) == 0) @@ -299,11 +301,11 @@ FAT12FindAvailableCluster (PDEVICE_EXTENSION DeviceExt, PULONG Cluster) { DPRINT("Found available cluster 0x%x\n", i); *Cluster = i; - CcReleaseCacheSegment(DeviceExt->StorageBcb, CacheSeg, TRUE); + CcReleaseCacheSegment(DeviceExt->Fat12StorageBcb, CacheSeg, TRUE); return(STATUS_SUCCESS); } } - CcReleaseCacheSegment(DeviceExt->StorageBcb, CacheSeg, TRUE); + CcReleaseCacheSegment(DeviceExt->Fat12StorageBcb, CacheSeg, TRUE); return (STATUS_DISK_FULL); } @@ -315,21 +317,36 @@ FAT32FindAvailableCluster (PDEVICE_EXTENSION DeviceExt, PULONG Cluster) { ULONG sector; PULONG Block; - int i; + int i,forto; + ULONG numberofclusters; + NTSTATUS Status; Block = ExAllocatePool (NonPagedPool, BLOCKSIZE); *Cluster = 0; + numberofclusters = ((DeviceExt->Boot->Sectors ? DeviceExt->Boot->Sectors : DeviceExt->Boot->SectorsHuge)-DeviceExt->dataStart)/DeviceExt->Boot->SectorsPerCluster+2; + numberofclusters %= 128; + for (sector = 0; sector < ((struct _BootSector32 *) (DeviceExt->Boot))->FATSectors32; sector++) { - /* FIXME: Check status */ - VfatReadSectors (DeviceExt->StorageDevice, + Status = VfatReadSectors (DeviceExt->StorageDevice, (ULONG) (DeviceExt->FATStart + sector), 1, (UCHAR *) Block); - for (i = 0; i < 512; i++) + if (!NT_SUCCESS(Status)) + { + ExFreePool (Block); + return(Status); + } + + if (sector==((struct _BootSector32 *) (DeviceExt->Boot))->FATSectors32-1) + forto=numberofclusters; + else + forto=128; + + for (i = 0; i < forto; i++) { if (Block[i] == 0) { @@ -344,7 +361,7 @@ FAT32FindAvailableCluster (PDEVICE_EXTENSION DeviceExt, PULONG Cluster) return (STATUS_DISK_FULL); } -#if 0 + ULONG FAT12CountAvailableClusters (PDEVICE_EXTENSION DeviceExt) /* @@ -353,13 +370,43 @@ FAT12CountAvailableClusters (PDEVICE_EXTENSION DeviceExt) { ULONG FATOffset; ULONG Entry; - PUCHAR CBlock = DeviceExt->FAT; + PUCHAR CBlock; ULONG ulCount = 0; ULONG i; + PVOID BaseAddress; + BOOLEAN Valid; + PCACHE_SEGMENT CacheSeg; + NTSTATUS Status; + ULONG numberofclusters; ExAcquireResourceSharedLite (&DeviceExt->FatResource, TRUE); - - for (i = 2; i < ((DeviceExt->Boot->FATSectors * 512 * 8) / 12); i++) + Status = CcRequestCacheSegment(DeviceExt->Fat12StorageBcb, + 0, + &BaseAddress, + &Valid, + &CacheSeg); + if (!NT_SUCCESS(Status)) + { + ExReleaseResourceLite (&DeviceExt->FatResource); + return 0; // Will the caller understand NTSTATUS values? + } + if (!Valid) + { + Status = VfatReadSectors(DeviceExt->StorageDevice, + DeviceExt->FATStart, + DeviceExt->Boot->FATSectors, + BaseAddress); + if (!NT_SUCCESS(Status)) + { + CcReleaseCacheSegment(DeviceExt->Fat12StorageBcb, CacheSeg, FALSE); + ExReleaseResourceLite (&DeviceExt->FatResource); + return 0; // Will the caller understand NTSTATUS values? + } + } + CBlock = (PUCHAR)BaseAddress; + numberofclusters = ((DeviceExt->Boot->Sectors ? DeviceExt->Boot->Sectors : DeviceExt->Boot->SectorsHuge)-DeviceExt->dataStart)/DeviceExt->Boot->SectorsPerCluster+2; + + for (i = 2; i < numberofclusters; i++) { FATOffset = (i * 12) / 8; if ((i % 2) == 0) @@ -376,11 +423,13 @@ FAT12CountAvailableClusters (PDEVICE_EXTENSION DeviceExt) ulCount++; } + CcReleaseCacheSegment(DeviceExt->Fat12StorageBcb, CacheSeg, FALSE); ExReleaseResourceLite (&DeviceExt->FatResource); return ulCount; } +#if 0 ULONG FAT16CountAvailableClusters (PDEVICE_EXTENSION DeviceExt) /* @@ -415,11 +464,16 @@ FAT32CountAvailableClusters (PDEVICE_EXTENSION DeviceExt) ULONG sector; PULONG Block; ULONG ulCount = 0; - ULONG i; + ULONG i,forto; + ULONG numberofclusters; ExAcquireResourceSharedLite (&DeviceExt->FatResource, TRUE); Block = ExAllocatePool (NonPagedPool, BLOCKSIZE); + + numberofclusters = ((DeviceExt->Boot->Sectors ? DeviceExt->Boot->Sectors : DeviceExt->Boot->SectorsHuge)-DeviceExt->dataStart)/DeviceExt->Boot->SectorsPerCluster+2; + numberofclusters %= 128; + for (sector = 0; sector < ((struct _BootSector32 *) (DeviceExt->Boot))->FATSectors32; sector++) @@ -429,13 +483,16 @@ FAT32CountAvailableClusters (PDEVICE_EXTENSION DeviceExt) (ULONG) (DeviceExt->FATStart + sector), 1, (UCHAR *) Block); - for (i = 0; i < 512; i++) + if (sector==((struct _BootSector32 *) (DeviceExt->Boot))->FATSectors32-1) + forto=numberofclusters; + else + forto=128; + for (i = 0; i < forto; i++) { if (Block[i] == 0) ulCount++; } } - /* Give an error message (out of disk space) if we reach here) */ ExFreePool (Block); ExReleaseResourceLite (&DeviceExt->FatResource); return ulCount; @@ -516,7 +573,7 @@ FAT12WriteCluster (PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, 1, CBlock + FATsector * 512); } } - CcReleaseCacheSegment(DeviceExt->StorageBcb, CacheSeg, TRUE); + CcReleaseCacheSegment(DeviceExt->Fat12StorageBcb, CacheSeg, TRUE); return(STATUS_SUCCESS); } @@ -729,8 +786,8 @@ GetNextCluster (PDEVICE_EXTENSION DeviceExt, { NTSTATUS Status; - DPRINT ("GetNextCluster(DeviceExt %x, CurrentCluster %x)\n", - DeviceExt, CurrentCluster); +// DPRINT ("GetNextCluster(DeviceExt %x, CurrentCluster %x)\n", +// DeviceExt, CurrentCluster); if (Extend) { @@ -760,6 +817,10 @@ GetNextCluster (PDEVICE_EXTENSION DeviceExt, else if (DeviceExt->FatType == FAT32) { Status = FAT32FindAvailableCluster (DeviceExt, &NewCluster); + if (!NT_SUCCESS(Status)) + { + return(Status); + } } else { @@ -810,6 +871,10 @@ GetNextCluster (PDEVICE_EXTENSION DeviceExt, else if (DeviceExt->FatType == FAT32) { Status = FAT32FindAvailableCluster (DeviceExt, &NewCluster); + if (!NT_SUCCESS(Status)) + { + return(Status); + } } else { diff --git a/reactos/drivers/fs/vfat/volume.c b/reactos/drivers/fs/vfat/volume.c index 52df534fe55..ba132b4e8cf 100644 --- a/reactos/drivers/fs/vfat/volume.c +++ b/reactos/drivers/fs/vfat/volume.c @@ -1,4 +1,4 @@ -/* $Id: volume.c,v 1.6 2001/01/12 21:00:08 dwelch Exp $ +/* $Id: volume.c,v 1.7 2001/03/01 07:48:17 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -83,13 +83,11 @@ FsdGetFsSizeInformation (PDEVICE_OBJECT DeviceObject, struct _BootSector32 *BootSect = (struct _BootSector32 *) DeviceExt->Boot; - if (BootSect->Sectors) - FsSizeInfo->TotalAllocationUnits.QuadPart = BootSect->Sectors; - else - FsSizeInfo->TotalAllocationUnits.QuadPart = BootSect->SectorsHuge; + FsSizeInfo->TotalAllocationUnits.QuadPart = ((BootSect->Sectors ? BootSect->Sectors : BootSect->SectorsHuge)-DeviceExt->dataStart)/BootSect->SectorsPerCluster; - /* FsSizeInfo->AvailableAllocationUnits.QuadPart = - FAT32CountAvailableClusters (DeviceExt); */ + + + FsSizeInfo->AvailableAllocationUnits.QuadPart = FAT32CountAvailableClusters (DeviceExt); FsSizeInfo->SectorsPerAllocationUnit = BootSect->SectorsPerCluster; FsSizeInfo->BytesPerSector = BootSect->BytesPerSector; @@ -98,18 +96,18 @@ FsdGetFsSizeInformation (PDEVICE_OBJECT DeviceObject, { struct _BootSector *BootSect = (struct _BootSector *) DeviceExt->Boot; - if (BootSect->Sectors) - FsSizeInfo->TotalAllocationUnits.QuadPart = BootSect->Sectors; - else - FsSizeInfo->TotalAllocationUnits.QuadPart = BootSect->SectorsHuge; - /* + FsSizeInfo->TotalAllocationUnits.QuadPart = ((BootSect->Sectors ? BootSect->Sectors : BootSect->SectorsHuge)-DeviceExt->dataStart)/BootSect->SectorsPerCluster; + if (DeviceExt->FatType == FAT16) FsSizeInfo->AvailableAllocationUnits.QuadPart = +#if 0 FAT16CountAvailableClusters (DeviceExt); +#else +0; +#endif else FsSizeInfo->AvailableAllocationUnits.QuadPart = FAT12CountAvailableClusters (DeviceExt); - */ FsSizeInfo->SectorsPerAllocationUnit = BootSect->SectorsPerCluster; FsSizeInfo->BytesPerSector = BootSect->BytesPerSector; }