#[cfg(target_env = "msvc")]
mod internal {
#[link(name = "ntdll")]
extern "system" {
pub fn RtlGetNtVersionNumbers(major: *mut u32, minor: *mut u32, build: *mut u32);
}
}
#[cfg(target_env = "gnu")]
mod internal {
use windows::{
core::PCSTR,
s,
Win32::System::LibraryLoader::{GetModuleHandleA, GetProcAddress},
};
#[allow(non_upper_case_globals)]
static mut CacheRtlGetNtVersionNumbers: Option<unsafe extern "system" fn() -> isize> = None;
#[allow(non_snake_case)]
pub unsafe fn RtlGetNtVersionNumbers(major: *mut u32, minor: *mut u32, build: *mut u32) {
if CacheRtlGetNtVersionNumbers.is_none() {
CacheRtlGetNtVersionNumbers = GetProcAddress(
GetModuleHandleA(PCSTR::from_raw(s!("ntdll.dll").as_ptr())).unwrap_or_default(),
PCSTR::from_raw(s!("RtlGetNtVersionNumbers").as_ptr()),
);
}
if let Some(RtlGetNtVersionNumbers_FUNCTION) = CacheRtlGetNtVersionNumbers {
std::intrinsics::transmute::<_, extern "system" fn(*mut u32, *mut u32, *mut u32)>(
RtlGetNtVersionNumbers_FUNCTION,
)(major, minor, build)
} else {
*major = 7;
}
}
}
pub fn is_newer_than_windows81() -> bool {
let mut major = 0u32;
let mut minor = 0u32;
let mut build = 0u32;
unsafe {
internal::RtlGetNtVersionNumbers(&mut major, &mut minor, &mut build);
}
major > 6
}