Beispiel #1
0
        public int CompareTo(object obj)
        {
            if (obj is XDvdFsDirectoryStructure)
            {
                XDvdFsDirectoryStructure o = (XDvdFsDirectoryStructure)obj;

                return(this.DirectoryName.CompareTo(o.DirectoryName));
            }

            throw new ArgumentException("object is not an XDvdFsDirectoryStructure");
        }
Beispiel #2
0
        public void Initialize(FileStream isoStream, long offset, bool isRawDump)
        {
            XDvdFsDirectoryStructure rootDir;
            long rootDirectoryOffset;

            byte[] DateTimeBytes;

            this.VolumeBaseOffset        = offset - XDvdFs.BASE_OFFSET_CORRECTION;
            this.FormatDescription       = XDvdFs.FORMAT_DESCRIPTION_STRING;
            this.VolumeType              = VolumeDataType.Data;
            this.IsRawDump               = isRawDump;
            this.DirectoryStructureArray = new ArrayList();

            this.RootDirectorySector = BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(isoStream, offset + 0x14, 0x4), 0);
            this.RootDirectorySize   = BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(isoStream, offset + 0x18, 0x4), 0);

            DateTimeBytes          = ParseFile.ParseSimpleOffset(isoStream, offset + 0x1C, 0x8);
            this.ImageCreationTime = DateTime.FromFileTime(BitConverter.ToInt64(DateTimeBytes, 0));

            // Build Tree from Root Directory
            rootDirectoryOffset = this.VolumeBaseOffset + (this.RootDirectorySector * XDvdFs.SECTOR_SIZE);
            rootDir             = new XDvdFsDirectoryStructure(isoStream, isoStream.Name, this.ImageCreationTime, this.VolumeBaseOffset, rootDirectoryOffset, XDvdFs.SECTOR_SIZE, String.Empty, String.Empty, isRawDump, (int)XDvdFs.SECTOR_SIZE);
            this.DirectoryStructureArray.Add(rootDir);
        }
Beispiel #3
0
        private void parseDirectoryRecord(
            FileStream isoStream,
            DateTime creationDateTime,
            long baseOffset,
            long recordOffset,
            long logicalBlockSize,
            string parentDirectory,
            bool isRaw,
            int nonRawSectorSize)
        {
            byte recordSize;

            byte[] directoryRecordBytes;
            XDvdFsDirectoryRecord    tempDirectoryRecord;
            XDvdFsDirectoryStructure tempDirectory;
            XDvdFsFileStructure      tempFile;

            long directoryOffset;

            try
            {
                // get the first record
                recordSize           = (byte)(0x0E + ParseFile.ParseSimpleOffset(isoStream, ((long)recordOffset + 0x0D), 1)[0]);
                directoryRecordBytes = ParseFile.ParseSimpleOffset(isoStream, recordOffset, recordSize);
                tempDirectoryRecord  = new XDvdFsDirectoryRecord(directoryRecordBytes);

                if (tempDirectoryRecord.EntryFlags == 0x10 ||
                    tempDirectoryRecord.EntryFlags == 0x90)
                {
                    if (tempDirectoryRecord.EntrySize > 0)
                    {
                        directoryOffset = baseOffset + (long)((long)tempDirectoryRecord.StartingSector * (long)XDvdFs.SECTOR_SIZE);
                        tempDirectory   = new XDvdFsDirectoryStructure(isoStream, isoStream.Name, creationDateTime, baseOffset, directoryOffset, logicalBlockSize, tempDirectoryRecord.EntryName, parentDirectory, isRaw, nonRawSectorSize);
                        this.SubDirectoryArray.Add(tempDirectory);
                    }
                }
                else
                {
                    tempFile = new XDvdFsFileStructure(parentDirectory,
                                                       this.SourceFilePath,
                                                       tempDirectoryRecord.EntryName,
                                                       baseOffset + (long)((long)tempDirectoryRecord.StartingSector * (long)logicalBlockSize),
                                                       baseOffset,
                                                       tempDirectoryRecord.StartingSector,
                                                       tempDirectoryRecord.EntrySize,
                                                       creationDateTime,
                                                       isRaw,
                                                       nonRawSectorSize);
                    this.FileArray.Add(tempFile);
                }

                // Process Left SubTree
                if (tempDirectoryRecord.OffsetToLeftSubTree != 0)
                {
                    this.parseDirectoryRecord(isoStream, creationDateTime,
                                              baseOffset, this.DirectoryRecordOffset + tempDirectoryRecord.OffsetToLeftSubTree,
                                              logicalBlockSize, parentDirectory, isRaw, nonRawSectorSize);
                }

                // Process Right SubTree
                if (tempDirectoryRecord.OffsetToRightSubTree != 0)
                {
                    this.parseDirectoryRecord(isoStream, creationDateTime,
                                              baseOffset, this.DirectoryRecordOffset + tempDirectoryRecord.OffsetToRightSubTree,
                                              logicalBlockSize, parentDirectory, isRaw, nonRawSectorSize);
                }
            }
            catch (Exception ex)
            {
                throw new FormatException(String.Format("Error processing XDVDFS directory record at 0x{0}", recordOffset.ToString("X8")), ex);
            }
        }