From aef3d3451f881dadd89aa43c2ebaa556afeb9d21 Mon Sep 17 00:00:00 2001 From: Fabian Neundorf Date: Thu, 23 Jan 2025 19:23:11 +0100 Subject: [PATCH] patterns/iso: Add some improvements to the ISO pattern matching (#343) * patterns: Load all ISO volume descriptors * patterns: Parse supplementary volume descriptors * patterns: Add system use in directory records for iso --- patterns/iso.hexpat | 49 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/patterns/iso.hexpat b/patterns/iso.hexpat index 8845060..4171c44 100644 --- a/patterns/iso.hexpat +++ b/patterns/iso.hexpat @@ -4,6 +4,7 @@ #pragma endian little import std.io; +import std.mem; enum VolumeDescriptorTypes : u8 { BootRecord, @@ -96,6 +97,19 @@ struct DirectoryRecord { u8 fileNameLen; char fileName[fileNameLen]; padding[$ % 2]; + u8 remainingSize = $ - addressof(this); + if (recordSize > remainingSize) { + u8 systemUse[recordSize - remainingSize]; + } +}; + +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 { @@ -119,7 +133,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]; @@ -128,8 +142,37 @@ struct VolumeDescriptor { StrDateFormat expirationTime[[format("FormatStrDate")]]; StrDateFormat effectiveTime[[format("FormatStrDate")]]; u8 fileStructVersion; - padding[0x200 + 0x28E]; + } 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]; }; -VolumeDescriptor data @ 0x8000; \ No newline at end of file +VolumeDescriptor descriptors[while(std::mem::read_unsigned($, 1) != 0xFF)] @ 0x8000; +VolumeDescriptor terminator @ $; \ No newline at end of file