diff --git a/BurnOutSharp.Builders/InstallShieldCabinet.cs b/BurnOutSharp.Builders/InstallShieldCabinet.cs
index 2d125c65..632bb441 100644
--- a/BurnOutSharp.Builders/InstallShieldCabinet.cs
+++ b/BurnOutSharp.Builders/InstallShieldCabinet.cs
@@ -131,7 +131,7 @@ namespace BurnOutSharp.Builders
#region Directory Descriptors
// Create and fill the directory descriptors
- cabinet.DirectoryDescriptors = new FileDescriptor[descriptor.DirectoryCount];
+ cabinet.DirectoryNames = new string[descriptor.DirectoryCount];
for (int i = 0; i < descriptor.DirectoryCount; i++)
{
// Get the directory descriptor offset
@@ -147,8 +147,8 @@ namespace BurnOutSharp.Builders
data.Seek(offset, SeekOrigin.Begin);
// Create and add the file descriptor
- FileDescriptor directoryDescriptor = ParseDirectoryDescriptor(data, GetMajorVersion(commonHeader));
- cabinet.DirectoryDescriptors[i] = directoryDescriptor;
+ string directoryName = ParseDirectoryName(data, GetMajorVersion(commonHeader));
+ cabinet.DirectoryNames[i] = directoryName;
}
#endregion
@@ -673,10 +673,22 @@ namespace BurnOutSharp.Builders
component.FileGroupNames = new string[component.FileGroupCount];
for (int j = 0; j < component.FileGroupCount; j++)
{
+ // Get the name offset
+ uint nameOffset = data.ReadUInt32();
+
+ // Cache the current offset
+ long preNameOffset = data.Position;
+
+ // Seek to the name offset
+ data.Seek(nameOffset + descriptorOffset, SeekOrigin.Begin);
+
if (majorVersion >= 17)
component.FileGroupNames[j] = data.ReadString(Encoding.Unicode);
else
component.FileGroupNames[j] = data.ReadString(Encoding.ASCII);
+
+ // Seek back to the original position
+ data.Seek(preNameOffset, SeekOrigin.Begin);
}
}
@@ -687,22 +699,18 @@ namespace BurnOutSharp.Builders
}
///
- /// Parse a Stream into a directory descriptor
+ /// Parse a Stream into a directory name
///
/// Stream to parse
/// Major version of the cabinet
- /// Filled directory descriptor on success, null on error
- private static FileDescriptor ParseDirectoryDescriptor(Stream data, int majorVersion)
+ /// Filled directory name on success, null on error
+ private static string ParseDirectoryName(Stream data, int majorVersion)
{
- FileDescriptor fileDescriptor = new FileDescriptor();
-
// Read the string
if (majorVersion >= 17)
- fileDescriptor.Name = data.ReadString(Encoding.Unicode);
+ return data.ReadString(Encoding.Unicode);
else
- fileDescriptor.Name = data.ReadString(Encoding.ASCII);
-
- return fileDescriptor;
+ return data.ReadString(Encoding.ASCII);
}
///
diff --git a/BurnOutSharp.Models/InstallShieldCabinet/Cabinet.cs b/BurnOutSharp.Models/InstallShieldCabinet/Cabinet.cs
index 012d73f3..0234c669 100644
--- a/BurnOutSharp.Models/InstallShieldCabinet/Cabinet.cs
+++ b/BurnOutSharp.Models/InstallShieldCabinet/Cabinet.cs
@@ -33,9 +33,9 @@ namespace BurnOutSharp.Models.InstallShieldCabinet
public uint[] FileDescriptorOffsets { get; set; }
///
- /// Directory file descriptors
+ /// Directory names
///
- public FileDescriptor[] DirectoryDescriptors { get; set; }
+ public string[] DirectoryNames { get; set; }
///
/// Standard file descriptors
diff --git a/BurnOutSharp.Models/InstallShieldCabinet/Constants.cs b/BurnOutSharp.Models/InstallShieldCabinet/Constants.cs
index 9ec47168..aa16d7aa 100644
--- a/BurnOutSharp.Models/InstallShieldCabinet/Constants.cs
+++ b/BurnOutSharp.Models/InstallShieldCabinet/Constants.cs
@@ -8,6 +8,12 @@ namespace BurnOutSharp.Models.InstallShieldCabinet
public const uint SignatureUInt32 = 0x28635349;
+ public const int COMMON_HEADER_SIZE = 20;
+
+ public const int VOLUME_HEADER_SIZE_V5 = 40;
+
+ public const int VOLUME_HEADER_SIZE_V6 = 64;
+
// TODO: Determine how the value "71" was chosen here
public const int MAX_FILE_GROUP_COUNT = 71;
diff --git a/BurnOutSharp.Wrappers/InstallShieldCabinet.cs b/BurnOutSharp.Wrappers/InstallShieldCabinet.cs
index feaf82dc..a0747319 100644
--- a/BurnOutSharp.Wrappers/InstallShieldCabinet.cs
+++ b/BurnOutSharp.Wrappers/InstallShieldCabinet.cs
@@ -162,8 +162,8 @@ namespace BurnOutSharp.Wrappers
#region Directory Descriptors
- ///
- public Models.InstallShieldCabinet.FileDescriptor[] DirectoryDescriptors => _cabinet.DirectoryDescriptors;
+ ///
+ public string[] DirectoryNames => _cabinet.DirectoryNames;
#endregion
@@ -312,7 +312,7 @@ namespace BurnOutSharp.Wrappers
// File Descriptors
PrintFileDescriptorOffsets(builder);
- PrintDirectoryDescriptors(builder);
+ PrintDirectoryNames(builder);
PrintFileDescriptors(builder);
// File Groups
@@ -472,35 +472,22 @@ namespace BurnOutSharp.Wrappers
}
///
- /// Print directory descriptors information
+ /// Print directory names information
///
/// StringBuilder to append information to
- private void PrintDirectoryDescriptors(StringBuilder builder)
+ private void PrintDirectoryNames(StringBuilder builder)
{
- builder.AppendLine(" Directory Descriptors:");
+ builder.AppendLine(" Directory Names:");
builder.AppendLine(" -------------------------");
- if (DirectoryDescriptors == null || DirectoryDescriptors.Length == 0)
+ if (DirectoryNames == null || DirectoryNames.Length == 0)
{
- builder.AppendLine(" No directory descriptors");
+ builder.AppendLine(" No directory names");
}
else
{
- for (int i = 0; i < DirectoryDescriptors.Length; i++)
+ for (int i = 0; i < DirectoryNames.Length; i++)
{
- var directoryDescriptor = DirectoryDescriptors[i];
- builder.AppendLine($" Directory Descriptor {i}:");
- builder.AppendLine($" Name offset: {directoryDescriptor.NameOffset} (0x{directoryDescriptor.NameOffset:X})");
- builder.AppendLine($" Name: {directoryDescriptor.Name ?? "[NULL]"}");
- builder.AppendLine($" Directory index: {directoryDescriptor.DirectoryIndex} (0x{directoryDescriptor.DirectoryIndex:X})");
- builder.AppendLine($" Flags: {directoryDescriptor.Flags} (0x{directoryDescriptor.Flags:X})");
- builder.AppendLine($" Expanded size: {directoryDescriptor.ExpandedSize} (0x{directoryDescriptor.ExpandedSize:X})");
- builder.AppendLine($" Compressed size: {directoryDescriptor.CompressedSize} (0x{directoryDescriptor.CompressedSize:X})");
- builder.AppendLine($" Data offset: {directoryDescriptor.DataOffset} (0x{directoryDescriptor.DataOffset:X})");
- builder.AppendLine($" MD5: {BitConverter.ToString(directoryDescriptor.MD5 ?? new byte[0]).Replace('-', ' ')}");
- builder.AppendLine($" Volume: {directoryDescriptor.Volume} (0x{directoryDescriptor.Volume:X})");
- builder.AppendLine($" Link previous: {directoryDescriptor.LinkPrevious} (0x{directoryDescriptor.LinkPrevious:X})");
- builder.AppendLine($" Link next: {directoryDescriptor.LinkNext} (0x{directoryDescriptor.LinkNext:X})");
- builder.AppendLine($" Link flags: {directoryDescriptor.LinkFlags} (0x{directoryDescriptor.LinkFlags:X})");
+ builder.AppendLine($" Directory Name {i}: {DirectoryNames[i] ?? "[NULL]"}");
}
}
builder.AppendLine();
@@ -587,6 +574,7 @@ namespace BurnOutSharp.Wrappers
if (FileGroups == null || FileGroups.Length == 0)
{
builder.AppendLine(" No file groups");
+ builder.AppendLine();
}
else
{
@@ -625,9 +613,9 @@ namespace BurnOutSharp.Wrappers
builder.AppendLine($" Reserved 6: {BitConverter.ToString(fileGroup.Reserved6).Replace('-', ' ')}");
builder.AppendLine($" Reserved 7: {BitConverter.ToString(fileGroup.Reserved7).Replace('-', ' ')}");
}
+ builder.AppendLine();
}
}
- builder.AppendLine();
}
///
@@ -676,6 +664,7 @@ namespace BurnOutSharp.Wrappers
if (Components == null || Components.Length == 0)
{
builder.AppendLine(" No components");
+ builder.AppendLine();
}
else
{
@@ -739,9 +728,9 @@ namespace BurnOutSharp.Wrappers
builder.AppendLine($" Reserved offset 7: {component.ReservedOffset7} (0x{component.ReservedOffset7:X})");
builder.AppendLine($" Reserved offset 8: {component.ReservedOffset8} (0x{component.ReservedOffset8:X})");
}
+ builder.AppendLine();
}
}
- builder.AppendLine();
}
#if NET6_0_OR_GREATER