use zerocopy::little_endian::U32;
use crate::address::Rva;
pe_struct! {
pub struct ImageDataDirectory {
virtual_address: U32 => Rva,
size: U32 => u32,
}
}
impl ImageDataDirectory {
pub fn parse_table(data: &[u8], offset: usize) -> crate::Result<&[Self]> {
crate::bytes::Bytes(data).read_slice(offset, DataDirectoryType::COUNT)
}
pub fn is_present(&self) -> bool {
self.virtual_address().get() != 0 && self.size() != 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(usize)]
pub enum DataDirectoryType {
Export = 0,
Import = 1,
Resource = 2,
Exception = 3,
Security = 4,
BaseReloc = 5,
Debug = 6,
Copyright = 7,
GlobalPtr = 8,
Tls = 9,
LoadConfig = 10,
BoundImport = 11,
Iat = 12,
DelayImport = 13,
ComDescriptor = 14,
Reserved = 15,
}
impl DataDirectoryType {
pub const COUNT: usize = 16;
}