#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::string::String;
#[cfg(feature = "std")]
use std::string::String;
use super::list_entry::ListEntry;
use super::unicode_string::UnicodeString;
use crate::arch::NativePtr;
#[repr(C)]
pub struct PebLdrData {
pub length: u32,
pub initialized: u8,
pub ss_handle: NativePtr,
pub in_load_order_module_list: ListEntry,
pub in_memory_order_module_list: ListEntry,
pub in_initialization_order_module_list: ListEntry,
pub entry_in_progress: NativePtr,
pub shutdown_in_progress: u8,
pub shutdown_thread_id: NativePtr,
}
#[repr(C)]
pub struct LdrDataTableEntry {
pub in_load_order_links: ListEntry,
pub in_memory_order_links: ListEntry,
pub in_initialization_order_links: ListEntry,
pub dll_base: NativePtr,
pub entry_point: NativePtr,
pub size_of_image: u32,
pub full_dll_name: UnicodeString,
pub base_dll_name: UnicodeString,
}
impl LdrDataTableEntry {
pub fn base(&self) -> usize {
self.dll_base as usize
}
pub fn size(&self) -> usize {
self.size_of_image as usize
}
pub fn entry_point(&self) -> usize {
self.entry_point as usize
}
pub unsafe fn full_name(&self) -> String {
unsafe { self.full_dll_name.to_string() }
}
pub unsafe fn base_name(&self) -> String {
unsafe { self.base_dll_name.to_string() }
}
pub fn contains_address(&self, addr: usize) -> bool {
let base = self.base();
addr >= base && addr < base + self.size()
}
pub unsafe fn matches_name(&self, name: &str) -> bool {
unsafe { self.base_dll_name.eq_ignore_case(name) }
}
}
pub const IN_LOAD_ORDER_LINKS_OFFSET: usize = 0;
#[cfg(target_arch = "x86_64")]
pub const IN_MEMORY_ORDER_LINKS_OFFSET: usize = 0x10;
#[cfg(target_arch = "x86")]
pub const IN_MEMORY_ORDER_LINKS_OFFSET: usize = 0x08;
#[cfg(target_arch = "x86_64")]
pub const IN_INITIALIZATION_ORDER_LINKS_OFFSET: usize = 0x20;
#[cfg(target_arch = "x86")]
pub const IN_INITIALIZATION_ORDER_LINKS_OFFSET: usize = 0x10;