Get rid of global volume boot sector and store required info in separate

variables

svn path=/trunk/; revision=11690
This commit is contained in:
Gé van Geldorp 2004-11-17 22:07:45 +00:00
parent 4d21897222
commit c9e0a17bab

View file

@ -29,27 +29,28 @@
#include <cache.h> #include <cache.h>
#include <machine.h> #include <machine.h>
PFAT_BOOTSECTOR FatVolumeBootSector = NULL;
PFAT32_BOOTSECTOR Fat32VolumeBootSector = NULL;
PFATX_BOOTSECTOR FatXVolumeBootSector = NULL;
U32 BytesPerSector; /* Number of bytes per sector */ U32 BytesPerSector; /* Number of bytes per sector */
U32 SectorsPerCluster; /* Number of sectors per cluster */ U32 SectorsPerCluster; /* Number of sectors per cluster */
U32 FatVolumeStartSector; /* Absolute starting sector of the partition */ U32 FatVolumeStartSector; /* Absolute starting sector of the partition */
U32 SectorsPerFat; // Sectors per FAT table U32 FatSectorStart; /* Starting sector of 1st FAT table */
U32 RootDirSectorStart; // Starting sector of the root directory (non-fat32) U32 ActiveFatSectorStart; /* Starting sector of active FAT table */
U32 RootDirSectors; // Number of sectors of the root directory (non-fat32) U32 NumberOfFats; /* Number of FAT tables */
U32 SectorsPerFat; /* Sectors per FAT table */
U32 RootDirSectorStart; /* Starting sector of the root directory (non-fat32) */
U32 RootDirSectors; /* Number of sectors of the root directory (non-fat32) */
U32 RootDirStartCluster; /* Starting cluster number of the root directory (fat32 only) */ U32 RootDirStartCluster; /* Starting cluster number of the root directory (fat32 only) */
U32 DataSectorStart; // Starting sector of the data area U32 DataSectorStart; /* Starting sector of the data area */
U32 FatType = 0; // FAT12, FAT16, FAT32, FATX16 or FATX32 U32 FatType = 0; /* FAT12, FAT16, FAT32, FATX16 or FATX32 */
U32 FatDriveNumber = 0; U32 FatDriveNumber = 0;
BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCount) BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCount)
{ {
char ErrMsg[80]; char ErrMsg[80];
U32 FatSize; U32 FatSize;
PFAT_BOOTSECTOR FatVolumeBootSector;
PFAT32_BOOTSECTOR Fat32VolumeBootSector;
PFATX_BOOTSECTOR FatXVolumeBootSector;
DbgPrint((DPRINT_FILESYSTEM, "FatOpenVolume() DriveNumber = 0x%x VolumeStartSector = %d\n", DriveNumber, VolumeStartSector)); DbgPrint((DPRINT_FILESYSTEM, "FatOpenVolume() DriveNumber = 0x%x VolumeStartSector = %d\n", DriveNumber, VolumeStartSector));
@ -57,18 +58,7 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
FatDriveNumber = DriveNumber; FatDriveNumber = DriveNumber;
// //
// Free any memory previously allocated // Allocate the memory to hold the boot sector
//
if (FatVolumeBootSector != NULL)
{
MmFreeMemory(FatVolumeBootSector);
FatVolumeBootSector = NULL;
Fat32VolumeBootSector = NULL;
}
//
// Now allocate the memory to hold the boot sector
// //
FatVolumeBootSector = (PFAT_BOOTSECTOR) MmAllocateMemory(512); FatVolumeBootSector = (PFAT_BOOTSECTOR) MmAllocateMemory(512);
Fat32VolumeBootSector = (PFAT32_BOOTSECTOR) FatVolumeBootSector; Fat32VolumeBootSector = (PFAT32_BOOTSECTOR) FatVolumeBootSector;
@ -87,6 +77,7 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
// If this fails then abort // If this fails then abort
if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PVOID)DISKREADBUFFER)) if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PVOID)DISKREADBUFFER))
{ {
MmFreeMemory(FatVolumeBootSector);
return FALSE; return FALSE;
} }
RtlCopyMemory(FatVolumeBootSector, (PVOID)DISKREADBUFFER, 512); RtlCopyMemory(FatVolumeBootSector, (PVOID)DISKREADBUFFER, 512);
@ -186,6 +177,7 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
sprintf(ErrMsg, "Invalid boot sector magic on drive 0x%x (expected 0xaa55 found 0x%x)", sprintf(ErrMsg, "Invalid boot sector magic on drive 0x%x (expected 0xaa55 found 0x%x)",
DriveNumber, FatVolumeBootSector->BootSectorMagic); DriveNumber, FatVolumeBootSector->BootSectorMagic);
FileSystemError(ErrMsg); FileSystemError(ErrMsg);
MmFreeMemory(FatVolumeBootSector);
return FALSE; return FALSE;
} }
@ -197,12 +189,16 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
(! ISFATX(FatType) && 64 * 1024 < FatVolumeBootSector->SectorsPerCluster * FatVolumeBootSector->BytesPerSector)) (! ISFATX(FatType) && 64 * 1024 < FatVolumeBootSector->SectorsPerCluster * FatVolumeBootSector->BytesPerSector))
{ {
FileSystemError("This file system has cluster sizes bigger than 64k.\nFreeLoader does not support this."); FileSystemError("This file system has cluster sizes bigger than 64k.\nFreeLoader does not support this.");
MmFreeMemory(FatVolumeBootSector);
return FALSE; return FALSE;
} }
// //
// Clear our variables // Clear our variables
// //
FatSectorStart = 0;
ActiveFatSectorStart = 0;
NumberOfFats = 0;
RootDirSectorStart = 0; RootDirSectorStart = 0;
DataSectorStart = 0; DataSectorStart = 0;
SectorsPerFat = 0; SectorsPerFat = 0;
@ -217,11 +213,14 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
{ {
BytesPerSector = 512; BytesPerSector = 512;
SectorsPerCluster = FatXVolumeBootSector->SectorsPerCluster; SectorsPerCluster = FatXVolumeBootSector->SectorsPerCluster;
FatSectorStart = (4096 / BytesPerSector);
ActiveFatSectorStart = FatSectorStart;
NumberOfFats = 1;
FatSize = PartitionSectorCount / SectorsPerCluster * FatSize = PartitionSectorCount / SectorsPerCluster *
(FATX16 == FatType ? 2 : 4); (FATX16 == FatType ? 2 : 4);
SectorsPerFat = (((FatSize + 4095) / 4096) * 4096) / BytesPerSector; SectorsPerFat = (((FatSize + 4095) / 4096) * 4096) / BytesPerSector;
RootDirSectorStart = (4096 / BytesPerSector) + SectorsPerFat; RootDirSectorStart = FatSectorStart + NumberOfFats * SectorsPerFat;
RootDirSectors = FatXVolumeBootSector->SectorsPerCluster; RootDirSectors = FatXVolumeBootSector->SectorsPerCluster;
DataSectorStart = RootDirSectorStart + RootDirSectors; DataSectorStart = RootDirSectorStart + RootDirSectors;
@ -230,22 +229,28 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
{ {
BytesPerSector = FatVolumeBootSector->BytesPerSector; BytesPerSector = FatVolumeBootSector->BytesPerSector;
SectorsPerCluster = FatVolumeBootSector->SectorsPerCluster; SectorsPerCluster = FatVolumeBootSector->SectorsPerCluster;
FatSectorStart = FatVolumeBootSector->ReservedSectors;
ActiveFatSectorStart = FatSectorStart;
NumberOfFats = FatVolumeBootSector->NumberOfFats;
SectorsPerFat = FatVolumeBootSector->SectorsPerFat; SectorsPerFat = FatVolumeBootSector->SectorsPerFat;
RootDirSectorStart = (FatVolumeBootSector->NumberOfFats * SectorsPerFat) + FatVolumeBootSector->ReservedSectors; RootDirSectorStart = FatSectorStart + NumberOfFats * SectorsPerFat;
RootDirSectors = ((FatVolumeBootSector->RootDirEntries * 32) + (BytesPerSector - 1)) / BytesPerSector; RootDirSectors = ((FatVolumeBootSector->RootDirEntries * 32) + (BytesPerSector - 1)) / BytesPerSector;
DataSectorStart = FatVolumeBootSector->ReservedSectors + (FatVolumeBootSector->NumberOfFats * FatVolumeBootSector->SectorsPerFat) + RootDirSectors; DataSectorStart = RootDirSectorStart + RootDirSectors;
} }
else else
{ {
BytesPerSector = Fat32VolumeBootSector->BytesPerSector; BytesPerSector = Fat32VolumeBootSector->BytesPerSector;
SectorsPerCluster = Fat32VolumeBootSector->SectorsPerCluster; SectorsPerCluster = Fat32VolumeBootSector->SectorsPerCluster;
FatSectorStart = Fat32VolumeBootSector->ReservedSectors;
ActiveFatSectorStart = FatSectorStart +
((Fat32VolumeBootSector->ExtendedFlags & 0x80) ? ((Fat32VolumeBootSector->ExtendedFlags & 0x0f) * Fat32VolumeBootSector->SectorsPerFatBig) : 0);
NumberOfFats = Fat32VolumeBootSector->NumberOfFats;
SectorsPerFat = Fat32VolumeBootSector->SectorsPerFatBig; SectorsPerFat = Fat32VolumeBootSector->SectorsPerFatBig;
RootDirStartCluster = Fat32VolumeBootSector->RootDirStartCluster; RootDirStartCluster = Fat32VolumeBootSector->RootDirStartCluster;
DataSectorStart = FatVolumeBootSector->ReservedSectors + (FatVolumeBootSector->NumberOfFats * Fat32VolumeBootSector->SectorsPerFatBig) + RootDirSectors; DataSectorStart = FatSectorStart + NumberOfFats * SectorsPerFat;
// //
// Check version // Check version
@ -257,6 +262,7 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
return FALSE; return FALSE;
} }
} }
MmFreeMemory(FatVolumeBootSector);
// //
// Initialize the disk cache for this drive // Initialize the disk cache for this drive
@ -273,7 +279,7 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector, U32 PartitionSectorCo
// //
if (FatType != FAT32 && FatType != FATX32) if (FatType != FAT32 && FatType != FATX32)
{ {
if (!CacheForceDiskSectorsIntoCache(DriveNumber, FatVolumeStartSector + FatVolumeBootSector->ReservedSectors, FatVolumeBootSector->SectorsPerFat)) if (!CacheForceDiskSectorsIntoCache(DriveNumber, ActiveFatSectorStart, SectorsPerFat))
{ {
return FALSE; return FALSE;
} }
@ -832,7 +838,7 @@ BOOL FatGetFatEntry(U32 Cluster, U32* ClusterPointer)
case FAT12: case FAT12:
FatOffset = Cluster + (Cluster / 2); FatOffset = Cluster + (Cluster / 2);
ThisFatSecNum = FatVolumeBootSector->ReservedSectors + (FatOffset / BytesPerSector); ThisFatSecNum = ActiveFatSectorStart + (FatOffset / BytesPerSector);
ThisFatEntOffset = (FatOffset % BytesPerSector); ThisFatEntOffset = (FatOffset % BytesPerSector);
DbgPrint((DPRINT_FILESYSTEM, "FatOffset: %d\n", FatOffset)); DbgPrint((DPRINT_FILESYSTEM, "FatOffset: %d\n", FatOffset));
@ -866,7 +872,7 @@ BOOL FatGetFatEntry(U32 Cluster, U32* ClusterPointer)
case FATX16: case FATX16:
FatOffset = (Cluster * 2); FatOffset = (Cluster * 2);
ThisFatSecNum = FatVolumeBootSector->ReservedSectors + (FatOffset / BytesPerSector); ThisFatSecNum = ActiveFatSectorStart + (FatOffset / BytesPerSector);
ThisFatEntOffset = (FatOffset % BytesPerSector); ThisFatEntOffset = (FatOffset % BytesPerSector);
if (!FatReadVolumeSectors(FatDriveNumber, ThisFatSecNum, 1, (PVOID)FILESYSBUFFER)) if (!FatReadVolumeSectors(FatDriveNumber, ThisFatSecNum, 1, (PVOID)FILESYSBUFFER))
@ -882,8 +888,7 @@ BOOL FatGetFatEntry(U32 Cluster, U32* ClusterPointer)
case FATX32: case FATX32:
FatOffset = (Cluster * 4); FatOffset = (Cluster * 4);
ThisFatSecNum = (Fat32VolumeBootSector->ExtendedFlags & 0x80) ? ((Fat32VolumeBootSector->ExtendedFlags & 0x0f) * Fat32VolumeBootSector->SectorsPerFatBig) : 0; // Get the active fat sector offset ThisFatSecNum = ActiveFatSectorStart + (FatOffset / BytesPerSector);
ThisFatSecNum += FatVolumeBootSector->ReservedSectors + (FatOffset / BytesPerSector);
ThisFatEntOffset = (FatOffset % BytesPerSector); ThisFatEntOffset = (FatOffset % BytesPerSector);
if (!FatReadVolumeSectors(FatDriveNumber, ThisFatSecNum, 1, (PVOID)FILESYSBUFFER)) if (!FatReadVolumeSectors(FatDriveNumber, ThisFatSecNum, 1, (PVOID)FILESYSBUFFER))