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"); }
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); }
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); } }