public virtual int ReadFrom(byte[] buffer, int offset) { DescriptorTag = Utilities.ToStruct<DescriptorTag>(buffer, offset); InformationControlBlock = Utilities.ToStruct<InformationControlBlock>(buffer, offset + 16); Uid = Utilities.ToUInt32LittleEndian(buffer, offset + 36); Gid = Utilities.ToUInt32LittleEndian(buffer, offset + 40); Permissions = (FilePermissions)Utilities.ToUInt32LittleEndian(buffer, offset + 44); FileLinkCount = Utilities.ToUInt16LittleEndian(buffer, offset + 48); RecordFormat = buffer[offset + 50]; RecordDisplayAttributes = buffer[offset + 51]; RecordLength = Utilities.ToUInt16LittleEndian(buffer, offset + 52); InformationLength = Utilities.ToUInt64LittleEndian(buffer, offset + 56); LogicalBlocksRecorded = Utilities.ToUInt64LittleEndian(buffer, offset + 64); AccessTime = UdfUtilities.ParseTimestamp(buffer, offset + 72); ModificationTime = UdfUtilities.ParseTimestamp(buffer, offset + 84); AttributeTime = UdfUtilities.ParseTimestamp(buffer, offset + 96); Checkpoint = Utilities.ToUInt32LittleEndian(buffer, offset + 108); ExtendedAttributeIcb = Utilities.ToStruct<LongAllocationDescriptor>(buffer, offset + 112); ImplementationIdentifier = Utilities.ToStruct<ImplementationEntityIdentifier>(buffer, offset + 128); UniqueId = Utilities.ToUInt64LittleEndian(buffer, offset + 160); ExtendedAttributesLength = Utilities.ToInt32LittleEndian(buffer, offset + 168); AllocationDescriptorsLength = Utilities.ToInt32LittleEndian(buffer, offset + 172); AllocationDescriptors = Utilities.ToByteArray(buffer, offset + 176 + ExtendedAttributesLength, AllocationDescriptorsLength); byte[] eaData = Utilities.ToByteArray(buffer, offset + 176, ExtendedAttributesLength); ExtendedAttributes = ReadExtendedAttributes(eaData); return (int)(176 + ExtendedAttributesLength + AllocationDescriptorsLength); }
public int ReadFrom(byte[] buffer, int offset) { if (!DescriptorTag.IsValid(buffer, offset)) { throw new InvalidDataException("Invalid Anchor Volume Descriptor Pointer (invalid tag)"); } Tag = new DescriptorTag(); Tag.ReadFrom(buffer, offset); if (UdfUtilities.ComputeCrc(buffer, offset + Tag.Size, Tag.DescriptorCrcLength) != Tag.DescriptorCrc) { throw new InvalidDataException("Invalid Anchor Volume Descriptor Pointer (invalid CRC)"); } return Parse(buffer, offset); }
public int ReadFrom(byte[] buffer, int offset) { DescriptorTag = Utilities.ToStruct<DescriptorTag>(buffer, offset); RecordingTime = UdfUtilities.ParseTimestamp(buffer, offset + 16); InterchangeLevel = Utilities.ToUInt16LittleEndian(buffer, offset + 28); MaximumInterchangeLevel = Utilities.ToUInt16LittleEndian(buffer, offset + 30); CharacterSetList = Utilities.ToUInt32LittleEndian(buffer, offset + 32); MaximumCharacterSetList = Utilities.ToUInt32LittleEndian(buffer, offset + 36); FileSetNumber = Utilities.ToUInt32LittleEndian(buffer, offset + 40); FileSetDescriptorNumber = Utilities.ToUInt32LittleEndian(buffer, offset + 44); LogicalVolumeIdentifierCharset = Utilities.ToStruct<CharacterSetSpecification>(buffer, offset + 48); LogicalVolumeIdentifier = UdfUtilities.ReadDString(buffer, offset + 112, 128); FileSetCharset = Utilities.ToStruct<CharacterSetSpecification>(buffer, offset + 240); FileSetIdentifier = UdfUtilities.ReadDString(buffer, offset + 304, 32); CopyrightFileIdentifier = UdfUtilities.ReadDString(buffer, offset + 336, 32); AbstractFileIdentifier = UdfUtilities.ReadDString(buffer, offset + 368, 32); RootDirectoryIcb = Utilities.ToStruct<LongAllocationDescriptor>(buffer, offset + 400); DomainIdentifier = Utilities.ToStruct<DomainEntityIdentifier>(buffer, offset + 416); NextExtent = Utilities.ToStruct<LongAllocationDescriptor>(buffer, offset + 448); SystemStreamDirectoryIcb = Utilities.ToStruct<LongAllocationDescriptor>(buffer, offset + 464); return 512; }
protected static List<ExtendedAttributeRecord> ReadExtendedAttributes(byte[] eaData) { if (eaData != null && eaData.Length != 0) { DescriptorTag eaTag = new DescriptorTag(); eaTag.ReadFrom(eaData, 0); int implAttrLocation = Utilities.ToInt32LittleEndian(eaData, 16); int appAttrLocation = Utilities.ToInt32LittleEndian(eaData, 20); List<ExtendedAttributeRecord> extendedAttrs = new List<ExtendedAttributeRecord>(); int pos = 24; while (pos < eaData.Length) { ExtendedAttributeRecord ea; if (pos >= implAttrLocation) { ea = new ImplementationUseExtendedAttributeRecord(); } else { ea = new ExtendedAttributeRecord(); } int numRead = ea.ReadFrom(eaData, pos); extendedAttrs.Add(ea); pos += numRead; } return extendedAttrs; } else { return null; } }
public static bool TryFromStream(Stream stream, out DescriptorTag result) { byte[] next = Utilities.ReadFully(stream, 512); if (!DescriptorTag.IsValid(next, 0)) { result = null; return false; } DescriptorTag dt = new DescriptorTag(); dt.ReadFrom(next, 0); result = dt; return true; }
public int ReadFrom(byte[] buffer, int offset) { DescriptorTag = Utilities.ToStruct<DescriptorTag>(buffer, offset); FileVersionNumber = Utilities.ToUInt16LittleEndian(buffer, offset + 16); FileCharacteristics = (FileCharacteristic)buffer[offset + 18]; NameLength = buffer[offset + 19]; FileLocation = Utilities.ToStruct<LongAllocationDescriptor>(buffer, offset + 20); ImplementationUseLength = Utilities.ToUInt16LittleEndian(buffer, offset + 36); ImplementationUse = Utilities.ToByteArray(buffer, offset + 38, ImplementationUseLength); Name = UdfUtilities.ReadDCharacters(buffer, offset + 38 + ImplementationUseLength, NameLength); return Utilities.RoundUp(38 + ImplementationUseLength + NameLength, 4); }