#![cfg(feature = "std")]
use std::ptr::{addr_of_mut, null_mut};
use std::sync::OnceLock;
use windows::Win32::Foundation::HMODULE;
use windows::Win32::System::LibraryLoader::{
GET_MODULE_HANDLE_EX_FLAG_PIN, GetModuleHandleExA, GetProcAddress,
};
use windows::core::s;
#[must_use]
pub fn is_wine() -> bool {
static IS_WINE: OnceLock<bool> = OnceLock::new();
*IS_WINE.get_or_init(detect_wine)
}
#[allow(unsafe_code)]
fn detect_wine() -> bool {
let mut ntdll = HMODULE(null_mut());
if unsafe {
GetModuleHandleExA(
GET_MODULE_HANDLE_EX_FLAG_PIN,
s!("ntdll.dll"),
addr_of_mut!(ntdll),
)
}
.is_err()
{
return false;
}
unsafe { GetProcAddress(ntdll, s!("wine_get_version")) }.is_some()
}