/// <summary> /// Update a data directory /// </summary> /// <param name="writer">Writer</param> /// <param name="chunk">The data</param> public void WriteDataDirectory(BinaryWriter writer, IChunk chunk) { if (chunk == null || chunk.GetFileLength() == 0) { writer.Write(0UL); } else { writer.Write((uint)chunk.RVA); writer.Write(chunk.GetFileLength()); } }
/// <summary> /// Writes all data to <paramref name="writer" /> and verifies that all bytes were written /// </summary> /// <param name="chunk">this</param> /// <param name="writer">Destination</param> /// <exception cref="IOException">Not all bytes were written</exception> public static void VerifyWriteTo(this IChunk chunk, BinaryWriter writer) { var pos = writer.BaseStream.Position; chunk.WriteTo(writer); if (writer.BaseStream.Position - pos != chunk.GetFileLength()) { throw new IOException("Did not write all bytes"); } }
/// <summary> /// Writes all data to <paramref name="writer"/> and verifies that all bytes were written /// </summary> /// <param name="chunk">this</param> /// <param name="writer">Destination</param> /// <exception cref="IOException">Not all bytes were written</exception> public static void VerifyWriteTo(this IChunk chunk, DataWriter writer) { long pos = writer.Position; // Uncomment this to add some debug info, useful when comparing old vs new version //System.Diagnostics.Debug.WriteLine($" RVA 0x{(uint)chunk.RVA:X8} OFFS 0x{(uint)chunk.FileOffset:X8} VSIZE 0x{chunk.GetVirtualSize():X8} {chunk.GetType().FullName}"); chunk.WriteTo(writer); if (writer.Position - pos != chunk.GetFileLength()) { VerifyWriteToThrow(chunk); } }
/// <summary> /// Writes all data to <paramref name="writer"/> and verifies that all bytes were written /// </summary> /// <param name="chunk">this</param> /// <param name="writer">Destination</param> /// <exception cref="IOException">Not all bytes were written</exception> public static void VerifyWriteTo(this IChunk chunk, BinaryWriter writer) { long pos = writer.BaseStream.Position; // Uncomment this to add some debug info, useful when comparing old vs new version //System.Diagnostics.Debug.WriteLine(string.Format(" RVA 0x{0:X8} OFFS 0x{1:X8} VSIZE 0x{2:X8} {3}", (uint)chunk.RVA, (uint)chunk.FileOffset, chunk.GetVirtualSize(), chunk.GetType().FullName)); chunk.WriteTo(writer); if (writer.BaseStream.Position - pos != chunk.GetFileLength()) { throw new IOException("Did not write all bytes"); } }
/// <summary> /// Update a data directory /// </summary> /// <param name="writer">Writer</param> /// <param name="chunk">The data</param> public void WriteDataDirectory(BinaryWriter writer, IChunk chunk) { if (chunk == null || chunk.GetFileLength() == 0) writer.Write(0UL); else { writer.Write((uint)chunk.RVA); writer.Write(chunk.GetFileLength()); } }