12个版本

0.9.1 2023年9月22日
0.9.0 2022年3月29日
0.8.1 2022年3月23日
0.8.0 2021年6月12日
0.7.1 2021年3月29日

硬件支持 中排名33

Download history 1603/week @ 2024-04-21 1588/week @ 2024-04-28 2735/week @ 2024-05-05 2437/week @ 2024-05-12 2366/week @ 2024-05-19 2331/week @ 2024-05-26 2789/week @ 2024-06-02 2720/week @ 2024-06-09 2058/week @ 2024-06-16 2776/week @ 2024-06-23 2405/week @ 2024-06-30 3508/week @ 2024-07-07 2811/week @ 2024-07-14 2373/week @ 2024-07-21 2929/week @ 2024-07-28 2388/week @ 2024-08-04

每月下载量10,613
5 个crate中(4个直接使用)

自定义许可证

1MB
18K SLoC

smbios-lib

一个使用Rust创建的SMBIOS库,用于读取和解析原始BIOS数据

crates.io smbioslib_ci LOC

目录

一般信息

该项目从设备或文件读取原始SMBIOS数据,并作为API提供这些数据。

要查看使用此库的示例项目,请参阅dmidecode-rs

支持

SMBIOS 3.7.0包含49个定义的结构类型,本库覆盖了所有这些类型(类型0-46,126和127)。通过扩展性支持类型128-255(为OEM保留)。如果此库未针对最新规范版本或预发布规范进行更新,或者引入了新的类型,扩展性也适用。

项目状态

处于早期开发阶段。

当前的开发阶段是最终确定API设计。

依赖项

  • Windows
    • libc = "^0.2"
  • MacOS
    • libc = "^0.2"
    • mach = "^0.3"
    • core-foundation = "~0.6"
    • core-foundation-sys = "~0.6"
    • io-kit-sys = "^0.1.0"

安全性

此库的设计遵循严格的安全格言:“永不信任输入”。

SMBIOS存在几十年,经历了很多版本和修订。多年来,许多OEM供应商对规范进行了解释和实施。存在已知的不正确固件实现案例。这对已知和未知的情况都构成了一个逻辑迷宫。我们不是创建这样一个复杂的状态机,而是利用Rust的Option<>特性和断言,任何信息检索都可能失败。因此,举证责任从库转移到库消费者,要求其实施失败的条件分支。

示例

检索单个实例结构体的字段

有些结构是必需的,并且是单个实例。(例如,SMBiosSystemInformation

#[test]
/// Retrieves the System UUID from a device.
/// UUID is found in the System Information (type 1) structure
fn retrieve_system_uuid() {
    match table_load_from_device() {
        Ok(data) => match data.find_map(|sys_info: SMBiosSystemInformation| sys_info.uuid()) {
            Some(uuid) => println!("System Information UUID == {:?}", uuid),
            None => println!("No System Information (Type 1) structure found with a UUID field"),
        },
        Err(err) => println!("failure: {:?}", err),
    }
}

输出

running 1 test
System Information UUID == Uuid(4ee6523f-d56a-f3ea-8e2a-891cf96286ea)
test retrieve_system_uuid ... ok

检索结构实例 - collect()

某些结构可以拥有多个实例。(例如,SMBiosMemoryDevice

#[test]
/// Prints information for all memory devices within a device.
fn print_all_memory_devices() {
    match table_load_from_device() {
        Ok(data) => {
            for memory_device in data.collect::<SMBiosMemoryDevice>() {
                println!("{:#?}", memory_device);
            }
        }
        Err(err) => println!("failure: {:?}", err),
    }
}

输出

running 1 test
smbioslib::structs::types::memory_device::SMBiosMemoryDevice {
    header: smbioslib::core::header::Header {
        struct_type: 17,
        length: 40,
        handle: smbioslib::structs::structure::Handle {
            handle: 8,
        },
    },
    physical_memory_array_handle: Some(
        smbioslib::structs::structure::Handle {
            handle: 1,
        },
    ),
[...elided...]

根据句柄检索结构 - find_by_handle()

某些结构通过句柄指向其他结构。(例如,SMBiosMemoryDevice 指向 SMBiosPhysicalMemoryArray

/// Finds an associated struct by handle
#[test]
fn struct_struct_association() {
    match table_load_from_device() {
        Ok(data) => match data.first::<SMBiosMemoryDevice>() {
            Some(first_memory_device) => {
                let handle = first_memory_device.physical_memory_array_handle().unwrap();
                match data.find_by_handle(&handle) {
                    Some(undefined_struct) => {
                        let physical_memory_array = undefined_struct.defined_struct();
                        println!("{:#?}", physical_memory_array)
                    }
                    None => println!("No Physical Memory Array (Type 16) structure found"),
                }
            }
            None => println!("No Memory Device (Type 17) structure found"),
        },
        Err(err) => println!("failure: {:?}", err),
    }
}

输出

running 1 test
PhysicalMemoryArray(
    smbioslib::structs::types::physical_memory_array::SMBiosPhysicalMemoryArray {
        header: smbioslib::core::header::Header {
            struct_type: 16,
            length: 23,
            handle: smbioslib::structs::structure::Handle {
                handle: 1,
            },
        },
        location: Some(
            smbioslib::structs::types::physical_memory_array::MemoryArrayLocationData {
                raw: 3,
                value: SystemBoardOrMotherboard,
            },
        ),
[...elided...]

依赖项

~1.1–2.3MB
~42K SLoC