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