65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
// dnlib: See LICENSE.txt for more info
|
|
|
|
using System;
|
|
using dnlib.IO;
|
|
|
|
namespace dnlib.PE {
|
|
/// <summary>
|
|
/// Represents the IMAGE_NT_HEADERS PE section
|
|
/// </summary>
|
|
public sealed class ImageNTHeaders : FileSection {
|
|
readonly uint signature;
|
|
readonly ImageFileHeader imageFileHeader;
|
|
readonly IImageOptionalHeader imageOptionalHeader;
|
|
|
|
/// <summary>
|
|
/// Returns the IMAGE_NT_HEADERS.Signature field
|
|
/// </summary>
|
|
public uint Signature => signature;
|
|
|
|
/// <summary>
|
|
/// Returns the IMAGE_NT_HEADERS.FileHeader field
|
|
/// </summary>
|
|
public ImageFileHeader FileHeader => imageFileHeader;
|
|
|
|
/// <summary>
|
|
/// Returns the IMAGE_NT_HEADERS.OptionalHeader field
|
|
/// </summary>
|
|
public IImageOptionalHeader OptionalHeader => imageOptionalHeader;
|
|
|
|
/// <summary>
|
|
/// Constructor
|
|
/// </summary>
|
|
/// <param name="reader">PE file reader pointing to the start of this section</param>
|
|
/// <param name="verify">Verify section</param>
|
|
/// <exception cref="BadImageFormatException">Thrown if verification fails</exception>
|
|
public ImageNTHeaders(ref DataReader reader, bool verify) {
|
|
SetStartOffset(ref reader);
|
|
signature = reader.ReadUInt32();
|
|
// Mono only checks the low 2 bytes
|
|
if (verify && (ushort)signature != 0x4550)
|
|
throw new BadImageFormatException("Invalid NT headers signature");
|
|
imageFileHeader = new ImageFileHeader(ref reader, verify);
|
|
imageOptionalHeader = CreateImageOptionalHeader(ref reader, verify);
|
|
SetEndoffset(ref reader);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates an IImageOptionalHeader
|
|
/// </summary>
|
|
/// <param name="reader">PE file reader pointing to the start of the optional header</param>
|
|
/// <param name="verify">Verify section</param>
|
|
/// <returns>The created IImageOptionalHeader</returns>
|
|
/// <exception cref="BadImageFormatException">Thrown if verification fails</exception>
|
|
IImageOptionalHeader CreateImageOptionalHeader(ref DataReader reader, bool verify) {
|
|
ushort magic = reader.ReadUInt16();
|
|
reader.Position -= 2;
|
|
return magic switch {
|
|
0x010B => new ImageOptionalHeader32(ref reader, imageFileHeader.SizeOfOptionalHeader, verify),
|
|
0x020B => new ImageOptionalHeader64(ref reader, imageFileHeader.SizeOfOptionalHeader, verify),
|
|
_ => throw new BadImageFormatException("Invalid optional header magic"),
|
|
};
|
|
}
|
|
}
|
|
}
|