From bf02423e6a5907d994f146ab2d2558c708e43a82 Mon Sep 17 00:00:00 2001 From: Fabian Neundorf Date: Sun, 19 Jan 2025 12:16:03 +0100 Subject: [PATCH] patterns: Parse supplementary volume descriptors --- patterns/iso.hexpat | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/patterns/iso.hexpat b/patterns/iso.hexpat index d633a511..763452ee 100644 --- a/patterns/iso.hexpat +++ b/patterns/iso.hexpat @@ -99,6 +99,15 @@ struct DirectoryRecord { padding[$ % 2]; }; +fn GetSupplementaryEncoding() { + const u128 escapeSequencesOffset = 89 - 8; + + str encoding = std::mem::read_string($ + escapeSequencesOffset, 0x20); + return encoding == "%/@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + || encoding == "%/C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + || encoding == "%/E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; +}; + struct VolumeDescriptor { VolumeDescriptorTypes type; char id[5]; @@ -120,7 +129,7 @@ struct VolumeDescriptor { char setId[0x80]; char publisherId[0x80]; char preparerId[0x80]; - char applicationId[0x80]; + } else if (type == VolumeDescriptorTypes::SupplementaryVolume && GetSupplementaryEncoding()) { char copyrightFileId[0x25]; char abstractFileId[0x25]; char bibliographicFileId[0x25]; @@ -129,6 +138,34 @@ struct VolumeDescriptor { StrDateFormat expirationTime[[format("FormatStrDate")]]; StrDateFormat effectiveTime[[format("FormatStrDate")]]; u8 fileStructVersion; + } else if (type == VolumeDescriptorTypes::SupplementaryVolume) { + u8 flags; + be char16 systemId[0x10]; + be char16 volumeId[0x10]; + padding[8]; + di32 spaceSize; + u8 escapeSequences[0x20]; + di16 setSize; + di16 sequenceNumber; + di16 logicalBlockSize; + di32 pathTableSize; + PathTablePtr pathTableOffset; + DirectoryRecord rootDir; + be char16 setId[0x40]; + be char16 publisherId[0x40]; + be char16 preparerId[0x40]; + be char16 applicationId[0x40]; + be char16 copyrightFileId[0x12]; + padding[1]; + be char16 abstractFileId[0x12]; + padding[1]; + be char16 bibliographicFileId[0x12]; + padding[1]; + StrDateFormat creationTime[[format("FormatStrDate")]]; + StrDateFormat modificationTime[[format("FormatStrDate")]]; + StrDateFormat expirationTime[[format("FormatStrDate")]]; + StrDateFormat effectiveTime[[format("FormatStrDate")]]; + u8 fileStructVersion; } padding[0x800 - $ % 0x800]; };