From 890f1a35bb1b281ca96962911b1b8834fc0e1c3d Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 28 Jul 2019 16:55:15 +0100 Subject: [PATCH] Move ISO9660 system area decoding to a separate method. --- DiscImageChef.Filesystems/ISO9660/Dir.cs | 291 ++++++++++++----------- 1 file changed, 146 insertions(+), 145 deletions(-) diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs index 09eb5215d..e56a38937 100644 --- a/DiscImageChef.Filesystems/ISO9660/Dir.cs +++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs @@ -150,7 +150,6 @@ namespace DiscImageChef.Filesystems.ISO9660 return entries; } - // TODO: Implement system area Dictionary DecodeIsoDirectory(byte[] data) { Dictionary entries = new Dictionary(); @@ -198,150 +197,8 @@ namespace DiscImageChef.Filesystems.ISO9660 systemAreaLength--; } - bool hasResourceFork = false; - - int systemAreaOff = systemAreaStart; - int systemAreaEnd = systemAreaStart + systemAreaLength; - - while(systemAreaOff + 2 <= systemAreaEnd) - { - ushort systemAreaSignature = BigEndianBitConverter.ToUInt16(data, systemAreaOff); - - if(BigEndianBitConverter.ToUInt16(data, systemAreaOff + 6) == XA_MAGIC) - systemAreaSignature = XA_MAGIC; - - switch(systemAreaSignature) - { - case APPLE_MAGIC: - byte appleLength = data[systemAreaOff + 2]; - AppleId appleId = (AppleId)data[systemAreaOff + 3]; - - switch(appleId) - { - case AppleId.ProDOS: - AppleProDOSSystemUse appleProDosSystemUse = - Marshal.ByteArrayToStructureLittleEndian(data, - systemAreaOff, - Marshal - .SizeOf< - AppleProDOSSystemUse - >()); - - entry.AppleProDosType = appleProDosSystemUse.aux_type; - entry.AppleDosType = appleProDosSystemUse.type; - - break; - case AppleId.HFS: - AppleHFSSystemUse appleHfsSystemUse = - Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, - Marshal - .SizeOf< - AppleHFSSystemUse - >()); - - hasResourceFork = true; - - entry.FinderInfo = new FinderInfo(); - entry.FinderInfo.fdCreator = appleHfsSystemUse.creator; - entry.FinderInfo.fdFlags = (FinderFlags)appleHfsSystemUse.finder_flags; - entry.FinderInfo.fdType = appleHfsSystemUse.type; - - break; - } - - systemAreaOff += appleLength; - break; - case APPLE_MAGIC_OLD: - AppleOldId appleOldId = (AppleOldId)data[systemAreaOff + 2]; - - switch(appleOldId) - { - case AppleOldId.ProDOS: - AppleProDOSOldSystemUse appleProDosOldSystemUse = - Marshal.ByteArrayToStructureLittleEndian(data, - systemAreaOff, - Marshal - .SizeOf< - AppleProDOSOldSystemUse - >()); - entry.AppleProDosType = appleProDosOldSystemUse.aux_type; - entry.AppleDosType = appleProDosOldSystemUse.type; - - systemAreaOff += Marshal.SizeOf(); - break; - case AppleOldId.TypeCreator: - case AppleOldId.TypeCreatorBundle: - AppleHFSTypeCreatorSystemUse appleHfsTypeCreatorSystemUse = - Marshal.ByteArrayToStructureBigEndian(data, - systemAreaOff, - Marshal - .SizeOf< - AppleHFSTypeCreatorSystemUse - >()); - - hasResourceFork = true; - - entry.FinderInfo = new FinderInfo(); - entry.FinderInfo.fdCreator = appleHfsTypeCreatorSystemUse.creator; - entry.FinderInfo.fdType = appleHfsTypeCreatorSystemUse.type; - - systemAreaOff += Marshal.SizeOf(); - break; - case AppleOldId.TypeCreatorIcon: - case AppleOldId.TypeCreatorIconBundle: - AppleHFSIconSystemUse appleHfsIconSystemUse = - Marshal.ByteArrayToStructureBigEndian(data, - systemAreaOff, - Marshal - .SizeOf< - AppleHFSIconSystemUse - >()); - - hasResourceFork = true; - - entry.FinderInfo = new FinderInfo(); - entry.FinderInfo.fdCreator = appleHfsIconSystemUse.creator; - entry.FinderInfo.fdType = appleHfsIconSystemUse.type; - entry.AppleIcon = appleHfsIconSystemUse.icon; - - systemAreaOff += Marshal.SizeOf(); - break; - case AppleOldId.HFS: - AppleHFSOldSystemUse appleHfsSystemUse = - Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, - Marshal - .SizeOf< - AppleHFSOldSystemUse - >()); - - hasResourceFork = true; - - entry.FinderInfo = new FinderInfo(); - entry.FinderInfo.fdCreator = appleHfsSystemUse.creator; - entry.FinderInfo.fdFlags = (FinderFlags)appleHfsSystemUse.finder_flags; - entry.FinderInfo.fdType = appleHfsSystemUse.type; - - systemAreaOff += Marshal.SizeOf(); - break; - default: - // Cannot continue as we don't know this structure size - systemAreaOff = systemAreaEnd; - break; - } - - break; - case XA_MAGIC: - entry.XA = Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, - Marshal.SizeOf()); - - systemAreaOff += Marshal.SizeOf(); - break; - default: - // Cannot continue as we don't know this structure size - systemAreaOff = systemAreaEnd; - break; - } - } + DecodeSystemArea(data, systemAreaStart, systemAreaStart + systemAreaLength, ref entry, + out bool hasResourceFork); // TODO: Multi-extent files if(entry.Flags.HasFlag(FileFlags.Associated)) @@ -390,5 +247,149 @@ namespace DiscImageChef.Filesystems.ISO9660 return entries; } + + static void DecodeSystemArea(byte[] data, int start, int end, ref DecodedDirectoryEntry entry, + out bool hasResourceFork) + { + int systemAreaOff = start; + hasResourceFork = false; + + while(systemAreaOff + 2 <= end) + { + ushort systemAreaSignature = BigEndianBitConverter.ToUInt16(data, systemAreaOff); + + if(BigEndianBitConverter.ToUInt16(data, systemAreaOff + 6) == XA_MAGIC) systemAreaSignature = XA_MAGIC; + + switch(systemAreaSignature) + { + case APPLE_MAGIC: + byte appleLength = data[systemAreaOff + 2]; + AppleId appleId = (AppleId)data[systemAreaOff + 3]; + + switch(appleId) + { + case AppleId.ProDOS: + AppleProDOSSystemUse appleProDosSystemUse = + Marshal.ByteArrayToStructureLittleEndian(data, systemAreaOff, + Marshal + .SizeOf< + AppleProDOSSystemUse + >()); + + entry.AppleProDosType = appleProDosSystemUse.aux_type; + entry.AppleDosType = appleProDosSystemUse.type; + + break; + case AppleId.HFS: + AppleHFSSystemUse appleHfsSystemUse = + Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, + Marshal + .SizeOf< + AppleHFSSystemUse + >()); + + hasResourceFork = true; + + entry.FinderInfo = new FinderInfo(); + entry.FinderInfo.fdCreator = appleHfsSystemUse.creator; + entry.FinderInfo.fdFlags = (FinderFlags)appleHfsSystemUse.finder_flags; + entry.FinderInfo.fdType = appleHfsSystemUse.type; + + break; + } + + systemAreaOff += appleLength; + break; + case APPLE_MAGIC_OLD: + AppleOldId appleOldId = (AppleOldId)data[systemAreaOff + 2]; + + switch(appleOldId) + { + case AppleOldId.ProDOS: + AppleProDOSOldSystemUse appleProDosOldSystemUse = + Marshal.ByteArrayToStructureLittleEndian(data, + systemAreaOff, + Marshal + .SizeOf< + AppleProDOSOldSystemUse + >()); + entry.AppleProDosType = appleProDosOldSystemUse.aux_type; + entry.AppleDosType = appleProDosOldSystemUse.type; + + systemAreaOff += Marshal.SizeOf(); + break; + case AppleOldId.TypeCreator: + case AppleOldId.TypeCreatorBundle: + AppleHFSTypeCreatorSystemUse appleHfsTypeCreatorSystemUse = + Marshal.ByteArrayToStructureBigEndian(data, + systemAreaOff, + Marshal + .SizeOf< + AppleHFSTypeCreatorSystemUse + >()); + + hasResourceFork = true; + + entry.FinderInfo = new FinderInfo(); + entry.FinderInfo.fdCreator = appleHfsTypeCreatorSystemUse.creator; + entry.FinderInfo.fdType = appleHfsTypeCreatorSystemUse.type; + + systemAreaOff += Marshal.SizeOf(); + break; + case AppleOldId.TypeCreatorIcon: + case AppleOldId.TypeCreatorIconBundle: + AppleHFSIconSystemUse appleHfsIconSystemUse = + Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, + Marshal + .SizeOf< + AppleHFSIconSystemUse + >()); + + hasResourceFork = true; + + entry.FinderInfo = new FinderInfo(); + entry.FinderInfo.fdCreator = appleHfsIconSystemUse.creator; + entry.FinderInfo.fdType = appleHfsIconSystemUse.type; + entry.AppleIcon = appleHfsIconSystemUse.icon; + + systemAreaOff += Marshal.SizeOf(); + break; + case AppleOldId.HFS: + AppleHFSOldSystemUse appleHfsSystemUse = + Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, + Marshal + .SizeOf< + AppleHFSOldSystemUse + >()); + + hasResourceFork = true; + + entry.FinderInfo = new FinderInfo(); + entry.FinderInfo.fdCreator = appleHfsSystemUse.creator; + entry.FinderInfo.fdFlags = (FinderFlags)appleHfsSystemUse.finder_flags; + entry.FinderInfo.fdType = appleHfsSystemUse.type; + + systemAreaOff += Marshal.SizeOf(); + break; + default: + // Cannot continue as we don't know this structure size + systemAreaOff = end; + break; + } + + break; + case XA_MAGIC: + entry.XA = Marshal.ByteArrayToStructureBigEndian(data, systemAreaOff, + Marshal.SizeOf()); + + systemAreaOff += Marshal.SizeOf(); + break; + default: + // Cannot continue as we don't know this structure size + systemAreaOff = end; + break; + } + } + } } } \ No newline at end of file