mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-07-08 18:06:41 +00:00
Seek, if possible
This commit is contained in:
@@ -124,7 +124,7 @@ namespace ExtractionTool.Features
|
||||
try
|
||||
{
|
||||
int read = stream.Read(magic, 0, 16);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace InfoPrint.Features
|
||||
|
||||
// Read the first 8 bytes
|
||||
byte[]? magic = stream.ReadBytes(8);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
|
||||
// Get the file type
|
||||
string extension = Path.GetExtension(file).TrimStart('.');
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// The first 4 bytes are the type and length
|
||||
RecordType type = (RecordType)data.ReadByteValue();
|
||||
uint recordLength = data.ReadUInt24LittleEndian();
|
||||
data.Seek(-4, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-4, SeekOrigin.Current);
|
||||
|
||||
// Create a record based on the type
|
||||
return type switch
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the entry table
|
||||
data.Seek(tableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the entry table
|
||||
var table = ParseTable(data, footer.EntryCount);
|
||||
@@ -67,7 +67,7 @@ namespace SabreTools.Serialization.Readers
|
||||
public static Footer? ParseFooter(Stream data, long initialOffset)
|
||||
{
|
||||
// Seek to the end of the end of the data
|
||||
data.Seek(0, SeekOrigin.End);
|
||||
data.SeekIfPossible(0, SeekOrigin.End);
|
||||
|
||||
// Cache the current offset
|
||||
long endOffset = data.Position;
|
||||
@@ -76,7 +76,7 @@ namespace SabreTools.Serialization.Readers
|
||||
int iterations = 10;
|
||||
|
||||
// Seek backward to the first point it could be
|
||||
data.Seek(-10, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-10, SeekOrigin.Current);
|
||||
|
||||
// Search backward for the signature
|
||||
bool signatureFound = false;
|
||||
@@ -91,7 +91,7 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
iterations--;
|
||||
data.Seek(-11, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-11, SeekOrigin.Current);
|
||||
|
||||
} while (iterations > 0);
|
||||
|
||||
@@ -100,7 +100,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the first footer offset field
|
||||
data.Seek(-70, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-70, SeekOrigin.Current);
|
||||
|
||||
// Find the actual offset of the start of the footer
|
||||
uint footerStart = data.ReadUInt32LittleEndian();
|
||||
@@ -111,7 +111,7 @@ namespace SabreTools.Serialization.Readers
|
||||
bool shortFooter = footerStart == data.Position - 8;
|
||||
|
||||
// Seek to the start of the footer
|
||||
data.Seek(initialOffset + footerStart, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + footerStart, SeekOrigin.Begin);
|
||||
|
||||
var obj = new Footer();
|
||||
|
||||
|
||||
@@ -82,9 +82,9 @@ namespace SabreTools.Serialization.Readers
|
||||
if (fileEntry.Offset > 0)
|
||||
{
|
||||
long currentOffset = data.Position;
|
||||
data.Seek(initialOffset + fileEntry.Offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + fileEntry.Offset, SeekOrigin.Begin);
|
||||
fileEntry.CompressedSize = data.ReadInt32LittleEndian();
|
||||
data.Seek(currentOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentOffset, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
return fileEntry;
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the lump offset
|
||||
data.Seek(initialOffset + lumpEntry.Offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + lumpEntry.Offset, SeekOrigin.Begin);
|
||||
|
||||
// Read according to the lump type
|
||||
switch ((LumpType)l)
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the next sector
|
||||
data.Seek(sectorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the sectors
|
||||
var sectorNumbers = ParseSectorNumbers(data, fileHeader.SectorShift);
|
||||
@@ -116,7 +116,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the next sector
|
||||
data.Seek(sectorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the sectors
|
||||
var sectorNumbers = ParseSectorNumbers(data, fileHeader.SectorShift);
|
||||
@@ -152,7 +152,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the next sector
|
||||
data.Seek(sectorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the sectors
|
||||
var sectorNumbers = ParseSectorNumbers(data, fileHeader.SectorShift);
|
||||
@@ -207,7 +207,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the next sector
|
||||
data.Seek(sectorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the sectors
|
||||
var directoryEntries = ParseDirectoryEntries(data, fileHeader.SectorShift, fileHeader.MajorVersion);
|
||||
|
||||
@@ -335,13 +335,13 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Seek to the content index size
|
||||
data.Seek(4, SeekOrigin.Current);
|
||||
data.SeekIfPossible(4, SeekOrigin.Current);
|
||||
|
||||
// Read the size (big-endian)
|
||||
obj.ContentIndexSize = data.ReadUInt32BigEndian();
|
||||
|
||||
// Seek back to the start of the content index
|
||||
data.Seek(-8, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-8, SeekOrigin.Current);
|
||||
|
||||
obj.ContentIndex = data.ReadBytes((int)obj.ContentIndexSize);
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace SabreTools.Serialization.Readers
|
||||
string? directoryName = data.ReadNullTerminatedAnsiString();
|
||||
if (data.Position > directoryNamesEnd)
|
||||
{
|
||||
data.Seek(-directoryName?.Length ?? 0, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-directoryName?.Length ?? 0, SeekOrigin.Current);
|
||||
byte[] endingData = data.ReadBytes((int)(directoryNamesEnd - data.Position));
|
||||
directoryName = Encoding.ASCII.GetString(endingData);
|
||||
}
|
||||
@@ -216,7 +216,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#endregion
|
||||
|
||||
// Seek to end of directory section, just in case
|
||||
data.Seek(afterMapPosition + file.DirectoryHeader.DirectorySize, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(afterMapPosition + file.DirectoryHeader.DirectorySize, SeekOrigin.Begin);
|
||||
|
||||
#region Directory Map Header
|
||||
|
||||
@@ -304,7 +304,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#endregion
|
||||
|
||||
// Seek to end of checksum section, just in case
|
||||
data.Seek(afterMapPosition + checksumHeader.ChecksumSize, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(afterMapPosition + checksumHeader.ChecksumSize, SeekOrigin.Begin);
|
||||
|
||||
#region Data Block Header
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#endregion
|
||||
|
||||
// Seek to the end to read the trailer
|
||||
data.Seek(-8, SeekOrigin.End);
|
||||
data.SeekIfPossible(-8, SeekOrigin.End);
|
||||
|
||||
#region Trailer
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Read the raw data first
|
||||
obj.ExtraFieldBytes = data.ReadBytes(obj.ExtraLength);
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
|
||||
List<ExtraFieldData> extraFields = [];
|
||||
while (data.Position < currentPosition + obj.ExtraLength)
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the directories
|
||||
data.Seek(directoriesOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(directoriesOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the directories
|
||||
var directories = new List<Data.Models.InstallShieldArchiveV3.Directory>();
|
||||
@@ -52,7 +52,7 @@ namespace SabreTools.Serialization.Readers
|
||||
{
|
||||
var directory = ParseDirectory(data);
|
||||
directories.Add(directory);
|
||||
data.Seek(directory.ChunkSize - directory.Name!.Length - 6, SeekOrigin.Current);
|
||||
data.SeekIfPossible(directory.ChunkSize - directory.Name!.Length - 6, SeekOrigin.Current);
|
||||
}
|
||||
|
||||
// Set the directories
|
||||
@@ -71,7 +71,7 @@ namespace SabreTools.Serialization.Readers
|
||||
{
|
||||
var file = ParseFile(data);
|
||||
files.Add(file);
|
||||
data.Seek(file.ChunkSize - file.Name!.Length - 30, SeekOrigin.Current);
|
||||
data.SeekIfPossible(file.ChunkSize - file.Name!.Length - 30, SeekOrigin.Current);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the descriptor
|
||||
data.Seek(descriptorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Set the descriptor
|
||||
cabinet.Descriptor = ParseDescriptor(data);
|
||||
@@ -75,7 +75,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the file table
|
||||
data.Seek(fileTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// Get the number of file table items
|
||||
uint fileTableItems;
|
||||
@@ -109,7 +109,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the file descriptor offset
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create and add the file descriptor
|
||||
string? directoryName = ParseDirectoryName(data, majorVersion);
|
||||
@@ -146,7 +146,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the file descriptor offset
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create and add the file descriptor
|
||||
cabinet.FileDescriptors[i] = ParseFileDescriptor(data,
|
||||
@@ -173,7 +173,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the file group offset
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create and add the offset
|
||||
OffsetList offsetList = ParseOffsetList(data, majorVersion, descriptorOffset);
|
||||
@@ -187,7 +187,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long internalOffset = descriptorOffset + nextOffset;
|
||||
|
||||
// Seek to the file group offset
|
||||
data.Seek(internalOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(internalOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create and add the offset
|
||||
offsetList = ParseOffsetList(data, majorVersion, descriptorOffset);
|
||||
@@ -225,7 +225,7 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
/// Seek to the file group
|
||||
data.Seek(descriptorOffset + list.DescriptorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + list.DescriptorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Add the file group
|
||||
cabinet.FileGroups[fileGroupId++] = ParseFileGroup(data, majorVersion, descriptorOffset);
|
||||
@@ -250,7 +250,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the component offset
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create and add the offset
|
||||
OffsetList offsetList = ParseOffsetList(data, majorVersion, descriptorOffset);
|
||||
@@ -264,7 +264,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long internalOffset = descriptorOffset + nextOffset;
|
||||
|
||||
// Seek to the file group offset
|
||||
data.Seek(internalOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(internalOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create and add the offset
|
||||
offsetList = ParseOffsetList(data, majorVersion, descriptorOffset);
|
||||
@@ -302,7 +302,7 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Seek to the component
|
||||
data.Seek(descriptorOffset + list.DescriptorOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + list.DescriptorOffset, SeekOrigin.Begin);
|
||||
|
||||
// Add the component
|
||||
cabinet.Components[componentId++] = ParseComponent(data, majorVersion, descriptorOffset);
|
||||
@@ -391,7 +391,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.IdentifierOffset != 0)
|
||||
{
|
||||
// Seek to the identifier
|
||||
data.Seek(descriptorOffset + obj.IdentifierOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.IdentifierOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
@@ -404,7 +404,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.DisplayNameOffset != 0)
|
||||
{
|
||||
// Seek to the name
|
||||
data.Seek(descriptorOffset + obj.DisplayNameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.DisplayNameOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
@@ -417,7 +417,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.NameOffset != 0)
|
||||
{
|
||||
// Seek to the name
|
||||
data.Seek(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
@@ -430,7 +430,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.CLSIDOffset != 0)
|
||||
{
|
||||
// Seek to the CLSID
|
||||
data.Seek(descriptorOffset + obj.CLSIDOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.CLSIDOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the GUID
|
||||
obj.CLSID = data.ReadGuid();
|
||||
@@ -440,7 +440,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.FileGroupCount != 0 && obj.FileGroupNamesOffset != 0)
|
||||
{
|
||||
// Seek to the file group table offset
|
||||
data.Seek(descriptorOffset + obj.FileGroupNamesOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.FileGroupNamesOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the file group names table
|
||||
obj.FileGroupNames = new string[obj.FileGroupCount];
|
||||
@@ -453,7 +453,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long preNameOffset = data.Position;
|
||||
|
||||
// Seek to the name offset
|
||||
data.Seek(descriptorOffset + nameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + nameOffset, SeekOrigin.Begin);
|
||||
|
||||
if (majorVersion >= 17)
|
||||
obj.FileGroupNames[j] = data.ReadNullTerminatedUnicodeString() ?? string.Empty;
|
||||
@@ -461,12 +461,12 @@ namespace SabreTools.Serialization.Readers
|
||||
obj.FileGroupNames[j] = data.ReadNullTerminatedAnsiString() ?? string.Empty;
|
||||
|
||||
// Seek back to the original position
|
||||
data.Seek(preNameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(preNameOffset, SeekOrigin.Begin);
|
||||
}
|
||||
}
|
||||
|
||||
// Seek back to the correct offset
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -580,7 +580,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.NameOffset != 0)
|
||||
{
|
||||
// Seek to the name
|
||||
data.Seek(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
@@ -590,7 +590,7 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Seek back to the correct offset
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -613,7 +613,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// TODO: Figure out what data lives in this area for V5 and below
|
||||
if (majorVersion <= 5)
|
||||
data.Seek(0x36, SeekOrigin.Current);
|
||||
data.SeekIfPossible(0x36, SeekOrigin.Current);
|
||||
|
||||
obj.FirstFile = data.ReadUInt32LittleEndian();
|
||||
obj.LastFile = data.ReadUInt32LittleEndian();
|
||||
@@ -638,7 +638,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.NameOffset != 0)
|
||||
{
|
||||
// Seek to the name
|
||||
data.Seek(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
@@ -648,7 +648,7 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Seek back to the correct offset
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -672,7 +672,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long currentOffset = data.Position;
|
||||
|
||||
// Seek to the name offset
|
||||
data.Seek(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(descriptorOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
@@ -681,7 +681,7 @@ namespace SabreTools.Serialization.Readers
|
||||
obj.Name = data.ReadNullTerminatedAnsiString();
|
||||
|
||||
// Seek back to the correct offset
|
||||
data.Seek(currentOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentOffset, SeekOrigin.Begin);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#region Information Block
|
||||
|
||||
// Try to parse the executable header
|
||||
data.Seek(initialOffset + stub.Header.NewExeHeaderAddr, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + stub.Header.NewExeHeaderAddr, SeekOrigin.Begin);
|
||||
var informationBlock = ParseInformationBlock(data);
|
||||
if (informationBlock.Signature != LESignatureString && informationBlock.Signature != LXSignatureString)
|
||||
return null;
|
||||
@@ -58,7 +58,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the object table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the object table
|
||||
executable.ObjectTable = new ObjectTableEntry[informationBlock.ObjectTableCount];
|
||||
@@ -81,7 +81,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the object page map
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the object page map
|
||||
executable.ObjectPageMap = new ObjectPageMapEntry[informationBlock.ObjectTableCount];
|
||||
@@ -103,7 +103,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the object page map
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// TODO: Implement when model found
|
||||
// No model has been found in the documentation about what
|
||||
@@ -121,7 +121,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the resource table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the resource table
|
||||
executable.ResourceTable = new ResourceTableEntry[informationBlock.ResourceTableCount];
|
||||
@@ -144,7 +144,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the resident names table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the resident names table
|
||||
var residentNamesTable = new List<ResidentNamesTableEntry>();
|
||||
@@ -175,7 +175,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the entry table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the entry table
|
||||
var entryTable = new List<EntryTableBundle>();
|
||||
@@ -207,7 +207,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the module format directives table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the module format directives table
|
||||
executable.ModuleFormatDirectivesTable = new ModuleFormatDirectivesTableEntry[informationBlock.ModuleDirectivesCount];
|
||||
@@ -238,7 +238,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the fix-up page table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the fix-up page table
|
||||
executable.FixupPageTable = new FixupPageTableEntry[executable.ObjectPageMap?.Length ?? 0 + 1];
|
||||
@@ -261,7 +261,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the fix-up record table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the fix-up record table
|
||||
executable.FixupRecordTable = new FixupRecordTableEntry[executable.ObjectPageMap?.Length ?? 0 + 1];
|
||||
@@ -288,7 +288,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the imported module name table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the imported module name table
|
||||
executable.ImportModuleNameTable = new ImportModuleNameTableEntry[informationBlock.ImportedModulesCount];
|
||||
@@ -311,7 +311,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the imported module procedure name table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Get the size of the imported module procedure name table
|
||||
long tableSize = informationBlock.FixupPageTableOffset
|
||||
@@ -343,7 +343,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the per-page checksum name table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the per-page checksum name table
|
||||
executable.PerPageChecksumTable = new PerPageChecksumTableEntry[informationBlock.ModuleNumberPages];
|
||||
@@ -366,7 +366,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the non-resident names table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the non-resident names table
|
||||
var nonResidentNamesTable = new List<NonResidentNamesTableEntry>();
|
||||
@@ -397,7 +397,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset + stub.Header.NewExeHeaderAddr && offset < data.Length)
|
||||
{
|
||||
// Seek to the debug information
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the debug information
|
||||
var debugInformation = ParseDebugInformation(data, informationBlock.DebugInformationLength);
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return executable;
|
||||
|
||||
// Try to parse the relocation table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the relocation table
|
||||
executable.RelocationTable = new RelocationEntry[executableHeader.RelocationItems];
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the offset
|
||||
data.Seek(filesOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(filesOffset, SeekOrigin.Begin);
|
||||
|
||||
// Set the file array
|
||||
cabinet.Files = new CFFILE[cabinetHeader.FileCount];
|
||||
@@ -175,7 +175,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (folder.CabStartOffset > 0)
|
||||
{
|
||||
long currentPosition = data.Position;
|
||||
data.Seek(folder.CabStartOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(folder.CabStartOffset, SeekOrigin.Begin);
|
||||
|
||||
folder.DataBlocks = new CFDATA[folder.DataCount];
|
||||
for (int i = 0; i < folder.DataCount; i++)
|
||||
@@ -184,7 +184,7 @@ namespace SabreTools.Serialization.Readers
|
||||
folder.DataBlocks[i] = dataBlock;
|
||||
}
|
||||
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
return folder;
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Check for User Data
|
||||
uint possibleSignature = data.ReadUInt32LittleEndian();
|
||||
data.Seek(-4, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-4, SeekOrigin.Current);
|
||||
if (possibleSignature == UserDataSignatureUInt32)
|
||||
{
|
||||
// Deserialize the user data, returning null if invalid
|
||||
@@ -44,7 +44,7 @@ namespace SabreTools.Serialization.Readers
|
||||
archive.UserData = userData;
|
||||
|
||||
// Set the starting position according to the header offset
|
||||
data.Seek(initialOffset + archive.UserData.HeaderOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + archive.UserData.HeaderOffset, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -340,7 +340,7 @@ namespace SabreTools.Serialization.Readers
|
||||
ulong entryCount = header.HiBlockTableSize >> 1;
|
||||
|
||||
// Seek to the offset
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Read in the hi-block table
|
||||
var hiBlockTable = new short[entryCount];
|
||||
|
||||
@@ -73,7 +73,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the start of the partition
|
||||
data.Seek(partitionOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(partitionOffset, SeekOrigin.Begin);
|
||||
|
||||
// Handle the normal header
|
||||
var partition = ParseNCCHHeader(data);
|
||||
@@ -91,7 +91,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (partition.ExeFSSizeInMediaUnits > 0)
|
||||
{
|
||||
long offset = partition.ExeFSOffsetInMediaUnits * mediaUnitSize;
|
||||
data.Seek(partitionOffset + offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(partitionOffset + offset, SeekOrigin.Begin);
|
||||
|
||||
var exeFsHeader = ParseExeFSHeader(data);
|
||||
if (exeFsHeader == null)
|
||||
@@ -104,7 +104,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (partition.RomFSSizeInMediaUnits > 0)
|
||||
{
|
||||
long offset = partition.RomFSOffsetInMediaUnits * mediaUnitSize;
|
||||
data.Seek(partitionOffset + offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(partitionOffset + offset, SeekOrigin.Begin);
|
||||
|
||||
var romFsHeader = ParseRomFSHeader(data);
|
||||
if (romFsHeader.MagicString != RomFSMagicNumber)
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace SabreTools.Serialization.Readers
|
||||
string? directoryName = data.ReadNullTerminatedAnsiString();
|
||||
if (data.Position > directoryNamesEnd)
|
||||
{
|
||||
data.Seek(-directoryName?.Length ?? 0, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-directoryName?.Length ?? 0, SeekOrigin.Current);
|
||||
byte[] endingData = data.ReadBytes((int)(directoryNamesEnd - data.Position));
|
||||
directoryName = Encoding.ASCII.GetString(endingData);
|
||||
}
|
||||
@@ -151,7 +151,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#endregion
|
||||
|
||||
// Seek to end of directory section, just in case
|
||||
data.Seek(afterHeaderPosition + directoryHeader.DirectorySize, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(afterHeaderPosition + directoryHeader.DirectorySize, SeekOrigin.Begin);
|
||||
|
||||
#region Unknown Header
|
||||
|
||||
@@ -236,7 +236,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#endregion
|
||||
|
||||
// Seek to end of checksum section, just in case
|
||||
data.Seek(afterHeaderPosition + checksumHeader.ChecksumSize, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(afterHeaderPosition + checksumHeader.ChecksumSize, SeekOrigin.Begin);
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Try to parse the executable header
|
||||
data.Seek(newExeOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(newExeOffset, SeekOrigin.Begin);
|
||||
var header = ParseExecutableHeader(data);
|
||||
if (header.Magic != SignatureString)
|
||||
return null;
|
||||
@@ -63,7 +63,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the segment table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the segment table
|
||||
nex.SegmentTable = new SegmentTableEntry[header.FileSegmentCount];
|
||||
@@ -82,7 +82,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the resource table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the resource table
|
||||
nex.ResourceTable = ParseResourceTable(data, header.ResourceEntriesCount);
|
||||
@@ -98,7 +98,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the resident-name table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the resident-name table
|
||||
nex.ResidentNameTable = ParseResidentNameTable(data, endOffset);
|
||||
@@ -113,7 +113,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the module-reference table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the module-reference table
|
||||
nex.ModuleReferenceTable = new ModuleReferenceTableEntry[header.ModuleReferenceTableSize];
|
||||
@@ -133,7 +133,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the imported-name table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the imported-name table
|
||||
nex.ImportedNameTable = ParseImportedNameTable(data, endOffset);
|
||||
@@ -149,7 +149,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the imported-name table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the entry table
|
||||
nex.EntryTable = ParseEntryTable(data, endOffset);
|
||||
@@ -165,7 +165,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return nex;
|
||||
|
||||
// Seek to the nonresident-name table
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
|
||||
// Set the nonresident-name table
|
||||
nex.NonResidentNameTable = ParseNonResidentNameTable(data, endOffset);
|
||||
@@ -571,7 +571,7 @@ namespace SabreTools.Serialization.Readers
|
||||
for (int i = 0; i < stringOffsets.Count; i++)
|
||||
{
|
||||
int stringOffset = (int)(stringOffsets[i] + initialOffset);
|
||||
data.Seek(stringOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(stringOffset, SeekOrigin.Begin);
|
||||
|
||||
var str = ParseResourceTypeAndNameString(data);
|
||||
resourceTable.TypeAndNameStrings[stringOffsets[i]] = str;
|
||||
@@ -663,7 +663,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long currentOffset = data.Position;
|
||||
|
||||
// Seek to the data offset and read
|
||||
data.Seek(obj.Offset + initialOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(obj.Offset + initialOffset, SeekOrigin.Begin);
|
||||
obj.Data = data.ReadBytes(obj.Length);
|
||||
|
||||
|
||||
@@ -677,7 +677,7 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Seek back to the end of the entry
|
||||
data.Seek(currentOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentOffset, SeekOrigin.Begin);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the secure area
|
||||
data.Seek(secureAreaOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(secureAreaOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the secure area without processing
|
||||
cart.SecureArea = data.ReadBytes(0x800);
|
||||
@@ -61,7 +61,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the name table
|
||||
data.Seek(nameTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(nameTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// Set the name table
|
||||
cart.NameTable = ParseNameTable(data);
|
||||
@@ -76,7 +76,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the file allocation table
|
||||
data.Seek(fileAllocationTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileAllocationTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the file allocation table
|
||||
var fileAllocationTable = new List<FileAllocationTableEntry>();
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the directory items
|
||||
data.Seek(directoryItemsOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(directoryItemsOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the directory item array
|
||||
file.DirectoryItems = new DirectoryItem[header.DirectoryLength / 64];
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the segments
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Create the segments array
|
||||
archive.Segments = new Segment[header.NumberOfFiles];
|
||||
@@ -89,7 +89,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the footer
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Set the archive footer
|
||||
archive.Footer = ParseFooter(data);
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// Read the signature
|
||||
long beforeSignature = data.Position;
|
||||
uint signature = data.ReadUInt32LittleEndian();
|
||||
data.Seek(beforeSignature, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(beforeSignature, SeekOrigin.Begin);
|
||||
|
||||
// Switch based on the signature found
|
||||
bool validBlock = false;
|
||||
@@ -252,9 +252,9 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
else
|
||||
{
|
||||
data.Seek(12, SeekOrigin.Current);
|
||||
data.SeekIfPossible(12, SeekOrigin.Current);
|
||||
byte[] nextBlock = data.ReadBytes(2);
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
if (nextBlock.EqualsExactly([0x50, 0x4B]))
|
||||
isShort = true;
|
||||
}
|
||||
@@ -294,9 +294,9 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
else
|
||||
{
|
||||
data.Seek(20, SeekOrigin.Current);
|
||||
data.SeekIfPossible(20, SeekOrigin.Current);
|
||||
byte[] nextBlock = data.ReadBytes(2);
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
if (nextBlock.EqualsExactly([0x50, 0x4B]))
|
||||
isShort = true;
|
||||
}
|
||||
@@ -328,7 +328,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// Signatures are expected but not required
|
||||
obj.Signature = data.ReadUInt32LittleEndian();
|
||||
if (obj.Signature != EndOfCentralDirectoryLocator64Signature)
|
||||
data.Seek(-4, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-4, SeekOrigin.Current);
|
||||
|
||||
obj.StartDiskNumber = data.ReadUInt32LittleEndian();
|
||||
obj.CentralDirectoryOffset = data.ReadUInt64LittleEndian();
|
||||
@@ -487,7 +487,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// Read the signature
|
||||
long beforeSignature = data.Position;
|
||||
uint signature = data.ReadUInt32LittleEndian();
|
||||
data.Seek(beforeSignature, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(beforeSignature, SeekOrigin.Begin);
|
||||
|
||||
// Don't fail if descriptor is missing
|
||||
if (signature != DataDescriptorSignature)
|
||||
@@ -1451,16 +1451,16 @@ namespace SabreTools.Serialization.Readers
|
||||
long currentPosition = data.Position;
|
||||
|
||||
// Short 32-bit
|
||||
data.Seek(12, SeekOrigin.Current);
|
||||
data.SeekIfPossible(12, SeekOrigin.Current);
|
||||
byte[] nextBlock = data.ReadBytes(2);
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
if (nextBlock.EqualsExactly([0x50, 0x4B]))
|
||||
return false;
|
||||
|
||||
// Long 32-bit
|
||||
data.Seek(16, SeekOrigin.Current);
|
||||
data.SeekIfPossible(16, SeekOrigin.Current);
|
||||
nextBlock = data.ReadBytes(2);
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
if (nextBlock.EqualsExactly([0x50, 0x4B]))
|
||||
return false;
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the unknown block 1
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
// Try to parse the unknown block 1
|
||||
@@ -82,7 +82,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the unknown value 2
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
// Set the unknown value 2
|
||||
@@ -104,7 +104,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the unknown block 3
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
// Try to parse the unknown block 3
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Try to parse the executable header
|
||||
data.Seek(newExeOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(newExeOffset, SeekOrigin.Begin);
|
||||
byte[] signature = data.ReadBytes(4);
|
||||
pex.Signature = Encoding.ASCII.GetString(signature);
|
||||
if (pex.Signature != SignatureString)
|
||||
@@ -95,7 +95,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the section table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Set the section table
|
||||
pex.SectionTable = new SectionHeader[fileHeader.NumberOfSections];
|
||||
@@ -116,7 +116,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (offset > initialOffset && offset < data.Length)
|
||||
{
|
||||
// Seek to the symbol table
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
|
||||
// Set the symbol and string tables
|
||||
pex.SymbolTable = ParseSymbolTable(data, fileHeader.NumberOfSymbols);
|
||||
@@ -159,7 +159,7 @@ namespace SabreTools.Serialization.Readers
|
||||
offset = initialOffset + exportDirectoryTable.NameRVA.ConvertVirtualAddress(pex.SectionTable);
|
||||
if (offset > initialOffset && offset < data.Length)
|
||||
{
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
exportDirectoryTable.Name = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ namespace SabreTools.Serialization.Readers
|
||||
&& offset > initialOffset
|
||||
&& offset < data.Length)
|
||||
{
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
pex.ExportAddressTable = ParseExportAddressTable(data, exportDirectoryTable.AddressTableEntries);
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ namespace SabreTools.Serialization.Readers
|
||||
&& offset > initialOffset
|
||||
&& offset < data.Length)
|
||||
{
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
pex.NamePointerTable = ParseExportNamePointerTable(data, exportDirectoryTable.NumberOfNamePointers);
|
||||
}
|
||||
|
||||
@@ -189,7 +189,7 @@ namespace SabreTools.Serialization.Readers
|
||||
&& offset > initialOffset
|
||||
&& offset < data.Length)
|
||||
{
|
||||
data.Seek(offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
pex.OrdinalTable = ParseExportOrdinalTable(data, exportDirectoryTable.NumberOfNamePointers);
|
||||
}
|
||||
|
||||
@@ -246,7 +246,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// If the name RVA is non-zero
|
||||
if (nameOffset != initialOffset)
|
||||
{
|
||||
data.Seek(nameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(nameOffset, SeekOrigin.Begin);
|
||||
entry.Name = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
}
|
||||
@@ -813,7 +813,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long address = initialOffset + pointers[i].ConvertVirtualAddress(sections);
|
||||
if (address > initialOffset && address < data.Length)
|
||||
{
|
||||
data.Seek(address, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(address, SeekOrigin.Begin);
|
||||
|
||||
string? str = data.ReadNullTerminatedAnsiString();
|
||||
obj.Strings[i] = str ?? string.Empty;
|
||||
@@ -995,7 +995,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
if (hintNameTableEntryAddress > initialOffset && hintNameTableEntryAddress < data.Length)
|
||||
{
|
||||
data.Seek(hintNameTableEntryAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(hintNameTableEntryAddress, SeekOrigin.Begin);
|
||||
|
||||
var hintNameTableEntry = ParseHintNameTableEntry(data);
|
||||
importHintNameTable.Add(hintNameTableEntry);
|
||||
@@ -1075,7 +1075,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
if (tableAddress > initialOffset && tableAddress < data.Length)
|
||||
{
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
obj[i] = ParseImportAddressTable(data, magic);
|
||||
}
|
||||
}
|
||||
@@ -1217,7 +1217,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
if (tableAddress > initialOffset && tableAddress < data.Length)
|
||||
{
|
||||
data.Seek(tableAddress, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableAddress, SeekOrigin.Begin);
|
||||
obj[i] = ParseImportLookupTable(data, magic);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the sections
|
||||
data.Seek(sectionOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectionOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the sections array
|
||||
directory.Sections = new Section4[directoryHeader.SectionCount];
|
||||
@@ -191,7 +191,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the folders
|
||||
data.Seek(folderOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(folderOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the folders array
|
||||
directory.Folders = new Folder4[directoryHeader.FolderCount];
|
||||
@@ -214,7 +214,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the files
|
||||
data.Seek(fileOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileOffset, SeekOrigin.Begin);
|
||||
|
||||
// Get the file count
|
||||
uint fileCount = directoryHeader.FileCount;
|
||||
@@ -240,7 +240,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the string table
|
||||
data.Seek(stringTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(stringTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// TODO: Are these strings actually indexed by number and not position?
|
||||
// TODO: If indexed by position, I think it needs to be adjusted by start of table
|
||||
@@ -317,7 +317,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the sections
|
||||
data.Seek(sectionOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectionOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the sections array
|
||||
directory.Sections = new Section5[directoryHeader.SectionCount];
|
||||
@@ -340,7 +340,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the folders
|
||||
data.Seek(folderOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(folderOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the folders array
|
||||
directory.Folders = new Folder5[directoryHeader.FolderCount];
|
||||
@@ -363,7 +363,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the files
|
||||
data.Seek(fileOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the files array
|
||||
directory.Files = new File4[directoryHeader.FileCount];
|
||||
@@ -386,7 +386,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the string table
|
||||
data.Seek(stringTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(stringTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// TODO: Are these strings actually indexed by number and not position?
|
||||
// TODO: If indexed by position, I think it needs to be adjusted by start of table
|
||||
@@ -463,7 +463,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the sections
|
||||
data.Seek(sectionOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectionOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the sections array
|
||||
directory.Sections = new Section5[directoryHeader.SectionCount];
|
||||
@@ -486,7 +486,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the folders
|
||||
data.Seek(folderOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(folderOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the folders array
|
||||
directory.Folders = new Folder5[directoryHeader.FolderCount];
|
||||
@@ -509,7 +509,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the files
|
||||
data.Seek(fileOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the files array
|
||||
directory.Files = new File6[directoryHeader.FileCount];
|
||||
@@ -532,7 +532,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the string table
|
||||
data.Seek(stringTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(stringTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// TODO: Are these strings actually indexed by number and not position?
|
||||
// TODO: If indexed by position, I think it needs to be adjusted by start of table
|
||||
@@ -609,7 +609,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the sections
|
||||
data.Seek(sectionOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(sectionOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the sections array
|
||||
directory.Sections = new Section5[directoryHeader.SectionCount];
|
||||
@@ -632,7 +632,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the folders
|
||||
data.Seek(folderOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(folderOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the folders array
|
||||
directory.Folders = new Folder5[directoryHeader.FolderCount];
|
||||
@@ -655,7 +655,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the files
|
||||
data.Seek(fileOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the files array
|
||||
directory.Files = new File7[directoryHeader.FileCount];
|
||||
@@ -678,7 +678,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the string table
|
||||
data.Seek(stringTableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(stringTableOffset, SeekOrigin.Begin);
|
||||
|
||||
// TODO: Are these strings actually indexed by number and not position?
|
||||
// TODO: If indexed by position, I think it needs to be adjusted by start of table
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long currentOffset = data.Position;
|
||||
byte[] temp = data.ReadBytes(10);
|
||||
string tempString = Encoding.ASCII.GetString(temp);
|
||||
data.Seek(currentOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentOffset, SeekOrigin.Begin);
|
||||
|
||||
// If the temp string is a regex match for an ID
|
||||
if (Regex.IsMatch(tempString, @"[0-9]{6}-[0-9]{3}"))
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// (NecroVisioN.exe from the GamersGate patch NecroVisioN_Patch1.2_GG.exe) isn't RC and still has it.
|
||||
long tempPosition = data.Position;
|
||||
uint tempValue = data.ReadUInt32LittleEndian();
|
||||
data.Seek(tempPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tempPosition, SeekOrigin.Begin);
|
||||
|
||||
// Only 0 or 1 have been observed for long sections
|
||||
if (tempValue < 2)
|
||||
@@ -93,9 +93,9 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Determine if file path size is 256 or 512 bytes
|
||||
long tempPosition = data.Position;
|
||||
data.Seek(data.Position + 256, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(data.Position + 256, SeekOrigin.Begin);
|
||||
var tempValue = data.ReadUInt32LittleEndian();
|
||||
data.Seek(tempPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tempPosition, SeekOrigin.Begin);
|
||||
int pathSize = tempValue == 0 ? 512 : 256;
|
||||
|
||||
// Set default value for unknown value checking
|
||||
@@ -117,7 +117,7 @@ namespace SabreTools.Serialization.Readers
|
||||
{
|
||||
tempPosition = data.Position;
|
||||
tempValue = data.ReadUInt32LittleEndian();
|
||||
data.Seek(tempPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tempPosition, SeekOrigin.Begin);
|
||||
hasUnknown = tempValue == 0;
|
||||
}
|
||||
|
||||
@@ -136,4 +136,4 @@ namespace SabreTools.Serialization.Readers
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the entry table
|
||||
data.Seek(tableOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(tableOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the entry table
|
||||
var table = ParseTable(data, footer.EntryCount);
|
||||
@@ -63,7 +63,7 @@ namespace SabreTools.Serialization.Readers
|
||||
public static Footer ParseFooter(Stream data)
|
||||
{
|
||||
// Seek from the end (24 bytes has to use -23)
|
||||
data.Seek(-23, SeekOrigin.End);
|
||||
data.SeekIfPossible(-23, SeekOrigin.End);
|
||||
|
||||
var obj = new Footer();
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// Peek at the next 5 bytes
|
||||
byte[] temp = data.ReadBytes(5);
|
||||
string tempString = Encoding.ASCII.GetString(temp);
|
||||
data.Seek(-5, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-5, SeekOrigin.Current);
|
||||
if (tempString != "ustar")
|
||||
return obj;
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the lump offset
|
||||
data.Seek(initialOffset + lumpEntry.Offset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + lumpEntry.Offset, SeekOrigin.Begin);
|
||||
|
||||
// Read according to the lump type
|
||||
switch ((LumpType)l)
|
||||
|
||||
@@ -164,13 +164,13 @@ namespace SabreTools.Serialization.Readers
|
||||
long currentOffset = data.Position;
|
||||
|
||||
// Seek to the preload data offset
|
||||
data.Seek(preloadDataPointer, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(preloadDataPointer, SeekOrigin.Begin);
|
||||
|
||||
// Read the preload data
|
||||
preloadData = data.ReadBytes(preloadDataLength);
|
||||
|
||||
// Seek back to the original offset
|
||||
data.Seek(currentOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentOffset, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
// Set the preload data
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the lump offset
|
||||
data.Seek(dirOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(dirOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the lump array
|
||||
file.DirEntries = new DirEntry[header.NumDirs];
|
||||
@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers
|
||||
continue;
|
||||
|
||||
// Seek to the file entry offset
|
||||
data.Seek(fileEntryOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(fileEntryOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the file entry
|
||||
var fileEntry = ParseFileEntry(data, dirEntry.Type);
|
||||
|
||||
@@ -117,7 +117,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.DibDeflatedSize > data.Length)
|
||||
{
|
||||
obj.DibDeflatedSize = 0;
|
||||
data.Seek(-4, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-4, SeekOrigin.Current);
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Peek at the next 2 bytes
|
||||
ushort peek = data.ReadUInt16LittleEndian();
|
||||
data.Seek(-2, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-2, SeekOrigin.Current);
|
||||
|
||||
// If the next value is a known Endianness
|
||||
if (Enum.IsDefined(typeof(Endianness), peek))
|
||||
|
||||
@@ -62,11 +62,11 @@ namespace SabreTools.Serialization.Readers
|
||||
var header = new ScriptHeader();
|
||||
|
||||
// Attempt to read strings at 0x12 (Short)
|
||||
data.Seek(current + 0x12, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current + 0x12, SeekOrigin.Begin);
|
||||
string? ftpUrl = data.ReadNullTerminatedAnsiString();
|
||||
string? logPath = data.ReadNullTerminatedAnsiString();
|
||||
string? messageFont = data.ReadNullTerminatedAnsiString();
|
||||
data.Seek(current, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current, SeekOrigin.Begin);
|
||||
|
||||
// If the strings are valid
|
||||
if ((ftpUrl != null && (ftpUrl.Length == 0 || ftpUrl.Split('.').Length > 2))
|
||||
@@ -85,11 +85,11 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Attempt to read strings at 0x26 (Middle)
|
||||
data.Seek(current + 0x26, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current + 0x26, SeekOrigin.Begin);
|
||||
ftpUrl = data.ReadNullTerminatedAnsiString();
|
||||
logPath = data.ReadNullTerminatedAnsiString();
|
||||
messageFont = data.ReadNullTerminatedAnsiString();
|
||||
data.Seek(current, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current, SeekOrigin.Begin);
|
||||
|
||||
// If the strings are valid
|
||||
if ((ftpUrl != null && (ftpUrl.Length == 0 || ftpUrl.Split('.').Length > 2))
|
||||
@@ -110,11 +110,11 @@ namespace SabreTools.Serialization.Readers
|
||||
}
|
||||
|
||||
// Attempt to read strings at 0x34 (Long)
|
||||
data.Seek(current + 0x34, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current + 0x34, SeekOrigin.Begin);
|
||||
ftpUrl = data.ReadNullTerminatedAnsiString();
|
||||
logPath = data.ReadNullTerminatedAnsiString();
|
||||
messageFont = data.ReadNullTerminatedAnsiString();
|
||||
data.Seek(current, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current, SeekOrigin.Begin);
|
||||
|
||||
// If the strings are valid
|
||||
if ((ftpUrl != null && (ftpUrl.Length == 0 || ftpUrl.Split('.').Length > 2))
|
||||
@@ -162,7 +162,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// Try to handle invalid string lengths
|
||||
if (str.Length > 0 && IsTypicalControlCode(str, strict: false))
|
||||
{
|
||||
data.Seek(-str.Length - 1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-str.Length - 1, SeekOrigin.Current);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ namespace SabreTools.Serialization.Readers
|
||||
long original = data.Position;
|
||||
if (str.Length == 0)
|
||||
{
|
||||
data.Seek(-1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-1, SeekOrigin.Current);
|
||||
|
||||
// Try to read the next block as an install file call
|
||||
var maybeInstall = ParseInstallFile(data, header.LanguageCount);
|
||||
@@ -178,12 +178,12 @@ namespace SabreTools.Serialization.Readers
|
||||
&& (maybeInstall.DeflateEnd - maybeInstall.DeflateStart) < data.Length
|
||||
&& (maybeInstall.DeflateEnd - maybeInstall.DeflateStart) < maybeInstall.InflatedSize)
|
||||
{
|
||||
data.Seek(original - 1, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(original - 1, SeekOrigin.Begin);
|
||||
break;
|
||||
}
|
||||
|
||||
// Otherwise, seek back to reading
|
||||
data.Seek(original, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(original, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
headerStrings.Add(str);
|
||||
@@ -285,7 +285,7 @@ namespace SabreTools.Serialization.Readers
|
||||
states.Clear();
|
||||
|
||||
// Seek to the start of the machine and try again
|
||||
data.Seek(machineStart, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(machineStart, SeekOrigin.Begin);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -422,7 +422,7 @@ namespace SabreTools.Serialization.Readers
|
||||
if (obj.Terminator != 0x00)
|
||||
{
|
||||
obj.Terminator = 0x00;
|
||||
data.Seek(-1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-1, SeekOrigin.Current);
|
||||
}
|
||||
|
||||
return obj;
|
||||
@@ -562,7 +562,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Check for an empty registry call
|
||||
uint possiblyEmpty = data.ReadUInt32LittleEndian();
|
||||
data.Seek(-4, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-4, SeekOrigin.Current);
|
||||
if (possiblyEmpty == 0x00000000)
|
||||
{
|
||||
obj.DataType = data.ReadByteValue();
|
||||
@@ -588,7 +588,7 @@ namespace SabreTools.Serialization.Readers
|
||||
&& obj.Key != null && obj.Key.Length == 0
|
||||
&& obj.NewValue != null && obj.NewValue.Length == 0)
|
||||
{
|
||||
data.Seek(-(obj.ValueName?.Length ?? 0) - 1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-(obj.ValueName?.Length ?? 0) - 1, SeekOrigin.Current);
|
||||
obj.ValueName = obj.NewValue;
|
||||
obj.NewValue = obj.Key;
|
||||
obj.Key = obj.UnknownFsllib;
|
||||
@@ -599,7 +599,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// If the last value is a control
|
||||
else if (obj.ValueName != null && IsTypicalControlCode(obj.ValueName, strict: true))
|
||||
{
|
||||
data.Seek(-obj.ValueName.Length - 1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-obj.ValueName.Length - 1, SeekOrigin.Current);
|
||||
obj.ValueName = obj.NewValue;
|
||||
obj.NewValue = obj.Key;
|
||||
obj.Key = obj.UnknownFsllib;
|
||||
@@ -794,14 +794,14 @@ namespace SabreTools.Serialization.Readers
|
||||
{
|
||||
long current = data.Position;
|
||||
byte nextByte = data.ReadByteValue();
|
||||
data.Seek(current, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current, SeekOrigin.Begin);
|
||||
|
||||
op0x18skip = nextByte == 0 || nextByte == 0xFF ? 6 : 0;
|
||||
if (nextByte == 0x09)
|
||||
{
|
||||
var possible = ParseCallDllFunction(data, languageCount, shortDllCall);
|
||||
op0x18skip = (possible.FunctionName == null || possible.FunctionName.Length == 0) ? 6 : 0;
|
||||
data.Seek(current, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(current, SeekOrigin.Begin);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -864,7 +864,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Rewind if one was found
|
||||
if (data.Position < data.Length)
|
||||
data.Seek(-1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-1, SeekOrigin.Current);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace SabreTools.Serialization.Readers
|
||||
// Find offset of "WIS", determine header length, read presumed version value
|
||||
foreach (int offset in WisOffsets)
|
||||
{
|
||||
data.Seek(initialOffset + offset, 0);
|
||||
data.SeekIfPossible(initialOffset + offset, 0);
|
||||
byte[] checkBytes = data.ReadBytes(3);
|
||||
if (!checkBytes.EqualsExactly(WisString))
|
||||
continue;
|
||||
@@ -74,14 +74,14 @@ namespace SabreTools.Serialization.Readers
|
||||
headerLength = WiseSectionHeaderLengthDictionary[offset];
|
||||
int versionOffset = WiseSectionVersionOffsetDictionary[offset];
|
||||
|
||||
data.Seek(initialOffset + offset - versionOffset, 0);
|
||||
data.SeekIfPossible(initialOffset + offset - versionOffset, 0);
|
||||
obj.Version = data.ReadBytes(versionOffset);
|
||||
wisOffset = offset;
|
||||
break;
|
||||
}
|
||||
|
||||
//Seek back to the beginning of the section
|
||||
data.Seek(initialOffset, 0);
|
||||
data.SeekIfPossible(initialOffset, 0);
|
||||
|
||||
// Read common values
|
||||
obj.UnknownDataSize = data.ReadUInt32LittleEndian();
|
||||
@@ -154,7 +154,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Not sure what this data is. Might be a wisescript?
|
||||
if (obj.UnknownDataSize != 0)
|
||||
data.Seek(obj.UnknownDataSize, SeekOrigin.Current);
|
||||
data.SeekIfPossible(obj.UnknownDataSize, SeekOrigin.Current);
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -269,7 +269,7 @@ namespace SabreTools.Serialization.Readers
|
||||
checkForZero = data.ReadByteValue();
|
||||
} while (checkForZero == 0x00);
|
||||
|
||||
data.Seek(-1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-1, SeekOrigin.Current);
|
||||
endNow = true;
|
||||
break;
|
||||
}
|
||||
@@ -295,7 +295,7 @@ namespace SabreTools.Serialization.Readers
|
||||
checkForZero = data.ReadByteValue();
|
||||
} while (checkForZero == 0x00);
|
||||
|
||||
data.Seek(-1, SeekOrigin.Current);
|
||||
data.SeekIfPossible(-1, SeekOrigin.Current);
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#region Footer
|
||||
|
||||
// Seek to the start of the footer
|
||||
data.Seek(-12, SeekOrigin.End);
|
||||
data.SeekIfPossible(-12, SeekOrigin.End);
|
||||
|
||||
// Cache the current offset
|
||||
long startOfFooter = data.Position;
|
||||
@@ -61,7 +61,7 @@ namespace SabreTools.Serialization.Readers
|
||||
|
||||
// Seek to the start of the index
|
||||
long indexOffset = startOfFooter - ((footer.BackwardSize + 1) * 4);
|
||||
data.Seek(indexOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(indexOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the index
|
||||
var index = ParseIndex(data);
|
||||
@@ -78,7 +78,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#region Blocks
|
||||
|
||||
// Seek to the start of the blocks
|
||||
data.Seek(endOfHeader, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(endOfHeader, SeekOrigin.Begin);
|
||||
|
||||
// Create the block array
|
||||
int blockCount = index.Records.Length;
|
||||
@@ -296,7 +296,7 @@ namespace SabreTools.Serialization.Readers
|
||||
ulong output = encoded.DecodeVariableLength(byteCount, out int length);
|
||||
|
||||
// Seek the actual length processed and return
|
||||
data.Seek(currentOffset + length, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentOffset + length, SeekOrigin.Begin);
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ namespace SabreTools.Serialization.Readers
|
||||
return null;
|
||||
|
||||
// Seek to the directory items
|
||||
data.Seek(directoryItemOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(directoryItemOffset, SeekOrigin.Begin);
|
||||
|
||||
// Create the directory item array
|
||||
file.DirectoryItems = new DirectoryItem[header.DirectoryItemCount];
|
||||
@@ -109,7 +109,7 @@ namespace SabreTools.Serialization.Readers
|
||||
#region Footer
|
||||
|
||||
// Seek to the footer
|
||||
data.Seek(-8, SeekOrigin.End);
|
||||
data.SeekIfPossible(-8, SeekOrigin.End);
|
||||
|
||||
// Try to parse the footer
|
||||
var footer = ParseFooter(data);
|
||||
@@ -164,13 +164,13 @@ namespace SabreTools.Serialization.Readers
|
||||
long currentPosition = data.Position;
|
||||
|
||||
// Seek to the name offset
|
||||
data.Seek(initialOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(initialOffset + obj.NameOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the name
|
||||
obj.Name = data.ReadNullTerminatedAnsiString();
|
||||
|
||||
// Seek back to the right position
|
||||
data.Seek(currentPosition, SeekOrigin.Begin);
|
||||
data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace SabreTools.Serialization
|
||||
return wrapper;
|
||||
|
||||
// Try to read the executable info
|
||||
stream.Seek(initialOffset + msdos.Model.Header.NewExeHeaderAddr, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(initialOffset + msdos.Model.Header.NewExeHeaderAddr, SeekOrigin.Begin);
|
||||
var magic = stream.ReadBytes(4);
|
||||
|
||||
// If we didn't get valid data at the offset
|
||||
@@ -98,7 +98,7 @@ namespace SabreTools.Serialization
|
||||
// New Executable
|
||||
else if (magic.StartsWith(Data.Models.NewExecutable.Constants.SignatureBytes))
|
||||
{
|
||||
stream.Seek(initialOffset, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(initialOffset, SeekOrigin.Begin);
|
||||
return NewExecutable.Create(stream);
|
||||
}
|
||||
|
||||
@@ -106,14 +106,14 @@ namespace SabreTools.Serialization
|
||||
else if (magic.StartsWith(Data.Models.LinearExecutable.Constants.LESignatureBytes)
|
||||
|| magic.StartsWith(Data.Models.LinearExecutable.Constants.LXSignatureBytes))
|
||||
{
|
||||
stream.Seek(initialOffset, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(initialOffset, SeekOrigin.Begin);
|
||||
return LinearExecutable.Create(stream);
|
||||
}
|
||||
|
||||
// Portable Executable
|
||||
else if (magic.StartsWith(Data.Models.PortableExecutable.Constants.SignatureBytes))
|
||||
{
|
||||
stream.Seek(initialOffset, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(initialOffset, SeekOrigin.Begin);
|
||||
return PortableExecutable.Create(stream);
|
||||
}
|
||||
|
||||
@@ -637,7 +637,7 @@ namespace SabreTools.Serialization
|
||||
if (magic.StartsWith(Data.Models.StarForce.Constants.SignatureBytes))
|
||||
return WrapperType.SFFS;
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
#region SGA
|
||||
|
||||
@@ -692,7 +692,7 @@ namespace SabreTools.Serialization
|
||||
if (magic.StartsWith([0x3F, 0x5F, 0x03, 0x00]))
|
||||
return WrapperType.Textfile;
|
||||
|
||||
// XML
|
||||
// XML
|
||||
// "<?xml"
|
||||
if (magic.StartsWith([0x3C, 0x3F, 0x78, 0x6D, 0x6C]))
|
||||
return WrapperType.Textfile;
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.IO;
|
||||
using SabreTools.Data.Models.GZIP;
|
||||
using SabreTools.IO.Compression.Deflate;
|
||||
using SabreTools.IO.Extensions;
|
||||
|
||||
namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
@@ -27,7 +28,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
try
|
||||
{
|
||||
// Seek to the start of the compressed data
|
||||
long offset = _dataSource.Seek(DataOffset, SeekOrigin.Begin);
|
||||
long offset = _dataSource.SeekIfPossible(DataOffset, SeekOrigin.Begin);
|
||||
if (offset != DataOffset)
|
||||
{
|
||||
if (includeDebug) Console.Error.WriteLine($"Could not seek to compressed data at {DataOffset}");
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Text.RegularExpressions;
|
||||
using SabreTools.Data.Models.InstallShieldCabinet;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.IO.Compression.zlib;
|
||||
using SabreTools.IO.Extensions;
|
||||
using static SabreTools.Data.Models.InstallShieldCabinet.Constants;
|
||||
|
||||
namespace SabreTools.Serialization.Wrappers
|
||||
@@ -823,7 +824,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
else
|
||||
_volumeBytesLeft = volumeBytesLeftExpanded;
|
||||
|
||||
_volumeFile.Seek((long)_dataOffset, SeekOrigin.Begin);
|
||||
_volumeFile.SeekIfPossible((long)_dataOffset, SeekOrigin.Begin);
|
||||
_volumeId = volume;
|
||||
|
||||
return true;
|
||||
|
||||
@@ -218,7 +218,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
try
|
||||
{
|
||||
blockStream.Seek(file.FolderStartOffset, SeekOrigin.Begin);
|
||||
blockStream.SeekIfPossible(file.FolderStartOffset, SeekOrigin.Begin);
|
||||
byte[] fileData = blockStream.ReadBytes((int)file.FileSize);
|
||||
|
||||
// Ensure directory separators are consistent
|
||||
|
||||
@@ -235,7 +235,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private bool ExtractWiseOverlay(string outputDirectory, bool includeDebug, Stream source, long offset)
|
||||
{
|
||||
// Seek to the overlay and parse
|
||||
source.Seek(offset, SeekOrigin.Begin);
|
||||
source.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
var header = WiseOverlayHeader.Create(source);
|
||||
if (header == null)
|
||||
{
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
_dataSource.Seek(offset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
var relocationData = Readers.NewExecutable.ParsePerSegmentData(_dataSource);
|
||||
|
||||
offset = _dataSource.Position;
|
||||
@@ -115,7 +115,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
/// <summary>
|
||||
/// Overlay data, if it exists
|
||||
/// </summary>
|
||||
/// <remarks>Caches up to 0x10000 bytes</remarks>
|
||||
/// <remarks>Caches up to 0x10000 bytes</remarks>
|
||||
/// <see href="https://codeberg.org/CYBERDEV/REWise/src/branch/master/src/exefile.c"/>
|
||||
public byte[] OverlayData
|
||||
{
|
||||
@@ -303,7 +303,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private long? _overlayAddress = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlayAddress"/>
|
||||
/// Lock object for <see cref="_overlayAddress"/>
|
||||
/// </summary>
|
||||
private readonly object _overlayAddressLock = new();
|
||||
|
||||
@@ -313,7 +313,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _overlayData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlayData"/>
|
||||
/// Lock object for <see cref="_overlayData"/>
|
||||
/// </summary>
|
||||
private readonly object _overlayDataLock = new();
|
||||
|
||||
@@ -323,7 +323,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private long _overlaySize = -1;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlaySize"/>
|
||||
/// Lock object for <see cref="_overlaySize"/>
|
||||
/// </summary>
|
||||
private readonly object _overlaySizeLock = new();
|
||||
|
||||
@@ -333,7 +333,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private List<string>? _overlayStrings = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlayStrings"/>
|
||||
/// Lock object for <see cref="_overlayStrings"/>
|
||||
/// </summary>
|
||||
private readonly object _overlayStringsLock = new();
|
||||
|
||||
@@ -343,7 +343,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _stubExecutableData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_stubExecutableData"/>
|
||||
/// Lock object for <see cref="_stubExecutableData"/>
|
||||
/// </summary>
|
||||
private readonly object _stubExecutableDataLock = new();
|
||||
|
||||
@@ -441,18 +441,18 @@ namespace SabreTools.Serialization.Wrappers
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
// Attempt to get the overlay header
|
||||
_dataSource.Seek(overlayOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(overlayOffset, SeekOrigin.Begin);
|
||||
var header = WiseOverlayHeader.Create(_dataSource);
|
||||
if (header != null)
|
||||
return overlayOffset;
|
||||
|
||||
// Align and loop to see if it can be found
|
||||
_dataSource.Seek(overlayOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(overlayOffset, SeekOrigin.Begin);
|
||||
_dataSource.AlignToBoundary(0x10);
|
||||
overlayOffset = _dataSource.Position;
|
||||
while (_dataSource.Position < Length)
|
||||
{
|
||||
_dataSource.Seek(overlayOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(overlayOffset, SeekOrigin.Begin);
|
||||
header = WiseOverlayHeader.Create(_dataSource);
|
||||
if (header != null)
|
||||
return overlayOffset;
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
try
|
||||
{
|
||||
// Ensure the stream is starting at the beginning
|
||||
_dataSource.Seek(0, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
|
||||
// Try to deserialize the source data
|
||||
var deserializer = new Readers.AdvancedInstaller();
|
||||
@@ -182,7 +182,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
// Ensure the stream is starting at the overlay address
|
||||
_dataSource.Seek(overlayAddress, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(overlayAddress, SeekOrigin.Begin);
|
||||
|
||||
while (_dataSource.Position < _dataSource.Length)
|
||||
{
|
||||
@@ -623,7 +623,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
try
|
||||
{
|
||||
// Ensure the stream is starting at the beginning
|
||||
_dataSource.Seek(0, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
|
||||
// Try to deserialize the source data
|
||||
var deserializer = new Readers.SpoonInstaller();
|
||||
@@ -704,7 +704,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
return false;
|
||||
|
||||
// Seek to the overlay and parse
|
||||
source.Seek(offset, SeekOrigin.Begin);
|
||||
source.SeekIfPossible(offset, SeekOrigin.Begin);
|
||||
var header = WiseOverlayHeader.Create(source);
|
||||
if (header == null)
|
||||
{
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
/// <summary>
|
||||
/// Entry point data, if it exists
|
||||
/// </summary>
|
||||
/// <remarks>Caches up to 128 bytes</remarks>
|
||||
/// <remarks>Caches up to 128 bytes</remarks>
|
||||
public byte[] EntryPointData
|
||||
{
|
||||
get
|
||||
@@ -348,7 +348,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
/// <summary>
|
||||
/// Overlay data, if it exists
|
||||
/// </summary>
|
||||
/// <remarks>Caches up to 0x10000 bytes</remarks>
|
||||
/// <remarks>Caches up to 0x10000 bytes</remarks>
|
||||
/// <see href="https://www.autoitscript.com/forum/topic/153277-pe-file-overlay-extraction/"/>
|
||||
public byte[] OverlayData
|
||||
{
|
||||
@@ -904,7 +904,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private readonly Dictionary<int, object> _debugData = [];
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_debugData"/>
|
||||
/// Lock object for <see cref="_debugData"/>
|
||||
/// </summary>
|
||||
private readonly object _debugDataLock = new();
|
||||
|
||||
@@ -914,7 +914,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _entryPointData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_entryPointData"/>
|
||||
/// Lock object for <see cref="_entryPointData"/>
|
||||
/// </summary>
|
||||
private readonly object _entryPointDataLock = new();
|
||||
|
||||
@@ -924,7 +924,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _headerPaddingData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_headerPaddingData"/>
|
||||
/// Lock object for <see cref="_headerPaddingData"/>
|
||||
/// </summary>
|
||||
private readonly object _headerPaddingDataLock = new();
|
||||
|
||||
@@ -934,7 +934,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private List<string>? _headerPaddingStrings = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_headerPaddingStrings"/>
|
||||
/// Lock object for <see cref="_headerPaddingStrings"/>
|
||||
/// </summary>
|
||||
private readonly object _headerPaddingStringsLock = new();
|
||||
|
||||
@@ -944,12 +944,12 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private SecuROMMatroschkaPackage? _matroschkaPackage = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_matroschkaPackage"/>
|
||||
/// Lock object for <see cref="_matroschkaPackage"/>
|
||||
/// </summary>
|
||||
private readonly object _matroschkaPackageLock = new();
|
||||
|
||||
/// <summary>
|
||||
/// Cached attempt at creation for <see cref="_matroschkaPackage"/>
|
||||
/// Cached attempt at creation for <see cref="_matroschkaPackage"/>
|
||||
/// </summary>
|
||||
private bool _matroschkaPackageFailed = false;
|
||||
|
||||
@@ -959,7 +959,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private long? _overlayAddress = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlayAddress"/>
|
||||
/// Lock object for <see cref="_overlayAddress"/>
|
||||
/// </summary>
|
||||
private readonly object _overlayAddressLock = new();
|
||||
|
||||
@@ -969,7 +969,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _overlayData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlayData"/>
|
||||
/// Lock object for <see cref="_overlayData"/>
|
||||
/// </summary>
|
||||
private readonly object _overlayDataLock = new();
|
||||
|
||||
@@ -979,7 +979,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private long _overlaySize = -1;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlaySize"/>
|
||||
/// Lock object for <see cref="_overlaySize"/>
|
||||
/// </summary>
|
||||
private readonly object _overlaySizeLock = new();
|
||||
|
||||
@@ -989,7 +989,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private List<string>? _overlayStrings = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_overlayStrings"/>
|
||||
/// Lock object for <see cref="_overlayStrings"/>
|
||||
/// </summary>
|
||||
private readonly object _overlayStringsLock = new();
|
||||
|
||||
@@ -999,7 +999,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private readonly Dictionary<string, object?> _resourceData = [];
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_resourceData"/>
|
||||
/// Lock object for <see cref="_resourceData"/>
|
||||
/// </summary>
|
||||
private readonly object _resourceDataLock = new();
|
||||
|
||||
@@ -1009,7 +1009,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private string[]? _sectionNames = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_sectionNames"/>
|
||||
/// Lock object for <see cref="_sectionNames"/>
|
||||
/// </summary>
|
||||
private readonly object _sectionNamesLock = new();
|
||||
|
||||
@@ -1024,7 +1024,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private List<string>?[]? _sectionStringData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_sectionStringData"/>
|
||||
/// Lock object for <see cref="_sectionStringData"/>
|
||||
/// </summary>
|
||||
private readonly object _sectionStringDataLock = new();
|
||||
|
||||
@@ -1034,7 +1034,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _sectionTableTrailerData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_sectionTableTrailerData"/>
|
||||
/// Lock object for <see cref="_sectionTableTrailerData"/>
|
||||
/// </summary>
|
||||
private readonly object _sectionTableTrailerDataLock = new();
|
||||
|
||||
@@ -1044,7 +1044,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private byte[]? _stubExecutableData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_stubExecutableData"/>
|
||||
/// Lock object for <see cref="_stubExecutableData"/>
|
||||
/// </summary>
|
||||
private readonly object _stubExecutableDataLock = new();
|
||||
|
||||
@@ -1064,12 +1064,12 @@ namespace SabreTools.Serialization.Wrappers
|
||||
private WiseSectionHeader? _wiseSectionHeader = null;
|
||||
|
||||
/// <summary>
|
||||
/// Lock object for <see cref="_wiseSectionHeader"/>
|
||||
/// Lock object for <see cref="_wiseSectionHeader"/>
|
||||
/// </summary>
|
||||
private readonly object _wiseSectionHeaderLock = new();
|
||||
|
||||
/// <summary>
|
||||
/// Indicates if <see cref="_wiseSectionHeader"/> cannot be found
|
||||
/// Indicates if <see cref="_wiseSectionHeader"/> cannot be found
|
||||
/// </summary>
|
||||
private bool _wiseSectionHeaderMissing = false;
|
||||
|
||||
@@ -1606,7 +1606,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
// Attempt to get the overlay header
|
||||
if (overlayOffset >= 0 && overlayOffset < Length)
|
||||
{
|
||||
_dataSource.Seek(overlayOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(overlayOffset, SeekOrigin.Begin);
|
||||
var header = WiseOverlayHeader.Create(_dataSource);
|
||||
if (header != null)
|
||||
return overlayOffset;
|
||||
@@ -1617,7 +1617,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
string sectionName = Encoding.ASCII.GetString(section.Name ?? []).TrimEnd('\0');
|
||||
long sectionOffset = section.VirtualAddress.ConvertVirtualAddress(SectionTable);
|
||||
_dataSource.Seek(sectionOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(sectionOffset, SeekOrigin.Begin);
|
||||
|
||||
var header = WiseOverlayHeader.Create(_dataSource);
|
||||
if (header != null)
|
||||
@@ -1628,14 +1628,14 @@ namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
// Data immediately following
|
||||
long afterResourceOffset = sectionOffset + section.SizeOfRawData;
|
||||
_dataSource.Seek(afterResourceOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(afterResourceOffset, SeekOrigin.Begin);
|
||||
|
||||
header = WiseOverlayHeader.Create(_dataSource);
|
||||
if (header != null)
|
||||
return afterResourceOffset;
|
||||
|
||||
// Data following padding data
|
||||
_dataSource.Seek(afterResourceOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(afterResourceOffset, SeekOrigin.Begin);
|
||||
_ = _dataSource.ReadNullTerminatedAnsiString();
|
||||
|
||||
afterResourceOffset = _dataSource.Position;
|
||||
@@ -1681,7 +1681,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
// Search the resource table data for the offset
|
||||
long resourceOffset = -1;
|
||||
_dataSource.Seek(resourceTableOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(resourceTableOffset, SeekOrigin.Begin);
|
||||
while (_dataSource.Position < resourceTableOffset + OptionalHeader.ResourceTable.Size && _dataSource.Position < _dataSource.Length)
|
||||
{
|
||||
ushort possibleSignature = _dataSource.ReadUInt16();
|
||||
@@ -1691,7 +1691,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
break;
|
||||
}
|
||||
|
||||
_dataSource.Seek(-1, SeekOrigin.Current);
|
||||
_dataSource.SeekIfPossible(-1, SeekOrigin.Current);
|
||||
}
|
||||
|
||||
// If there was no valid offset, somehow
|
||||
@@ -1699,7 +1699,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
return -1;
|
||||
|
||||
// Parse the executable and recurse
|
||||
_dataSource.Seek(resourceOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(resourceOffset, SeekOrigin.Begin);
|
||||
var resourceExe = WrapperFactory.CreateExecutableWrapper(_dataSource);
|
||||
if (resourceExe is not PortableExecutable resourcePex)
|
||||
return -1;
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
archiveStream = File.Open(archiveFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
|
||||
// Seek to the data
|
||||
archiveStream.Seek(directoryItem.DirectoryEntry.EntryOffset, SeekOrigin.Begin);
|
||||
archiveStream.SeekIfPossible(directoryItem.DirectoryEntry.EntryOffset, SeekOrigin.Begin);
|
||||
|
||||
// Read the directory item bytes
|
||||
data = archiveStream.ReadBytes((int)directoryItem.DirectoryEntry.EntryLength);
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.IO;
|
||||
using SabreTools.Data.Models.WiseInstaller.Actions;
|
||||
using SabreTools.IO.Compression.Deflate;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Streams;
|
||||
|
||||
namespace SabreTools.Serialization.Wrappers
|
||||
@@ -20,7 +21,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
// Seek to the compressed data offset
|
||||
_dataSource.Seek(CompressedDataOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(CompressedDataOffset, SeekOrigin.Begin);
|
||||
if (includeDebug) Console.WriteLine($"Beginning of header-defined files: {CompressedDataOffset}");
|
||||
|
||||
// Extract WiseColors.dib, if it exists
|
||||
@@ -102,7 +103,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
/// <param name="outputDirectory">Output directory to write to</param>
|
||||
/// <param name="includeDebug">True to include debug data, false otherwise</param>
|
||||
/// <returns>True if the file extracted successfully, false otherwise</returns>
|
||||
/// <remarks>Requires <see cref="InstallerDataOffset"/> to be set</remarks>
|
||||
/// <remarks>Requires <see cref="InstallerDataOffset"/> to be set</remarks>
|
||||
public ExtractionStatus ExtractFile(InstallFile obj, int index, string outputDirectory, bool includeDebug)
|
||||
{
|
||||
// Get expected values
|
||||
@@ -119,7 +120,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
_dataSource.Seek(InstallerDataOffset + obj.DeflateStart, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(InstallerDataOffset + obj.DeflateStart, SeekOrigin.Begin);
|
||||
return InflateWrapper.ExtractFile(_dataSource,
|
||||
filename,
|
||||
outputDirectory,
|
||||
@@ -136,7 +137,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
/// <param name="outputDirectory">Output directory to write to</param>
|
||||
/// <param name="includeDebug">True to include debug data, false otherwise</param>
|
||||
/// <returns>True if the file extracted successfully, false otherwise</returns>
|
||||
/// <remarks>Requires <see cref="InstallerDataOffset"/> to be set</remarks>
|
||||
/// <remarks>Requires <see cref="InstallerDataOffset"/> to be set</remarks>
|
||||
public ExtractionStatus ExtractFile(DisplayBillboard obj, string outputDirectory, bool includeDebug)
|
||||
{
|
||||
// Get the generated base name
|
||||
@@ -168,7 +169,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
_dataSource.Seek(InstallerDataOffset + info.DeflateStart, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(InstallerDataOffset + info.DeflateStart, SeekOrigin.Begin);
|
||||
_ = InflateWrapper.ExtractFile(_dataSource, filename, outputDirectory, expected, IsPKZIP, includeDebug);
|
||||
}
|
||||
}
|
||||
@@ -184,7 +185,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
/// <param name="outputDirectory">Output directory to write to</param>
|
||||
/// <param name="includeDebug">True to include debug data, false otherwise</param>
|
||||
/// <returns>True if the file extracted successfully, false otherwise</returns>
|
||||
/// <remarks>Requires <see cref="InstallerDataOffset"/> to be set</remarks>
|
||||
/// <remarks>Requires <see cref="InstallerDataOffset"/> to be set</remarks>
|
||||
public ExtractionStatus ExtractFile(CustomDialogSet obj, string outputDirectory, bool includeDebug)
|
||||
{
|
||||
// Get expected values
|
||||
@@ -201,7 +202,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
_dataSource.Seek(InstallerDataOffset + obj.DeflateStart, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(InstallerDataOffset + obj.DeflateStart, SeekOrigin.Begin);
|
||||
return InflateWrapper.ExtractFile(_dataSource, filename, outputDirectory, expected, IsPKZIP, includeDebug);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
lock (_dataSourceLock)
|
||||
{
|
||||
// Seek to the compressed data offset
|
||||
_dataSource.Seek(CompressedDataOffset, SeekOrigin.Begin);
|
||||
_dataSource.SeekIfPossible(CompressedDataOffset, SeekOrigin.Begin);
|
||||
bool successful = true;
|
||||
|
||||
// Extract first executable, if it exists
|
||||
@@ -60,7 +60,7 @@ namespace SabreTools.Serialization.Wrappers
|
||||
{
|
||||
// Fallback- seek to the position that's the length of the MSI file entry from the end, then try and
|
||||
// extract from there.
|
||||
_dataSource.Seek(-MsiFileEntryLength + 1, SeekOrigin.End);
|
||||
_dataSource.SeekIfPossible(-MsiFileEntryLength + 1, SeekOrigin.End);
|
||||
if (ExtractFile("ExtractedMsi.msi", outputDirectory, MsiFileEntryLength, includeDebug) != ExtractionStatus.GOOD)
|
||||
return false; // The fallback also failed.
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.AttractMode;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -136,7 +137,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteRows(obj.Row, writer, longHeader);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.ClrMamePro;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -76,7 +77,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteGames(obj.Game, writer);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.CueSheets;
|
||||
using SabreTools.IO.Extensions;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
{
|
||||
@@ -32,7 +33,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteCueSheet(obj, writer);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.DosCenter;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -28,7 +29,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteGames(obj.Game, writer);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.EverdriveSMDB;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -23,7 +24,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteRows(obj.Row, writer);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.Hashfile;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -117,7 +118,7 @@ namespace SabreTools.Serialization.Writers
|
||||
}
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
using SabreTools.IO.Extensions;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
{
|
||||
@@ -95,7 +96,7 @@ namespace SabreTools.Serialization.Writers
|
||||
|
||||
// Perform the deserialization and return
|
||||
serializer.Serialize(jsonWriter, obj);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.Listrom;
|
||||
using SabreTools.IO.Extensions;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
{
|
||||
@@ -21,7 +22,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteSets(obj.Set, writer);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.RomCenter;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -31,7 +32,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteGames(obj.Games, writer);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.Data.Models.SeparatedValue;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.IO.Writers;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
@@ -123,7 +124,7 @@ namespace SabreTools.Serialization.Writers
|
||||
WriteRows(obj.Row, writer, longHeader);
|
||||
|
||||
// Return the stream
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using SabreTools.IO.Extensions;
|
||||
|
||||
namespace SabreTools.Serialization.Writers
|
||||
{
|
||||
@@ -120,7 +121,7 @@ namespace SabreTools.Serialization.Writers
|
||||
|
||||
// Perform the deserialization and return
|
||||
serializer.Serialize(xmlWriter, obj, namespaces);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user