mod directory;
mod directory_entry_data;
mod image;
mod resource_types;
mod section_reader;
use std::io;
pub use directory::ResourceDirectory;
pub use image::{ImageResourceDataEntry, ImageResourceDirectory, ImageResourceDirectoryEntry};
pub use resource_types::ResourceType;
pub use section_reader::SectionReader;
use zerocopy::{FromBytes, FromZeros, IntoBytes};
#[derive(Debug)]
pub struct ResourceDirectoryTable {
pub header: ImageResourceDirectory,
name_entries: Vec<ImageResourceDirectoryEntry>,
id_entries: Vec<ImageResourceDirectoryEntry>,
}
impl ResourceDirectoryTable {
pub fn read_from<R>(mut src: R) -> io::Result<Self>
where
R: io::Read,
{
let header = ImageResourceDirectory::read_from_io(&mut src)?;
let mut name_entries =
vec![ImageResourceDirectoryEntry::new_zeroed(); header.number_of_name_entries().into()];
for name_entry in &mut name_entries {
src.read_exact(name_entry.as_mut_bytes())?;
}
let mut id_entries =
vec![ImageResourceDirectoryEntry::new_zeroed(); header.number_of_id_entries().into()];
for id_entry in &mut id_entries {
src.read_exact(id_entry.as_mut_bytes())?;
}
Ok(Self {
header,
name_entries,
id_entries,
})
}
pub fn find_id_entry(&self, id: u32) -> Option<&ImageResourceDirectoryEntry> {
self.id_entries().find(|entry| entry.name_or_id() == id)
}
#[inline]
pub fn id_entries(&self) -> impl Iterator<Item = &ImageResourceDirectoryEntry> {
self.id_entries.iter()
}
#[inline]
pub fn name_entries(&self) -> impl Iterator<Item = &ImageResourceDirectoryEntry> {
self.name_entries.iter()
}
pub fn entries(&self) -> impl Iterator<Item = &ImageResourceDirectoryEntry> {
self.name_entries().chain(self.id_entries())
}
}