vmi_os_windows/comps/object/
file.rs1use vmi_core::{Va, VmiError, VmiState, VmiVa, driver::VmiRead};
2
3use super::{FromWindowsObject, WindowsObject, WindowsObjectTypeKind};
4use crate::{ArchAdapter, WindowsOs, WindowsOsExt as _, offset};
5
6pub struct WindowsFileObject<'a, Driver>
16where
17 Driver: VmiRead,
18 Driver::Architecture: ArchAdapter<Driver>,
19{
20 vmi: VmiState<'a, WindowsOs<Driver>>,
22
23 va: Va,
25}
26
27impl<'a, Driver> From<WindowsFileObject<'a, Driver>> for WindowsObject<'a, Driver>
28where
29 Driver: VmiRead,
30 Driver::Architecture: ArchAdapter<Driver>,
31{
32 fn from(value: WindowsFileObject<'a, Driver>) -> Self {
33 Self::new(value.vmi, value.va)
34 }
35}
36
37impl<'a, Driver> FromWindowsObject<'a, Driver> for WindowsFileObject<'a, Driver>
38where
39 Driver: VmiRead,
40 Driver::Architecture: ArchAdapter<Driver>,
41{
42 fn from_object(object: WindowsObject<'a, Driver>) -> Result<Option<Self>, VmiError> {
43 match object.type_kind()? {
44 Some(WindowsObjectTypeKind::File) => Ok(Some(Self::new(object.vmi, object.va))),
45 _ => Ok(None),
46 }
47 }
48}
49
50impl<Driver> VmiVa for WindowsFileObject<'_, Driver>
51where
52 Driver: VmiRead,
53 Driver::Architecture: ArchAdapter<Driver>,
54{
55 fn va(&self) -> Va {
56 self.va
57 }
58}
59
60impl<'a, Driver> WindowsFileObject<'a, Driver>
61where
62 Driver: VmiRead,
63 Driver::Architecture: ArchAdapter<Driver>,
64{
65 pub fn new(vmi: VmiState<'a, WindowsOs<Driver>>, va: Va) -> Self {
67 Self { vmi, va }
68 }
69
70 pub fn device_object(&self) -> Result<WindowsObject<'a, Driver>, VmiError> {
76 let FILE_OBJECT = offset!(self.vmi, _FILE_OBJECT);
77
78 let device_object = self
79 .vmi
80 .read_va_native(self.va + FILE_OBJECT.DeviceObject.offset())?;
81
82 Ok(WindowsObject::new(self.vmi, device_object))
83 }
84
85 pub fn filename(&self) -> Result<String, VmiError> {
95 let FILE_OBJECT = offset!(self.vmi, _FILE_OBJECT);
96
97 self.vmi
100 .os()
101 .read_unicode_string(self.va + FILE_OBJECT.FileName.offset())
102 }
103
104 pub fn full_path(&self) -> Result<String, VmiError> {
116 let device = self.device_object()?.name_info()?;
117 let directory = match &device {
118 Some(device) => match device.directory()? {
119 Some(directory) => directory.name_info()?,
120 None => None,
121 },
122 None => None,
123 };
124
125 let mut result = String::new();
126 if let Some(directory) = directory {
127 result.push('\\');
128 result.push_str(&directory.name()?);
129 }
130
131 if let Some(device) = device {
132 result.push('\\');
133 result.push_str(&device.name()?);
134 }
135
136 result.push_str(&self.filename()?);
137
138 Ok(result)
139 }
140}