1use super::list_entry::ListEntry;
4use super::unicode_string::UnicodeString;
5use crate::arch::NativePtr;
6
7#[repr(C)]
9pub struct PebLdrData {
10 pub length: u32,
11 pub initialized: u8,
12 pub ss_handle: NativePtr,
13 pub in_load_order_module_list: ListEntry,
14 pub in_memory_order_module_list: ListEntry,
15 pub in_initialization_order_module_list: ListEntry,
16 pub entry_in_progress: NativePtr,
17 pub shutdown_in_progress: u8,
18 pub shutdown_thread_id: NativePtr,
19}
20
21#[repr(C)]
26pub struct LdrDataTableEntry {
27 pub in_load_order_links: ListEntry,
28 pub in_memory_order_links: ListEntry,
29 pub in_initialization_order_links: ListEntry,
30 pub dll_base: NativePtr,
31 pub entry_point: NativePtr,
32 pub size_of_image: u32,
33 pub full_dll_name: UnicodeString,
34 pub base_dll_name: UnicodeString,
35 }
38
39impl LdrDataTableEntry {
40 pub fn base(&self) -> usize {
42 self.dll_base as usize
43 }
44
45 pub fn size(&self) -> usize {
47 self.size_of_image as usize
48 }
49
50 pub fn entry_point(&self) -> usize {
52 self.entry_point as usize
53 }
54
55 pub unsafe fn full_name(&self) -> String {
60 unsafe { self.full_dll_name.to_string() }
61 }
62
63 pub unsafe fn base_name(&self) -> String {
68 unsafe { self.base_dll_name.to_string() }
69 }
70
71 pub fn contains_address(&self, addr: usize) -> bool {
73 let base = self.base();
74 addr >= base && addr < base + self.size()
75 }
76
77 pub unsafe fn matches_name(&self, name: &str) -> bool {
82 unsafe { self.base_dll_name.eq_ignore_case(name) }
83 }
84}
85
86pub const IN_LOAD_ORDER_LINKS_OFFSET: usize = 0;
88
89#[cfg(target_arch = "x86_64")]
91pub const IN_MEMORY_ORDER_LINKS_OFFSET: usize = 0x10;
92
93#[cfg(target_arch = "x86")]
94pub const IN_MEMORY_ORDER_LINKS_OFFSET: usize = 0x08;
95
96#[cfg(target_arch = "x86_64")]
98pub const IN_INITIALIZATION_ORDER_LINKS_OFFSET: usize = 0x20;
99
100#[cfg(target_arch = "x86")]
101pub const IN_INITIALIZATION_ORDER_LINKS_OFFSET: usize = 0x10;