#os-version #version #windows #os #api-version

winver

winver 是一个用于检测Windows真实操作系统的非常小的crate,仅依赖于 windows crate。有多种获取Windows操作系统版本的方法,每种方法都有其缺点。此crate提供API,可以更轻松、更安全地获取版本,避免缺点。

3个版本 (1个稳定版)

1.0.0 2023年7月30日
0.1.1 2023年7月28日
0.1.0 2023年7月28日

#69Windows API

Download history 53/week @ 2024-03-14 37/week @ 2024-03-21 85/week @ 2024-03-28 49/week @ 2024-04-04 51/week @ 2024-04-11 70/week @ 2024-04-18 579/week @ 2024-04-25 1591/week @ 2024-05-02 1777/week @ 2024-05-09 2016/week @ 2024-05-16 1253/week @ 2024-05-23 2169/week @ 2024-05-30 1717/week @ 2024-06-06 2182/week @ 2024-06-13 2366/week @ 2024-06-20 1243/week @ 2024-06-27

每月8,001次下载
用于 3 crate

MIT 协议

27KB
443

winver crate

CI crate docs

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 函数的工作方式如下

  1. 尝试从 ntdll.dll 中的 RtlGetVersion 函数获取操作系统版本。然而,它是一个内核模式函数,且ntdll.dll不一定存在。
  2. 尝试通过WMI的 Win32_OperatingSystem 提供程序 通过WQL获取操作系统版本。由于进程安全级别设置,WMI可能不可用。
  3. 尝试从 kernel32.dll 的文件版本信息获取操作系统版本。然而,文件中的版本信息可能与实际操作系统版本略有不同。
  4. 作为后备,尝试使用 GetVersionExW 函数获取操作系统版本。这是获取操作系统版本的官方方式,但如果程序在兼容模式下运行,它就会撒谎,并且需要在可执行文件中嵌入兼容性清单。
  5. 放弃获取操作系统版本,并返回 None

每个步骤都作为 WindowsVersion 中的独立函数实现。例如,步骤1等价于 WindowsVersion::from_ntdll_dll

此逻辑实现参考了Python的sys.getwindowsversionplatform.win32_ver的实现。

更多详细信息,请参阅API文档

安装

将以下行添加到您的项目Cargo.toml文件中。请注意,winver包仅在Windows上可用。

[target."cfg(windows)".dependencies]
winver = "1"

最小支持的Rust版本为1.65.0,以便使用let-else语句。

许可证

MIT许可证下分发。

依赖项

约129MB
约2000000 SLoC