コード例 #1
0
        public VfsXfsFileSystem(Stream stream, FileSystemParameters parameters)
            : base(new XfsFileSystemOptions(parameters))
        {
            stream.Position = 0;
            byte[] superblockData = Utilities.ReadFully(stream, 264);

            SuperBlock superblock = new SuperBlock();

            superblock.ReadFrom(superblockData, 0);

            if (superblock.Magic != SuperBlock.XfsMagic)
            {
                throw new IOException("Invalid superblock magic - probably not an xfs file system");
            }

            Context = new Context
            {
                RawStream  = stream,
                SuperBlock = superblock,
                Options    = (XfsFileSystemOptions)Options
            };

            var  allocationGroups = new AllocationGroup[superblock.AgCount];
            long offset           = 0;

            for (int i = 0; i < allocationGroups.Length; i++)
            {
                var ag = new AllocationGroup(Context, offset);
                allocationGroups[ag.InodeBtreeInfo.SequenceNumber] = ag;
                offset += ag.FreeBlockInfo.Length * superblock.Blocksize;
            }
            Context.AllocationGroups = allocationGroups;

            RootDirectory = new Directory(Context, Context.GetInode(superblock.RootInode));
        }
コード例 #2
0
 internal FatFileSystemOptions(FileSystemParameters parameters)
 {
     if (parameters != null)
     {
         FileNameEncoding = parameters.FileNameEncoding ?? Encoding.GetEncoding(437);
     }
 }
コード例 #3
0
 private DiscFileSystem OpenUdf(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     if (volumeInfo != null)
     {
         return(new UdfReader(stream, volumeInfo.PhysicalGeometry.BytesPerSector));
     }
     return(new UdfReader(stream));
 }
コード例 #4
0
 internal FatFileSystemOptions(FileSystemParameters parameters)
 {
     if (parameters != null && parameters.FileNameEncoding != null)
     {
         FileNameEncoding = parameters.FileNameEncoding;
     }
     else
     {
         FileNameEncoding = Encoding.GetEncoding(437);
     }
 }
コード例 #5
0
 internal XfsFileSystemOptions(FileSystemParameters parameters)
 {
     if (parameters != null && parameters.FileNameEncoding != null)
     {
         FileNameEncoding = parameters.FileNameEncoding;
     }
     else
     {
         FileNameEncoding = Encoding.UTF8;
     }
 }
コード例 #6
0
 private DiscFileSystem OpenUdf(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     if (volumeInfo != null)
     {
         return new UdfReader(stream, volumeInfo.PhysicalGeometry.BytesPerSector);
     }
     else
     {
         return new UdfReader(stream);
     }
 }
コード例 #7
0
 internal ExtFileSystemOptions(FileSystemParameters parameters)
 {
     if (parameters != null && parameters.FileNameEncoding != null)
     {
         FileNameEncoding = parameters.FileNameEncoding;
     }
     else
     {
         FileNameEncoding = Encoding.UTF8;
     }
 }
コード例 #8
0
 internal FatFileSystemOptions(FileSystemParameters parameters)
 {
     if (parameters != null && parameters.FileNameEncoding != null)
     {
         FileNameEncoding = parameters.FileNameEncoding;
     }
     else
     {
         Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
         FileNameEncoding = Encoding.GetEncoding(437);
     }
 }
コード例 #9
0
 internal FatFileSystemOptions(FileSystemParameters parameters)
 {
     if (parameters != null && parameters.FileNameEncoding != null)
     {
         FileNameEncoding = parameters.FileNameEncoding;
     }
     else
     {
         // FileNameEncoding = Encoding.GetEncoding(437);
         FileNameEncoding = Encoding.ASCII;
     }
 }
