use std::ffi::c_void;
#[repr(transparent)]
#[allow(non_camel_case_types)]
pub struct CREATE_TOOLHELP_SNAPSHOT_FLAGS(pub u32);
#[repr(transparent)]
#[allow(non_camel_case_types)]
pub struct PROCESS_ACCESS_RIGHTS(pub u32);
impl std::ops::BitOr for PROCESS_ACCESS_RIGHTS {
type Output = Self;
fn bitor(self, rhs: Self) -> Self {
PROCESS_ACCESS_RIGHTS(self.0 | rhs.0)
}
}
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 DELETE: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x00010000);
pub const READ_CONTROL: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x00020000);
pub const SYNCHRONIZE: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x00100000);
pub const WRITE_DAC: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x00040000);
pub const WRITE_OWNER: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x00080000);
pub const STANDARD_RIGHTS_REQUIRED: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x000F0000);
pub const PROCESS_TERMINATE: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0001);
pub const PROCESS_CREATE_THREAD: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0002);
pub const PROCESS_VM_OPERATION: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0008);
pub const PROCESS_VM_READ: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0010);
pub const PROCESS_VM_WRITE: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0020);
pub const PROCESS_DUP_HANDLE: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0040);
pub const PROCESS_CREATE_PROCESS: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0080);
pub const PROCESS_SET_QUOTA: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0100);
pub const PROCESS_SET_INFORMATION: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0200);
pub const PROCESS_QUERY_INFORMATION: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0400);
pub const PROCESS_SUSPEND_RESUME: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x0800);
pub const PROCESS_QUERY_LIMITED_INFORMATION: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(0x1000);
pub const PROCESS_ALL_ACCESS: PROCESS_ACCESS_RIGHTS = PROCESS_ACCESS_RIGHTS(STANDARD_RIGHTS_REQUIRED.0 | SYNCHRONIZE.0 | 0xFFFF);
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 GetProcAddress(hModule: *mut c_void, lpProcName: *const i8) -> *mut c_void;
pub fn LoadLibraryA(lpLibFileName: *const i8) -> *mut c_void;
pub fn CloseHandle(hObject: HANDLE) -> i32;
pub fn OpenProcess(dwDesiredAccess: PROCESS_ACCESS_RIGHTS, bInheritHandle: i32, process_id: u32) -> HANDLE;
pub fn IsWow64Process(hProcess: HANDLE, Wow64Process: &mut i32) -> bool;
}