#[cfg(target_os = "linux")]
use procfs::process::{all_processes, Process};
#[cfg(target_os = "windows")]
use std::ffi::CStr;
#[cfg(target_os = "windows")]
use std::ptr::null_mut;
#[cfg(target_os = "windows")]
use winapi::um::handleapi::CloseHandle;
#[cfg(target_os = "windows")]
use winapi::um::tlhelp32::{
CreateToolhelp32Snapshot, Process32First, Process32Next, PROCESSENTRY32, TH32CS_SNAPPROCESS,
};
#[cfg(any(target_os = "linux", target_os = "macos"))]
pub fn get_pid(task_name: &str) -> Option<i32> {
for process in all_processes().unwrap() {
if let Ok(proc) = process {
if proc.stat.comm.to_lowercase() == task_name.to_lowercase() {
return Some(proc.pid); }
}
}
None
}
#[cfg(target_os = "windows")]
pub fn get_pid(task_name: &str) -> Option<u32> {
unsafe {
let snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if snapshot == null_mut() {
return None;
}
let mut entry: PROCESSENTRY32 = std::mem::zeroed();
entry.dwSize = std::mem::size_of::<PROCESSENTRY32>() as u32;
if Process32First(snapshot, &mut entry) == 1 {
loop {
let process_name = CStr::from_ptr(entry.szExeFile.as_ptr())
.to_string_lossy()
.into_owned();
if process_name.to_lowercase().contains(&task_name.to_lowercase()) {
CloseHandle(snapshot);
return Some(entry.th32ProcessID);
}
if Process32Next(snapshot, &mut entry) == 0 {
break;
}
}
}
CloseHandle(snapshot); None
}
}
#[cfg(any(target_os = "linux", target_os = "macos"))]
pub fn get_process_name(pid: i32) -> Option<String> {
match Process::new(pid) {
Ok(process) => Some(process.stat.comm),
Err(_) => None,
}
}
#[cfg(target_os = "windows")]
pub fn get_process_name(pid: u32) -> Option<String> {
unsafe {
let snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if snapshot == null_mut() {
return None;
}
let mut entry: PROCESSENTRY32 = std::mem::zeroed();
entry.dwSize = std::mem::size_of::<PROCESSENTRY32>() as u32;
if Process32First(snapshot, &mut entry) == 1 {
loop {
if entry.th32ProcessID == pid {
let process_name = CStr::from_ptr(entry.szExeFile.as_ptr())
.to_string_lossy()
.into_owned();
CloseHandle(snapshot); return Some(process_name);
}
if Process32Next(snapshot, &mut entry) == 0 {
break;
}
}
}
CloseHandle(snapshot); None
}
}