コード例 #10
0
        public VfsExtFileSystem(Stream stream, FileSystemParameters parameters)
            : base(new ExtFileSystemOptions(parameters))
        {
            stream.Position = 1024;
            byte[] superblockData = Utilities.ReadFully(stream, 1024);

            SuperBlock superblock = new SuperBlock();

            superblock.ReadFrom(superblockData, 0);

            if (superblock.Magic != SuperBlock.Ext2Magic)
            {
                throw new IOException("Invalid superblock magic - probably not an Ext file system");
            }

            if (superblock.RevisionLevel == SuperBlock.OldRevision)
            {
                throw new IOException("Old ext revision - not supported");
            }

            if ((superblock.IncompatibleFeatures & ~SupportedIncompatibleFeatures) != 0)
            {
                throw new IOException("Incompatible ext features present: " +
                                      (superblock.IncompatibleFeatures & ~SupportedIncompatibleFeatures));
            }

            Context = new Context
            {
                RawStream  = stream,
                SuperBlock = superblock,
                Options    = (ExtFileSystemOptions)Options
            };

            uint numGroups      = Utilities.Ceil(superblock.BlocksCount, superblock.BlocksPerGroup);
            long blockDescStart = (superblock.FirstDataBlock + 1) * (long)superblock.BlockSize;

            stream.Position = blockDescStart;
            byte[] blockDescData = Utilities.ReadFully(stream, (int)numGroups * BlockGroup.DescriptorSize);

            _blockGroups = new BlockGroup[numGroups];
            for (int i = 0; i < numGroups; ++i)
            {
                BlockGroup bg = new BlockGroup();
                bg.ReadFrom(blockDescData, i * BlockGroup.DescriptorSize);
                _blockGroups[i] = bg;
            }

            RootDirectory = new Directory(Context, 2, GetInode(2));
        }
コード例 #11
0
 /// <summary>
 /// Opens a stream using the file system.
 /// </summary>
 /// <param name="stream">The stream to access.</param>
 /// <param name="parameters">Parameters for the file system.</param>
 /// <returns>A file system instance.</returns>
 public override DiscFileSystem Open(Stream stream, FileSystemParameters parameters)
 {
     return(_openDelegate(stream, null, parameters));
 }
コード例 #12
0
 /// <summary>
 /// Opens a volume using the file system.
 /// </summary>
 /// <param name="volume">The volume to access.</param>
 /// <param name="parameters">Parameters for the file system.</param>
 /// <returns>A file system instance.</returns>
 public override DiscFileSystem Open(VolumeInfo volume, FileSystemParameters parameters)
 {
     return(_openDelegate(volume.Open(), volume, parameters));
 }
コード例 #13
0
 /// <summary>
 /// Opens a volume using the file system.
 /// </summary>
 /// <param name="volume">The volume to access.</param>
 /// <param name="parameters">Parameters for the file system.</param>
 /// <returns>A file system instance.</returns>
 public override DiscFileSystem Open(VolumeInfo volume, FileSystemParameters parameters)
 {
     return _openDelegate(volume.Open(), volume, parameters);
 }
コード例 #14
0
 /// <summary>
 /// Opens a stream using the file system.
 /// </summary>
 /// <param name="stream">The stream to access.</param>
 /// <param name="parameters">Parameters for the file system.</param>
 /// <returns>A file system instance.</returns>
 public override DiscFileSystem Open(Stream stream, FileSystemParameters parameters)
 {
     return _openDelegate(stream, null, parameters);
 }
コード例 #15
0
 private DiscFileSystem OpenIso(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return new CDReader(stream, true, true);
 }
