- Fixed some problems to recognize a FATX partition on a non xbox (Should be tested on a real xbox).  
- Fixed the calculation of the number of clusters.
Modified: trunk/reactos/drivers/fs/vfat/fsctl.c

Modified: trunk/reactos/drivers/fs/vfat/fsctl.c
--- trunk/reactos/drivers/fs/vfat/fsctl.c	2005-01-25 21:10:42 UTC (rev 13280)
+++ trunk/reactos/drivers/fs/vfat/fsctl.c	2005-01-25 21:11:46 UTC (rev 13281)
@@ -130,130 +130,129 @@
    {
       *RecognizedFS = TRUE;
    }  
-   if (*RecognizedFS == FALSE)
+   if (*RecognizedFS)
    {
-      return STATUS_SUCCESS;
-   }
 
-   Boot = ExAllocatePool(NonPagedPool, DiskGeometry.BytesPerSector);
-   if (Boot == NULL)
-   {
-      return STATUS_INSUFFICIENT_RESOURCES;
-   }
-
-   Offset.QuadPart = 0;
-   
-   /* Try to recognize FAT12/FAT16/FAT32 partitions */
-   Status = VfatReadDisk(DeviceToMount, &Offset, DiskGeometry.BytesPerSector, (PUCHAR) Boot, FALSE);
-   if (NT_SUCCESS(Status))
-   {
-      if (Boot->Signatur1 != 0xaa55)
+      Boot = ExAllocatePool(NonPagedPool, DiskGeometry.BytesPerSector);
+      if (Boot == NULL)
       {
-         *RecognizedFS = FALSE;
+         return STATUS_INSUFFICIENT_RESOURCES;
       }
-      if (*RecognizedFS &&
-	       Boot->BytesPerSector != 512 &&
-	       Boot->BytesPerSector != 1024 &&
-          Boot->BytesPerSector != 2048 && 
-	       Boot->BytesPerSector != 4096)
-      {
-         DPRINT1("BytesPerSector %d\n", Boot->BytesPerSector);
-         *RecognizedFS = FALSE;
-      }
 
-      if (*RecognizedFS &&
-          Boot->FATCount != 1 && 
-	       Boot->FATCount != 2)
+      Offset.QuadPart = 0;
+   
+      /* Try to recognize FAT12/FAT16/FAT32 partitions */
+      Status = VfatReadDisk(DeviceToMount, &Offset, DiskGeometry.BytesPerSector, (PUCHAR) Boot, FALSE);
+      if (NT_SUCCESS(Status))
       {
-         DPRINT1("FATCount %d\n", Boot->FATCount);
-         *RecognizedFS = FALSE;
-      }
+         if (Boot->Signatur1 != 0xaa55)
+         {
+            *RecognizedFS = FALSE;
+         }
+         if (*RecognizedFS &&
+	     Boot->BytesPerSector != 512 &&
+	     Boot->BytesPerSector != 1024 &&
+             Boot->BytesPerSector != 2048 && 
+	     Boot->BytesPerSector != 4096)
+         {
+            DPRINT1("BytesPerSector %d\n", Boot->BytesPerSector);
+            *RecognizedFS = FALSE;
+         }
 
-      if (*RecognizedFS &&
-          Boot->Media != 0xf0 && 
-          Boot->Media != 0xf8 &&
-          Boot->Media != 0xf9 &&
-          Boot->Media != 0xfa && 
-          Boot->Media != 0xfb &&
-          Boot->Media != 0xfc &&
-          Boot->Media != 0xfd &&
-          Boot->Media != 0xfe && 
-          Boot->Media != 0xff)
-      {
-         DPRINT1("Media             %02x\n", Boot->Media);
-         *RecognizedFS = FALSE;
-      }
-
-      if (*RecognizedFS &&
-          Boot->SectorsPerCluster != 1 &&
-          Boot->SectorsPerCluster != 2 &&
-          Boot->SectorsPerCluster != 4 && 
-          Boot->SectorsPerCluster != 8 &&
-          Boot->SectorsPerCluster != 16 &&
-          Boot->SectorsPerCluster != 32 && 
-          Boot->SectorsPerCluster != 64 &&
-          Boot->SectorsPerCluster != 128)
-      {
-         DPRINT1("SectorsPerCluster %02x\n", Boot->SectorsPerCluster);
-         *RecognizedFS = FALSE;
-      }
-
-      if (*RecognizedFS &&
-          Boot->BytesPerSector * Boot->SectorsPerCluster > 32 * 1024)
-      {
-         DPRINT1("ClusterSize %dx\n", Boot->BytesPerSector * Boot->SectorsPerCluster);
-         *RecognizedFS = FALSE;
-      }
-
-      if (*RecognizedFS)
-      {
-         FatInfo.VolumeID = Boot->VolumeID;
-         FatInfo.FATStart = Boot->ReservedSectors;
-         FatInfo.FATCount = Boot->FATCount;
-         FatInfo.FATSectors = Boot->FATSectors ? Boot->FATSectors : ((struct _BootSector32*) Boot)->FATSectors32;
-         FatInfo.BytesPerSector = Boot->BytesPerSector;
-         FatInfo.SectorsPerCluster = Boot->SectorsPerCluster;
-         FatInfo.BytesPerCluster = FatInfo.BytesPerSector * FatInfo.SectorsPerCluster;
-         FatInfo.rootDirectorySectors = ((Boot->RootEntries * 32) + Boot->BytesPerSector - 1) / Boot->BytesPerSector;
-         FatInfo.rootStart = FatInfo.FATStart + FatInfo.FATCount * FatInfo.FATSectors;
-         FatInfo.dataStart = FatInfo.rootStart + FatInfo.rootDirectorySectors;
-         FatInfo.Sectors = Sectors = Boot->Sectors ? Boot->Sectors : Boot->SectorsHuge;
-         Sectors -= Boot->ReservedSectors + FatInfo.FATCount * FatInfo.FATSectors + FatInfo.rootDirectorySectors;
-         FatInfo.NumberOfClusters = Sectors / Boot->SectorsPerCluster;
-         if (FatInfo.NumberOfClusters < 4085)
+         if (*RecognizedFS &&
+             Boot->FATCount != 1 && 
+	     Boot->FATCount != 2)
          {
-            DPRINT("FAT12\n");
-            FatInfo.FatType = FAT12;
+            DPRINT1("FATCount %d\n", Boot->FATCount);
+            *RecognizedFS = FALSE;
          }
-         else if (FatInfo.NumberOfClusters >= 65525)
+
+         if (*RecognizedFS &&
+             Boot->Media != 0xf0 && 
+             Boot->Media != 0xf8 &&
+             Boot->Media != 0xf9 &&
+             Boot->Media != 0xfa && 
+             Boot->Media != 0xfb &&
+             Boot->Media != 0xfc &&
+             Boot->Media != 0xfd &&
+             Boot->Media != 0xfe && 
+             Boot->Media != 0xff)
          {
-            DPRINT("FAT32\n");
-            FatInfo.FatType = FAT32;
-            FatInfo.RootCluster = ((struct _BootSector32*) Boot)->RootCluster;
-            FatInfo.rootStart = FatInfo.dataStart + ((FatInfo.RootCluster - 2) * FatInfo.SectorsPerCluster);
-            FatInfo.VolumeID = ((struct _BootSector32*) Boot)->VolumeID;
+            DPRINT1("Media             %02x\n", Boot->Media);
+            *RecognizedFS = FALSE;
          }
-         else
+
+         if (*RecognizedFS &&
+             Boot->SectorsPerCluster != 1 &&
+             Boot->SectorsPerCluster != 2 &&
+             Boot->SectorsPerCluster != 4 && 
+             Boot->SectorsPerCluster != 8 &&
+             Boot->SectorsPerCluster != 16 &&
+             Boot->SectorsPerCluster != 32 && 
+             Boot->SectorsPerCluster != 64 &&
+             Boot->SectorsPerCluster != 128)
          {
-            DPRINT("FAT16\n");
-            FatInfo.FatType = FAT16;
+            DPRINT1("SectorsPerCluster %02x\n", Boot->SectorsPerCluster);
+            *RecognizedFS = FALSE;
          }
-         if (PartitionInfoIsValid &&
-	         FatInfo.Sectors > PartitionInfo.PartitionLength.QuadPart / FatInfo.BytesPerSector)
+
+         if (*RecognizedFS &&
+             Boot->BytesPerSector * Boot->SectorsPerCluster > 32 * 1024)
          {
-	         CHECKPOINT1;
+            DPRINT1("ClusterSize %dx\n", Boot->BytesPerSector * Boot->SectorsPerCluster);
             *RecognizedFS = FALSE;
          }
+
+         if (*RecognizedFS)
+         {
+            FatInfo.VolumeID = Boot->VolumeID;
+            FatInfo.FATStart = Boot->ReservedSectors;
+            FatInfo.FATCount = Boot->FATCount;
+            FatInfo.FATSectors = Boot->FATSectors ? Boot->FATSectors : ((struct _BootSector32*) Boot)->FATSectors32;
+            FatInfo.BytesPerSector = Boot->BytesPerSector;
+            FatInfo.SectorsPerCluster = Boot->SectorsPerCluster;
+            FatInfo.BytesPerCluster = FatInfo.BytesPerSector * FatInfo.SectorsPerCluster;
+            FatInfo.rootDirectorySectors = ((Boot->RootEntries * 32) + Boot->BytesPerSector - 1) / Boot->BytesPerSector;
+            FatInfo.rootStart = FatInfo.FATStart + FatInfo.FATCount * FatInfo.FATSectors;
+            FatInfo.dataStart = FatInfo.rootStart + FatInfo.rootDirectorySectors;
+            FatInfo.Sectors = Sectors = Boot->Sectors ? Boot->Sectors : Boot->SectorsHuge;
+            Sectors -= Boot->ReservedSectors + FatInfo.FATCount * FatInfo.FATSectors + FatInfo.rootDirectorySectors;
+            FatInfo.NumberOfClusters = Sectors / Boot->SectorsPerCluster;
+            if (FatInfo.NumberOfClusters < 4085)
+            {
+               DPRINT("FAT12\n");
+               FatInfo.FatType = FAT12;
+            }
+            else if (FatInfo.NumberOfClusters >= 65525)
+            {
+               DPRINT("FAT32\n");
+               FatInfo.FatType = FAT32;
+               FatInfo.RootCluster = ((struct _BootSector32*) Boot)->RootCluster;
+               FatInfo.rootStart = FatInfo.dataStart + ((FatInfo.RootCluster - 2) * FatInfo.SectorsPerCluster);
+               FatInfo.VolumeID = ((struct _BootSector32*) Boot)->VolumeID;
+            }
+            else
+            {
+               DPRINT("FAT16\n");
+               FatInfo.FatType = FAT16;
+            }
+            if (PartitionInfoIsValid &&
+	        FatInfo.Sectors > PartitionInfo.PartitionLength.QuadPart / FatInfo.BytesPerSector)
+            {
+	       CHECKPOINT1;
+               *RecognizedFS = FALSE;
+            }
 	    
-         if (pFatInfo && *RecognizedFS)
-         {
-            *pFatInfo = FatInfo;
+            if (pFatInfo && *RecognizedFS)
+            {
+               *pFatInfo = FatInfo;
+            }
          }
       }
+
+      ExFreePool(Boot);
    }
 
-   ExFreePool(Boot);
-   
    if (!*RecognizedFS && PartitionInfoIsValid)
    {
       BootFatX = ExAllocatePool(NonPagedPool, sizeof(struct _BootSectorFatX));
@@ -299,8 +298,8 @@
             FatInfo.SectorsPerCluster = BootFatX->SectorsPerCluster;
             FatInfo.rootDirectorySectors = BootFatX->SectorsPerCluster;
             FatInfo.BytesPerCluster = BootFatX->SectorsPerCluster * DiskGeometry.BytesPerSector;
-            FatInfo.NumberOfClusters = PartitionInfo.PartitionLength.QuadPart / FatInfo.BytesPerCluster;
-            if (FatInfo.NumberOfClusters < 65525)
+	    FatInfo.Sectors = PartitionInfo.PartitionLength.QuadPart / DiskGeometry.BytesPerSector;
+            if (FatInfo.Sectors / FatInfo.SectorsPerCluster < 65525)
             {
                DPRINT("FATX16\n");
                FatInfo.FatType = FATX16;
@@ -313,13 +312,14 @@
             FatInfo.VolumeID = BootFatX->VolumeID;
             FatInfo.FATStart = sizeof(struct _BootSectorFatX) / DiskGeometry.BytesPerSector;
             FatInfo.FATCount = BootFatX->FATCount;
-            FatInfo.FATSectors =
-                  ROUND_UP(FatInfo.NumberOfClusters * (FatInfo.FatType == FATX16 ? 2 : 4), 4096) /
+            FatInfo.FATSectors = 
+                  ROUND_UP(FatInfo.Sectors / FatInfo.SectorsPerCluster * (FatInfo.FatType == FATX16 ? 2 : 4), 4096) /
                   FatInfo.BytesPerSector;
             FatInfo.rootStart = FatInfo.FATStart + FatInfo.FATCount * FatInfo.FATSectors;
             FatInfo.dataStart = FatInfo.rootStart + FatInfo.rootDirectorySectors;
-            FatInfo.Sectors = PartitionInfo.PartitionLength.QuadPart / FatInfo.BytesPerSector;
-            if (pFatInfo && *RecognizedFS)
+            FatInfo.NumberOfClusters = (FatInfo.Sectors - FatInfo.dataStart) / FatInfo.SectorsPerCluster;
+	    
+	    if (pFatInfo && *RecognizedFS)
             {
                *pFatInfo = FatInfo;
             }