#[repr(transparent)]pub struct Pointer<U: Sized, T: ?Sized = ()> {
pub inner: U,
/* private fields */
}Expand description
This type can be used in structs that are being read from the target memory. It holds a phantom type that can be used to describe the proper type of the pointer and to read it in a more convenient way.
This module is a direct adaption of CasualX’s great IntPtr crate.
Generally the generic Type should implement the Pod trait to be read into easily. See here for more information on the Pod trait.
Examples
use memflow::types::Pointer64;
use memflow::mem::MemoryView;
use memflow::dataview::Pod;
#[repr(C)]
#[derive(Clone, Debug, Pod)]
struct Foo {
pub some_value: i64,
}
#[repr(C)]
#[derive(Clone, Debug, Pod)]
struct Bar {
pub foo_ptr: Pointer64<Foo>,
}
fn read_foo_bar(mem: &mut impl MemoryView) {
let bar: Bar = mem.read(0x1234.into()).unwrap();
let foo = bar.foo_ptr.read(mem).unwrap();
println!("value: {}", foo.some_value);
}
use memflow::types::Pointer64;
use memflow::mem::MemoryView;
use memflow::dataview::Pod;
#[repr(C)]
#[derive(Clone, Debug, Pod)]
struct Foo {
pub some_value: i64,
}
#[repr(C)]
#[derive(Clone, Debug, Pod)]
struct Bar {
pub foo_ptr: Pointer64<Foo>,
}
fn read_foo_bar(mem: &mut impl MemoryView) {
let bar: Bar = mem.read(0x1234.into()).unwrap();
let foo = mem.read_ptr(bar.foo_ptr).unwrap();
println!("value: {}", foo.some_value);
}
Fields
inner: UImplementations
sourceimpl<U: PrimitiveAddress, T: ?Sized> Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Pointer<U, T>
sourcepub fn null() -> Self
pub fn null() -> Self
Returns a pointer64 with a value of zero.
Examples
use memflow::types::Pointer64;
println!("pointer: {}", Pointer64::<()>::null());sourcepub fn is_null(self) -> bool
pub fn is_null(self) -> bool
Returns true if the pointer64 is null.
Examples
use memflow::types::Pointer32;
let ptr = Pointer32::<()>::from(0x1000u32);
assert!(!ptr.is_null());sourcepub fn non_null(self) -> Option<Pointer<U, T>>
pub fn non_null(self) -> Option<Pointer<U, T>>
Converts the pointer64 to an Option that is None when it is null
Examples
use memflow::types::Pointer64;
assert_eq!(Pointer64::<()>::null().non_null(), None);
assert_eq!(Pointer64::<()>::from(0x1000u64).non_null(), Some(Pointer64::from(0x1000u64)));sourcepub fn to_umem(self) -> umem
pub fn to_umem(self) -> umem
Converts the pointer into a raw umem value.
Examples
use memflow::types::{Pointer64, umem};
let ptr = Pointer64::<()>::from(0x1000u64);
let ptr_umem: umem = ptr.to_umem();
assert_eq!(ptr_umem, 0x1000);pub fn address(&self) -> Address
sourceimpl<U: PrimitiveAddress, T: Sized> Pointer<U, T>
impl<U: PrimitiveAddress, T: Sized> Pointer<U, T>
sourcepub fn offset(self, count: imem) -> Self
pub fn offset(self, count: imem) -> Self
Calculates the offset from a pointer64
count is in units of T; e.g., a count of 3 represents a pointer offset of 3 * size_of::<T>() bytes.
Panics
This function panics if T is a Zero-Sized Type (“ZST”).
This function also panics when offset * size_of::<T>()
causes overflow of a signed 64-bit integer.
Examples:
use memflow::types::Pointer64;
let ptr = Pointer64::<u16>::from(0x1000u64);
println!("{:?}", ptr.offset(3));sourcepub fn offset_from(self, origin: Self) -> imem
pub fn offset_from(self, origin: Self) -> imem
Calculates the distance between two pointers. The returned value is in
units of T: the distance in bytes is divided by mem::size_of::<T>().
This function is the inverse of offset.
Panics
This function panics if T is a Zero-Sized Type (“ZST”).
Examples:
use memflow::types::Pointer64;
let ptr1 = Pointer64::<u16>::from(0x1000u64);
let ptr2 = Pointer64::<u16>::from(0x1008u64);
assert_eq!(ptr2.offset_from(ptr1), 4);
assert_eq!(ptr1.offset_from(ptr2), -4);sourcepub fn add(self, count: umem) -> Self
pub fn add(self, count: umem) -> Self
Calculates the offset from a pointer (convenience for .offset(count as i64)).
count is in units of T; e.g., a count of 3 represents a pointer
offset of 3 * size_of::<T>() bytes.
Panics
This function panics if T is a Zero-Sized Type (“ZST”).
Examples
Basic usage:
use memflow::types::Pointer64;
let ptr = Pointer64::<u16>::from(0x1000u64);
println!("{:?}", ptr.add(3));sourcepub fn sub(self, count: umem) -> Self
pub fn sub(self, count: umem) -> Self
Calculates the offset from a pointer (convenience for
.offset((count as isize).wrapping_neg())).
count is in units of T; e.g., a count of 3 represents a pointer
offset of 3 * size_of::<T>() bytes.
Panics
This function panics if T is a Zero-Sized Type (“ZST”).
Examples
Basic usage:
use memflow::types::Pointer64;
let ptr = Pointer64::<u16>::from(0x1000u64);
println!("{:?}", ptr.sub(3));sourceimpl<U: PrimitiveAddress, T: Pod + ?Sized> Pointer<U, T>
impl<U: PrimitiveAddress, T: Pod + ?Sized> Pointer<U, T>
Implement special phys/virt read/write for Pod types
pub fn read_into<M: MemoryView>(
self,
mem: &mut M,
out: &mut T
) -> PartialResult<()>
sourceimpl<U: PrimitiveAddress, T: Pod + Sized> Pointer<U, T>
impl<U: PrimitiveAddress, T: Pod + Sized> Pointer<U, T>
pub fn read<M: MemoryView>(self, mem: &mut M) -> PartialResult<T>
pub fn write<M: MemoryView>(self, mem: &mut M, data: &T) -> PartialResult<()>
sourceimpl<U: PrimitiveAddress> Pointer<U, ReprCString>
impl<U: PrimitiveAddress> Pointer<U, ReprCString>
Implement special phys/virt read/write for CReprStr
pub fn read_string<M: MemoryView>(
self,
mem: &mut M
) -> PartialResult<ReprCString>
sourceimpl<U: PrimitiveAddress, T> Pointer<U, [T]>
impl<U: PrimitiveAddress, T> Pointer<U, [T]>
Trait Implementations
sourceimpl<U: PrimitiveAddress, T> Add<u64> for Pointer<U, T>
impl<U: PrimitiveAddress, T> Add<u64> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T> Add<usize> for Pointer<U, T>
impl<U: PrimitiveAddress, T> Add<usize> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> AsMut<U> for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> AsMut<U> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> AsRef<U> for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> AsRef<U> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized + 'static> ByteSwap for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized + 'static> ByteSwap for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> Clone for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Clone for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> Debug for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Debug for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> Default for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Default for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> Display for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Display for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> From<Pointer<U, T>> for Address
impl<U: PrimitiveAddress, T: ?Sized> From<Pointer<U, T>> for Address
Converts any Pointer into an Address.
sourceimpl<U: PrimitiveAddress, T: ?Sized> From<Pointer<U, T>> for PhysicalAddress
impl<U: PrimitiveAddress, T: ?Sized> From<Pointer<U, T>> for PhysicalAddress
sourceimpl<U: PrimitiveAddress, T: ?Sized> From<U> for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> From<U> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> Hash for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Hash for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> LowerHex for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> LowerHex for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> Ord for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Ord for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> PartialOrd<Pointer<U, T>> for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> PartialOrd<Pointer<U, T>> for Pointer<U, T>
sourcefn partial_cmp(&self, rhs: &Pointer<U, T>) -> Option<Ordering>
fn partial_cmp(&self, rhs: &Pointer<U, T>) -> Option<Ordering>
This method returns an ordering between self and other values if one exists. Read more
1.0.0 · sourcefn lt(&self, other: &Rhs) -> bool
fn lt(&self, other: &Rhs) -> bool
This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · sourcefn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
operator. Read more
sourceimpl<U: Pod, T: ?Sized + 'static> Pod for Pointer<U, T>
impl<U: Pod, T: ?Sized + 'static> Pod for Pointer<U, T>
sourcefn as_bytes(&self) -> &[u8]ⓘNotable traits for &'_ [u8]impl<'_> Read for &'_ [u8]impl<'_> Write for &'_ mut [u8]
fn as_bytes(&self) -> &[u8]ⓘNotable traits for &'_ [u8]impl<'_> Read for &'_ [u8]impl<'_> Write for &'_ mut [u8]
Returns the object’s memory as a byte slice.
sourcefn as_bytes_mut(&mut self) -> &mut [u8]ⓘNotable traits for &'_ [u8]impl<'_> Read for &'_ [u8]impl<'_> Write for &'_ mut [u8]
fn as_bytes_mut(&mut self) -> &mut [u8]ⓘNotable traits for &'_ [u8]impl<'_> Read for &'_ [u8]impl<'_> Write for &'_ mut [u8]
Returns the object’s memory as a mutable byte slice.
sourcefn as_data_view(&self) -> &DataView
fn as_data_view(&self) -> &DataView
Returns a data view into the object’s memory.
sourcefn as_data_view_mut(&mut self) -> &mut DataView
fn as_data_view_mut(&mut self) -> &mut DataView
Returns a mutable data view into the object’s memory.
sourcefn transmute_ref<T>(&self) -> &T where
T: Pod,
fn transmute_ref<T>(&self) -> &T where
T: Pod,
Safely transmutes references to another type. Read more
sourcefn transmute_mut<T>(&mut self) -> &mut T where
T: Pod,
fn transmute_mut<T>(&mut self) -> &mut T where
T: Pod,
Safely transmutes references to another type. Read more
sourceimpl<U: PrimitiveAddress, T> Sub<u64> for Pointer<U, T>
impl<U: PrimitiveAddress, T> Sub<u64> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T> Sub<usize> for Pointer<U, T>
impl<U: PrimitiveAddress, T> Sub<usize> for Pointer<U, T>
sourceimpl<U: PrimitiveAddress, T: ?Sized> UpperHex for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> UpperHex for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Copy for Pointer<U, T>
impl<U: PrimitiveAddress, T: ?Sized> Eq for Pointer<U, T>
Auto Trait Implementations
impl<U, T: ?Sized> RefUnwindSafe for Pointer<U, T> where
U: RefUnwindSafe,
impl<U, T: ?Sized> Send for Pointer<U, T> where
U: Send,
impl<U, T: ?Sized> Sync for Pointer<U, T> where
U: Sync,
impl<U, T: ?Sized> Unpin for Pointer<U, T> where
U: Unpin,
impl<U, T: ?Sized> UnwindSafe for Pointer<U, T> where
U: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<'a, T> BorrowOwned<'a> for T where
T: 'a + Clone,
impl<'a, T> BorrowOwned<'a> for T where
T: 'a + Clone,
type ROwned = T
type ROwned = T
The owned type, stored in RCow::Owned
pub fn r_borrow(
this: &'a <T as BorrowOwned<'a>>::ROwned
) -> <T as BorrowOwned<'a>>::RBorrowed
pub fn r_to_owned(
this: <T as BorrowOwned<'a>>::RBorrowed
) -> <T as BorrowOwned<'a>>::ROwned
pub fn deref_borrowed(this: &<T as BorrowOwned<'a>>::RBorrowed) -> &T
pub fn deref_owned(this: &<T as BorrowOwned<'a>>::ROwned) -> &T
pub fn from_cow_borrow(this: &'a T) -> <T as BorrowOwned<'a>>::RBorrowed
pub fn from_cow_owned(
this: <T as ToOwned>::Owned
) -> <T as BorrowOwned<'a>>::ROwned
pub fn into_cow_borrow(this: <T as BorrowOwned<'a>>::RBorrowed) -> &'a T
pub fn into_cow_owned(
this: <T as BorrowOwned<'a>>::ROwned
) -> <T as ToOwned>::Owned
sourceimpl<T> GetWithMetadata for T
impl<T> GetWithMetadata for T
type ForSelf = WithMetadata_<T, T>
type ForSelf = WithMetadata_<T, T>
This is always WithMetadata_<Self, Self>
impl<S> ROExtAcc for S
impl<S> ROExtAcc for S
pub fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
pub fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
Gets a reference to a field, determined by offset. Read more
pub fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
pub fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
Gets a muatble reference to a field, determined by offset. Read more
pub fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
pub fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
Gets a const pointer to a field,
the field is determined by offset. Read more
pub fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
pub fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
Gets a mutable pointer to a field, determined by offset. Read more
impl<S> ROExtOps<Aligned> for S
impl<S> ROExtOps<Aligned> for S
pub fn f_replace<F>(
&mut self,
offset: FieldOffset<S, F, Aligned>,
value: F
) -> F
pub fn f_replace<F>(
&mut self,
offset: FieldOffset<S, F, Aligned>,
value: F
) -> F
Replaces a field (determined by offset) with value,
returning the previous value of the field. Read more
pub fn f_swap<F>(&mut self, offset: FieldOffset<S, F, Aligned>, right: &mut S)
pub fn f_swap<F>(&mut self, offset: FieldOffset<S, F, Aligned>, right: &mut S)
Swaps a field (determined by offset) with the same field in right. Read more
pub fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> F where
F: Copy,
pub fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> F where
F: Copy,
Gets a copy of a field (determined by offset).
The field is determined by offset. Read more
impl<S> ROExtOps<Unaligned> for S
impl<S> ROExtOps<Unaligned> for S
pub fn f_replace<F>(
&mut self,
offset: FieldOffset<S, F, Unaligned>,
value: F
) -> F
pub fn f_replace<F>(
&mut self,
offset: FieldOffset<S, F, Unaligned>,
value: F
) -> F
Replaces a field (determined by offset) with value,
returning the previous value of the field. Read more
pub fn f_swap<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, right: &mut S)
pub fn f_swap<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, right: &mut S)
Swaps a field (determined by offset) with the same field in right. Read more
pub fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> F where
F: Copy,
pub fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> F where
F: Copy,
Gets a copy of a field (determined by offset).
The field is determined by offset. Read more
impl<T> SelfOps for T where
T: ?Sized,
impl<T> SelfOps for T where
T: ?Sized,
fn eq_id(&self, other: &Self) -> bool
fn eq_id(&self, other: &Self) -> bool
Compares the address of self with the address of other. Read more
fn piped<F, U>(self, f: F) -> U where
F: FnOnce(Self) -> U,
fn piped<F, U>(self, f: F) -> U where
F: FnOnce(Self) -> U,
Emulates the pipeline operator, allowing method syntax in more places. Read more
fn piped_ref<'a, F, U>(&'a self, f: F) -> U where
F: FnOnce(&'a Self) -> U,
fn piped_ref<'a, F, U>(&'a self, f: F) -> U where
F: FnOnce(&'a Self) -> U,
The same as piped except that the function takes &Self
Useful for functions that take &Self instead of Self. Read more
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> U where
F: FnOnce(&'a mut Self) -> U,
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> U where
F: FnOnce(&'a mut Self) -> U,
The same as piped, except that the function takes &mut Self.
Useful for functions that take &mut Self instead of Self. Read more
fn mutated<F>(self, f: F) -> Self where
F: FnOnce(&mut Self),
fn mutated<F>(self, f: F) -> Self where
F: FnOnce(&mut Self),
Mutates self using a closure taking self by mutable reference, passing it along the method chain. Read more
fn observe<F>(self, f: F) -> Self where
F: FnOnce(&Self),
fn observe<F>(self, f: F) -> Self where
F: FnOnce(&Self),
Observes the value of self, passing it along unmodified. Useful in long method chains. Read more
fn into_<T>(self) -> T where
Self: Into<T>,
fn into_<T>(self) -> T where
Self: Into<T>,
Performs a conversion with Into.
using the turbofish .into_::<_>() syntax. Read more
fn as_ref_<T>(&self) -> &T where
Self: AsRef<T>,
T: ?Sized,
fn as_ref_<T>(&self) -> &T where
Self: AsRef<T>,
T: ?Sized,
Performs a reference to reference conversion with AsRef,
using the turbofish .as_ref_::<_>() syntax. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcepub fn to_owned(&self) -> T
pub fn to_owned(&self) -> T
Creates owned data from borrowed data, usually by cloning. Read more
sourcepub fn clone_into(&self, target: &mut T)
pub fn clone_into(&self, target: &mut T)
toowned_clone_into)Uses borrowed data to replace owned data, usually by cloning. Read more
sourceimpl<This> TransmuteElement for This where
This: ?Sized,
impl<This> TransmuteElement for This where
This: ?Sized,
sourceunsafe fn transmute_element<T>(self) -> Self::TransmutedPtr where
Self: CanTransmuteElement<T>,
unsafe fn transmute_element<T>(self) -> Self::TransmutedPtr where
Self: CanTransmuteElement<T>,
Transmutes the element type of this pointer.. Read more
impl<T> TypeIdentity for T where
T: ?Sized,
impl<T> TypeIdentity for T where
T: ?Sized,
type Type = T
type Type = T
This is always Self.
fn into_type(self) -> Self::Type where
Self::Type: Sized,
fn into_type(self) -> Self::Type where
Self::Type: Sized,
Converts a value back to the original type.
fn as_type(&self) -> &Self::Type
fn as_type(&self) -> &Self::Type
Converts a reference back to the original type.
fn as_type_mut(&mut self) -> &mut Self::Type
fn as_type_mut(&mut self) -> &mut Self::Type
Converts a mutable reference back to the original type.
fn into_type_box(self: Box<Self, Global>) -> Box<Self::Type, Global>
fn into_type_box(self: Box<Self, Global>) -> Box<Self::Type, Global>
Converts a box back to the original type.
fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type>
fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type>
Converts an Arc back to the original type. Read more
fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type>
fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type>
Converts an Rc back to the original type. Read more
fn from_type(this: Self::Type) -> Self where
Self::Type: Sized,
fn from_type(this: Self::Type) -> Self where
Self::Type: Sized,
Converts a value back to the original type.
fn from_type_ref(this: &Self::Type) -> &Self
fn from_type_ref(this: &Self::Type) -> &Self
Converts a reference back to the original type.
fn from_type_mut(this: &mut Self::Type) -> &mut Self
fn from_type_mut(this: &mut Self::Type) -> &mut Self
Converts a mutable reference back to the original type.
fn from_type_box(this: Box<Self::Type, Global>) -> Box<Self, Global>
fn from_type_box(this: Box<Self::Type, Global>) -> Box<Self, Global>
Converts a box back to the original type.
fn from_type_arc(this: Arc<Self::Type>) -> Arc<Self>
fn from_type_arc(this: Arc<Self::Type>) -> Arc<Self>
Converts an Arc back to the original type.
fn from_type_rc(this: Rc<Self::Type>) -> Rc<Self>
fn from_type_rc(this: Rc<Self::Type>) -> Rc<Self>
Converts an Rc back to the original type.