heim-process 0.0.11

Cross-platform processes information
Documentation
use std::io::{Error, Result};
use std::mem;

use winapi::shared::minwindef::DWORD;
use winapi::um::psapi;

pub mod handle;
pub mod processes;
pub mod snapshot;

pub use self::handle::ProcessHandle;

pub fn pids() -> Result<Vec<DWORD>> {
    let mut processes = Vec::with_capacity(1024);
    let mut bytes_returned: DWORD = 0;

    loop {
        let cb = (processes.capacity() * mem::size_of::<DWORD>()) as DWORD;
        let result =
            unsafe { psapi::EnumProcesses(processes.as_mut_ptr(), cb, &mut bytes_returned) };

        if result == 0 {
            return Err(Error::last_os_error());
        }

        if cb == bytes_returned {
            processes.reserve(1024);
            continue;
        } else {
            unsafe {
                processes.set_len(bytes_returned as usize / mem::size_of::<DWORD>());
            }
            break;
        }
    }

    Ok(processes)
}