Ejemplo n.º 1
0
        public virtual void LoadDirectories(FileStream isoStream)
        {
            // change name of top level folder
            this.DirectoryRecordForRootDirectory.FileIdentifierString = String.Empty;

            // get first path record
            byte[] rootDirPathBytes = CdRom.GetSectorByLba(isoStream, this.VolumeBaseOffset, this.LocationOfOccurrenceOfTypeMPathTable, this.IsRawDump, this.LogicalBlockSize);
            rootDirPathBytes = CdRom.GetDataChunkFromSector(rootDirPathBytes, this.IsRawDump);

            // grab the directory record
            uint rootDirectoryOffset = ByteConversion.GetUInt32BigEndian(ParseFile.ParseSimpleOffset(rootDirPathBytes, 2, 4));

            byte[] rootDirDirectorySector = CdRom.GetSectorByLba(isoStream, this.VolumeBaseOffset, rootDirectoryOffset, this.IsRawDump, this.LogicalBlockSize);
            rootDirDirectorySector = CdRom.GetDataChunkFromSector(rootDirDirectorySector, this.IsRawDump);

            byte rootDirectoryRecordSize = rootDirDirectorySector[0];

            byte[] rootDirectoryRecord = ParseFile.ParseSimpleOffset(rootDirDirectorySector, 0, rootDirectoryRecordSize);
            this.DirectoryRecordForRootDirectory = new GreenBookCdiDirectoryRecord(rootDirectoryRecord);

            // populate this volume's directory structure
            GreenBookCdiDirectoryStructure rootDirectory =
                new GreenBookCdiDirectoryStructure(isoStream, isoStream.Name,
                                                   this.VolumeBaseOffset, this.DirectoryRecordForRootDirectory,
                                                   this.LogicalBlockSize, this.IsRawDump, this.SectorSize, null);

            this.DirectoryStructureArray.Add(rootDirectory);
        }
Ejemplo n.º 2
0
        public int CompareTo(object obj)
        {
            if (obj is GreenBookCdiDirectoryStructure)
            {
                GreenBookCdiDirectoryStructure o = (GreenBookCdiDirectoryStructure)obj;

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

            throw new ArgumentException("object is not an GreenBookCdiDirectoryStructure");
        }
Ejemplo n.º 3
0
        private void parseDirectoryRecord(FileStream isoStream, long baseOffset,
                                          GreenBookCdiDirectoryRecord directoryRecord, uint logicalBlockSize,
                                          bool isRaw, int nonRawSectorSize, string parentDirectory)
        {
            byte recordSize;
            int  currentOffset;
            uint bytesRead  = 0;
            uint currentLba = directoryRecord.LocationOfExtent;

            byte[] directoryRecordBytes;
            GreenBookCdiDirectoryRecord    tempDirectoryRecord;
            GreenBookCdiDirectoryStructure tempDirectory;
            GreenBookCdiFileStructure      tempFile;

            byte[] directorySector = CdRom.GetSectorByLba(isoStream, baseOffset, currentLba, isRaw, nonRawSectorSize);
            directorySector = CdRom.GetDataChunkFromSector(directorySector, isRaw);

            currentOffset = 0;

            while (bytesRead < directoryRecord.DataLength)
            {
                recordSize = ParseFile.ParseSimpleOffset(directorySector, currentOffset, 1)[0];

                if (recordSize > 0)
                {
                    directoryRecordBytes = ParseFile.ParseSimpleOffset(directorySector, currentOffset, recordSize);
                    tempDirectoryRecord  = new GreenBookCdiDirectoryRecord(directoryRecordBytes);

                    if (!tempDirectoryRecord.FileIdentifierString.Equals(".") &&
                        !tempDirectoryRecord.FileIdentifierString.Equals("..")) // skip "this" directory
                    {
                        //if (tempDirectoryRecord.FlagMultiExtent)
                        //{
                        //    int x = 1;
                        //}

                        if (tempDirectoryRecord.FlagDirectory)
                        {
                            tempDirectory = new GreenBookCdiDirectoryStructure(isoStream, isoStream.Name, baseOffset, tempDirectoryRecord, logicalBlockSize, isRaw, nonRawSectorSize, parentDirectory);
                            this.SubDirectoryArray.Add(tempDirectory);
                        }
                        else
                        {
                            tempFile = new GreenBookCdiFileStructure(parentDirectory,
                                                                     this.SourceFilePath,
                                                                     tempDirectoryRecord.FileIdentifierString.Replace(";1", String.Empty),
                                                                     baseOffset,
                                                                     tempDirectoryRecord.LocationOfExtent,
                                                                     tempDirectoryRecord.DataLength,
                                                                     isRaw,
                                                                     nonRawSectorSize,
                                                                     tempDirectoryRecord.RecordingDateAndTime);
                            this.FileArray.Add(tempFile);
                        }
                    }
                    else if (tempDirectoryRecord.FileIdentifierString.Equals(".."))
                    {
                        this.ParentDirectoryRecord = tempDirectoryRecord;
                    }

                    bytesRead     += recordSize;
                    currentOffset += recordSize;
                }
                else if ((directoryRecord.DataLength - bytesRead) > (directorySector.Length - currentOffset))
                {
                    // move to start of next sector
                    directorySector = CdRom.GetSectorByLba(isoStream, baseOffset, ++currentLba, isRaw, nonRawSectorSize);
                    directorySector = CdRom.GetDataChunkFromSector(directorySector, isRaw);
                    bytesRead      += (uint)(logicalBlockSize - currentOffset);
                    currentOffset   = 0;
                }
                else
                {
                    break;
                }
            }
        }