From ce394eb4e9ff0970992f401d4168534d087f3161 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 27 Oct 2025 22:43:56 -0400 Subject: [PATCH] Seek, if possible --- ExtractionTool/Features/MainFeature.cs | 2 +- InfoPrint/Features/MainFeature.cs | 2 +- SabreTools.Serialization/Readers/AACS.cs | 2 +- .../Readers/AdvancedInstaller.cs | 12 ++--- SabreTools.Serialization/Readers/BFPK.cs | 4 +- SabreTools.Serialization/Readers/BSP.cs | 2 +- SabreTools.Serialization/Readers/CFB.cs | 8 +-- SabreTools.Serialization/Readers/CIA.cs | 4 +- SabreTools.Serialization/Readers/GCF.cs | 6 +-- SabreTools.Serialization/Readers/GZip.cs | 4 +- .../Readers/InstallShieldArchiveV3.cs | 6 +-- .../Readers/InstallShieldCabinet.cs | 50 +++++++++--------- .../Readers/LinearExecutable.cs | 30 +++++------ SabreTools.Serialization/Readers/MSDOS.cs | 2 +- .../Readers/MicrosoftCabinet.cs | 6 +-- SabreTools.Serialization/Readers/MoPaQ.cs | 6 +-- SabreTools.Serialization/Readers/N3DS.cs | 6 +-- SabreTools.Serialization/Readers/NCF.cs | 6 +-- .../Readers/NewExecutable.cs | 22 ++++---- SabreTools.Serialization/Readers/Nitro.cs | 6 +-- SabreTools.Serialization/Readers/PAK.cs | 2 +- SabreTools.Serialization/Readers/PFF.cs | 4 +- SabreTools.Serialization/Readers/PKZIP.cs | 22 ++++---- .../Readers/PlayJAudio.cs | 6 +-- .../Readers/PortableExecutable.cs | 24 ++++----- SabreTools.Serialization/Readers/SGA.cs | 32 ++++++------ .../Readers/SecuROMAddD.cs | 2 +- .../Readers/SecuROMMatroschkaPackage.cs | 10 ++-- .../Readers/SpoonInstaller.cs | 4 +- .../Readers/TapeArchive.cs | 2 +- SabreTools.Serialization/Readers/VBSP.cs | 2 +- SabreTools.Serialization/Readers/VPK.cs | 4 +- SabreTools.Serialization/Readers/WAD3.cs | 4 +- .../Readers/WiseOverlayHeader.cs | 4 +- .../Readers/WiseScript.cs | 36 ++++++------- .../Readers/WiseSectionHeader.cs | 12 ++--- SabreTools.Serialization/Readers/XZ.cs | 8 +-- SabreTools.Serialization/Readers/XZP.cs | 8 +-- SabreTools.Serialization/WrapperFactory.cs | 12 ++--- .../Wrappers/GZip.Extraction.cs | 3 +- .../InstallShieldCabinet.Extraction.cs | 3 +- .../Wrappers/MicrosoftCabinet.Extraction.cs | 2 +- .../Wrappers/NewExecutable.Extraction.cs | 2 +- .../Wrappers/NewExecutable.cs | 20 +++---- .../Wrappers/PortableExecutable.Extraction.cs | 8 +-- .../Wrappers/PortableExecutable.cs | 52 +++++++++---------- .../Wrappers/VPK.Extraction.cs | 2 +- .../Wrappers/WiseOverlayHeader.Extraction.cs | 15 +++--- .../Wrappers/WiseSectionHeader.Extraction.cs | 4 +- .../Writers/AttractMode.cs | 3 +- .../Writers/ClrMamePro.cs | 3 +- SabreTools.Serialization/Writers/CueSheet.cs | 3 +- SabreTools.Serialization/Writers/DosCenter.cs | 3 +- .../Writers/EverdriveSMDB.cs | 3 +- SabreTools.Serialization/Writers/Hashfile.cs | 3 +- SabreTools.Serialization/Writers/JsonFile.cs | 3 +- SabreTools.Serialization/Writers/Listrom.cs | 3 +- SabreTools.Serialization/Writers/RomCenter.cs | 3 +- .../Writers/SeparatedValue.cs | 3 +- SabreTools.Serialization/Writers/XmlFile.cs | 3 +- 60 files changed, 271 insertions(+), 257 deletions(-) diff --git a/ExtractionTool/Features/MainFeature.cs b/ExtractionTool/Features/MainFeature.cs index 455ef2ee..763fb463 100644 --- a/ExtractionTool/Features/MainFeature.cs +++ b/ExtractionTool/Features/MainFeature.cs @@ -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) { diff --git a/InfoPrint/Features/MainFeature.cs b/InfoPrint/Features/MainFeature.cs index cc6d7ea2..4682c53a 100644 --- a/InfoPrint/Features/MainFeature.cs +++ b/InfoPrint/Features/MainFeature.cs @@ -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('.'); diff --git a/SabreTools.Serialization/Readers/AACS.cs b/SabreTools.Serialization/Readers/AACS.cs index f15c7cb4..2744fb68 100644 --- a/SabreTools.Serialization/Readers/AACS.cs +++ b/SabreTools.Serialization/Readers/AACS.cs @@ -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 diff --git a/SabreTools.Serialization/Readers/AdvancedInstaller.cs b/SabreTools.Serialization/Readers/AdvancedInstaller.cs index d7300c3b..03f652b0 100644 --- a/SabreTools.Serialization/Readers/AdvancedInstaller.cs +++ b/SabreTools.Serialization/Readers/AdvancedInstaller.cs @@ -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(); diff --git a/SabreTools.Serialization/Readers/BFPK.cs b/SabreTools.Serialization/Readers/BFPK.cs index 5280864e..bce46202 100644 --- a/SabreTools.Serialization/Readers/BFPK.cs +++ b/SabreTools.Serialization/Readers/BFPK.cs @@ -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; diff --git a/SabreTools.Serialization/Readers/BSP.cs b/SabreTools.Serialization/Readers/BSP.cs index 22b8f3bd..7ba55ee7 100644 --- a/SabreTools.Serialization/Readers/BSP.cs +++ b/SabreTools.Serialization/Readers/BSP.cs @@ -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) diff --git a/SabreTools.Serialization/Readers/CFB.cs b/SabreTools.Serialization/Readers/CFB.cs index ed226e27..8a5fd472 100644 --- a/SabreTools.Serialization/Readers/CFB.cs +++ b/SabreTools.Serialization/Readers/CFB.cs @@ -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); diff --git a/SabreTools.Serialization/Readers/CIA.cs b/SabreTools.Serialization/Readers/CIA.cs index 26e7c4df..36d72f0a 100644 --- a/SabreTools.Serialization/Readers/CIA.cs +++ b/SabreTools.Serialization/Readers/CIA.cs @@ -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); diff --git a/SabreTools.Serialization/Readers/GCF.cs b/SabreTools.Serialization/Readers/GCF.cs index 157fd48f..ad0a2005 100644 --- a/SabreTools.Serialization/Readers/GCF.cs +++ b/SabreTools.Serialization/Readers/GCF.cs @@ -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 diff --git a/SabreTools.Serialization/Readers/GZip.cs b/SabreTools.Serialization/Readers/GZip.cs index a9ae1b7b..b2628deb 100644 --- a/SabreTools.Serialization/Readers/GZip.cs +++ b/SabreTools.Serialization/Readers/GZip.cs @@ -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 extraFields = []; while (data.Position < currentPosition + obj.ExtraLength) diff --git a/SabreTools.Serialization/Readers/InstallShieldArchiveV3.cs b/SabreTools.Serialization/Readers/InstallShieldArchiveV3.cs index b1586057..e66e979a 100644 --- a/SabreTools.Serialization/Readers/InstallShieldArchiveV3.cs +++ b/SabreTools.Serialization/Readers/InstallShieldArchiveV3.cs @@ -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(); @@ -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); } } diff --git a/SabreTools.Serialization/Readers/InstallShieldCabinet.cs b/SabreTools.Serialization/Readers/InstallShieldCabinet.cs index 7c122036..249bd175 100644 --- a/SabreTools.Serialization/Readers/InstallShieldCabinet.cs +++ b/SabreTools.Serialization/Readers/InstallShieldCabinet.cs @@ -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; } diff --git a/SabreTools.Serialization/Readers/LinearExecutable.cs b/SabreTools.Serialization/Readers/LinearExecutable.cs index 62846e3a..0f437515 100644 --- a/SabreTools.Serialization/Readers/LinearExecutable.cs +++ b/SabreTools.Serialization/Readers/LinearExecutable.cs @@ -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(); @@ -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(); @@ -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(); @@ -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); diff --git a/SabreTools.Serialization/Readers/MSDOS.cs b/SabreTools.Serialization/Readers/MSDOS.cs index 9e8aa847..5c5522eb 100644 --- a/SabreTools.Serialization/Readers/MSDOS.cs +++ b/SabreTools.Serialization/Readers/MSDOS.cs @@ -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]; diff --git a/SabreTools.Serialization/Readers/MicrosoftCabinet.cs b/SabreTools.Serialization/Readers/MicrosoftCabinet.cs index dc728b4a..59107f48 100644 --- a/SabreTools.Serialization/Readers/MicrosoftCabinet.cs +++ b/SabreTools.Serialization/Readers/MicrosoftCabinet.cs @@ -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; diff --git a/SabreTools.Serialization/Readers/MoPaQ.cs b/SabreTools.Serialization/Readers/MoPaQ.cs index 9d9d4b9e..04a669b5 100644 --- a/SabreTools.Serialization/Readers/MoPaQ.cs +++ b/SabreTools.Serialization/Readers/MoPaQ.cs @@ -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]; diff --git a/SabreTools.Serialization/Readers/N3DS.cs b/SabreTools.Serialization/Readers/N3DS.cs index dec7e5ed..6010441b 100644 --- a/SabreTools.Serialization/Readers/N3DS.cs +++ b/SabreTools.Serialization/Readers/N3DS.cs @@ -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) diff --git a/SabreTools.Serialization/Readers/NCF.cs b/SabreTools.Serialization/Readers/NCF.cs index c3a5a214..9539742b 100644 --- a/SabreTools.Serialization/Readers/NCF.cs +++ b/SabreTools.Serialization/Readers/NCF.cs @@ -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; } diff --git a/SabreTools.Serialization/Readers/NewExecutable.cs b/SabreTools.Serialization/Readers/NewExecutable.cs index dc3df703..19e430bb 100644 --- a/SabreTools.Serialization/Readers/NewExecutable.cs +++ b/SabreTools.Serialization/Readers/NewExecutable.cs @@ -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; } diff --git a/SabreTools.Serialization/Readers/Nitro.cs b/SabreTools.Serialization/Readers/Nitro.cs index be0a7d06..50038fe3 100644 --- a/SabreTools.Serialization/Readers/Nitro.cs +++ b/SabreTools.Serialization/Readers/Nitro.cs @@ -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(); diff --git a/SabreTools.Serialization/Readers/PAK.cs b/SabreTools.Serialization/Readers/PAK.cs index a98efbcb..fedf986a 100644 --- a/SabreTools.Serialization/Readers/PAK.cs +++ b/SabreTools.Serialization/Readers/PAK.cs @@ -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]; diff --git a/SabreTools.Serialization/Readers/PFF.cs b/SabreTools.Serialization/Readers/PFF.cs index 1ff2fdd5..9990ae57 100644 --- a/SabreTools.Serialization/Readers/PFF.cs +++ b/SabreTools.Serialization/Readers/PFF.cs @@ -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); diff --git a/SabreTools.Serialization/Readers/PKZIP.cs b/SabreTools.Serialization/Readers/PKZIP.cs index b09a4488..9e8a2f3b 100644 --- a/SabreTools.Serialization/Readers/PKZIP.cs +++ b/SabreTools.Serialization/Readers/PKZIP.cs @@ -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; diff --git a/SabreTools.Serialization/Readers/PlayJAudio.cs b/SabreTools.Serialization/Readers/PlayJAudio.cs index bb0a9379..d906de68 100644 --- a/SabreTools.Serialization/Readers/PlayJAudio.cs +++ b/SabreTools.Serialization/Readers/PlayJAudio.cs @@ -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 diff --git a/SabreTools.Serialization/Readers/PortableExecutable.cs b/SabreTools.Serialization/Readers/PortableExecutable.cs index 2f45d654..36053e1e 100644 --- a/SabreTools.Serialization/Readers/PortableExecutable.cs +++ b/SabreTools.Serialization/Readers/PortableExecutable.cs @@ -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); } } diff --git a/SabreTools.Serialization/Readers/SGA.cs b/SabreTools.Serialization/Readers/SGA.cs index 97f41071..a05fce01 100644 --- a/SabreTools.Serialization/Readers/SGA.cs +++ b/SabreTools.Serialization/Readers/SGA.cs @@ -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 diff --git a/SabreTools.Serialization/Readers/SecuROMAddD.cs b/SabreTools.Serialization/Readers/SecuROMAddD.cs index 63c66c11..e1a41027 100644 --- a/SabreTools.Serialization/Readers/SecuROMAddD.cs +++ b/SabreTools.Serialization/Readers/SecuROMAddD.cs @@ -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}")) diff --git a/SabreTools.Serialization/Readers/SecuROMMatroschkaPackage.cs b/SabreTools.Serialization/Readers/SecuROMMatroschkaPackage.cs index 1f45065c..a51f29a0 100644 --- a/SabreTools.Serialization/Readers/SecuROMMatroschkaPackage.cs +++ b/SabreTools.Serialization/Readers/SecuROMMatroschkaPackage.cs @@ -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; } } -} \ No newline at end of file +} diff --git a/SabreTools.Serialization/Readers/SpoonInstaller.cs b/SabreTools.Serialization/Readers/SpoonInstaller.cs index 6e53eeee..51ddcdc7 100644 --- a/SabreTools.Serialization/Readers/SpoonInstaller.cs +++ b/SabreTools.Serialization/Readers/SpoonInstaller.cs @@ -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(); diff --git a/SabreTools.Serialization/Readers/TapeArchive.cs b/SabreTools.Serialization/Readers/TapeArchive.cs index bc3af5a2..5d319cf7 100644 --- a/SabreTools.Serialization/Readers/TapeArchive.cs +++ b/SabreTools.Serialization/Readers/TapeArchive.cs @@ -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; diff --git a/SabreTools.Serialization/Readers/VBSP.cs b/SabreTools.Serialization/Readers/VBSP.cs index e7666a62..59628ae2 100644 --- a/SabreTools.Serialization/Readers/VBSP.cs +++ b/SabreTools.Serialization/Readers/VBSP.cs @@ -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) diff --git a/SabreTools.Serialization/Readers/VPK.cs b/SabreTools.Serialization/Readers/VPK.cs index e62303bd..d10ee229 100644 --- a/SabreTools.Serialization/Readers/VPK.cs +++ b/SabreTools.Serialization/Readers/VPK.cs @@ -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 diff --git a/SabreTools.Serialization/Readers/WAD3.cs b/SabreTools.Serialization/Readers/WAD3.cs index e9219d8f..63e66d38 100644 --- a/SabreTools.Serialization/Readers/WAD3.cs +++ b/SabreTools.Serialization/Readers/WAD3.cs @@ -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); diff --git a/SabreTools.Serialization/Readers/WiseOverlayHeader.cs b/SabreTools.Serialization/Readers/WiseOverlayHeader.cs index 8542ad02..e6dbdfe0 100644 --- a/SabreTools.Serialization/Readers/WiseOverlayHeader.cs +++ b/SabreTools.Serialization/Readers/WiseOverlayHeader.cs @@ -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)) diff --git a/SabreTools.Serialization/Readers/WiseScript.cs b/SabreTools.Serialization/Readers/WiseScript.cs index 2850fb45..670eaa48 100644 --- a/SabreTools.Serialization/Readers/WiseScript.cs +++ b/SabreTools.Serialization/Readers/WiseScript.cs @@ -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; } diff --git a/SabreTools.Serialization/Readers/WiseSectionHeader.cs b/SabreTools.Serialization/Readers/WiseSectionHeader.cs index b2573247..7726afd1 100644 --- a/SabreTools.Serialization/Readers/WiseSectionHeader.cs +++ b/SabreTools.Serialization/Readers/WiseSectionHeader.cs @@ -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 diff --git a/SabreTools.Serialization/Readers/XZ.cs b/SabreTools.Serialization/Readers/XZ.cs index 9ee7ce8a..05da9949 100644 --- a/SabreTools.Serialization/Readers/XZ.cs +++ b/SabreTools.Serialization/Readers/XZ.cs @@ -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; } } diff --git a/SabreTools.Serialization/Readers/XZP.cs b/SabreTools.Serialization/Readers/XZP.cs index 9a999a72..8fbf07ef 100644 --- a/SabreTools.Serialization/Readers/XZP.cs +++ b/SabreTools.Serialization/Readers/XZP.cs @@ -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; } diff --git a/SabreTools.Serialization/WrapperFactory.cs b/SabreTools.Serialization/WrapperFactory.cs index 16cd18c7..8e16b504 100644 --- a/SabreTools.Serialization/WrapperFactory.cs +++ b/SabreTools.Serialization/WrapperFactory.cs @@ -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 // " /// Overlay data, if it exists /// - /// Caches up to 0x10000 bytes + /// Caches up to 0x10000 bytes /// public byte[] OverlayData { @@ -303,7 +303,7 @@ namespace SabreTools.Serialization.Wrappers private long? _overlayAddress = null; /// - /// Lock object for + /// Lock object for /// private readonly object _overlayAddressLock = new(); @@ -313,7 +313,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _overlayData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _overlayDataLock = new(); @@ -323,7 +323,7 @@ namespace SabreTools.Serialization.Wrappers private long _overlaySize = -1; /// - /// Lock object for + /// Lock object for /// private readonly object _overlaySizeLock = new(); @@ -333,7 +333,7 @@ namespace SabreTools.Serialization.Wrappers private List? _overlayStrings = null; /// - /// Lock object for + /// Lock object for /// private readonly object _overlayStringsLock = new(); @@ -343,7 +343,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _stubExecutableData = null; /// - /// Lock object for + /// Lock object for /// 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; diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.Extraction.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.Extraction.cs index dc5e8d0c..c729d483 100644 --- a/SabreTools.Serialization/Wrappers/PortableExecutable.Extraction.cs +++ b/SabreTools.Serialization/Wrappers/PortableExecutable.Extraction.cs @@ -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) { diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.cs index 936b0218..ee62c858 100644 --- a/SabreTools.Serialization/Wrappers/PortableExecutable.cs +++ b/SabreTools.Serialization/Wrappers/PortableExecutable.cs @@ -55,7 +55,7 @@ namespace SabreTools.Serialization.Wrappers /// /// Entry point data, if it exists /// - /// Caches up to 128 bytes + /// Caches up to 128 bytes public byte[] EntryPointData { get @@ -348,7 +348,7 @@ namespace SabreTools.Serialization.Wrappers /// /// Overlay data, if it exists /// - /// Caches up to 0x10000 bytes + /// Caches up to 0x10000 bytes /// public byte[] OverlayData { @@ -904,7 +904,7 @@ namespace SabreTools.Serialization.Wrappers private readonly Dictionary _debugData = []; /// - /// Lock object for + /// Lock object for /// private readonly object _debugDataLock = new(); @@ -914,7 +914,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _entryPointData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _entryPointDataLock = new(); @@ -924,7 +924,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _headerPaddingData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _headerPaddingDataLock = new(); @@ -934,7 +934,7 @@ namespace SabreTools.Serialization.Wrappers private List? _headerPaddingStrings = null; /// - /// Lock object for + /// Lock object for /// private readonly object _headerPaddingStringsLock = new(); @@ -944,12 +944,12 @@ namespace SabreTools.Serialization.Wrappers private SecuROMMatroschkaPackage? _matroschkaPackage = null; /// - /// Lock object for + /// Lock object for /// private readonly object _matroschkaPackageLock = new(); /// - /// Cached attempt at creation for + /// Cached attempt at creation for /// private bool _matroschkaPackageFailed = false; @@ -959,7 +959,7 @@ namespace SabreTools.Serialization.Wrappers private long? _overlayAddress = null; /// - /// Lock object for + /// Lock object for /// private readonly object _overlayAddressLock = new(); @@ -969,7 +969,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _overlayData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _overlayDataLock = new(); @@ -979,7 +979,7 @@ namespace SabreTools.Serialization.Wrappers private long _overlaySize = -1; /// - /// Lock object for + /// Lock object for /// private readonly object _overlaySizeLock = new(); @@ -989,7 +989,7 @@ namespace SabreTools.Serialization.Wrappers private List? _overlayStrings = null; /// - /// Lock object for + /// Lock object for /// private readonly object _overlayStringsLock = new(); @@ -999,7 +999,7 @@ namespace SabreTools.Serialization.Wrappers private readonly Dictionary _resourceData = []; /// - /// Lock object for + /// Lock object for /// private readonly object _resourceDataLock = new(); @@ -1009,7 +1009,7 @@ namespace SabreTools.Serialization.Wrappers private string[]? _sectionNames = null; /// - /// Lock object for + /// Lock object for /// private readonly object _sectionNamesLock = new(); @@ -1024,7 +1024,7 @@ namespace SabreTools.Serialization.Wrappers private List?[]? _sectionStringData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _sectionStringDataLock = new(); @@ -1034,7 +1034,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _sectionTableTrailerData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _sectionTableTrailerDataLock = new(); @@ -1044,7 +1044,7 @@ namespace SabreTools.Serialization.Wrappers private byte[]? _stubExecutableData = null; /// - /// Lock object for + /// Lock object for /// private readonly object _stubExecutableDataLock = new(); @@ -1064,12 +1064,12 @@ namespace SabreTools.Serialization.Wrappers private WiseSectionHeader? _wiseSectionHeader = null; /// - /// Lock object for + /// Lock object for /// private readonly object _wiseSectionHeaderLock = new(); /// - /// Indicates if cannot be found + /// Indicates if cannot be found /// 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; diff --git a/SabreTools.Serialization/Wrappers/VPK.Extraction.cs b/SabreTools.Serialization/Wrappers/VPK.Extraction.cs index 99f93362..7f4ae5f9 100644 --- a/SabreTools.Serialization/Wrappers/VPK.Extraction.cs +++ b/SabreTools.Serialization/Wrappers/VPK.Extraction.cs @@ -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); diff --git a/SabreTools.Serialization/Wrappers/WiseOverlayHeader.Extraction.cs b/SabreTools.Serialization/Wrappers/WiseOverlayHeader.Extraction.cs index 3d10e943..8eb0feb8 100644 --- a/SabreTools.Serialization/Wrappers/WiseOverlayHeader.Extraction.cs +++ b/SabreTools.Serialization/Wrappers/WiseOverlayHeader.Extraction.cs @@ -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 /// Output directory to write to /// True to include debug data, false otherwise /// True if the file extracted successfully, false otherwise - /// Requires to be set + /// Requires to be set 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 /// Output directory to write to /// True to include debug data, false otherwise /// True if the file extracted successfully, false otherwise - /// Requires to be set + /// Requires to be set 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 /// Output directory to write to /// True to include debug data, false otherwise /// True if the file extracted successfully, false otherwise - /// Requires to be set + /// Requires to be set 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); } } diff --git a/SabreTools.Serialization/Wrappers/WiseSectionHeader.Extraction.cs b/SabreTools.Serialization/Wrappers/WiseSectionHeader.Extraction.cs index a56079c6..520600b1 100644 --- a/SabreTools.Serialization/Wrappers/WiseSectionHeader.Extraction.cs +++ b/SabreTools.Serialization/Wrappers/WiseSectionHeader.Extraction.cs @@ -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. } diff --git a/SabreTools.Serialization/Writers/AttractMode.cs b/SabreTools.Serialization/Writers/AttractMode.cs index 201ab78a..9887b1dc 100644 --- a/SabreTools.Serialization/Writers/AttractMode.cs +++ b/SabreTools.Serialization/Writers/AttractMode.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/ClrMamePro.cs b/SabreTools.Serialization/Writers/ClrMamePro.cs index 7b2de2de..ae53084d 100644 --- a/SabreTools.Serialization/Writers/ClrMamePro.cs +++ b/SabreTools.Serialization/Writers/ClrMamePro.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/CueSheet.cs b/SabreTools.Serialization/Writers/CueSheet.cs index d9851875..4f7fdbc6 100644 --- a/SabreTools.Serialization/Writers/CueSheet.cs +++ b/SabreTools.Serialization/Writers/CueSheet.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/DosCenter.cs b/SabreTools.Serialization/Writers/DosCenter.cs index ab238ed8..41370c86 100644 --- a/SabreTools.Serialization/Writers/DosCenter.cs +++ b/SabreTools.Serialization/Writers/DosCenter.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/EverdriveSMDB.cs b/SabreTools.Serialization/Writers/EverdriveSMDB.cs index 49e562ec..6a82e977 100644 --- a/SabreTools.Serialization/Writers/EverdriveSMDB.cs +++ b/SabreTools.Serialization/Writers/EverdriveSMDB.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/Hashfile.cs b/SabreTools.Serialization/Writers/Hashfile.cs index d6f188f8..ce5c7f9d 100644 --- a/SabreTools.Serialization/Writers/Hashfile.cs +++ b/SabreTools.Serialization/Writers/Hashfile.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/JsonFile.cs b/SabreTools.Serialization/Writers/JsonFile.cs index 522b9c82..20508648 100644 --- a/SabreTools.Serialization/Writers/JsonFile.cs +++ b/SabreTools.Serialization/Writers/JsonFile.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/Listrom.cs b/SabreTools.Serialization/Writers/Listrom.cs index 102d6918..7767ee79 100644 --- a/SabreTools.Serialization/Writers/Listrom.cs +++ b/SabreTools.Serialization/Writers/Listrom.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/RomCenter.cs b/SabreTools.Serialization/Writers/RomCenter.cs index 5e9fdd4d..f8d2668c 100644 --- a/SabreTools.Serialization/Writers/RomCenter.cs +++ b/SabreTools.Serialization/Writers/RomCenter.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/SeparatedValue.cs b/SabreTools.Serialization/Writers/SeparatedValue.cs index f94f14c0..47587f62 100644 --- a/SabreTools.Serialization/Writers/SeparatedValue.cs +++ b/SabreTools.Serialization/Writers/SeparatedValue.cs @@ -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; } diff --git a/SabreTools.Serialization/Writers/XmlFile.cs b/SabreTools.Serialization/Writers/XmlFile.cs index f3e7f507..abbe4464 100644 --- a/SabreTools.Serialization/Writers/XmlFile.cs +++ b/SabreTools.Serialization/Writers/XmlFile.cs @@ -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; }