Read the entire file at once when reading a ticket

This commit is contained in:
Alex Barney 2024-05-13 20:04:36 -07:00
parent c238cf63b0
commit 9eb35528ac

View file

@ -37,11 +37,24 @@ public class Ticket
0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55
]; ];
// Ticket files are often found in .xci files. Reading a file from a hashed partition file system found in these
// will error when the start offset of a read falls within the first 0x200 (usually) bytes of the file, and the end
// offset falls past that region. We work around this while pushing off a rewrite of the Ticket class by reading
// the entire ticket into memory in one read.
private static MemoryStream ReadTicketData(Stream stream)
{
int ticketSize = (int)Math.Min(0x600, stream.Length - stream.Position);
byte[] ticketData = new byte[ticketSize];
int bytesRead = stream.Read(ticketData);
return new MemoryStream(ticketData, 0, bytesRead);
}
public Ticket() { } public Ticket() { }
public Ticket(Stream stream) : this(new BinaryReader(stream)) { } public Ticket(Stream stream) : this(new BinaryReader(ReadTicketData(stream))) { }
public Ticket(BinaryReader reader) private Ticket(BinaryReader reader)
{ {
long fileStart = reader.BaseStream.Position; long fileStart = reader.BaseStream.Position;
SignatureType = (TicketSigType)reader.ReadUInt32(); SignatureType = (TicketSigType)reader.ReadUInt32();