Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #[cfg(windows)]
- pub fn descendents_of(parent_pid: pid_t) -> Result<Vec<pid_t>, Error> {
- use std::os::windows::io::RawHandle;
- use winapi::um::processthreadsapi::{GetProcessId, OpenProcess};
- use winapi::um::winnt::{ACCESS_MASK, MAXIMUM_ALLOWED, HANDLE, PROCESS_QUERY_INFORMATION};
- use winapi::um::handleapi::CloseHandle;
- use winapi::shared::minwindef::{FALSE, ULONG};
- use winapi::shared::ntdef::NTSTATUS;
- #[link(name="ntdll")]
- extern "system" {
- // (Vista and above) enumerate process children.
- fn NtGetNextProcess(process: HANDLE, access: ACCESS_MASK, attritubes: ULONG, flags: ULONG, new_process: *mut HANDLE) -> NTSTATUS;
- }
- let mut handle = unsafe {
- OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, parent_pid)
- };
- let mut handles = vec![handle];
- if handle == (0 as RawHandle) {
- return Err(format_err!(
- "Unable to fetch process handle for process {}", parent_pid
- ));
- }
- unsafe {
- while NtGetNextProcess(handle, MAXIMUM_ALLOWED, 0, 0,
- &mut handle) == 0 {
- handles.push(handle);
- }
- }
- let ret = handles.iter().map(|x| {
- let pid = GetProcessId(x);
- unsafe { CloseHandle(x) };
- pid
- }).collect();
- println!("TODO: debugging, remove!!! {:?}", ret);
- Ok(ret)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement