Esempio n. 1
0
 private void InitBootSector(BootSector bs)
 {
     bs.Init();
     bs.SetFileSystemTypeLabel(fatType.GetLabel());
     bs.SetNrReservedSectors(reservedSectors);
     bs.SetNrFats(fatCount);
     bs.SetSectorsPerCluster(sectorsPerCluster);
     bs.SetMediumDescriptor(MEDIUM_DESCRIPTOR_HD);
     bs.SetSectorsPerTrack(DEFAULT_SECTORS_PER_TRACK);
     bs.SetNrHeads(DEFAULT_HEADS);
     bs.SetOemName(oemName);
 }
Esempio n. 2
0
        private Fat(BootSector bs, long offset)
        {
            this.bs = bs;
            fatType = bs.GetFatType();
            if (bs.GetSectorsPerFat() > int.MaxValue)
            {
                throw new ArgumentException("FAT too large");
            }

            if (bs.GetSectorsPerFat() <= 0)
            {
                throw new IOException(
                          "boot sector says there are " + bs.GetSectorsPerFat() +
                          " sectors per FAT");
            }

            if (bs.GetBytesPerSector() <= 0)
            {
                throw new IOException(
                          "boot sector says there are " + bs.GetBytesPerSector() +
                          " bytes per sector");
            }

            sectorCount          = (int)bs.GetSectorsPerFat();
            sectorSize           = bs.GetBytesPerSector();
            device               = bs.GetDevice();
            this.offset          = offset;
            lastAllocatedCluster = FIRST_CLUSTER;

            if (bs.GetDataClusterCount() > int.MaxValue)
            {
                throw
                    new IOException("too many data clusters");
            }

            if (bs.GetDataClusterCount() == 0)
            {
                throw
                    new IOException("no data clusters");
            }

            lastClusterIndex = (int)bs.GetDataClusterCount() + FIRST_CLUSTER;

            entries = new long[(int)((sectorCount * sectorSize) /
                                     fatType.GetEntrySize())];

            if (lastClusterIndex > entries.Length)
            {
                throw new IOException(
                          "file system has " + lastClusterIndex +
                          "clusters but only " + entries.Length + " FAT entries");
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Constructor for FatFileSystem in specified readOnly mode
        /// </summary>
        /// <param name="device">the <see cref="IBlockDevice"/> holding the file system</param>
        /// <param name="readOnly"></param>
        /// <param name="ignoreFatDifferences"></param>
        /// <exception cref="IOException">IOException on read error</exception>
        private FatFileSystem(IBlockDevice device, bool readOnly,
                              bool ignoreFatDifferences) : base(readOnly)
        {
            bs = BootSector.Read(device);

            if (bs.GetNrFats() <= 0)
            {
                throw new IOException(
                          "boot sector says there are no FATs");
            }

            filesOffset = FatUtils.GetFilesOffset(bs);
            fatType     = bs.GetFatType();
            fat         = Fat.Read(bs, 0);

            if (!ignoreFatDifferences)
            {
                for (var i = 1; i < bs.GetNrFats(); i++)
                {
                    var tmpFat = Fat.Read(bs, i);
                    if (!fat.Equals(tmpFat))
                    {
                        throw new IOException("FAT " + i + " differs from FAT 0");
                    }
                }
            }

            if (fatType == FatType.BaseFat32)
            {
                var f32Bs       = (Fat32BootSector)bs;
                var rootDirFile = new ClusterChain(fat,
                                                   f32Bs.GetRootDirFirstCluster(), IsReadOnly());
                rootDirStore = ClusterChainDirectory.ReadRoot(rootDirFile);
                fsiSector    = FsInfoSector.Read(f32Bs);

                if (fsiSector.GetFreeClusterCount() != fat.GetFreeClusterCount())
                {
                    throw new IOException("free cluster count mismatch - fat: " +
                                          fat.GetFreeClusterCount() + " - fsinfo: " +
                                          fsiSector.GetFreeClusterCount());
                }
            }
            else
            {
                rootDirStore =
                    Fat16RootDirectory.Read((Fat16BootSector)bs, readOnly);
                fsiSector = null;
            }

            rootDir = new FatLfnDirectory(rootDirStore, fat, IsReadOnly());
        }
Esempio n. 4
0
        /// <summary>
        /// Reads a <see cref="Fat"/> as specified by a <see cref="BootSector"/>.
        /// </summary>
        /// <param name="bs">the boot sector specifying the <see cref="Fat"/> layout</param>
        /// <param name="fatNr">the number of the <see cref="Fat"/> to read</param>
        /// <returns>the <see cref="Fat"/> that was read</returns>
        /// <exception cref="IOException">IOException on read error</exception>
        /// <exception cref="ArgumentException">ArgumentException if fatNr is greater than
        ///     <see cref="BootSector.GetNrFats"/></exception>
        public static Fat Read(BootSector bs, int fatNr)
        {
            if (fatNr > bs.GetNrFats())
            {
                throw new ArgumentException(
                          "boot sector says there are only " + bs.GetNrFats() +
                          " FATs when reading FAT #" + fatNr);
            }

            var fatOffset = FatUtils.GetFatOffset(bs, fatNr);
            var result    = new Fat(bs, fatOffset);

            result.Read();
            return(result);
        }
Esempio n. 5
0
        /// <summary>
        /// Creates a new <see cref="Fat"/> as specified by a <see cref="BootSector"/>.
        /// </summary>
        /// <param name="bs">the boot sector specifying the <see cref="Fat"/> layout</param>
        /// <param name="fatNr">the number of the <see cref="Fat"/> to create</param>
        /// <returns>the <see cref="Fat"/> that was created</returns>
        /// <exception cref="IOException">IOException on write error</exception>
        /// <exception cref="ArgumentException">ArgumentException if fatNr is greater than
        ///     <see cref="BootSector.GetNrFats"/></exception>
        public static Fat Create(BootSector bs, int fatNr)
        {
            if (fatNr > bs.GetNrFats())
            {
                throw new ArgumentException(
                          "boot sector says there are only " + bs.GetNrFats() +
                          " FATs when creating FAT #" + fatNr);
            }

            var fatOffset = FatUtils.GetFatOffset(bs, fatNr);
            var result    = new Fat(bs, fatOffset);

            if (bs.GetDataClusterCount() > result.entries.Length)
            {
                throw new IOException("FAT too small for device");
            }

            result.Init(bs.GetMediumDescriptor());
            result.Write();
            return(result);
        }