pub trait MemoryAccessor {
// Required methods
fn read_memory<'a>(
&self,
addr: UserAddress,
bytes: &'a mut [MaybeUninit<u8>],
) -> Result<&'a mut [u8], Errno>;
fn read_memory_partial_until_null_byte<'a>(
&self,
addr: UserAddress,
bytes: &'a mut [MaybeUninit<u8>],
) -> Result<&'a mut [u8], Errno>;
fn read_memory_partial<'a>(
&self,
addr: UserAddress,
bytes: &'a mut [MaybeUninit<u8>],
) -> Result<&'a mut [u8], Errno>;
fn write_memory(
&self,
addr: UserAddress,
bytes: &[u8],
) -> Result<usize, Errno>;
fn write_memory_partial(
&self,
addr: UserAddress,
bytes: &[u8],
) -> Result<usize, Errno>;
fn zero(&self, addr: UserAddress, length: usize) -> Result<usize, Errno>;
}Required Methods§
Sourcefn read_memory<'a>(
&self,
addr: UserAddress,
bytes: &'a mut [MaybeUninit<u8>],
) -> Result<&'a mut [u8], Errno>
fn read_memory<'a>( &self, addr: UserAddress, bytes: &'a mut [MaybeUninit<u8>], ) -> Result<&'a mut [u8], Errno>
Reads exactly bytes.len() bytes of memory from addr into bytes.
In case of success, the number of bytes read will always be bytes.len().
Consider using MemoryAccessorExt::read_memory_to_* methods if you do not require control
over the allocation.
Sourcefn read_memory_partial_until_null_byte<'a>(
&self,
addr: UserAddress,
bytes: &'a mut [MaybeUninit<u8>],
) -> Result<&'a mut [u8], Errno>
fn read_memory_partial_until_null_byte<'a>( &self, addr: UserAddress, bytes: &'a mut [MaybeUninit<u8>], ) -> Result<&'a mut [u8], Errno>
Reads bytes starting at addr, continuing until either a null byte is read, bytes.len()
bytes have been read or no more bytes can be read from the target.
This is used, for example, to read null-terminated strings where the exact length is not known, only the maximum length is.
Returns the bytes that have been read to on success.
Sourcefn read_memory_partial<'a>(
&self,
addr: UserAddress,
bytes: &'a mut [MaybeUninit<u8>],
) -> Result<&'a mut [u8], Errno>
fn read_memory_partial<'a>( &self, addr: UserAddress, bytes: &'a mut [MaybeUninit<u8>], ) -> Result<&'a mut [u8], Errno>
Reads bytes starting at addr, continuing until either bytes.len() bytes have been read
or no more bytes can be read from the target.
This is used, for example, to read null-terminated strings where the exact length is not known, only the maximum length is.
Consider using MemoryAccessorExt::read_memory_partial_to_* methods if you do not require
control over the allocation.
Sourcefn write_memory(&self, addr: UserAddress, bytes: &[u8]) -> Result<usize, Errno>
fn write_memory(&self, addr: UserAddress, bytes: &[u8]) -> Result<usize, Errno>
Writes the provided bytes to addr.
In case of success, the number of bytes written will always be bytes.len().
§Parameters
addr: The address to write to.bytes: The bytes to write from.
Sourcefn write_memory_partial(
&self,
addr: UserAddress,
bytes: &[u8],
) -> Result<usize, Errno>
fn write_memory_partial( &self, addr: UserAddress, bytes: &[u8], ) -> Result<usize, Errno>
Writes bytes starting at addr, continuing until either bytes.len() bytes have been
written or no more bytes can be written.
§Parameters
addr: The address to write to.bytes: The bytes to write from.
Trait Implementations§
Source§impl MemoryAccessorExt for dyn MemoryAccessor + '_
impl MemoryAccessorExt for dyn MemoryAccessor + '_
Source§fn read_memory_to_slice(
&self,
addr: UserAddress,
bytes: &mut [u8],
) -> Result<(), Errno>
fn read_memory_to_slice( &self, addr: UserAddress, bytes: &mut [u8], ) -> Result<(), Errno>
Source§fn read_memory_to_vec(
&self,
addr: UserAddress,
len: usize,
) -> Result<Vec<u8>, Errno>
fn read_memory_to_vec( &self, addr: UserAddress, len: usize, ) -> Result<Vec<u8>, Errno>
len bytes of memory, returning them as a a Vec.Source§fn read_memory_partial_to_vec(
&self,
addr: UserAddress,
max_len: usize,
) -> Result<Vec<u8>, Errno>
fn read_memory_partial_to_vec( &self, addr: UserAddress, max_len: usize, ) -> Result<Vec<u8>, Errno>
max_len bytes from addr, returning them as a Vec.Source§fn read_memory_to_array<const N: usize>(
&self,
addr: UserAddress,
) -> Result<[u8; N], Errno>
fn read_memory_to_array<const N: usize>( &self, addr: UserAddress, ) -> Result<[u8; N], Errno>
N bytes from addr, returning them as an array.Source§fn read_buffer(&self, buffer: &UserBuffer) -> Result<Vec<u8>, Errno>
fn read_buffer(&self, buffer: &UserBuffer) -> Result<Vec<u8>, Errno>
buffer, returning them as a Vec.Source§fn read_object<T: FromBytes>(&self, user: UserRef<T>) -> Result<T, Errno>
fn read_object<T: FromBytes>(&self, user: UserRef<T>) -> Result<T, Errno>
user.fn read_multi_arch_ptr<T64, T32>( &self, user: MultiArchUserRef<MultiArchUserRef<T64, T32>, MultiArchUserRef<T64, T32>>, ) -> Result<MultiArchUserRef<T64, T32>, Errno>
Source§fn read_multi_arch_object<T, T64: FromBytes + TryInto<T>, T32: FromBytes + TryInto<T>>(
&self,
user: MappingMultiArchUserRef<T, T64, T32>,
) -> Result<T, Errno>
fn read_multi_arch_object<T, T64: FromBytes + TryInto<T>, T32: FromBytes + TryInto<T>>( &self, user: MappingMultiArchUserRef<T, T64, T32>, ) -> Result<T, Errno>
user where the object has a different representation in 32
and 64 bits.Source§fn read_multi_arch_objects_to_vec<T, T64: FromBytes + TryInto<T>, T32: FromBytes + TryInto<T>>(
&self,
user: MappingMultiArchUserRef<T, T64, T32>,
len: usize,
) -> Result<Vec<T>, Errno>
fn read_multi_arch_objects_to_vec<T, T64: FromBytes + TryInto<T>, T32: FromBytes + TryInto<T>>( &self, user: MappingMultiArchUserRef<T, T64, T32>, len: usize, ) -> Result<Vec<T>, Errno>
len objects from user, returning them as a Vec.Source§fn read_object_partial<T: FromBytes>(
&self,
user: UserRef<T>,
partial_size: usize,
) -> Result<T, Errno>
fn read_object_partial<T: FromBytes>( &self, user: UserRef<T>, partial_size: usize, ) -> Result<T, Errno>
partial bytes of an object, leaving any remainder 0-filled. Read moreSource§fn read_objects<'a, T: FromBytes>(
&self,
user: UserRef<T>,
objects: &'a mut [MaybeUninit<T>],
) -> Result<&'a mut [T], Errno>
fn read_objects<'a, T: FromBytes>( &self, user: UserRef<T>, objects: &'a mut [MaybeUninit<T>], ) -> Result<&'a mut [T], Errno>
objects.len() objects into objects from user.Source§fn read_objects_to_slice<T: FromBytes>(
&self,
user: UserRef<T>,
objects: &mut [T],
) -> Result<(), Errno>
fn read_objects_to_slice<T: FromBytes>( &self, user: UserRef<T>, objects: &mut [T], ) -> Result<(), Errno>
objects.len() objects into objects from user.Source§fn read_objects_to_vec<T: FromBytes>(
&self,
user: UserRef<T>,
len: usize,
) -> Result<Vec<T>, Errno>
fn read_objects_to_vec<T: FromBytes>( &self, user: UserRef<T>, len: usize, ) -> Result<Vec<T>, Errno>
len objects from user, returning them as a Vec.Source§fn read_objects_to_smallvec<T: Clone + FromBytes, const N: usize>(
&self,
user: UserRef<T>,
len: usize,
) -> Result<SmallVec<[T; N]>, Errno>
fn read_objects_to_smallvec<T: Clone + FromBytes, const N: usize>( &self, user: UserRef<T>, len: usize, ) -> Result<SmallVec<[T; N]>, Errno>
len objects from user, returning them as a SmallVec.Source§fn read_objects_to_array<T: Copy + FromBytes, const N: usize>(
&self,
user: UserRef<T>,
) -> Result<[T; N], Errno>
fn read_objects_to_array<T: Copy + FromBytes, const N: usize>( &self, user: UserRef<T>, ) -> Result<[T; N], Errno>
N objects from user, returning them as an array.Source§fn read_iovec<T: Copy + Eq + IntoBytes + FromBytes + Immutable + TryInto<usize>>(
&self,
iovec_addr: IOVecPtr,
iovec_count: UserValue<T>,
) -> Result<UserBuffers, Errno>
fn read_iovec<T: Copy + Eq + IntoBytes + FromBytes + Immutable + TryInto<usize>>( &self, iovec_addr: IOVecPtr, iovec_count: UserValue<T>, ) -> Result<UserBuffers, Errno>
Source§fn read_c_string_to_vec(
&self,
string: UserCString,
max_size: usize,
) -> Result<FsString, Errno>
fn read_c_string_to_vec( &self, string: UserCString, max_size: usize, ) -> Result<FsString, Errno>
max_size bytes from string, stopping at the first discovered null byte and
returning the results as a Vec.Source§fn read_path_if_non_null(&self, path: UserCString) -> Result<FsString, Errno>
fn read_path_if_non_null(&self, path: UserCString) -> Result<FsString, Errno>
Source§fn read_nul_delimited_c_string_list(
&self,
start: UserAddress,
len: usize,
) -> Result<Vec<FsString>, Errno>
fn read_nul_delimited_c_string_list( &self, start: UserAddress, len: usize, ) -> Result<Vec<FsString>, Errno>
len bytes from start and parse the region as null-delimited CStrings, for example
how argv is stored. Read moreSource§fn read_c_string<'a>(
&self,
string: UserCString,
buffer: &'a mut [MaybeUninit<u8>],
) -> Result<&'a FsStr, Errno>
fn read_c_string<'a>( &self, string: UserCString, buffer: &'a mut [MaybeUninit<u8>], ) -> Result<&'a FsStr, Errno>
buffer.len() bytes from string, stopping at the first discovered null byte
and returning the result as a slice that ends before that null. Read moreSource§fn read_c_string_if_non_null<'a>(
&self,
addr: UserCString,
buffer: &'a mut [MaybeUninit<u8>],
) -> Result<&'a FsStr, Errno>
fn read_c_string_if_non_null<'a>( &self, addr: UserCString, buffer: &'a mut [MaybeUninit<u8>], ) -> Result<&'a FsStr, Errno>
addr is null, otherwise
behaves as read_c_string.