Skip to content

Commit

Permalink
Add support for CreateReaderAtFileOffset to read from EOF data.
Browse files Browse the repository at this point in the history
  • Loading branch information
Washi1337 committed Jun 10, 2023
1 parent 1196789 commit 5821428
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
21 changes: 19 additions & 2 deletions src/AsmResolver.PE.File/PEFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -282,8 +282,9 @@ public bool TryCreateDataDirectoryReader(DataDirectory dataDirectory, out Binary
/// <inheritdoc />
public BinaryStreamReader CreateReaderAtFileOffset(uint fileOffset)
{
var section = GetSectionContainingOffset(fileOffset);
return section.CreateReader(fileOffset);
return !TryCreateReaderAtFileOffset(fileOffset, out var reader)
? throw new ArgumentOutOfRangeException(nameof(fileOffset))
: reader;
}

/// <inheritdoc />
Expand All @@ -295,6 +296,14 @@ public bool TryCreateReaderAtFileOffset(uint fileOffset, out BinaryStreamReader
return true;
}

if (EofData is IReadableSegment eofData
&& fileOffset >= eofData.Offset
&& fileOffset < eofData.Offset + eofData.GetPhysicalSize())
{
reader = eofData.CreateReader(fileOffset);
return true;
}

reader = default;
return false;
}
Expand All @@ -315,6 +324,14 @@ public bool TryCreateReaderAtFileOffset(uint fileOffset, uint size, out BinarySt
return true;
}

if (EofData is IReadableSegment eofData
&& fileOffset >= eofData.Offset
&& fileOffset < eofData.Offset + eofData.GetPhysicalSize())
{
reader = eofData.CreateReader(fileOffset, size);
return true;
}

reader = default;
return false;
}
Expand Down
10 changes: 10 additions & 0 deletions test/AsmResolver.PE.File.Tests/PEFileTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,16 @@ public void ReadEofData()
Assert.Equal(Encoding.ASCII.GetBytes("abcdefghijklmnopqrstuvwxyz"), data);
}

[Fact]
public void ReadEofDataFromFileOffset()
{
var file = PEFile.FromBytes(Properties.Resources.HelloWorld_EOF);
Assert.NotNull(file.EofData);
Assert.True(file.TryCreateReaderAtFileOffset((uint) file.EofData.Offset, out var reader));
byte[] data = reader.ReadToEnd();
Assert.Equal(Encoding.ASCII.GetBytes("abcdefghijklmnopqrstuvwxyz"), data);
}

[Fact]
public void AddNewEofData()
{
Expand Down

0 comments on commit 5821428

Please sign in to comment.