public void VerifyBlockIndexes() { Console.WriteLine("Verifying blocks."); VolumeStream.Position = TocOffset + 0x12; ushort blockCount = VolumeStream.ReadUInt16(); BlockInfo block = GetBlock(0); BlockDebugInfo blockDebInfo = new BlockDebugInfo(); blockDebInfo.ReadFromBlockInfo(block); foreach (var entry in blockDebInfo.Entries) { var childIndexBlock = GetBlock(entry.BlockIndex); BlockDebugInfo childblockDebInfo = new BlockDebugInfo(); childblockDebInfo.ReadFromBlockInfo(childIndexBlock); for (int i = 0; i < childblockDebInfo.Entries.Count; i++) { BlockDebugEntryInfo cutoff = childblockDebInfo.Entries[i]; // Get the entries in the middle var prevEntryBlock = GetBlock(cutoff.BlockIndex); BlockDebugInfo prevEntryBlockDebInfo = new BlockDebugInfo(); prevEntryBlockDebInfo.ReadFromBlockInfo(prevEntryBlock); var nextEntryBlock = GetBlock(cutoff.BlockIndex + 1); BlockDebugInfo nextEntryBlockDebInfo = new BlockDebugInfo(); nextEntryBlockDebInfo.ReadFromBlockInfo(nextEntryBlock); var lastEntry = prevEntryBlockDebInfo.Entries[^ 1];
public void ReadFromBlockInfo(BlockInfo block) { SpanReader sr = new SpanReader(block.BlockBuffer); BlockType = sr.ReadInt16(); EntryCount = sr.ReadInt16(); NextPage = sr.ReadInt32(); PrevPage = sr.ReadInt32(); Entries = new List <BlockDebugEntryInfo>(EntryCount / 2); if (BlockType == 1 && NextPage == -1 && PrevPage == -1) { IsMasterIndexBlock = true; } for (int i = 0; i < EntryCount / 2; i++) { sr.Position = block.ParentVolume.BlockSize - (i * 0x08) - 0x08; BlockDebugEntryInfo entry = new BlockDebugEntryInfo(); entry.ReadFromBuffer(ref sr, BlockType == 1); Entries.Add(entry); } }