3个版本 (1个稳定版)
1.0.0 | 2023年7月30日 |
---|---|
0.1.1 | 2023年7月28日 |
0.1.0 | 2023年7月28日 |
#69 在 Windows API
每月8,001次下载
用于 3 crate
27KB
443 行
winver
crate
winver
是一个极小的Rust crate,用于检测真实的Windows操作系统版本,仅依赖于 windows
crate。
use winver::WindowsVersion;
let version = WindowsVersion::detect().unwrap();
if version >= WindowsVersion::new(10, 0, 15063) {
println!("OS version is 10.0.15063 or later: {}", version);
}
有多种获取Windows操作系统版本的方法,每种方法都有其缺点。此crate提供API,可以更轻松、更安全地获取版本,避免缺点。
上述 WindowsVersion::detect
函数的工作方式如下
- 尝试从 ntdll.dll 中的
RtlGetVersion
函数获取操作系统版本。然而,它是一个内核模式函数,且ntdll.dll不一定存在。 - 尝试通过WMI的
Win32_OperatingSystem
提供程序 通过WQL获取操作系统版本。由于进程安全级别设置,WMI可能不可用。 - 尝试从 kernel32.dll 的文件版本信息获取操作系统版本。然而,文件中的版本信息可能与实际操作系统版本略有不同。
- 作为后备,尝试使用
GetVersionExW
函数获取操作系统版本。这是获取操作系统版本的官方方式,但如果程序在兼容模式下运行,它就会撒谎,并且需要在可执行文件中嵌入兼容性清单。 - 放弃获取操作系统版本,并返回
None
。
每个步骤都作为 WindowsVersion
中的独立函数实现。例如,步骤1等价于 WindowsVersion::from_ntdll_dll
。
此逻辑实现参考了Python的sys.getwindowsversion
和platform.win32_ver
的实现。
更多详细信息,请参阅API文档。
安装
将以下行添加到您的项目Cargo.toml文件中。请注意,winver
包仅在Windows上可用。
[target."cfg(windows)".dependencies]
winver = "1"
最小支持的Rust版本为1.65.0,以便使用let-else语句。
许可证
在MIT许可证下分发。
依赖项
约129MB
约2000000 SLoC