//! Support for reading PE files. //! //! Traits are used to abstract over the difference between PE32 and PE32+. //! The primary trait for this is [`ImageNtHeaders`]. //! //! ## High level API //! //! [`PeFile`] implements the [`Object`](crate::read::Object) trait for //! PE files. [`PeFile`] is parameterised by [`ImageNtHeaders`] to allow //! reading both PE32 and PE32+. There are type aliases for these parameters //! ([`PeFile32`] and [`PeFile64`]). //! //! ## Low level API //! //! The [`ImageNtHeaders`] trait can be directly used to parse both //! [`pe::ImageNtHeaders32`] and [`pe::ImageNtHeaders64`]. //! //! ### Example for low level API //! ```no_run //! use object::pe; //! use object::read::pe::ImageNtHeaders; //! use std::error::Error; //! use std::fs; //! //! /// Reads a file and displays the name of each section. //! fn main() -> Result<(), Box> { //! # #[cfg(feature = "std")] { //! let data = fs::read("path/to/binary")?; //! let dos_header = pe::ImageDosHeader::parse(&*data)?; //! let mut offset = dos_header.nt_headers_offset().into(); //! let (nt_headers, data_directories) = pe::ImageNtHeaders64::parse(&*data, &mut offset)?; //! let sections = nt_headers.sections(&*data, offset)?; //! let symbols = nt_headers.symbols(&*data)?; //! for section in sections.iter() { //! println!("{}", String::from_utf8_lossy(section.name(symbols.strings())?)); //! } //! # } //! Ok(()) //! } //! ``` #[cfg(doc)] use crate::pe; mod file; pub use file::*; mod section; pub use section::*; mod data_directory; pub use data_directory::*; mod export; pub use export::*; mod import; pub use import::*; mod relocation; pub use relocation::*; mod resource; pub use resource::*; mod rich; pub use rich::*; pub use super::coff::{SectionTable, SymbolTable};