pub struct Inventory { /* private fields */ }Expand description
The core of the plugin system
It scans system directories and collects valid memflow plugins. They can then be instantiated easily. The reason the libraries are collected is to allow for reuse, and save performance
§Examples
Creating a OS instance, the recommended way:
use memflow::plugins::Inventory;
let mut inventory = Inventory::scan();
inventory
.builder()
.connector("qemu")
.os("win32")
.build()Nesting connectors and os plugins:
use memflow::plugins::{Inventory, Args};
let mut inventory = Inventory::scan();
let os = inventory
.builder()
.connector("qemu")
.os("linux")
.connector("qemu")
.os("win32")
.build();Implementations§
Source§impl Inventory
impl Inventory
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new inventory of plugins from the default plugin installation path. The default plugin installation path is also the one used by memflowup.
§Examples
Creating a inventory:
use memflow::plugins::Inventory;
let mut inventory = Inventory::new();Sourcepub fn scan_path<P: AsRef<Path>>(path: P) -> Result<Self>
pub fn scan_path<P: AsRef<Path>>(path: P) -> Result<Self>
Creates a new inventory of plugins from the provided path.
The path has to be a valid directory or the function will fail with an Error::IO error.
§Examples
Creating a inventory:
use memflow::plugins::Inventory;
let mut inventory = Inventory::scan_path("./")
.unwrap();Sourcepub fn scan() -> Self
pub fn scan() -> Self
Creates a new inventory of plugins by searching various paths.
It will query PATH, and an additional set of of directories (standard unix ones, if unix, and “HOME/.local/lib” on all OSes) for “memflow” directory, and if there is one, then search for libraries in there.
§Examples
Creating an inventory:
use memflow::plugins::Inventory;
let mut inventory = Inventory::scan();Sourcepub fn add_cargo_workspace(self) -> Result<Self>
pub fn add_cargo_workspace(self) -> Result<Self>
Adds cargo workspace to the inventory
This function is used behind the scenes by the documentation, however, is not particularly useful for end users.
Sourcepub fn add_dir<P: AsRef<Path>>(&mut self, path: P) -> Result<&Self>
pub fn add_dir<P: AsRef<Path>>(&mut self, path: P) -> Result<&Self>
Adds a library directory to the inventory
§Safety
Same as previous functions - compiler can not guarantee the safety of third party library implementations.
pub fn add_file<P: AsRef<Path>>(&mut self, path: P) -> Result<&Self>
Sourcepub fn builder(&mut self) -> BuilderEmpty<'_>
pub fn builder(&mut self) -> BuilderEmpty<'_>
Creates a new Connector / OS builder.
§Examples
Create a connector:
use memflow::plugins::Inventory;
let mut inventory = Inventory::scan();
let os = inventory
.builder()
.connector("qemu")
.build();Create a Connector with arguments:
use memflow::plugins::{Inventory, Args};
let mut inventory = Inventory::scan();
let os = inventory
.builder()
.connector("qemu")
.args(str::parse("vm-win10").unwrap())
.build();Create a Connector and OS with arguments:
use memflow::plugins::{Inventory, Args};
let mut inventory = Inventory::scan();
let os = inventory
.builder()
.connector("qemu")
.args(str::parse("vm-win10").unwrap())
.os("win10")
.build();Create a OS without a connector and arguments:
use memflow::plugins::Inventory;
let mut inventory = Inventory::scan();
let os = inventory
.builder()
.os("native")
.build();Sourcepub fn instantiate_connector(
&mut self,
name: &str,
input: ConnectorInputArg,
args: Option<&ConnectorArgs>,
) -> Result<ConnectorInstanceArcBox<'static>>
pub fn instantiate_connector( &mut self, name: &str, input: ConnectorInputArg, args: Option<&ConnectorArgs>, ) -> Result<ConnectorInstanceArcBox<'static>>
Instantiates a new connector instance. The instance will be initialized with the args provided to this call.
In case no connector could be found this will throw an Error::Library.
§Safety
This function assumes all libraries were loaded with appropriate safety checks in place. This function is safe, but can crash if previous checks fail.
§Examples
Creating a connector instance:
use memflow::plugins::{Inventory, Args};
let mut inventory = Inventory::scan_path("./").unwrap();
let connector = inventory
.instantiate_connector("coredump", None, None)
.unwrap();Defining a dynamically loaded connector:
use memflow::error::Result;
use memflow::types::size;
use memflow::dummy::DummyMemory;
use memflow::plugins::ConnectorArgs;
use memflow::derive::connector;
use memflow::mem::phys_mem::*;
#[connector(name = "dummy_conn")]
pub fn create_connector(_args: &ConnectorArgs) -> Result<DummyMemory> {
Ok(DummyMemory::new(size::mb(16)))
}pub fn create_connector( &mut self, name: &str, input: ConnectorInputArg, args: Option<&ConnectorArgs>, ) -> Result<ConnectorInstanceArcBox<'static>>
Sourcepub fn instantiate_os(
&mut self,
name: &str,
input: OsInputArg,
args: Option<&OsArgs>,
) -> Result<OsInstanceArcBox<'static>>
pub fn instantiate_os( &mut self, name: &str, input: OsInputArg, args: Option<&OsArgs>, ) -> Result<OsInstanceArcBox<'static>>
Instantiates a new connector instance. The instance will be initialized with the args provided to this call.
In case no connector could be found this will throw an Error::Library.
§Safety
This function assumes all libraries were loaded with appropriate safety checks in place. This function is safe, but can crash if previous checks fail.
§Examples
Creating a OS instance with custom arguments
use memflow::plugins::{Inventory, ConnectorArgs};
let args = str::parse(":4m").unwrap();
let os = inventory.instantiate_os("dummy", None, Some(&args))
.unwrap();
std::mem::drop(os);pub fn create_os( &mut self, name: &str, input: OsInputArg, args: Option<&OsArgs>, ) -> Result<OsInstanceArcBox<'static>>
Sourcepub fn set_max_log_level(&self, level: LevelFilter)
pub fn set_max_log_level(&self, level: LevelFilter)
Sets the maximum logging level in all plugins and updates the
internal [PluginLogger] in each plugin instance.
Sourcepub fn available_connectors(&self) -> Vec<String>
pub fn available_connectors(&self) -> Vec<String>
Returns the names of all currently available connectors that can be used.
Sourcepub fn available_os(&self) -> Vec<String>
pub fn available_os(&self) -> Vec<String>
Returns the names of all currently available os plugins that can be used.
Sourcepub fn connector_help(&mut self, name: &str) -> Result<String>
pub fn connector_help(&mut self, name: &str) -> Result<String>
Returns the help string of the given Connector.
This function returns an error in case the Connector was not found or does not implement the help feature.
Sourcepub fn os_help(&mut self, name: &str) -> Result<String>
pub fn os_help(&mut self, name: &str) -> Result<String>
Returns the help string of the given Os Plugin.
This function returns an error in case the Os Plugin was not found or does not implement the help feature.
Sourcepub fn connector_target_list(&mut self, name: &str) -> Result<Vec<TargetInfo>>
pub fn connector_target_list(&mut self, name: &str) -> Result<Vec<TargetInfo>>
Returns a list of all available targets of the connector.
This function returns an error in case the connector does not implement this feature.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Inventory
impl RefUnwindSafe for Inventory
impl Send for Inventory
impl Sync for Inventory
impl Unpin for Inventory
impl UnwindSafe for Inventory
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<'a, T> BorrowOwned<'a> for Twhere
T: 'a + Clone,
impl<'a, T> BorrowOwned<'a> for Twhere
T: 'a + Clone,
fn r_borrow( this: &'a <T as BorrowOwned<'a>>::ROwned, ) -> <T as BorrowOwned<'a>>::RBorrowed
fn r_to_owned( this: <T as BorrowOwned<'a>>::RBorrowed, ) -> <T as BorrowOwned<'a>>::ROwned
fn deref_borrowed(this: &<T as BorrowOwned<'a>>::RBorrowed) -> &T
fn deref_owned(this: &<T as BorrowOwned<'a>>::ROwned) -> &T
fn from_cow_borrow(this: &'a T) -> <T as BorrowOwned<'a>>::RBorrowed
fn from_cow_owned(this: <T as ToOwned>::Owned) -> <T as BorrowOwned<'a>>::ROwned
fn into_cow_borrow(this: <T as BorrowOwned<'a>>::RBorrowed) -> &'a T
fn into_cow_owned(this: <T as BorrowOwned<'a>>::ROwned) -> <T as ToOwned>::Owned
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> GetWithMetadata for T
impl<T> GetWithMetadata for T
Source§type ForSelf = WithMetadata_<T, T>
type ForSelf = WithMetadata_<T, T>
WithMetadata_<Self, Self>Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<S> ROExtAcc for S
impl<S> ROExtAcc for S
Source§fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
offset. Read moreSource§fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
offset. Read moreSource§fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
offset. Read moreSource§fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
offset. Read moreSource§impl<S> ROExtOps<Aligned> for S
impl<S> ROExtOps<Aligned> for S
Source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
offset) with value,
returning the previous value of the field. Read moreSource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
Source§impl<S> ROExtOps<Unaligned> for S
impl<S> ROExtOps<Unaligned> for S
Source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
offset) with value,
returning the previous value of the field. Read moreSource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
Source§impl<T> SelfOps for Twhere
T: ?Sized,
impl<T> SelfOps for Twhere
T: ?Sized,
Source§fn piped<F, U>(self, f: F) -> U
fn piped<F, U>(self, f: F) -> U
Source§fn piped_ref<'a, F, U>(&'a self, f: F) -> Uwhere
F: FnOnce(&'a Self) -> U,
fn piped_ref<'a, F, U>(&'a self, f: F) -> Uwhere
F: FnOnce(&'a Self) -> U,
piped except that the function takes &Self
Useful for functions that take &Self instead of Self. Read moreSource§fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
piped, except that the function takes &mut Self.
Useful for functions that take &mut Self instead of Self.Source§fn mutated<F>(self, f: F) -> Self
fn mutated<F>(self, f: F) -> Self
Source§fn observe<F>(self, f: F) -> Self
fn observe<F>(self, f: F) -> Self
Source§fn as_ref_<T>(&self) -> &T
fn as_ref_<T>(&self) -> &T
AsRef,
using the turbofish .as_ref_::<_>() syntax. Read more