use vmi_core::{Va, VmiError, VmiState, VmiVa, driver::VmiRead};
use crate::{ArchAdapter, WindowsOs, WindowsOsExt as _};
struct Field {
offset: u64,
}
impl Field {
const fn offset(&self) -> u64 {
self.offset
}
}
#[expect(non_camel_case_types)]
struct _UNLOADED_DRIVERS {
Name: Field, StartAddress: Field, EndAddress: Field, CurrentTime: Field, }
const UNLOADED_DRIVERS: _UNLOADED_DRIVERS = _UNLOADED_DRIVERS {
Name: Field { offset: 0x0000 }, StartAddress: Field { offset: 0x0010 }, EndAddress: Field { offset: 0x0018 }, CurrentTime: Field { offset: 0x0020 }, };
pub struct WindowsUnloadedDriver<'a, Driver>
where
Driver: VmiRead,
Driver::Architecture: ArchAdapter<Driver>,
{
vmi: VmiState<'a, WindowsOs<Driver>>,
va: Va,
}
impl<Driver> VmiVa for WindowsUnloadedDriver<'_, Driver>
where
Driver: VmiRead,
Driver::Architecture: ArchAdapter<Driver>,
{
fn va(&self) -> Va {
self.va
}
}
impl<'a, Driver> WindowsUnloadedDriver<'a, Driver>
where
Driver: VmiRead,
Driver::Architecture: ArchAdapter<Driver>,
{
pub fn new(vmi: VmiState<'a, WindowsOs<Driver>>, va: Va) -> Self {
Self { vmi, va }
}
pub fn name(&self) -> Result<String, VmiError> {
self.vmi
.os()
.read_unicode_string(self.va + UNLOADED_DRIVERS.Name.offset())
}
pub fn start_address(&self) -> Result<Va, VmiError> {
self.vmi
.read_va_native(self.va + UNLOADED_DRIVERS.StartAddress.offset())
}
pub fn end_address(&self) -> Result<Va, VmiError> {
self.vmi
.read_va_native(self.va + UNLOADED_DRIVERS.EndAddress.offset())
}
pub fn current_time(&self) -> Result<u64, VmiError> {
self.vmi
.read_u64(self.va + UNLOADED_DRIVERS.CurrentTime.offset())
}
}