public MetadataPartition(UdfContext context, LogicalVolumeDescriptor volumeDescriptor, MetadataPartitionMap partitionMap) : base(context, volumeDescriptor) { _partitionMap = partitionMap; PhysicalPartition physical = context.PhysicalPartitions[partitionMap.PartitionNumber]; long fileEntryPos = partitionMap.MetadataFileLocation * (long)volumeDescriptor.LogicalBlockSize; byte[] entryData = Utilities.ReadFully(physical.Content, fileEntryPos, _context.PhysicalSectorSize); if (!DescriptorTag.IsValid(entryData, 0)) { throw new IOException("Invalid descriptor tag looking for Metadata file entry"); } DescriptorTag dt = Utilities.ToStruct <DescriptorTag>(entryData, 0); if (dt.TagIdentifier == TagIdentifier.ExtendedFileEntry) { ExtendedFileEntry efe = Utilities.ToStruct <ExtendedFileEntry>(entryData, 0); _metadataFile = new File(context, physical, efe, _volumeDescriptor.LogicalBlockSize); } else { throw new NotImplementedException("Only EFE implemented for Metadata file entry"); } }
public static File FromDescriptor(UdfContext context, LongAllocationDescriptor icb) { LogicalPartition partition = context.LogicalPartitions[icb.ExtentLocation.Partition]; byte[] rootDirData = UdfUtilities.ReadExtent(context, icb); DescriptorTag rootDirTag = Utilities.ToStruct <DescriptorTag>(rootDirData, 0); if (rootDirTag.TagIdentifier == TagIdentifier.ExtendedFileEntry) { ExtendedFileEntry fileEntry = Utilities.ToStruct <ExtendedFileEntry>(rootDirData, 0); if (fileEntry.InformationControlBlock.FileType == FileType.Directory) { return(new Directory(context, partition, fileEntry)); } else { return(new File(context, partition, fileEntry, (uint)partition.LogicalBlockSize)); } } else if (rootDirTag.TagIdentifier == TagIdentifier.FileEntry) { FileEntry fileEntry = Utilities.ToStruct <FileEntry>(rootDirData, 0); if (fileEntry.InformationControlBlock.FileType == FileType.Directory) { return(new Directory(context, partition, fileEntry)); } else { return(new File(context, partition, fileEntry, (uint)partition.LogicalBlockSize)); } } else { throw new NotImplementedException("Only ExtendedFileEntries implemented"); } }