win_iter 0.1.2

A package that allows you to easily iterate over all running programs on Windows and filter them via architecture. This package only uses bindings for WinAPI functionality.
Documentation
//! # WinAPI Bindings
//!
//! This module contains direct bindings for the Windows API
use std::ffi::c_void;

#[repr(transparent)]
#[allow(non_camel_case_types)]
pub struct CREATE_TOOLHELP_SNAPSHOT_FLAGS(pub u32);

impl std::ops::BitOr for CREATE_TOOLHELP_SNAPSHOT_FLAGS {
    type Output = Self;
    fn bitor(self, rhs: Self) -> Self {
        CREATE_TOOLHELP_SNAPSHOT_FLAGS(self.0 | rhs.0)
    }
}

pub const TH32CS_INHERIT: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(0x80000000);
pub const TH32CS_SNAPHEAPLIST: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(0x00000001);
pub const TH32CS_SNAPMODULE: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(0x00000008);
pub const TH32CS_SNAPMODULE32: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(0x00000010);
pub const TH32CS_SNAPPROCESS: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(0x00000002);
pub const TH32CS_SNAPTHREAD: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(0x00000004);
pub const TH32CS_SNAPALL: CREATE_TOOLHELP_SNAPSHOT_FLAGS = CREATE_TOOLHELP_SNAPSHOT_FLAGS(
    TH32CS_SNAPHEAPLIST.0 | TH32CS_SNAPMODULE.0 | TH32CS_SNAPPROCESS.0 | TH32CS_SNAPTHREAD.0,
);

pub const INVALID_HANDLE_VALUE: HANDLE = HANDLE(-1isize as *mut c_void);

#[repr(transparent)]
#[derive(PartialEq, Copy, Clone)]
pub struct HANDLE(pub *mut c_void);

#[repr(transparent)]
pub struct HRESULT(pub i32);

pub type Result<T> = std::result::Result<T, HRESULT>;

#[repr(C)]
#[allow(non_snake_case)]
pub struct PROCESSENTRY32 {
    pub dwSize: u32,
    pub cntUsage: u32,
    pub th32ProcessID: u32,
    pub th32DefaultHeapID: usize,
    pub th32ModuleID: u32,
    pub cntThreads: u32,
    pub th32ParentProcessID: u32,
    pub pcPriClassBase: i32,
    pub dwFlags: u32,
    pub szExeFile: [i8; 260],
}

#[repr(C)]
#[allow(non_snake_case)]
pub struct MODULEENTRY32 {
    pub dwSize: u32,
    pub th32ModuleID: u32,
    pub th32ProcessID: u32,
    pub GlblcntUsage: u32,
    pub ProccntUsage: u32,
    pub modBaseAddr: *mut u8,
    pub modBaseSize: u32,
    pub hModule: *mut c_void,
    pub szModule: [i8; 256],
    pub szExePath: [i8; 260],
}

impl Default for MODULEENTRY32 {
    fn default() -> Self {
        unsafe { core::mem::zeroed() }
    }
}

impl Default for PROCESSENTRY32 {
    fn default() -> Self {
        Self {
            dwSize: 0,
            cntUsage: 0,
            th32ProcessID: 0,
            th32DefaultHeapID: 0,
            th32ModuleID: 0,
            cntThreads: 0,
            th32ParentProcessID: 0,
            pcPriClassBase: 0,
            dwFlags: 0,
            szExeFile: [0; 260],
        }
    }
}

#[link(name = "kernel32")]
#[allow(dead_code)]
unsafe extern "system" {
    pub fn CreateToolhelp32Snapshot(dwFlags: CREATE_TOOLHELP_SNAPSHOT_FLAGS, th32ProcessId: u32) -> HANDLE;
    pub fn Process32First(hSnapshot: HANDLE, lppe: *mut PROCESSENTRY32) -> i32;
    pub fn Process32Next(hSnapshot: HANDLE, lppe: *mut PROCESSENTRY32) -> i32;
    pub fn Module32First(hSnapshot: HANDLE, llpe: *mut MODULEENTRY32) -> i32;
    pub fn Module32Next(hSnapshot: HANDLE, llpe: *mut MODULEENTRY32) -> i32;
    pub fn CloseHandle(hObject: HANDLE) -> i32;
}