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()
}
}