vmi_os_windows/comps/
name_info.rs1use vmi_core::{Va, VmiError, VmiState, VmiVa, driver::VmiRead};
2
3use super::WindowsObject;
4use crate::{ArchAdapter, WindowsOs, WindowsOsExt as _, offset};
5
6pub struct WindowsObjectHeaderNameInfo<'a, Driver>
15where
16 Driver: VmiRead,
17 Driver::Architecture: ArchAdapter<Driver>,
18{
19 vmi: VmiState<'a, WindowsOs<Driver>>,
21
22 va: Va,
24}
25
26impl<Driver> VmiVa for WindowsObjectHeaderNameInfo<'_, Driver>
27where
28 Driver: VmiRead,
29 Driver::Architecture: ArchAdapter<Driver>,
30{
31 fn va(&self) -> Va {
32 self.va
33 }
34}
35
36impl<Driver> std::fmt::Debug for WindowsObjectHeaderNameInfo<'_, Driver>
37where
38 Driver: VmiRead,
39 Driver::Architecture: ArchAdapter<Driver>,
40{
41 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
42 let directory = self.directory();
43 let name = self.name();
44
45 f.debug_struct("WindowsObjectHeaderNameInfo")
46 .field("directory", &directory)
47 .field("name", &name)
48 .finish()
49 }
50}
51
52impl<'a, Driver> WindowsObjectHeaderNameInfo<'a, Driver>
53where
54 Driver: VmiRead,
55 Driver::Architecture: ArchAdapter<Driver>,
56{
57 pub fn new(vmi: VmiState<'a, WindowsOs<Driver>>, va: Va) -> Self {
59 Self { vmi, va }
60 }
61
62 pub fn directory(&self) -> Result<Option<WindowsObject<'a, Driver>>, VmiError> {
68 let OBJECT_HEADER_NAME_INFO = offset!(self.vmi, _OBJECT_HEADER_NAME_INFO);
69
70 let directory = self
71 .vmi
72 .read_va_native(self.va + OBJECT_HEADER_NAME_INFO.Directory.offset())?;
73
74 if directory.is_null() {
75 return Ok(None);
76 }
77
78 Ok(Some(WindowsObject::new(self.vmi, directory)))
79 }
80
81 pub fn name(&self) -> Result<String, VmiError> {
87 let OBJECT_HEADER_NAME_INFO = offset!(self.vmi, _OBJECT_HEADER_NAME_INFO);
88
89 self.vmi
90 .os()
91 .read_unicode_string(self.va + OBJECT_HEADER_NAME_INFO.Name.offset())
92 }
93
94 pub fn full_path(&self) -> Result<String, VmiError> {
98 let mut path = String::new();
99
100 if let Some(directory) = self.directory()? {
101 if let Some(directory_path) = directory.full_path()? {
102 path.push_str(&directory_path);
103 }
104
105 if directory.va() != self.vmi.os().object_root_directory()?.va() {
106 path.push('\\');
107 }
108 }
109
110 path.push_str(&self.name()?);
111
112 Ok(path)
113 }
114}