DoxigAlpha

init

Function parameters

Parameters

#
data:[]const u8
is_loaded:bool

Type definitions in this namespace

Types

#
ImportHintNameEntry
Every name ends with a NULL byte.

Error sets in this namespace

Error Sets

#

= 0x10b

Values

#

Source

Implementation

#
pub fn init(data: []const u8, is_loaded: bool) !Coff {
    const pe_pointer_offset = 0x3C;
    const pe_magic = "PE\x00\x00";

    var stream = std.io.fixedBufferStream(data);
    const reader = stream.reader();
    try stream.seekTo(pe_pointer_offset);
    const coff_header_offset = try reader.readInt(u32, .little);
    try stream.seekTo(coff_header_offset);
    var buf: [4]u8 = undefined;
    try reader.readNoEof(&buf);
    const is_image = mem.eql(u8, pe_magic, &buf);

    var coff = @This(){
        .data = data,
        .is_image = is_image,
        .is_loaded = is_loaded,
        .coff_header_offset = coff_header_offset,
    };

    // Do some basic validation upfront
    if (is_image) {
        coff.coff_header_offset = coff.coff_header_offset + 4;
        const coff_header = coff.getCoffHeader();
        if (coff_header.size_of_optional_header == 0) return error.MissingPEHeader;
    }

    // JK: we used to check for architecture here and throw an error if not x86 or derivative.
    // However I am willing to take a leap of faith and let aarch64 have a shot also.

    return coff;
}