use crate::error::Result;
use crate::module::Module;
use crate::platform;
use crate::region::MemoryRegion;
pub struct Process {
inner: platform::ProcessHandle,
pid: u32,
}
impl Process {
pub fn attach(pid: u32) -> Result<Self> {
let inner = platform::attach(pid)?;
Ok(Self { inner, pid })
}
pub fn pid(&self) -> u32 {
self.pid
}
pub unsafe fn read<T: Copy>(&self, address: usize) -> Result<T> {
let mut value = std::mem::MaybeUninit::<T>::uninit();
let buf =
std::slice::from_raw_parts_mut(value.as_mut_ptr() as *mut u8, std::mem::size_of::<T>());
platform::read_bytes(&self.inner, address, buf)?;
Ok(value.assume_init())
}
pub fn write<T: Copy>(&self, address: usize, value: &T) -> Result<()> {
let buf = unsafe {
std::slice::from_raw_parts(value as *const T as *const u8, std::mem::size_of::<T>())
};
platform::write_bytes(&self.inner, address, buf)
}
pub fn read_bytes(&self, address: usize, len: usize) -> Result<Vec<u8>> {
let mut buf = vec![0u8; len];
platform::read_bytes(&self.inner, address, &mut buf)?;
Ok(buf)
}
pub fn write_bytes(&self, address: usize, bytes: &[u8]) -> Result<()> {
platform::write_bytes(&self.inner, address, bytes)
}
pub fn modules(&self) -> Result<Vec<Module>> {
platform::modules(&self.inner, self.pid)
}
pub fn regions(&self) -> Result<Vec<MemoryRegion>> {
platform::regions(&self.inner, self.pid)
}
}