public static async Task <IEnumerable <LoadSegBlock> > Read(
            RigidDiskBlock rigidDiskBlock, FileSystemHeaderBlock fileSystemHeaderBlock, Stream stream)
        {
            var loadSegBlocks = new List <LoadSegBlock>();

            var segListBlock = fileSystemHeaderBlock.SegListBlocks;

            do
            {
                // calculate seg list block offset
                var segListBlockOffset = rigidDiskBlock.BlockSize * segListBlock;

                // seek partition block offset
                stream.Seek(segListBlockOffset, SeekOrigin.Begin);

                // read block
                var block = await BlockHelper.ReadBlock(stream);

                // parse file system header block
                var loadSegBlock = await Parse(block);

                loadSegBlocks.Add(loadSegBlock);

                // get next partition list block and increase partition number
                segListBlock = loadSegBlock.NextLoadSegBlock;
            } while (segListBlock > 0);

            return(loadSegBlocks);
        }
        public static async Task <IEnumerable <PartitionBlock> > Read(RigidDiskBlock rigidDiskBlock, Stream stream)
        {
            if (rigidDiskBlock.PartitionList == BlockIdentifiers.EndOfBlock)
            {
                return(Enumerable.Empty <PartitionBlock>());
            }


            // get partition list block and set partition number to 1
            var partitionList = rigidDiskBlock.PartitionList;

            var partitionBlocks = new List <PartitionBlock>();

            do
            {
                // calculate partition block offset
                var partitionBlockOffset = rigidDiskBlock.BlockSize * partitionList;

                // seek partition block offset
                stream.Seek(partitionBlockOffset, SeekOrigin.Begin);

                // read block
                var blockBytes = await BlockHelper.ReadBlock(stream);

                // read partition block
                var partitionBlock = await Parse(rigidDiskBlock, blockBytes);

                // fail, if partition block is null
                if (partitionBlock == null)
                {
                    throw new IOException("Invalid partition block");
                }

                partitionBlocks.Add(partitionBlock);

                // get next partition list block and increase partition number
                partitionList = partitionBlock.NextPartitionBlock;
            } while (partitionList > 0 && partitionList != BlockIdentifiers.EndOfBlock);

            rigidDiskBlock.PartitionBlocks = partitionBlocks;

            rigidDiskBlock.FileSystemHeaderBlocks =
                await FileSystemHeaderBlockReader.Read(rigidDiskBlock, stream);

            return(partitionBlocks);
        }
        public static async Task <IEnumerable <BadBlock> > Read(RigidDiskBlock rigidDiskBlock, Stream stream)
        {
            if (rigidDiskBlock == null)
            {
                throw new ArgumentNullException(nameof(rigidDiskBlock));
            }
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (rigidDiskBlock.BadBlockList == BlockIdentifiers.EndOfBlock)
            {
                return(Enumerable.Empty <BadBlock>());
            }

            var badBlocks = new List <BadBlock>();

            var badBlockList = rigidDiskBlock.BadBlockList;

            do
            {
                // calculate block offset
                var blockOffset = rigidDiskBlock.BlockSize * badBlockList;

                // seek block offset
                stream.Seek(blockOffset, SeekOrigin.Begin);

                // read block
                var block = await BlockHelper.ReadBlock(stream);

                // read rigid disk block
                var badBlock = await Parse(block);

                badBlocks.Add(badBlock);

                // get next partition list block and increase partition number
                badBlockList = badBlock.NextBadBlock;
            } while (badBlockList > 0 && badBlockList != BlockIdentifiers.EndOfBlock);

            return(badBlocks);
        }
        public static async Task <IEnumerable <FileSystemHeaderBlock> > Read(
            RigidDiskBlock rigidDiskBlock, Stream stream)
        {
            if (rigidDiskBlock.FileSysHdrList == BlockIdentifiers.EndOfBlock)
            {
                return(Enumerable.Empty <FileSystemHeaderBlock>());
            }

            var fileSystemHeaderBlocks = new List <FileSystemHeaderBlock>();

            var fileSysHdrList = rigidDiskBlock.FileSysHdrList;

            do
            {
                // calculate file system header block offset
                var fileSystemHeaderBlockOffset = rigidDiskBlock.BlockSize * fileSysHdrList;

                // seek partition block offset
                stream.Seek(fileSystemHeaderBlockOffset, SeekOrigin.Begin);

                // read block
                var block = await BlockHelper.ReadBlock(stream);

                // parse file system header block
                var fileSystemHeaderBlock = await Parse(block);

                fileSystemHeaderBlocks.Add(fileSystemHeaderBlock);

                // get next partition list block and increase partition number
                fileSysHdrList = fileSystemHeaderBlock.NextFileSysHeaderBlock;
            } while (fileSysHdrList > 0 && fileSysHdrList != BlockIdentifiers.EndOfBlock);

            foreach (var fileSystemHeaderBlock in fileSystemHeaderBlocks)
            {
                fileSystemHeaderBlock.LoadSegBlocks =
                    await LoadSegBlockReader.Read(rigidDiskBlock, fileSystemHeaderBlock, stream);
            }

            return(fileSystemHeaderBlocks);
        }
예제 #5
0
        public static async Task <RigidDiskBlock> Read(Stream stream)
        {
            var            rdbIndex         = 0;
            var            blockSize        = 512;
            var            rdbLocationLimit = 16;
            RigidDiskBlock rigidDiskBlock;

            // read rigid disk block from one of the first 15 blocks
            do
            {
                // calculate block offset
                var blockOffset = blockSize * rdbIndex;

                // seek block offset
                stream.Seek(blockOffset, SeekOrigin.Begin);

                // read block
                var block = await BlockHelper.ReadBlock(stream);

                // read rigid disk block
                rigidDiskBlock = await Parse(block);

                rdbIndex++;
            } while (rdbIndex < rdbLocationLimit && rigidDiskBlock == null);

            // fail, if rigid disk block is null
            if (rigidDiskBlock == null)
            {
                return(null);
            }

            rigidDiskBlock.PartitionBlocks = await PartitionBlockReader.Read(rigidDiskBlock, stream);

            rigidDiskBlock.BadBlocks = await BadBlockReader.Read(rigidDiskBlock, stream);

            return(rigidDiskBlock);
        }