#![cfg(feature = "libloaderapi")]
use super::*;
use winapi::um::libloaderapi::{
FreeLibrary, GetModuleHandleW, GetProcAddress, LoadLibraryW,
};
#[inline]
pub unsafe fn get_module_handle(
opt_name: Option<&str>,
) -> Result<HMODULE, ErrorCode> {
let module = match opt_name {
Some(name) => {
let name_wide = wide_null(name);
GetModuleHandleW(name_wide.as_ptr())
}
None => GetModuleHandleW(null()),
};
if module.is_null() {
Err(get_last_error())
} else {
Ok(module)
}
}
#[inline]
pub fn load_library(lib_file_name: &str) -> Result<HMODULE, ErrorCode> {
let name_null = wide_null(lib_file_name);
let h = unsafe { LoadLibraryW(name_null.as_ptr()) };
if h.is_null() {
Err(get_last_error())
} else {
Ok(h)
}
}
#[inline]
pub unsafe fn free_library(handle: HMODULE) -> Result<(), ErrorCode> {
if FreeLibrary(handle) != 0 {
Ok(())
} else {
Err(get_last_error())
}
}
#[inline]
pub unsafe fn get_proc_address(
module: HMODULE,
proc: &str,
) -> Result<NonNull<c_void>, ErrorCode> {
let v: Vec<u8> = proc.bytes().chain(Some(0)).collect();
NonNull::new(GetProcAddress(module, v.as_ptr().cast()).cast())
.ok_or_else(|| get_last_error())
}