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
每月下载量10,613
在 5 个crate中(4个直接使用)
1MB
18K SLoC
smbios-lib
一个使用Rust创建的SMBIOS库,用于读取和解析原始BIOS数据
目录
一般信息
该项目从设备或文件读取原始SMBIOS数据,并作为API提供这些数据。
要查看使用此库的示例项目,请参阅dmidecode-rs。
支持
- DMTF系统管理BIOS (SMBIOS) 参考规范 3.7.0
- Linux
- MacOS
- Windows系列
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