diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml
index d397e1a93..54d8d6c54 100644
--- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml
+++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml
@@ -6,7 +6,6 @@
-
@@ -36,6 +35,7 @@
+
@@ -61,7 +61,7 @@
-
+
@@ -76,6 +76,7 @@
+
@@ -2073,6 +2074,7 @@
+
diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs
index 2d3cb41c8..f4a5dab5c 100644
--- a/DiscImageChef.Filesystems/ISO9660/Dir.cs
+++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs
@@ -132,8 +132,46 @@ namespace DiscImageChef.Filesystems.ISO9660
Dictionary DecodeCdiDirectory(byte[] data) =>
throw new NotImplementedException();
- Dictionary DecodeHighSierraDirectory(byte[] data) =>
- throw new NotImplementedException();
+ Dictionary DecodeHighSierraDirectory(byte[] data)
+ {
+ Dictionary entries = new Dictionary();
+ int entryOff = 0;
+
+ while(entryOff + DirectoryRecordSize < data.Length)
+ {
+ HighSierraDirectoryRecord record =
+ Marshal.ByteArrayToStructureLittleEndian(data, entryOff,
+ Marshal
+ .SizeOf());
+
+ if(record.length == 0) break;
+
+ // Special entries for current and parent directories, skip them
+ if(record.name_len == 1)
+ if(data[entryOff + DirectoryRecordSize] == 0 || data[entryOff + DirectoryRecordSize] == 1)
+ {
+ entryOff += record.length;
+ continue;
+ }
+
+ DecodedDirectoryEntry entry = new DecodedDirectoryEntry
+ {
+ Extent = record.size == 0 ? 0 : record.extent,
+ Size = record.size,
+ Flags = record.flags,
+ Interleave = record.interleave,
+ VolumeSequenceNumber = record.volume_sequence_number,
+ IsoFilename =
+ Encoding.ASCII.GetString(data, entryOff + DirectoryRecordSize, record.name_len)
+ };
+
+ if(!entries.ContainsKey(entry.IsoFilename)) entries.Add(entry.IsoFilename, entry);
+
+ entryOff += record.length;
+ }
+
+ return entries;
+ }
// TODO: Implement system area
Dictionary DecodeIsoDirectory(byte[] data)