diff --git a/DiscImageChef.Filesystems/ISO9660/PathTable.cs b/DiscImageChef.Filesystems/ISO9660/PathTable.cs index 143f55d9d..84ba10981 100644 --- a/DiscImageChef.Filesystems/ISO9660/PathTable.cs +++ b/DiscImageChef.Filesystems/ISO9660/PathTable.cs @@ -35,5 +35,39 @@ namespace DiscImageChef.Filesystems.ISO9660 return table.ToArray(); } + + PathTableEntryInternal[] DecodeHighSierraPathTable(byte[] data) + { + if(data is null) return null; + + List table = new List(); + + int off = 0; + while(off < data.Length) + { + HighSierraPathTableEntry entry = + Marshal.ByteArrayToStructureBigEndian(data, off, + Marshal + .SizeOf()); + + if(entry.name_len == 0) break; + + off += Marshal.SizeOf(); + + string name = Encoding.GetString(data, off, entry.name_len); + + table.Add(new PathTableEntryInternal + { + Extent = entry.start_lbn, Name = name, Parent = entry.parent_dirno + }); + + off += entry.name_len; + + if(entry.name_len % 2 != 0) off++; + } + + return table.ToArray(); + } } } \ No newline at end of file diff --git a/DiscImageChef.Filesystems/ISO9660/Super.cs b/DiscImageChef.Filesystems/ISO9660/Super.cs index d93f9d125..8caafc203 100644 --- a/DiscImageChef.Filesystems/ISO9660/Super.cs +++ b/DiscImageChef.Filesystems/ISO9660/Super.cs @@ -199,7 +199,7 @@ namespace DiscImageChef.Filesystems.ISO9660 fsFormat = "ISO9660"; } - pathTable = DecodePathTable(pathTableData); + pathTable = highSierra ? DecodeHighSierraPathTable(pathTableData) : DecodePathTable(pathTableData); // High Sierra and CD-i do not support Joliet or RRIP if((highSierra || cdi) && this.@namespace != Namespace.Normal && this.@namespace != Namespace.Vms)