Skip to content

Commit

Permalink
Move IBinaryStreamWriter and BinaryStreamWriterExtensions into Binary…
Browse files Browse the repository at this point in the history
…StreamWriter. Fix signed compressed integer parsing/writing.
  • Loading branch information
Washi1337 committed Jun 7, 2024
1 parent bf80344 commit c7bc9f6
Show file tree
Hide file tree
Showing 185 changed files with 708 additions and 644 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal static class MetadataStreamBufferHelper
{
public delegate void IndexBlobAction(uint originalIndex, uint newIndex);

public static void CloneBlobHeap(IMetadataStream stream, IBinaryStreamWriter writer,
public static void CloneBlobHeap(IMetadataStream stream, BinaryStreamWriter writer,
IndexBlobAction indexAction)
{
if (!stream.CanRead)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public StringsStreamBlobFlags Flags
public uint GetPhysicalSize() => (uint) (Blob.ByteCount + (IsZeroTerminated ? 1 : 0));

/// <inheritdoc />
public void Write(IBinaryStreamWriter writer)
public void Write(BinaryStreamWriter writer)
{
writer.WriteBytes(Blob.GetBytesUnsafe());
if (IsZeroTerminated)
Expand Down
12 changes: 6 additions & 6 deletions src/AsmResolver.DotNet/Bundles/BundleManifest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ public void WriteUsingTemplate(Stream outputStream, in BundlerParameters paramet
/// </summary>
/// <param name="writer">The output stream to write to.</param>
/// <param name="parameters">The parameters to use for bundling all files into a single executable.</param>
public void WriteUsingTemplate(IBinaryStreamWriter writer, BundlerParameters parameters)
public void WriteUsingTemplate(BinaryStreamWriter writer, BundlerParameters parameters)
{
// Verify entry point assembly exists within the bundle and is a correct length.
var appBinaryEntry = Files.FirstOrDefault(f => f.RelativePath == parameters.ApplicationBinaryPath);
Expand Down Expand Up @@ -483,7 +483,7 @@ private static void EnsureAppHostPEHeadersAreUpToDate(ref BundlerParameters para
/// without a host application that invokes the manifest. If you want to produce a runnable executable, use one
/// of the <c>WriteUsingTemplate</c> methods instead.
/// </remarks>
public ulong WriteManifest(IBinaryStreamWriter writer, bool isArm64Linux)
public ulong WriteManifest(BinaryStreamWriter writer, bool isArm64Linux)
{
WriteFileContents(writer, isArm64Linux
? 4096u
Expand All @@ -495,7 +495,7 @@ public ulong WriteManifest(IBinaryStreamWriter writer, bool isArm64Linux)
return headerAddress;
}

private void WriteFileContents(IBinaryStreamWriter writer, uint alignment)
private void WriteFileContents(BinaryStreamWriter writer, uint alignment)
{
for (int i = 0; i < Files.Count; i++)
{
Expand All @@ -509,7 +509,7 @@ private void WriteFileContents(IBinaryStreamWriter writer, uint alignment)
}
}

private void WriteManifestHeader(IBinaryStreamWriter writer)
private void WriteManifestHeader(BinaryStreamWriter writer)
{
writer.WriteUInt32(MajorVersion);
writer.WriteUInt32(MinorVersion);
Expand All @@ -528,7 +528,7 @@ private void WriteManifestHeader(IBinaryStreamWriter writer)
WriteFileHeaders(writer);
}

private void WriteFileHeaders(IBinaryStreamWriter writer)
private void WriteFileHeaders(BinaryStreamWriter writer)
{
for (int i = 0; i < Files.Count; i++)
{
Expand All @@ -544,7 +544,7 @@ private void WriteFileHeaders(IBinaryStreamWriter writer)
}
}

private static void WriteFileOffsetSizePair(IBinaryStreamWriter writer, BundleFile? file)
private static void WriteFileOffsetSizePair(BinaryStreamWriter writer, BundleFile? file)
{
if (file is not null)
{
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.DotNet/Code/Cil/CilMethodBodySerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ private byte[] SerializeExceptionHandlers(MethodBodySerializationContext context
return rentedWriter.GetData();
}

private void WriteExceptionHandler(MethodBodySerializationContext context, IBinaryStreamWriter writer, CilExceptionHandler handler, bool useFatFormat)
private void WriteExceptionHandler(MethodBodySerializationContext context, BinaryStreamWriter writer, CilExceptionHandler handler, bool useFatFormat)
{
if (handler.IsFat && !useFatFormat)
throw new InvalidOperationException("Can only serialize fat exception handlers in fat format.");
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.DotNet/ModuleDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1301,7 +1301,7 @@ public void Write(Stream outputStream, IPEImageBuilder imageBuilder, IPEFileBuil
/// <param name="imageBuilder">The engine to use for reconstructing a PE image.</param>
/// <param name="fileBuilder">The engine to use for reconstructing a PE file.</param>
/// <exception cref="AggregateException">Occurs when the construction of the image threw exceptions.</exception>
public void Write(IBinaryStreamWriter writer, IPEImageBuilder imageBuilder, IPEFileBuilder fileBuilder)
public void Write(BinaryStreamWriter writer, IPEImageBuilder imageBuilder, IPEFileBuilder fileBuilder)
{
ToPEImage(imageBuilder).ToPEFile(fileBuilder).Write(writer);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public static DefaultResourceDataSerializer Instance
} = new();

/// <inheritdoc />
public virtual void Serialize(IBinaryStreamWriter writer, ResourceType type, object? value)
public virtual void Serialize(BinaryStreamWriter writer, ResourceType type, object? value)
{
switch (value)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface IResourceDataSerializer
/// <param name="writer">The output stream to write to.</param>
/// <param name="type">The type of the resource.</param>
/// <param name="value">The object to serialize.</param>
void Serialize(IBinaryStreamWriter writer, ResourceType type, object? value);
void Serialize(BinaryStreamWriter writer, ResourceType type, object? value);

/// <summary>
/// Reads a resource object from the input stream.
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.DotNet/Resources/ResourceManagerHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public uint GetPhysicalSize()
}

/// <inheritdoc />
public void Write(IBinaryStreamWriter writer)
public void Write(BinaryStreamWriter writer)
{
writer.WriteUInt32(Magic);
writer.WriteUInt32(1);
Expand Down
4 changes: 2 additions & 2 deletions src/AsmResolver.DotNet/Resources/ResourceSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,15 @@ protected override void Initialize()
/// </summary>
/// <param name="writer">The output stream.</param>
/// <exception cref="NotSupportedException">Occurs when an invalid or unsupported version is specified in <see cref="FormatVersion"/>.</exception>
public void Write(IBinaryStreamWriter writer) => Write(writer, DefaultResourceDataSerializer.Instance);
public void Write(BinaryStreamWriter writer) => Write(writer, DefaultResourceDataSerializer.Instance);

/// <summary>
/// Serializes the resource set and writes it to the provided output stream.
/// </summary>
/// <param name="writer">The output stream.</param>
/// <param name="serializer">The object responsible for serializing user-defined types.</param>
/// <exception cref="NotSupportedException">Occurs when an invalid or unsupported version is specified in <see cref="FormatVersion"/>.</exception>
public void Write(IBinaryStreamWriter writer, IResourceDataSerializer serializer)
public void Write(BinaryStreamWriter writer, IResourceDataSerializer serializer)
{
if (FormatVersion is not 1 and not 2)
throw new NotSupportedException($"Invalid or unsupported format version {FormatVersion}.");
Expand Down
6 changes: 3 additions & 3 deletions src/AsmResolver.DotNet/Resources/ResourceSetEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public ResourceType Type
/// <inheritdoc />
public override string ToString() => $"{Name} : {Type.FullName}";

internal void Write(IBinaryStreamWriter writer, int formatVersion, int typeCode, IResourceDataSerializer serializer)
internal void Write(BinaryStreamWriter writer, int formatVersion, int typeCode, IResourceDataSerializer serializer)
{
writer.Write7BitEncodedInt32(typeCode);

Expand All @@ -116,7 +116,7 @@ internal void Write(IBinaryStreamWriter writer, int formatVersion, int typeCode,
}
}

private void WriteV1(IBinaryStreamWriter writer, IResourceDataSerializer serializer)
private void WriteV1(BinaryStreamWriter writer, IResourceDataSerializer serializer)
{
if (Data is null)
return;
Expand Down Expand Up @@ -182,7 +182,7 @@ private void WriteV1(IBinaryStreamWriter writer, IResourceDataSerializer seriali
}
}

private void WriteV2(IBinaryStreamWriter writer, IResourceDataSerializer serializer)
private void WriteV2(BinaryStreamWriter writer, IResourceDataSerializer serializer)
{
if (Data is null)
return;
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.DotNet/Resources/ResourceSetEntryHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public uint Offset
public uint GetPhysicalSize() => Name.GetBinaryFormatterSize(Encoding.Unicode) + sizeof(uint);

/// <inheritdoc />
public void Write(IBinaryStreamWriter writer)
public void Write(BinaryStreamWriter writer)
{
writer.WriteBinaryFormatterString(Name, Encoding.Unicode);
writer.WriteUInt32(Offset);
Expand Down
8 changes: 4 additions & 4 deletions src/AsmResolver.DotNet/Signatures/ArrayTypeSignature.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,10 @@ internal new static ArrayTypeSignature FromReader(ref BlobReaderContext context,
return signature;
}

var loBounds = new List<uint>((int) numLoBounds);
var loBounds = new List<int>((int) numLoBounds);
for (int i = 0; i < numLoBounds; i++)
{
if (!reader.TryReadCompressedUInt32(out uint bound))
if (!reader.TryReadCompressedInt32(out int bound))
{
context.ReaderContext.BadImage($"Lower bound {i.ToString()} of array type signature is invalid.");
return signature;
Expand All @@ -130,7 +130,7 @@ internal new static ArrayTypeSignature FromReader(ref BlobReaderContext context,
if (i < numSizes)
size = (int) sizes[i];
if (i < numLoBounds)
lowerBound = (int) loBounds[i];
lowerBound = loBounds[i];

signature.Dimensions.Add(new ArrayDimension(size, lowerBound));
}
Expand Down Expand Up @@ -237,7 +237,7 @@ protected override void WriteContents(in BlobSerializationContext context)
.ToArray();
writer.WriteCompressedUInt32((uint) boundedDimensions.Length);
foreach (var boundedDimension in boundedDimensions)
writer.WriteCompressedUInt32((uint) boundedDimension.LowerBound!.Value);
writer.WriteCompressedInt32(boundedDimension.LowerBound!.Value);
}
}
}
4 changes: 2 additions & 2 deletions src/AsmResolver.DotNet/Signatures/BlobSerializationContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace AsmResolver.DotNet.Signatures
/// <param name="writer">The output stream to write the raw data to.</param>
/// <param name="indexProvider">The object responsible for obtaining coded indices to types.</param>
/// <param name="errorListener">The object responsible for collecting diagnostic information during the serialization process.</param>
public BlobSerializationContext(IBinaryStreamWriter writer, ITypeCodedIndexProvider indexProvider, IErrorListener errorListener)
public BlobSerializationContext(BinaryStreamWriter writer, ITypeCodedIndexProvider indexProvider, IErrorListener errorListener)
{
Writer = writer ?? throw new ArgumentNullException(nameof(writer));
IndexProvider = indexProvider ?? throw new ArgumentNullException(nameof(indexProvider));
Expand All @@ -24,7 +24,7 @@ public BlobSerializationContext(IBinaryStreamWriter writer, ITypeCodedIndexProvi
/// <summary>
/// Gets the output stream to write the raw data to.
/// </summary>
public IBinaryStreamWriter Writer
public BinaryStreamWriter Writer
{
get;
}
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/DataDirectory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public static DataDirectory CreateForSegment(ISegment? segment)
public uint GetPhysicalSize() => DataDirectorySize;

/// <inheritdoc />
public void Write(IBinaryStreamWriter writer)
public void Write(BinaryStreamWriter writer)
{
writer.WriteUInt32(VirtualAddress);
writer.WriteUInt32(Size);
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/DosHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public uint NextHeaderOffset
public override uint GetPhysicalSize() => (uint) _stub.Length;

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteBytes(_stub, 0, NextHeaderFieldOffset);
writer.WriteUInt32(NextHeaderOffset);
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/FileHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public Characteristics Characteristics
public override uint GetPhysicalSize() => FileHeaderSize;

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteUInt16((ushort)Machine);
writer.WriteUInt16(NumberOfSections);
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/OptionalHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ public override uint GetPhysicalSize()
}

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
ulong start = writer.Offset;

Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/PEFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ public void Write(string filePath)
/// Writes the PE file to the provided output stream.
/// </summary>
/// <param name="writer">The output stream to write to.</param>
public void Write(IBinaryStreamWriter writer)
public void Write(BinaryStreamWriter writer)
{
UpdateHeaders();

Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/PESection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,6 @@ public ulong RvaToFileOffset(uint rva)
public override string ToString() => Name;

/// <inheritdoc />
public void Write(IBinaryStreamWriter writer) => Contents?.Write(writer);
public void Write(BinaryStreamWriter writer) => Contents?.Write(writer);
}
}
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.File/SectionHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ public ulong RvaToFileOffset(uint rva)
}

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteBytes(Name.GetBytesUnsafe());
writer.WriteZeroes(8 - Name.ByteCount);
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.Win32Resources/Icon/IconEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public static IconEntry FromReader(ref BinaryStreamReader reader)
public override uint GetPhysicalSize() => (uint)RawIcon.Length;

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteBytes(RawIcon, 0, RawIcon.Length);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public override uint GetPhysicalSize()
}

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteUInt16(Reserved);
writer.WriteUInt16(Type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public override uint GetPhysicalSize()
}

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteByte(Width);
writer.WriteByte((Height));
Expand Down
4 changes: 2 additions & 2 deletions src/AsmResolver.PE.Win32Resources/Version/FixedVersionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ public ulong FileDate
+ sizeof(ulong); // FileDate

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
writer.WriteUInt32(Signature);
writer.WriteUInt32(DefaultStructVersion);
Expand All @@ -155,7 +155,7 @@ public override void Write(IBinaryStreamWriter writer)
writer.WriteUInt64(FileDate);
}

private static void WriteVersion(IBinaryStreamWriter writer, System.Version version)
private static void WriteVersion(BinaryStreamWriter writer, System.Version version)
{
writer.WriteUInt16((ushort) version.Minor);
writer.WriteUInt16((ushort) version.Major);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public override uint GetPhysicalSize()
protected override uint GetValueLength() => 0;

/// <inheritdoc />
protected override void WriteValue(IBinaryStreamWriter writer)
protected override void WriteValue(BinaryStreamWriter writer)
{
for (int i = 0; i < Tables.Count; i++)
Tables[i].Write(writer);
Expand Down
4 changes: 2 additions & 2 deletions src/AsmResolver.PE.Win32Resources/Version/StringTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ private static uint CalculateEntryValueSize(string value)
protected override uint GetValueLength() => 0u;

/// <inheritdoc />
protected override void WriteValue(IBinaryStreamWriter writer)
protected override void WriteValue(BinaryStreamWriter writer)
{
foreach (var entry in _entries)
{
Expand All @@ -224,7 +224,7 @@ protected override void WriteValue(IBinaryStreamWriter writer)
}
}

private static void WriteEntry(IBinaryStreamWriter writer, KeyValuePair<string, string> entry)
private static void WriteEntry(BinaryStreamWriter writer, KeyValuePair<string, string> entry)
{
var header = new VersionTableEntryHeader(entry.Key)
{
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.Win32Resources/Version/VarFileInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public override uint GetPhysicalSize()
protected override uint GetValueLength() => 0;

/// <inheritdoc />
protected override void WriteValue(IBinaryStreamWriter writer)
protected override void WriteValue(BinaryStreamWriter writer)
{
for (int i = 0; i < Tables.Count; i++)
Tables[i].Write(writer);
Expand Down
2 changes: 1 addition & 1 deletion src/AsmResolver.PE.Win32Resources/Version/VarTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public override uint GetPhysicalSize()
protected override uint GetValueLength() => (uint) (Values.Count * sizeof(uint));

/// <inheritdoc />
protected override void WriteValue(IBinaryStreamWriter writer)
protected override void WriteValue(BinaryStreamWriter writer)
{
foreach (uint value in Values)
writer.WriteUInt32(value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ public override uint GetPhysicalSize()
protected override uint GetValueLength() => FixedVersionInfo.GetPhysicalSize();

/// <inheritdoc />
protected override void WriteValue(IBinaryStreamWriter writer)
protected override void WriteValue(BinaryStreamWriter writer)
{
FixedVersionInfo.Write(writer);
foreach (var entry in _entries.Values)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public abstract class VersionTableEntry : SegmentBase
protected abstract uint GetValueLength();

/// <inheritdoc />
public override void Write(IBinaryStreamWriter writer)
public override void Write(BinaryStreamWriter writer)
{
var header = CreateHeader();
header.Write(writer);
Expand All @@ -49,6 +49,6 @@ public override void Write(IBinaryStreamWriter writer)
/// Writes the value field of the version structure.
/// </summary>
/// <param name="writer">The output stream.</param>
protected abstract void WriteValue(IBinaryStreamWriter writer);
protected abstract void WriteValue(BinaryStreamWriter writer);
}
}

0 comments on commit c7bc9f6

Please sign in to comment.