mod standard_fields_32;
mod standard_fields_64;
use std::io;
pub use standard_fields_32::StandardFields32;
pub use standard_fields_64::StandardFields64;
use zerocopy::{Immutable, KnownLayout, TryFromBytes};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum StandardFields {
PE32(StandardFields32),
PE64(StandardFields64),
}
impl StandardFields {
#[inline]
pub const fn major_linker_version(&self) -> u8 {
match self {
Self::PE32(pe32) => pe32.major_linker_version(),
Self::PE64(pe64) => pe64.major_linker_version(),
}
}
#[inline]
pub const fn minor_linker_version(&self) -> u8 {
match self {
Self::PE32(pe32) => pe32.minor_linker_version(),
Self::PE64(pe64) => pe64.minor_linker_version(),
}
}
#[inline]
pub const fn size_of_code(&self) -> u32 {
match self {
Self::PE32(pe32) => pe32.size_of_code(),
Self::PE64(pe64) => pe64.size_of_code(),
}
}
#[inline]
pub const fn size_of_initialized_data(&self) -> u32 {
match self {
Self::PE32(pe32) => pe32.size_of_initialized_data(),
Self::PE64(pe64) => pe64.size_of_initialized_data(),
}
}
#[inline]
pub const fn size_of_uninitialized_data(&self) -> u32 {
match self {
Self::PE32(pe32) => pe32.size_of_uninitialized_data(),
Self::PE64(pe64) => pe64.size_of_uninitialized_data(),
}
}
#[inline]
pub const fn address_of_entry_point(&self) -> u32 {
match self {
Self::PE32(pe32) => pe32.address_of_entry_point(),
Self::PE64(pe64) => pe64.address_of_entry_point(),
}
}
#[inline]
pub const fn base_of_code(&self) -> u32 {
match self {
Self::PE32(pe32) => pe32.base_of_code(),
Self::PE64(pe64) => pe64.base_of_code(),
}
}
#[inline]
pub const fn base_of_data(&self) -> Option<u32> {
match self {
Self::PE32(pe32) => Some(pe32.base_of_data()),
Self::PE64(_) => None,
}
}
}
impl From<StandardFields32> for StandardFields {
#[inline]
fn from(fields: StandardFields32) -> Self {
Self::PE32(fields)
}
}
impl From<StandardFields64> for StandardFields {
#[inline]
fn from(fields: StandardFields64) -> Self {
Self::PE64(fields)
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, TryFromBytes, Immutable, KnownLayout)]
#[repr(u16)]
pub enum Magic {
#[doc(alias = "IMAGE_NT_OPTIONAL_HDR32_MAGIC")]
ImageNtOptionalHdr32 = 0x10b_u16.to_le(),
#[doc(alias = "IMAGE_NT_OPTIONAL_HDR64_MAGIC")]
ImageNtOptionalHdr64 = 0x20b_u16.to_le(),
#[doc(alias = "IMAGE_ROM_OPTIONAL_HDR_MAGIC")]
ImageRomOptionalHdr = 0x107_u16.to_le(),
}
impl Magic {
pub fn try_read_from_io<R>(mut src: R) -> io::Result<Self>
where
Self: Sized,
R: io::Read,
{
let mut buf = [0; size_of::<Self>()];
src.read_exact(&mut buf)?;
Self::try_read_from_bytes(&buf)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err.to_string()))
}
}
impl From<standard_fields_32::Magic> for Magic {
fn from(_magic: standard_fields_32::Magic) -> Self {
Self::ImageNtOptionalHdr32
}
}
impl From<Magic> for standard_fields_32::Magic {
fn from(_magic: Magic) -> Self {
Self::ImageNtOptionalHdr32
}
}
impl From<standard_fields_64::Magic> for Magic {
fn from(_magic: standard_fields_64::Magic) -> Self {
Self::ImageNtOptionalHdr64
}
}
impl From<Magic> for standard_fields_64::Magic {
fn from(_magic: Magic) -> Self {
Self::ImageNtOptionalHdr64
}
}