Peek in XDVDFS, Support XB00104M (#86)

* Peek in XDVDFS, Support XB00104M

* var
This commit is contained in:
Deterous
2026-04-19 10:30:44 +09:00
committed by GitHub
parent 63c13254d7
commit 94f86fe1d1
3 changed files with 23 additions and 21 deletions

View File

@@ -5,15 +5,15 @@ namespace SabreTools.Data.Models.XboxISO
{
/// <summary>
/// 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
/// </summary>
/// <see href="https://github.dev/Deterous/XboxKit/"/>
public static readonly long[] RedumpIsoLengths = [
0x1D26A8000, 0x1D3301800, 0x1D2FEF800, 0x1D3082000,
0x1D3390000, 0x1D31A0000, 0x208E05800, 0x208E03800
0x1D330C000, 0x1D26A8000, 0x1D3301800, 0x1D2FEF800,
0x1D3082000, 0x1D3390000, 0x1D31A0000, 0x208E05800, 0x208E03800
];
/// <summary>

View File

@@ -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<DirectoryRecord>();
data.SeekIfPossible(initialOffset + (((long)offset) * Constants.SectorSize), SeekOrigin.Begin);
long curPosition;
while (size > data.Position - (initialOffset + (((long)offset) * Constants.SectorSize)))
{

View File

@@ -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,
};