use crate::{
impl_ttd_view,
ttd::{
memory::{QueriedMemory, QueriedMemoryRange, QueriedMemoryWithRanges},
raw::bindings::*,
},
};
use std::ffi::c_void;
impl_ttd_view!(ThreadView, IThreadView);
impl ThreadView {
#[inline]
pub fn get_thread_info(&self) -> ThreadInfo {
unsafe { *self.0.GetThreadInfo() }
}
#[inline]
pub fn get_teb_address(&self) -> GuestAddress {
unsafe { self.0.GetTebAddress() }
}
#[inline]
pub fn get_position(&self) -> Position { unsafe { *self.0.GetPosition() } }
#[inline]
pub fn get_previous_position(&self) -> Position {
unsafe { self.0.GetPreviousPosition() }
}
#[inline]
pub fn get_program_counter(&self) -> GuestAddress {
unsafe { self.0.GetProgramCounter() }
}
#[inline]
pub fn get_stack_pointer(&self) -> GuestAddress {
unsafe { self.0.GetStackPointer() }
}
#[inline]
pub fn get_frame_pointer(&self) -> GuestAddress {
unsafe { self.0.GetFramePointer() }
}
#[inline]
pub fn get_basic_return_value(&self) -> u64 {
unsafe { self.0.GetBasicReturnValue() }
}
#[inline]
pub fn get_cross_platform_context(&self) -> RegisterContext {
unsafe { self.0.GetCrossPlatformContext() }
}
#[inline]
pub fn get_avx_extended_context(&self) -> ExtendedRegisterContext {
unsafe { self.0.GetAvxExtendedContext() }
}
#[inline]
pub fn query_memory_range<'a>(
&'a mut self,
address: GuestAddress,
) -> QueriedMemoryRange<'a> {
let result = unsafe { self.0.QueryMemoryRange(address) };
unsafe { QueriedMemoryRange::from_ttd_owned(result) }
}
pub fn query_memory_buffer<'a>(
&self,
address: GuestAddress,
buffer: &'a mut [u8],
) -> QueriedMemory<'a> {
let raw_buffer = BufferView {
BaseAddress: buffer.as_mut_ptr().cast(),
Size: buffer.len(),
};
let result = unsafe { self.0.QueryMemoryBuffer(address, raw_buffer) };
QueriedMemory::from_raw(buffer, result)
}
pub fn query_memory_buffer_with_ranges<'a, 'r>(
&self,
address: GuestAddress,
buffer: &'a mut [u8],
ranges: &'r mut [MemoryRange],
) -> QueriedMemoryWithRanges<'a, 'r> {
let raw_buffer = BufferView {
BaseAddress: buffer.as_mut_ptr().cast(),
Size: buffer.len(),
};
let result = unsafe {
self.0
.QueryMemoryBufferWithRanges(address, raw_buffer, ranges)
};
QueriedMemoryWithRanges::from_raw(buffer, ranges, result)
}
}
impl ThreadView {
pub unsafe fn _from_callback_raw(raw: *const c_void) -> Option<Self> {
let raw = unsafe { IThreadView::from_raw(raw) }?;
Some(Self::from(raw))
}
}