use crate::maps::Maps;
use super::{list_entry::ListEntry, unicode_string::UnicodeString};
#[derive(Debug)]
pub struct LdrDataTableEntry {
pub in_load_order_links: ListEntry, pub in_memory_order_links: ListEntry, pub in_initialization_order_links: ListEntry, pub dll_base: u32, pub entry_point: u32, pub size_of_image: u32, pub full_dll_name: UnicodeString, pub base_dll_name: UnicodeString, pub flags: u32, pub load_count: u16, pub tls_index: u16, pub hash_links: ListEntry, pub time_date_stamp: u32, }
impl Default for LdrDataTableEntry {
fn default() -> Self {
Self::new()
}
}
impl LdrDataTableEntry {
pub fn size() -> usize {
72
}
pub fn new() -> LdrDataTableEntry {
LdrDataTableEntry {
in_load_order_links: ListEntry::new(),
in_memory_order_links: ListEntry::new(),
in_initialization_order_links: ListEntry::new(),
dll_base: 0,
entry_point: 0,
size_of_image: 0,
full_dll_name: UnicodeString::new(),
base_dll_name: UnicodeString::new(),
flags: 0,
load_count: 0,
tls_index: 0,
hash_links: ListEntry::new(),
time_date_stamp: 0,
}
}
pub fn load(addr: u64, maps: &Maps) -> LdrDataTableEntry {
LdrDataTableEntry {
in_load_order_links: ListEntry::load(addr, maps), in_memory_order_links: ListEntry::load(addr + 8, maps), in_initialization_order_links: ListEntry::load(addr + 16, maps), dll_base: maps.read_dword(addr + 24).unwrap(), entry_point: maps.read_dword(addr + 28).unwrap(), size_of_image: maps.read_dword(addr + 32).unwrap(), full_dll_name: UnicodeString::load(addr + 36, maps), base_dll_name: UnicodeString::load(addr + 44, maps), flags: maps.read_dword(addr + 52).unwrap(), load_count: maps.read_word(addr + 56).unwrap(), tls_index: maps.read_word(addr + 58).unwrap(), hash_links: ListEntry::load(addr + 60, maps), time_date_stamp: maps.read_dword(addr + 68).unwrap(), }
}
pub fn save(&self, addr: u64, maps: &mut Maps) {
self.in_load_order_links.save(addr, maps); self.in_memory_order_links.save(addr + 8, maps); self.in_initialization_order_links.save(addr + 16, maps); maps.write_dword(addr + 24, self.dll_base); maps.write_dword(addr + 28, self.entry_point); maps.write_dword(addr + 32, self.size_of_image); self.full_dll_name.save(addr + 36, maps); self.base_dll_name.save(addr + 44, maps); maps.write_dword(addr + 52, self.flags); maps.write_word(addr + 56, self.load_count); maps.write_word(addr + 58, self.tls_index); self.hash_links.save(addr + 60, maps); maps.write_dword(addr + 68, self.time_date_stamp); }
pub fn print(&self) {
log::trace!("{:#x?}", self);
}
}