Пример #1
0
        /// <summary>
        /// Detects if a stream contains a valid ISO file system.
        /// </summary>
        /// <param name="data">The stream to inspect</param>
        /// <returns><c>true</c> if the stream contains an ISO file system, else false.</returns>
        public static bool Detect(Stream data)
        {
            byte[] buffer = new byte[IsoUtilities.SectorSize];

            if (data.Length < 0x8000 + IsoUtilities.SectorSize)
            {
                return(false);
            }

            data.Position = 0x8000;
            int numRead = Utilities.ReadFully(data, buffer, 0, IsoUtilities.SectorSize);

            if (numRead != IsoUtilities.SectorSize)
            {
                return(false);
            }

            BaseVolumeDescriptor bvd = new BaseVolumeDescriptor(buffer, 0);

            return(bvd.StandardIdentifier == "CD001");
        }
Пример #2
0
        /// <summary>
        /// Initializes a new instance of the VfsCDReader class.
        /// </summary>
        /// <param name="data">The stream to read the ISO image from.</param>
        /// <param name="joliet">Whether to read Joliet extensions.</param>
        /// <param name="hideVersions">Hides version numbers (e.g. ";1") from the end of files</param>
        public VfsCDReader(Stream data, bool joliet, bool hideVersions)
            : base(new DiscFileSystemOptions())
        {
            _data         = data;
            _hideVersions = hideVersions;

            long vdpos = 0x8000; // Skip lead-in

            byte[] buffer = new byte[IsoUtilities.SectorSize];

            long pvdPos = 0;
            long svdPos = 0;

            BaseVolumeDescriptor bvd;

            do
            {
                data.Position = vdpos;
                int numRead = data.Read(buffer, 0, IsoUtilities.SectorSize);
                if (numRead != IsoUtilities.SectorSize)
                {
                    break;
                }

                bvd = new BaseVolumeDescriptor(buffer, 0);
                switch (bvd.VolumeDescriptorType)
                {
                case VolumeDescriptorType.Boot:
                    _bootVolDesc = new BootVolumeDescriptor(buffer, 0);
                    if (_bootVolDesc.SystemId != BootVolumeDescriptor.ElToritoSystemIdentifier)
                    {
                        _bootVolDesc = null;
                    }

                    break;

                case VolumeDescriptorType.Primary:     // Primary Vol Descriptor
                    pvdPos = vdpos;
                    break;

                case VolumeDescriptorType.Supplementary:     // Supplementary Vol Descriptor
                    svdPos = vdpos;
                    break;

                case VolumeDescriptorType.Partition:     // Volume Partition Descriptor
                    break;

                case VolumeDescriptorType.SetTerminator:     // Volume Descriptor Set Terminator
                    break;
                }

                vdpos += IsoUtilities.SectorSize;
            }while (bvd.VolumeDescriptorType != VolumeDescriptorType.SetTerminator);

            CommonVolumeDescriptor volDesc;

            if (joliet && svdPos != 0)
            {
                data.Position = svdPos;
                data.Read(buffer, 0, IsoUtilities.SectorSize);
                volDesc = new SupplementaryVolumeDescriptor(buffer, 0);
            }
            else
            {
                data.Position = pvdPos;
                data.Read(buffer, 0, IsoUtilities.SectorSize);
                volDesc = new PrimaryVolumeDescriptor(buffer, 0);
            }

            Context = new IsoContext {
                VolumeDescriptor = volDesc, DataStream = _data
            };
            RootDirectory = new ReaderDirectory(Context, volDesc.RootDirectory);
        }