Seek, if possible

This commit is contained in:
Matt Nadareski
2025-10-27 22:43:56 -04:00
parent 15109bed88
commit ce394eb4e9
60 changed files with 271 additions and 257 deletions

View File

@@ -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)
{

View File

@@ -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('.');

View File

@@ -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

View File

@@ -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();

View File

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

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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)

View File

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

View File

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

View File

@@ -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);

View File

@@ -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];

View File

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

View File

@@ -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];

View File

@@ -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)

View File

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

View 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;
}

View File

@@ -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>();

View File

@@ -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];

View File

@@ -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);

View File

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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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}"))

View File

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

View File

@@ -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();

View File

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

View File

@@ -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)

View File

@@ -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

View File

@@ -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);

View File

@@ -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))

View File

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

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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}");

View File

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

View File

@@ -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

View File

@@ -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)
{

View File

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

View File

@@ -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)
{

View File

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

View File

@@ -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);

View File

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

View File

@@ -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.
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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