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 FileContentBuffer(UdfContext context, Partition partition, FileEntry fileEntry, uint blockSize) { _context = context; _partition = partition; _fileEntry = fileEntry; _blockSize = blockSize; LoadExtents(); }
public static LogicalPartition FromDescriptor(UdfContext context, LogicalVolumeDescriptor volumeDescriptor, int index) { PartitionMap map = volumeDescriptor.PartitionMaps[index]; Type1PartitionMap asType1 = map as Type1PartitionMap; if (asType1 != null) { return new Type1Partition(context, volumeDescriptor, asType1); } MetadataPartitionMap asMetadata = map as MetadataPartitionMap; if (asMetadata != null) { return new MetadataPartition(context, volumeDescriptor, asMetadata); } throw new NotImplementedException("Unrecognized partition map type"); }
protected LogicalPartition(UdfContext context, LogicalVolumeDescriptor volumeDescriptor) { _context = context; _volumeDescriptor = volumeDescriptor; }
public static byte[] ReadExtent(UdfContext context, LongAllocationDescriptor extent) { LogicalPartition partition = context.LogicalPartitions[extent.ExtentLocation.Partition]; long pos = extent.ExtentLocation.LogicalBlock * partition.LogicalBlockSize; return Utilities.ReadFully(partition.Content, pos, (int)extent.ExtentLength); }