diff --git a/SabreTools.Serialization.Readers/XDVDFS.cs b/SabreTools.Serialization.Readers/XDVDFS.cs index 2e7990c2..cea61242 100644 --- a/SabreTools.Serialization.Readers/XDVDFS.cs +++ b/SabreTools.Serialization.Readers/XDVDFS.cs @@ -22,6 +22,9 @@ namespace SabreTools.Serialization.Readers try { + // Cache the current offset + long initialOffset = data.Position; + // Create a new Volume to fill var volume = new Volume(); @@ -39,7 +42,7 @@ namespace SabreTools.Serialization.Readers volume.LayoutDescriptor = ParseLayoutDescriptor(data); // Parse the descriptors from the root directory descriptor - var dd = ParseDirectoryDescriptors(data, vd.RootOffset, vd.RootSize); + var dd = ParseDirectoryDescriptors(data, initialOffset, vd.RootOffset, vd.RootSize); if (dd is null) return null; @@ -129,7 +132,7 @@ namespace SabreTools.Serialization.Readers /// Sector number descriptor is located at /// Number of bytes descriptor contains /// Filled Dictionary of int to DirectoryDescriptors on success, null on error - public static Dictionary? ParseDirectoryDescriptors(Stream data, uint offset, uint size) + public static Dictionary? ParseDirectoryDescriptors(Stream data, long initialOffset, uint offset, uint size) { // Ensure descriptor size is valid if (size < 14) @@ -141,7 +144,7 @@ namespace SabreTools.Serialization.Readers var obj = new Dictionary(); - var dd = ParseDirectoryDescriptor(data, offset, size); + var dd = ParseDirectoryDescriptor(data, initialOffset, offset, size); if (dd is null) return null; @@ -157,7 +160,7 @@ namespace SabreTools.Serialization.Readers continue; // Get all descriptors from child - var descriptors = ParseDirectoryDescriptors(data, dr.ExtentOffset, dr.ExtentSize); + var descriptors = ParseDirectoryDescriptors(data, initialOffset, dr.ExtentOffset, dr.ExtentSize); if (descriptors is null) continue; @@ -180,7 +183,7 @@ namespace SabreTools.Serialization.Readers /// Sector number descriptor is located at /// Number of bytes descriptor contains /// Filled DirectoryDescriptor on success, null on error - public static DirectoryDescriptor? ParseDirectoryDescriptor(Stream data, uint offset, uint size) + public static DirectoryDescriptor? ParseDirectoryDescriptor(Stream data, long initialOffset, uint offset, uint size) { // Ensure descriptor size is valid if (size < Constants.MinimumRecordLength) @@ -193,7 +196,7 @@ namespace SabreTools.Serialization.Readers var obj = new DirectoryDescriptor(); var records = new List(); - data.SeekIfPossible(((long)offset) * Constants.SectorSize, SeekOrigin.Begin); + data.SeekIfPossible(initialOffset + ((long)offset) * Constants.SectorSize, SeekOrigin.Begin); long curPosition; while (size > data.Position - (((long)offset) * Constants.SectorSize)) { diff --git a/SabreTools.Wrappers/XDVDFS.Extraction.cs b/SabreTools.Wrappers/XDVDFS.Extraction.cs index 29ba3fb1..0deec455 100644 --- a/SabreTools.Wrappers/XDVDFS.Extraction.cs +++ b/SabreTools.Wrappers/XDVDFS.Extraction.cs @@ -25,14 +25,17 @@ namespace SabreTools.Wrappers // Clear the extraction state extractedFiles.Clear(); + // Cache the current offset + long initialOffset = _dataSource.Position; + // Extract files from all directories from root directory - return ExtractDescriptor(outputDirectory, includeDebug, VolumeDescriptor.RootOffset); + return ExtractDescriptor(outputDirectory, includeDebug, initialOffset, VolumeDescriptor.RootOffset); } /// /// Extracts all directory records recursively from directory descriptor /// - public bool ExtractDescriptor(string outputDirectory, bool includeDebug, uint sectorNumber) + public bool ExtractDescriptor(string outputDirectory, bool includeDebug, long initialOffset, uint sectorNumber) { // If no descriptor exists at that sector, we cannot extract from it if (!DirectoryDescriptors.ContainsKey(sectorNumber)) @@ -58,7 +61,7 @@ namespace SabreTools.Wrappers if (!string.IsNullOrEmpty(outputPath) && !Directory.Exists(outputPath)) Directory.CreateDirectory(outputPath); - allExtracted |= ExtractDescriptor(outputPath, includeDebug, dr.ExtentOffset); + allExtracted |= ExtractDescriptor(outputPath, includeDebug, initialOffset, dr.ExtentOffset); } else { @@ -88,7 +91,7 @@ namespace SabreTools.Wrappers lock (_dataSourceLock) { long fileOffset = ((long)dr.ExtentOffset) * Constants.SectorSize; - _dataSource.SeekIfPossible(fileOffset, SeekOrigin.Begin); + _dataSource.SeekIfPossible(initialOffset + fileOffset, SeekOrigin.Begin); // Get the length, and make sure it won't EOF uint length = dr.ExtentSize;