use core::ffi::c_void;
use tracing::{instrument, Span};
use windows::Win32::Foundation::HANDLE;
use windows::Win32::System::Memory::{VirtualFreeEx, MEM_RELEASE};
use super::surrogate_process_manager::get_surrogate_process_manager;
use super::wrappers::HandleWrapper;
#[derive(Debug)]
pub(super) struct SurrogateProcess {
pub(crate) allocated_address: *mut c_void,
pub(crate) process_handle: HandleWrapper,
}
impl SurrogateProcess {
#[instrument(skip_all, parent = Span::current(), level= "Trace")]
pub(super) fn new(allocated_address: *mut c_void, process_handle: HANDLE) -> Self {
Self {
allocated_address,
process_handle: HandleWrapper::from(process_handle),
}
}
}
impl Default for SurrogateProcess {
#[instrument(skip_all, parent = Span::current(), level= "Trace")]
fn default() -> Self {
let allocated_address = std::ptr::null_mut();
Self::new(allocated_address, Default::default())
}
}
impl Drop for SurrogateProcess {
#[instrument(skip_all, parent = Span::current(), level= "Trace")]
fn drop(&mut self) {
let handle: HANDLE = self.process_handle.into();
if let Err(e) = unsafe { VirtualFreeEx(handle, self.allocated_address, 0, MEM_RELEASE) } {
tracing::error!(
"Failed to free surrogate process resources (VirtualFreeEx failed): {:?}",
e
);
}
get_surrogate_process_manager()
.unwrap()
.return_surrogate_process(self.process_handle)
.unwrap();
}
}