From 94f86fe1d1f4ea26f9f647c423addeff61353877 Mon Sep 17 00:00:00 2001 From: Deterous <138427222+Deterous@users.noreply.github.com> Date: Sun, 19 Apr 2026 10:30:44 +0900 Subject: [PATCH] Peek in XDVDFS, Support XB00104M (#86) * Peek in XDVDFS, Support XB00104M * var --- SabreTools.Data.Models/XboxISO/Constants.cs | 12 +++++------ SabreTools.Serialization.Readers/XDVDFS.cs | 24 +++++++++++---------- SabreTools.Wrappers/XboxISO.cs | 8 +++---- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/SabreTools.Data.Models/XboxISO/Constants.cs b/SabreTools.Data.Models/XboxISO/Constants.cs index 6343911f..06a7a9bb 100644 --- a/SabreTools.Data.Models/XboxISO/Constants.cs +++ b/SabreTools.Data.Models/XboxISO/Constants.cs @@ -5,15 +5,15 @@ namespace SabreTools.Data.Models.XboxISO { /// /// Known redump ISO lengths - /// 0 = XGD1 - /// 1/2/3/4 = XGD2 - /// 5 = XGD2-Hybrid - /// 6/7 = XGD3 + /// 0/1 = XGD1 + /// 2/3/4/5 = XGD2 + /// 6 = XGD2-Hybrid + /// 7/8 = XGD3 /// /// public static readonly long[] RedumpIsoLengths = [ - 0x1D26A8000, 0x1D3301800, 0x1D2FEF800, 0x1D3082000, - 0x1D3390000, 0x1D31A0000, 0x208E05800, 0x208E03800 + 0x1D330C000, 0x1D26A8000, 0x1D3301800, 0x1D2FEF800, + 0x1D3082000, 0x1D3390000, 0x1D31A0000, 0x208E05800, 0x208E03800 ]; /// diff --git a/SabreTools.Serialization.Readers/XDVDFS.cs b/SabreTools.Serialization.Readers/XDVDFS.cs index 88620951..166e8ef1 100644 --- a/SabreTools.Serialization.Readers/XDVDFS.cs +++ b/SabreTools.Serialization.Readers/XDVDFS.cs @@ -67,11 +67,12 @@ namespace SabreTools.Serialization.Readers { var obj = new VolumeDescriptor(); - obj.StartSignature = data.ReadBytes(20); - var signature = System.Text.Encoding.ASCII.GetString(obj.StartSignature); + var temp = data.PeekBytes(20); + var signature = System.Text.Encoding.ASCII.GetString(temp); if (!signature.Equals(Constants.VolumeDescriptorSignature)) return null; + obj.StartSignature = data.ReadBytes(20); obj.RootOffset = data.ReadUInt32LittleEndian(); obj.RootSize = data.ReadUInt32LittleEndian(); obj.MasteringTimestamp = data.ReadInt64LittleEndian(); @@ -91,19 +92,19 @@ namespace SabreTools.Serialization.Readers { var obj = new LayoutDescriptor(); - obj.Signature = data.ReadBytes(24); - var signature = System.Text.Encoding.ASCII.GetString(obj.Signature); + var temp = data.PeekBytes(24); + var signature = System.Text.Encoding.ASCII.GetString(temp); if (!signature.Equals(Constants.LayoutDescriptorSignature)) return null; - obj.Unused8Bytes = data.ReadBytes(8); + obj.Signature = data.ReadBytes(24); + obj.Unused8Bytes = data.ReadBytes(8); obj.XBLayoutVersion = ParseFourPartVersionType(data); obj.XBPremasterVersion = ParseFourPartVersionType(data); obj.XBGameDiscVersion = ParseFourPartVersionType(data); obj.XBOther1Version = ParseFourPartVersionType(data); obj.XBOther2Version = ParseFourPartVersionType(data); obj.XBOther3Version = ParseFourPartVersionType(data); - obj.Reserved = data.ReadBytes(1968); return obj; @@ -160,11 +161,17 @@ namespace SabreTools.Serialization.Readers if (obj.ContainsKey(dr.ExtentOffset)) continue; + // Ensure offset is valid + if ((((long)offset) * Constants.SectorSize) + size > data.Length) + return null; + // Get all descriptors from child var descriptors = ParseDirectoryDescriptors(data, initialOffset, dr.ExtentOffset, dr.ExtentSize); if (descriptors is null) continue; + data.SeekIfPossible(initialOffset + (((long)offset) * Constants.SectorSize), SeekOrigin.Begin); + // Merge dictionaries foreach (var kvp in descriptors) { @@ -190,14 +197,9 @@ namespace SabreTools.Serialization.Readers if (size < Constants.MinimumRecordLength) return null; - // Ensure offset is valid - if ((((long)offset) * Constants.SectorSize) + size > data.Length) - return null; - var obj = new DirectoryDescriptor(); var records = new List(); - data.SeekIfPossible(initialOffset + (((long)offset) * Constants.SectorSize), SeekOrigin.Begin); long curPosition; while (size > data.Position - (initialOffset + (((long)offset) * Constants.SectorSize))) { diff --git a/SabreTools.Wrappers/XboxISO.cs b/SabreTools.Wrappers/XboxISO.cs index 065ee5f2..983b735e 100644 --- a/SabreTools.Wrappers/XboxISO.cs +++ b/SabreTools.Wrappers/XboxISO.cs @@ -101,10 +101,10 @@ namespace SabreTools.Wrappers // Determine location/size of game partition based on total ISO size model.XGDType = redumpType switch { - 0 => 0, // XGD1 - 1 or 2 or 3 or 4 => 1, // XGD2 - 5 => 2, // XGD2 (Hybrid) - 6 or 7 => 3, // XGD3 + 0 or 1 => 0, // XGD1 + 2 or 3 or 4 or 5 => 1, // XGD2 + 6 => 2, // XGD2 (Hybrid) + 7 or 8 => 3, // XGD3 _ => -1, };