use windows::{
Win32::{
Foundation::HANDLE,
System::Threading::{OpenProcess, PROCESS_ALL_ACCESS},
},
};
use super::DllInjectorError;
pub(crate) fn get_module_base_address(pid: u32, module_name: &str) -> Result<usize, DllInjectorError> {
crate::snapshot::get_module_base_address(pid, module_name)
.ok_or_else(|| DllInjectorError::Other(format!(
"Module {} not found in process {}",
module_name, pid
)))
}
pub(crate) fn is_module_loaded(pid: u32, module_name: &str) -> bool {
crate::snapshot::get_module_base_address(pid, module_name).is_some()
}
pub(crate) fn open_process_full(pid: u32) -> Result<HANDLE, DllInjectorError> {
unsafe {
OpenProcess(PROCESS_ALL_ACCESS, false, pid)
.map_err(|e| DllInjectorError::OpenProcessFailed(e.to_string()))
.and_then(|handle| {
if handle.is_invalid() {
Err(DllInjectorError::OpenProcessFailed(
format!("Invalid handle for process {}", pid)
))
} else {
Ok(handle)
}
})
}
}