[ros-diffs] [fireball] 43477: [fastfat_new] - Add a helper function for reading (mapping) volume's stream file object. - Read a boot sector during volume mounting, unpack it and store values in Vcb->Bpb for later usage. In particular, a volume's serial number being empty problem is fixed now. Volume label is still empty. - Silence more non-important debug prints.

fireball at svn.reactos.org fireball at svn.reactos.org
Thu Oct 15 12:50:12 CEST 2009


Author: fireball
Date: Thu Oct 15 12:50:12 2009
New Revision: 43477

URL: http://svn.reactos.org/svn/reactos?rev=43477&view=rev
Log:
[fastfat_new]
- Add a helper function for reading (mapping) volume's stream file object.
- Read a boot sector during volume mounting, unpack it and store values in Vcb->Bpb for later usage. In particular, a volume's serial number being empty problem is fixed now. Volume label is still empty.
- Silence more non-important debug prints.

Modified:
    trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h
    trunk/reactos/drivers/filesystems/fastfat_new/fcb.c
    trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c
    trunk/reactos/drivers/filesystems/fastfat_new/volume.c

Modified: trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h?rev=43477&r1=43476&r2=43477&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h [iso-8859-1] Thu Oct 15 12:50:12 2009
@@ -49,6 +49,13 @@
 
 NTSTATUS NTAPI
 FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
+VOID NTAPI
+FatReadStreamFile(PVCB Vcb,
+                  ULONGLONG ByteOffset,
+                  ULONG ByteSize,
+                  PBCB *Bcb,
+                  PVOID *Buffer);
 
 /*  ------------------------------------------------------  blockdev.c  */
 NTSTATUS

Modified: trunk/reactos/drivers/filesystems/fastfat_new/fcb.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat_new/fcb.c?rev=43477&r1=43476&r2=43477&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/fcb.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/fcb.c [iso-8859-1] Thu Oct 15 12:50:12 2009
@@ -502,7 +502,7 @@
         RtlDowncaseUnicodeString(UnicodeName, UnicodeName, FALSE);
         RtlUpcaseUnicodeString(UnicodeName, UnicodeName, FALSE);
 
-        DPRINT1("Converted long name: %wZ\n", UnicodeName);
+        DPRINT("Converted long name: %wZ\n", UnicodeName);
 
         /* Add the long unicode name link */
         FatInsertName(IrpContext, &Fcb->ParentFcb->Dcb.SplayLinksUnicode, &Fcb->LongName);
@@ -603,7 +603,7 @@
     /* Set the length */
     OutString->Length = BaseLen + ExtLen;
 
-    DPRINT1("'%s', len %d\n", OutString->Buffer, OutString->Length);
+    DPRINT("'%s', len %d\n", OutString->Buffer, OutString->Length);
 }
 
 VOID

Modified: trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c?rev=43477&r1=43476&r2=43477&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c [iso-8859-1] Thu Oct 15 12:50:12 2009
@@ -47,6 +47,37 @@
     ExReleaseResourceLite(&FatGlobalData.Resource);
 }
 
