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;
}