============================= LGPL licensed 7zip, UdfIn.cpp ============================= HRESULT CInArchive::ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf) { if (item.Size >= (UInt32)1 << 30) return S_FALSE; if (item.IsInline) { buf = item.InlineData; return S_OK; } buf.SetCapacity((size_t)item.Size); size_t pos = 0; for (int i = 0; i < item.Extents.Size(); i++) { const CMyExtent &e = item.Extents[i]; UInt32 len = e.GetLen(); RINOK(Read(volIndex, e.PartitionRef, e.Pos, len, (Byte *)buf + pos)); pos += len; } return S_OK; } ====================================================== GPL licensed derivative work ImageMaster, UdfReader.cs ====================================================== private bool ReadFromFile(int volumeIndex, ref UdfRecord item, ref byte[] buffer) { if (item.Size >= MaxExtents) return false; if (item.IsInline) { buffer = item.InlineData; return true; } buffer = new byte[item.Size]; int position = 0; for (int i = 0; i < item.Extents.Count; i++) { FileExtent e = item.Extents[i]; int length = e.Length; byte[] b = UdfHelper.Readbytes(position, buffer, buffer.Length); Read(volumeIndex, e.PartitionReference, e.Position, length, b); position += length; } return true; } ================================================== Microsoft licensed ISO tool, reflected source code ================================================== private bool ReadFromFile(int volumeIndex, ref UdfRecord item, ref byte[] buffer) { if (item.Size >= 1073741824L) { return false; } if (item.IsInline) { buffer = item.InlineData; return true; } buffer = new byte[item.Size]; int start = 0; for (int i = 0; i < item.Extents.Count; i++) { FileExtent extent = item.Extents[i]; int length = extent.Length; byte[] buffer2 = UdfHelper.Readbytes(start, buffer, buffer.Length); if (!this.ReadData(volumeIndex, extent.PartitionReference, extent.Position, length, buffer2)) { return false; } start += length; } return true; }