コード例 #16
0
        public VfsExtFileSystem(Stream stream, FileSystemParameters parameters)
            : base(new ExtFileSystemOptions(parameters))
        {
            stream.Position = 1024;
            byte[] superblockData = StreamUtilities.ReadExact(stream, 1024);

            SuperBlock superblock = new SuperBlock();

            superblock.ReadFrom(superblockData, 0);

            if (superblock.Magic != SuperBlock.Ext2Magic)
            {
                throw new IOException("Invalid superblock magic - probably not an Ext file system");
            }

            if (superblock.RevisionLevel == SuperBlock.OldRevision)
            {
                throw new IOException("Old ext revision - not supported");
            }

            if ((superblock.IncompatibleFeatures & ~SupportedIncompatibleFeatures) != 0)
            {
                throw new IOException("Incompatible ext features present: " +
                                      (superblock.IncompatibleFeatures & ~SupportedIncompatibleFeatures));
            }

            Context = new Context
            {
                RawStream  = stream,
                SuperBlock = superblock,
                Options    = (ExtFileSystemOptions)Options
            };

            uint numGroups      = MathUtilities.Ceil(superblock.BlocksCount, superblock.BlocksPerGroup);
            long blockDescStart = (superblock.FirstDataBlock + 1) * (long)superblock.BlockSize;

            stream.Position = blockDescStart;
            var bgDescSize = superblock.Has64Bit ? BlockGroup64.DescriptorSize64 : BlockGroup.DescriptorSize;

            byte[] blockDescData = StreamUtilities.ReadExact(stream, (int)numGroups * bgDescSize);

            _blockGroups = new BlockGroup[numGroups];
            for (int i = 0; i < numGroups; ++i)
            {
                BlockGroup bg = superblock.Has64Bit ? new BlockGroup64() : new BlockGroup();
                bg.ReadFrom(blockDescData, i * bgDescSize);
                _blockGroups[i] = bg;
            }

            var journalSuperBlock = new JournalSuperBlock();

            if (superblock.JournalInode != 0)
            {
                var journalInode      = GetInode(superblock.JournalInode);
                var journalDataStream = journalInode.GetContentBuffer(Context);
                var journalData       = StreamUtilities.ReadExact(journalDataStream, 0, 1024 + 12);
                journalSuperBlock.ReadFrom(journalData, 0);
                Context.JournalSuperblock = journalSuperBlock;
            }

            RootDirectory = new Directory(Context, 2, GetInode(2));
        }
コード例 #17
0
 private static DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return(new ExFatFileSystem(stream));
 }
コード例 #18
0
ファイル: ExtFileSystem.cs プロジェクト: alexcmd/DiscUtils
 /// <summary>
 /// Initializes a new instance of the ExtFileSystem class.
 /// </summary>
 /// <param name="stream">The stream containing the ext file system.</param>
 /// <param name="parameters">The generic file system parameters (only file name encoding is honoured).</param>
 public ExtFileSystem(Stream stream, FileSystemParameters parameters)
     : base(new VfsExtFileSystem(stream, parameters))
 {
 }
コード例 #19
0
 /// <summary>
 /// Initializes a new instance of the ExtFileSystem class.
 /// </summary>
 /// <param name="stream">The stream containing the ext file system.</param>
 /// <param name="parameters">The generic file system parameters (only file name encoding is honoured).</param>
 public XfsFileSystem(Stream stream, FileSystemParameters parameters)
     : base(new VfsXfsFileSystem(stream, parameters))
 {
 }
コード例 #20
0
 private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return(new SquashFileSystemReader(stream));
 }
コード例 #21
0
 private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return(new HfsPlusFileSystem(stream));
 }
コード例 #22
0
 private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return new NtfsFileSystem(stream);
 }
コード例 #23
0
 private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return new SquashFileSystemReader(stream);
 }
コード例 #24
0
 private DiscFileSystem Open(Stream stream, VolumeInfo volInfo, FileSystemParameters parameters)
 {
     return(new MyFileSystem());
 }
コード例 #25
0
ファイル: FileSystemFactory.cs プロジェクト: tckm1977/LibHac
 private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return(new FatFileSystem(stream, Ownership.None, parameters));
 }
コード例 #26
0
 private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return new FatFileSystem(stream, Ownership.None, parameters);
 }
コード例 #27
0
ファイル: FatFileSystem.cs プロジェクト: AnotherAltr/Rc.Core
        /// <summary>
        /// Initializes a new instance of the FatFileSystem class.
        /// </summary>
        /// <param name="data">The stream containing the file system.</param>
        /// <param name="ownsData">Indicates if the new instance should take ownership
        /// of <paramref name="data"/>.</param>
        /// <param name="parameters">The parameters for the file system.</param>
        public FatFileSystem(Stream data, Ownership ownsData, FileSystemParameters parameters)
            : base(new FatFileSystemOptions(parameters))
        {
            _dirCache = new Dictionary<uint, Directory>();

            if (parameters != null && parameters.TimeConverter != null)
            {
                _timeConverter = parameters.TimeConverter;
            }
            else
            {
                _timeConverter = DefaultTimeConverter;
            }

            Initialize(data);
            _ownsData = ownsData;
        }
コード例 #28
0
 private DiscFileSystem OpenIso(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
 {
     return(new CDReader(stream, true, true));
 }