+VOID
+NTAPI
+FatiUnpackBpb(PBIOS_PARAMETER_BLOCK Bpb, PPACKED_BIOS_PARAMETER_BLOCK PackedBpb)
+{
+    CopyUchar2(&Bpb->BytesPerSector,     &PackedBpb->BytesPerSector[0]);
+    CopyUchar1(&Bpb->SectorsPerCluster,  &PackedBpb->SectorsPerCluster[0]);
+    CopyUchar2(&Bpb->ReservedSectors,    &PackedBpb->ReservedSectors[0]);
+    CopyUchar1(&Bpb->Fats,               &PackedBpb->Fats[0]);
+    CopyUchar2(&Bpb->RootEntries,        &PackedBpb->RootEntries[0]);
+    CopyUchar2(&Bpb->Sectors,            &PackedBpb->Sectors[0]);
+    CopyUchar1(&Bpb->Media,              &PackedBpb->Media[0]);
+    CopyUchar2(&Bpb->SectorsPerFat,      &PackedBpb->SectorsPerFat[0]);
+    CopyUchar2(&Bpb->SectorsPerTrack,    &PackedBpb->SectorsPerTrack[0]);
+    CopyUchar2(&Bpb->Heads,              &PackedBpb->Heads[0]);
+    CopyUchar4(&Bpb->HiddenSectors,      &PackedBpb->HiddenSectors[0]);
+    CopyUchar4(&Bpb->LargeSectors,       &PackedBpb->LargeSectors[0]);
+    CopyUchar4(&Bpb->LargeSectorsPerFat, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->LargeSectorsPerFat[0]);
+    CopyUchar2(&Bpb->ExtendedFlags,      &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->ExtendedFlags[0]);
+    CopyUchar2(&Bpb->FsVersion,          &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->FsVersion[0]);
+    CopyUchar4(&Bpb->RootDirFirstCluster,&((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->RootDirFirstCluster[0]);
+    CopyUchar2(&Bpb->FsInfoSector,       &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->FsInfoSector[0]);
+    CopyUchar2(&Bpb->BackupBootSector,   &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->BackupBootSector[0]);
+}
+
+BOOLEAN
+NTAPI
+FatiBpbFat32(PPACKED_BIOS_PARAMETER_BLOCK PackedBpb)
+{
+    return (*(USHORT *)(&PackedBpb->SectorsPerFat) == 0);
+}
+
 NTSTATUS
 NTAPI
 FatMountVolume(PFAT_IRP_CONTEXT IrpContext,
@@ -60,6 +91,8 @@
     PVOLUME_DEVICE_OBJECT VolumeDevice;
     VCB *Vcb;
     FF_ERROR Error;
+    PBCB BootBcb;
+    PPACKED_BOOT_SECTOR BootSector;
 
     DPRINT1("FatMountVolume()\n");
 
@@ -167,7 +200,46 @@
         goto FatMountVolumeCleanup;
     }
 
-    // TODO: Read BPB and store it in Vcb->Bpb
+    /* Read the boot sector */
+    FatReadStreamFile(Vcb, 0, sizeof(PACKED_BOOT_SECTOR), &BootBcb, (PVOID)&BootSector);
+
+    /* Check if it's successful */
+    if (!BootBcb)
+    {
+        Status = STATUS_UNRECOGNIZED_VOLUME;
+        goto FatMountVolumeCleanup;
+    }
+
+    /* Unpack data */
+    FatiUnpackBpb(&Vcb->Bpb, &BootSector->PackedBpb);
+
+    /* Verify if sector size matches */
+    if (DiskGeometry.BytesPerSector != Vcb->Bpb.BytesPerSector)
+    {
+        DPRINT1("Disk geometry BPS %d and bios BPS %d don't match!\n",
+            DiskGeometry.BytesPerSector, Vcb->Bpb.BytesPerSector);
+
+        /* Fail */
+        Status = STATUS_UNRECOGNIZED_VOLUME;
+        goto FatMountVolumeCleanup;
+    }
+
+    /* If Sectors value is set, discard the LargeSectors value */
+    if (Vcb->Bpb.Sectors) Vcb->Bpb.LargeSectors = 0;
+
+    /* Copy serial number */
+    if (FatiBpbFat32(&BootSector->PackedBpb))
+    {
+        CopyUchar4(&Vpb->SerialNumber, ((PPACKED_BOOT_SECTOR_EX)BootSector)->Id);
+    }
+    else
+    {
+        /* This is FAT12/16 */
+        CopyUchar4(&Vpb->SerialNumber, BootSector->Id);
+    }
+
+    /* Unpin the BCB */
+    CcUnpinData(BootBcb);
 
     /* Create root DCB for it */
     FatCreateRootDcb(IrpContext, &VolumeDevice->Vcb);
@@ -249,7 +321,7 @@
     PFAT_IRP_CONTEXT IrpContext;
     BOOLEAN CanWait = TRUE;
 
-    DPRINT1("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
+    DPRINT("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
 
     /* Get CanWait flag */
     if (IoGetCurrentIrpStackLocation(Irp)->FileObject)

Modified: trunk/reactos/drivers/filesystems/fastfat_new/volume.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat_new/volume.c?rev=43477&r1=43476&r2=43477&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/volume.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/volume.c [iso-8859-1] Thu Oct 15 12:50:12 2009
@@ -171,4 +171,27 @@
     return STATUS_NOT_IMPLEMENTED;
 }
 
+VOID
+NTAPI
+FatReadStreamFile(PVCB Vcb,
+                  ULONGLONG ByteOffset,
+                  ULONG ByteSize,
+                  PBCB *Bcb,
+                  PVOID *Buffer)
+{
+    LARGE_INTEGER Offset;
+
+    Offset.QuadPart = ByteOffset;
+
+    if (!CcMapData(Vcb->StreamFileObject,
+                   &Offset,
+                   ByteSize,
+                   TRUE, // FIXME: CanWait
+                   Bcb,
+                   Buffer))
+    {
+        ASSERT(FALSE);
+    }
+}
+
 /* EOF */




More information about the Ros-diffs mailing list