pewter 0.0.3

A library for reading and writing PE files
Documentation
use crate::{
    error::{Result, PewterError},
    io::Reader,
    pe::{
        coff::CoffFileHeader,
        optional_header::{data_directories::ImageDataDirectory, OptionalHeader},
    },
};

use super::ParseSectionData;

#[derive(Default, Clone, Debug, PartialEq, Eq)]
pub struct ImageCor20Header {
    pub major_rt_version: u16,
    pub minor_rt_version: u16,
    pub metadata: ImageDataDirectory,
    pub flags: u32,
    pub entrypoint_token_or_rva: u32,
    pub resources: ImageDataDirectory,
    pub strong_name_signature: ImageDataDirectory,
    pub code_manager_table: ImageDataDirectory,
    pub vtable_fixups: ImageDataDirectory,
    pub export_address_table_jumps: ImageDataDirectory,
    pub managed_native_header: ImageDataDirectory,
}

impl ParseSectionData for ImageCor20Header {
    fn parse(
        section_data: &[u8],
        _: &super::Sections,
        _: &OptionalHeader,
        _: &CoffFileHeader,
    ) -> Result<Self> {
        let mut reader = section_data;

        let cb: u32 = reader.read()?;
        if cb < 0x48 {
            return Err(PewterError::invalid_image_format(
                "Invalid IMAGE_COR20_HEADER.cb value",
            ));
        }
        Ok(Self {
            major_rt_version: reader.read()?,
            minor_rt_version: reader.read()?,
            metadata: reader.read()?,
            flags: reader.read()?,
            entrypoint_token_or_rva: reader.read()?,
            resources: reader.read()?,
            strong_name_signature: reader.read()?,
            code_manager_table: reader.read()?,
            vtable_fixups: reader.read()?,
            export_address_table_jumps: reader.read()?,
            managed_native_header: reader.read()?,
        })
    }
}