pe-assembler 0.1.1

PE/COFF assembler for Windows instruction sets - strongly typed, object-oriented, zero-dependency core
Documentation
use gaia_binary::{LittleEndian, ReadBytesExt};
use gaia_types::GaiaError;
use serde::{Deserialize, Serialize};
use std::io::{Read, Seek, SeekFrom};

/// NT header structure
///
/// Contains the main signature and basic information for a PE file, identifying it as a valid PE file.
/// The signature field must be 0x00004550 ("PE\0\0").
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub struct NtHeader {
    /// PE signature, must be 0x00004550 ("PE\0\0")
    pub signature: u32,
}

impl NtHeader {
    /// Read NT header from binary reader
    ///
    /// # Arguments
    /// * `reader` - Binary reader
    ///
    /// # Returns
    /// Returns NT header structure or error
    pub fn read<R>(mut reader: R) -> Result<Self, GaiaError>
    where
        R: Read,
    {
        let signature = reader.read_u32::<LittleEndian>()?;
        Ok(NtHeader { signature })
    }

    pub fn read_at<R, E>(mut reader: R, offset: u64) -> Result<Self, GaiaError>
    where
        R: Read + Seek,
    {
        reader.seek(SeekFrom::Start(offset))?;
        Self::read(reader)
    }
}

impl Default for NtHeader {
    fn default() -> Self {
        Self {
            // "PE\0\0"
            signature: 0x00004550,
        }
    }
}