From b980b3301969c7d3fa8abd9673082fdc4473b3cb Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 9 Jan 2023 22:04:29 -0800 Subject: [PATCH] Add sector chain helpers --- BurnOutSharp.Wrappers/CFB.cs | 69 ++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/BurnOutSharp.Wrappers/CFB.cs b/BurnOutSharp.Wrappers/CFB.cs index 4a50bbd9..67c67817 100644 --- a/BurnOutSharp.Wrappers/CFB.cs +++ b/BurnOutSharp.Wrappers/CFB.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; namespace BurnOutSharp.Wrappers @@ -158,6 +159,74 @@ namespace BurnOutSharp.Wrappers #endregion + #region Data + + /// + /// Get the ordered FAT sector chain for a given starting sector + /// + /// Initial FAT sector + /// Ordered list of sector numbers, null on error + public List GetFATSectorChain(uint startingSector) + { + // If we have an invalid sector + if (startingSector < 0 || startingSector >= FATSectorNumbers.Length) + return null; + + // Setup the returned list + var sectors = new List { (Models.CFB.SectorNumber)startingSector }; + + var lastSector = (Models.CFB.SectorNumber)startingSector; + while (true) + { + // Get the next sector from the lookup table + var nextSector = FATSectorNumbers[(uint)lastSector]; + + // If we have an end of chain or free sector + if (nextSector == Models.CFB.SectorNumber.ENDOFCHAIN || nextSector == Models.CFB.SectorNumber.FREESECT) + break; + + // Add the next sector to the list and replace the last sector + sectors.Add(nextSector); + lastSector = nextSector; + } + + return sectors; + } + + /// + /// Get the ordered Mini FAT sector chain for a given starting sector + /// + /// Initial Mini FAT sector + /// Ordered list of sector numbers, null on error + public List GetMiniFATSectorChain(uint startingSector) + { + // If we have an invalid sector + if (startingSector < 0 || startingSector >= MiniFATSectorNumbers.Length) + return null; + + // Setup the returned list + var sectors = new List { (Models.CFB.SectorNumber)startingSector }; + + var lastSector = (Models.CFB.SectorNumber)startingSector; + while (true) + { + // Get the next sector from the lookup table + var nextSector = MiniFATSectorNumbers[(uint)lastSector]; + + // If we have an end of chain or free sector + if (nextSector == Models.CFB.SectorNumber.ENDOFCHAIN || nextSector == Models.CFB.SectorNumber.FREESECT) + break; + + // Add the next sector to the list and replace the last sector + sectors.Add(nextSector); + lastSector = nextSector; + } + + return sectors; + } + + #endregion + #region Printing ///