win_iter 0.1.3

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
pub mod wrappers {
    use std::ffi::{CStr, CString};

    use crate::winapi_bindings::{
        CREATE_TOOLHELP_SNAPSHOT_FLAGS, CloseHandle, CreateToolhelp32Snapshot, HANDLE, INVALID_HANDLE_VALUE, LoadLibraryA,
        MODULEENTRY32, Module32First, Module32Next, OpenProcess, PROCESS_ACCESS_RIGHTS, PROCESS_QUERY_INFORMATION,
        PROCESSENTRY32, Process32First, Process32Next,
    };

    pub fn load_library_a(lib_name: &str) -> Option<usize> {
        let name = CString::new(lib_name).unwrap();
        let result = unsafe { LoadLibraryA(name.as_ptr()) };

        if result.is_null() {
            return None;
        }

        Some(result as usize)
    }

    pub fn create_tool_help32_snapshot(flags: CREATE_TOOLHELP_SNAPSHOT_FLAGS, process_id: u32) -> Option<HANDLE> {
        let snapshot = unsafe { CreateToolhelp32Snapshot(flags, process_id) };
        if snapshot == INVALID_HANDLE_VALUE {
            return None;
        }

        Some(snapshot)
    }

    pub fn process32_first(snapshot: HANDLE, process_entry: *mut PROCESSENTRY32) -> bool {
        if process_entry.is_null() || snapshot == INVALID_HANDLE_VALUE {
            return false;
        }

        if unsafe { Process32First(snapshot, process_entry) } == 0 {
            return false;
        }

        true
    }

    pub fn process32_next(snapshot: HANDLE, process_entry: *mut PROCESSENTRY32) -> bool {
        if process_entry.is_null() || snapshot == INVALID_HANDLE_VALUE {
            return false;
        }

        if unsafe { Process32Next(snapshot, process_entry) == 0 } {
            return false;
        }

        true
    }

    pub fn module32_first(snapshot: HANDLE, module_entry: *mut MODULEENTRY32) -> bool {
        if snapshot == INVALID_HANDLE_VALUE || module_entry.is_null() {
            return false;
        }

        if unsafe { Module32First(snapshot, module_entry) == 0 } {
            return false;
        }

        true
    }

    pub fn module32_next(snapshot: HANDLE, module_entry: *mut MODULEENTRY32) -> bool {
        if snapshot == INVALID_HANDLE_VALUE || module_entry.is_null() {
            return false;
        }

        if unsafe { Module32Next(snapshot, module_entry) == 0 } {
            return false;
        }

        true
    }

    pub fn open_process(desired_access: PROCESS_ACCESS_RIGHTS, inherit_handle: bool, process_id: u32) -> Option<HANDLE> {
        let proc = unsafe { OpenProcess(desired_access, inherit_handle as i32, process_id) };

        if is_valid_handle(proc) {
            return Some(proc);
        } else {
            return None;
        }
    }

    pub fn close_handle(hobject: HANDLE) -> bool {
        return unsafe { CloseHandle(hobject) } != 0;
    }

    pub fn is_valid_handle(hobject: HANDLE) -> bool {
        return hobject != INVALID_HANDLE_VALUE;
    }

    pub fn cstr_to_str(cstr: *const i8) -> String {
        let str = unsafe { CStr::from_ptr(cstr).to_string_lossy() };
        str.to_string()
    }
}