tasklist 0.1.0

Get the process name or process id on windows
use std::mem::zeroed;
use windows::Win32::Foundation::CHAR;
use windows::Win32::Foundation::CloseHandle;
use std::mem::size_of;
use windows::Win32::System::Diagnostics::ToolHelp::{CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,PROCESSENTRY32,Process32First,Process32Next};


pub unsafe fn find_all_process_id(process_name:&str)->Vec<i32>{
    let mut temp:Vec<i32> = vec![];
    let h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0).unwrap();

    let mut process =zeroed::<PROCESSENTRY32>();
    process.dwSize= size_of::<PROCESSENTRY32>() as u32;

    if Process32First(h,&mut process).as_bool(){
        loop{

            if Process32Next(h, &mut process).as_bool(){
                if get_proc_name(process.szExeFile) == process_name {
                    temp.push(process.th32ProcessID.try_into().unwrap());
                }
            }else{
                break;
            }
        }
    }

    CloseHandle(h);
    temp

}

pub unsafe fn find_first_process_id(process_name:&str)->i32{

        let h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0).unwrap();

        let mut process =zeroed::<PROCESSENTRY32>();
        process.dwSize= size_of::<PROCESSENTRY32>() as u32;

        if Process32First(h,&mut process).as_bool(){
            loop{
                Process32Next(h, &mut process);
                if get_proc_name(process.szExeFile) == process_name {
                    break;
                }
            }
        }

        CloseHandle(h);
        process.th32ProcessID.try_into().unwrap()
}

pub unsafe fn find_process_name(process_id:i32)->String{

    let h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0).unwrap();

    let mut process =zeroed::<PROCESSENTRY32>();
    process.dwSize= size_of::<PROCESSENTRY32>() as u32;

    if Process32First(h,&mut process).as_bool(){
        loop{
            Process32Next(h, &mut process);
            let id:i32 = process.th32ProcessID.try_into().unwrap();
            if  id == process_id{
                break;
            }
        }
    }

    CloseHandle(h);
    
    get_proc_name(process.szExeFile)
}

fn get_proc_name(name:[CHAR;260])->String{

    let mut temp:Vec<u8> = vec![];
    let len = name.iter().position(|&x| x == windows::Win32::Foundation::CHAR(0)).unwrap();

    for i in name.iter(){
        temp.push(i.0.clone());
    }

    let s = String::from_utf8(temp[0..len].to_vec()).unwrap();

    s
}