Beispiel #1
0
        PathTableEntryInternal[] DecodePathTable(byte[] data)
        {
            if (data is null)
            {
                return(null);
            }

            List <PathTableEntryInternal> table = new List <PathTableEntryInternal>();

            int off = 0;

            PathTableEntry entry =
                Marshal.ByteArrayToStructureBigEndian <PathTableEntry>(data, off, Marshal.SizeOf <PathTableEntry>());

            if (entry.name_len != 1 ||
                entry.parent_dirno != 1 ||
                data.Length <= Marshal.SizeOf <PathTableEntry>() ||
                data[Marshal.SizeOf <PathTableEntry>()] != 0x00)
            {
                return(null);
            }

            while (off < data.Length)
            {
                entry =
                    Marshal.ByteArrayToStructureBigEndian <PathTableEntry>(data, off, Marshal.SizeOf <PathTableEntry>());

                if (entry.name_len == 0)
                {
                    break;
                }

                off += Marshal.SizeOf <PathTableEntry>();

                string name = Encoding.GetString(data, off, entry.name_len);

                table.Add(new PathTableEntryInternal
                {
                    Extent      = entry.start_lbn,
                    Name        = name,
                    Parent      = entry.parent_dirno,
                    XattrLength = entry.xattr_len
                });

                off += entry.name_len;

                if (entry.name_len % 2 != 0)
                {
                    off++;
                }
            }

            return(table.ToArray());
        }
Beispiel #2
0
        public Iso9660(Stream stream)
        {
            VolumeDescriptor volume  = VolumeDescriptor.Create(stream, 2);
            bool             unicode = false;

            if (volume == null)
            {
                volume = VolumeDescriptor.Create(stream, 1);
            }
            else
            {
                unicode = true;
            }

            if (volume == null)
            {
                throw new FormatException();
            }

            MemoryStream rootmem    = new MemoryStream(volume.root);
            EndianReader rootreader = new EndianReader(rootmem, Endianness.BigEndian);
            //List<PathTableEntry> entries = new List<PathTableEntry>();
            PathTableEntry root = new PathTableEntry();

            rootreader.Position  = OffsetExtended;
            root.ExtendedSectors = rootreader.ReadByte();
            rootreader.Position  = OffsetSector;
            root.Sector          = rootreader.ReadUInt32();
            root.Name            = "";

            /*
             * entries.Add(root);
             *
             * uint pathtable = volume.path_table_be;
             * uint pathtablelen = volume.path_table_len_be;
             * SeekSector(stream, pathtable);
             * stream.Position += PathTableEntrySize + 2;
             *
             * for (ushort i = 1; i < 0xFFFF && stream.Position < (pathtable * SectorSize + pathtablelen); i++) {
             *      PathTableEntry entry = PathTableEntry.Create(stream, unicode);
             *      PathTableEntry parent = entries[entry.Parent - 1];
             *      parent.Children.Add(entry);
             *
             *      entries.Add(entry);
             * }
             */
            Root = Stat(new EndianReader(stream, Endianness.BigEndian), root, unicode);
        }
Beispiel #3
0
            public static PathTableEntry Create(Stream stream, bool unicode)
            {
                PathTableEntry entry      = new PathTableEntry();
                EndianReader   reader     = new EndianReader(stream, Endianness.BigEndian);
                byte           namelength = reader.ReadByte();

                entry.ExtendedSectors = reader.ReadByte();
                entry.Sector          = reader.ReadUInt32();
                entry.Parent          = reader.ReadUInt16();
                entry.Name            = (unicode ? Encoding.Unicode : Util.Encoding).GetString(reader.ReadBytes(namelength)).Trim('\0');
                if (namelength % 2 != 0)
                {
                    reader.ReadByte();
                }
                return(entry);
            }
        private void PopulatePathTable()
        {
            dataGrid_PathTableItems.ItemsSource = null;
            if (_customer == null) return;

            if (File.Exists(_customer.PathTableLocation))
            {
                var entries = new List<PathTableEntry>();
                
                try
                {
                    XDocument xdoc = XDocument.Load(_customer.PathTableLocation);
                    
                    foreach (var node in xdoc.Descendants("XMaskTable__x0024__x0024_"))
                    {
                        var entry = new PathTableEntry();

                        var mask = node.Descendants("Mask");
                        foreach (var ele in mask)
                        {
                            entry.Mask = ele.Value;   
                        }

                        var path = node.Descendants("Path");
                        foreach (var ele in path)
                        {
                            entry.Path = ele.Value;
                        }

                        entries.Add(entry);
                    }
                }
                catch (Exception ex)
                {
                    entries = new List<PathTableEntry>();
                    Log.WriteToLog(ex.Message);
                }

                dataGrid_PathTableItems.ItemsSource = entries;
            }
        }
Beispiel #5
0
        private DirectoryNode Stat(EndianReader reader, PathTableEntry entry, bool unicode, DirectoryNode parent = null)
        {
            SeekSector(reader, entry.Sector);

            long baseposition = (long)entry.Sector * SectorSize;

            DirectoryEntry dir  = DirectoryEntry.Create(reader, unicode);
            DirectoryNode  root = new DirectoryNode(entry.Name);

            if (parent != null)
            {
                parent.AddChild(root);
            }

            while (reader.Position < baseposition + dir.Size)
            {
                DirectoryEntry file = DirectoryEntry.Create(reader, unicode);
                if (file == null)
                {
                    continue;
                }
                PathTableEntry childentry = new PathTableEntry();
                childentry.Sector = file.Sector;
                childentry.Name   = file.Name;
                if ((file.Flags & FlagDir) == FlagDir)
                {
                    long position = reader.Position;
                    Stat(reader, childentry, unicode, root);
                    reader.Position = position;
                }
                else
                {
                    root.AddChild(new FileNode(file.Name, file.Size, new Substream(reader, file.Sector * SectorSize, file.Size)));
                }
            }

            return(root);
        }