use crate::memory::MemoryError;
use crate::memory_hook::register_extractor::extractor::RegisterExtractor;
use crate::memory_hook::register_extractor::register::Register;
use windows::Win32::Foundation::HANDLE;
pub struct RegisterExtractorBuilder {
handle: Option<HANDLE>,
target_address: Option<usize>,
bytes_to_overwrite: Option<usize>,
extracted_regs: Vec<Register>,
is_x64: bool,
}
impl RegisterExtractorBuilder {
pub fn new() -> Self {
Self {
handle: None,
target_address: None,
bytes_to_overwrite: None,
extracted_regs: Vec::new(),
is_x64: true, }
}
pub fn handle(mut self, handle: HANDLE) -> Self {
self.handle = Some(handle);
self
}
pub fn target_address(mut self, addr: usize) -> Self {
self.target_address = Some(addr);
self
}
pub fn bytes_to_overwrite(mut self, bytes: usize) -> Self {
self.bytes_to_overwrite = Some(bytes);
self
}
pub fn extract_register(mut self, reg: Register) -> Self {
if !self.extracted_regs.contains(®) {
self.extracted_regs.push(reg);
}
self
}
pub fn extract_registers(mut self, regs: &[Register]) -> Self {
for ® in regs {
if !self.extracted_regs.contains(®) {
self.extracted_regs.push(reg);
}
}
self
}
pub fn x86(mut self) -> Self {
self.is_x64 = false;
self
}
pub fn x64(mut self) -> Self {
self.is_x64 = true;
self
}
pub fn build(self) -> Result<RegisterExtractor, MemoryError> {
let handle = self
.handle
.ok_or_else(|| MemoryError::InvalidAddress("handle is required".to_string()))?;
let target_address = self
.target_address
.ok_or_else(|| MemoryError::InvalidAddress("target_address is required".to_string()))?;
let bytes_to_overwrite = self.bytes_to_overwrite.ok_or_else(|| {
MemoryError::InvalidAddress("bytes_to_overwrite is required".to_string())
})?;
if self.extracted_regs.is_empty() {
return Err(MemoryError::InvalidAddress(
"At least one register must be specified for extraction".to_string(),
));
}
Ok(RegisterExtractor::new(
handle,
target_address,
bytes_to_overwrite,
self.extracted_regs,
self.is_x64,
))
}
}
impl Default for RegisterExtractorBuilder {
fn default() -> Self {
Self::new()
}
}