Skip to content

Commit c4e18ee

Browse files
committed
esrt: Get full ESRT table entries on Windows
Before: ``` ESRT Table ResourceCount: 1 ResourceCountMax: 1 ResourceVersion: 1 ESRT Entry 0 GUID: 9C13B7F1-D618-5D68-BE61-6B17881014A7 GUID: Amd13Ai300Bios Type: SystemFirmware Version: 0x304 (772) Min FW Version: 0x0 (0) Capsule Flags: 0x0 Last Attempt Version: 0x0 (0) Last Attempt Status: Success ``` After ``` ESRT Table ResourceCount: 1 ResourceCountMax: 1 ResourceVersion: 1 ESRT Entry 0 GUID: 9C13B7F1-D618-5D68-BE61-6B17881014A7 GUID: Amd13Ai300Bios Type: SystemFirmware Version: 0x304 (772) Min FW Version: 0x204 (516) Capsule Flags: 0x0 Last Attempt Version: 0x304 (772) Last Attempt Status: Success ``` Signed-off-by: Daniel Schaefer <[email protected]>
1 parent bba3daa commit c4e18ee

File tree

3 files changed

+47
-60
lines changed

3 files changed

+47
-60
lines changed

Cargo.lock

Lines changed: 21 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework_lib/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ clap = { version = "4.5", features = ["derive", "cargo"] }
5151
clap-num = { version = "1.2.0" }
5252
clap-verbosity-flag = { version = "2.2.1" }
5353
windows-version = "0.1.4"
54+
winreg = "0.55.0"
5455

5556
[target.'cfg(unix)'.dependencies]
5657
libc = "0.2.155"

framework_lib/src/esrt/mod.rs

Lines changed: 25 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ use std::io;
2424
#[cfg(target_os = "linux")]
2525
use std::path::Path;
2626

27+
#[cfg(target_os = "windows")]
28+
use winreg::enums::HKEY_LOCAL_MACHINE;
29+
#[cfg(target_os = "windows")]
30+
use winreg::RegKey;
31+
2732
#[cfg(target_os = "freebsd")]
2833
use nix::ioctl_readwrite;
2934
#[cfg(target_os = "freebsd")]
@@ -425,67 +430,28 @@ pub fn get_esrt() -> Option<Esrt> {
425430
resource_version: ESRT_FIRMWARE_RESOURCE_VERSION,
426431
entries: vec![],
427432
};
428-
use wmi::*;
429-
debug!("Opening WMI");
430-
let wmi_con = WMIConnection::new(COMLibrary::new().unwrap()).unwrap();
431-
use std::collections::HashMap;
432-
use wmi::Variant;
433-
debug!("Querying WMI");
434-
let results: Vec<HashMap<String, Variant>> = wmi_con.raw_query("SELECT HardwareID, Name FROM Win32_PnPEntity WHERE ClassGUID = '{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}'").unwrap();
435-
436-
let re = regex::Regex::new(r"([\-a-h0-9]+)\}&REV_([A-F0-9]+)").expect("Bad regex");
437-
for (i, val) in results.iter().enumerate() {
438-
let hwid = &val["HardwareID"];
439-
if let Variant::Array(strs) = hwid {
440-
if let Variant::String(s) = &strs[0] {
441-
// Sample "UEFI\\RES_{c57fd615-2ac9-4154-bf34-4dc715344408}&REV_CF"
442-
let caps = re.captures(s).expect("No caps");
443-
let guid_str = caps.get(1).unwrap().as_str().to_string();
444-
let ver_str = caps.get(2).unwrap().as_str().to_string();
445-
446-
let guid = GUID::parse(guid_str.trim()).expect("Kernel provided wrong value");
447-
let guid_kind = match_guid_kind(&CGuid::from(guid));
448-
let ver = u32::from_str_radix(&ver_str, 16).unwrap();
449-
debug!("ESRT Entry {}", i);
450-
debug!(" Name: {:?}", guid_kind);
451-
debug!(" GUID: {}", guid_str);
452-
debug!(" Version: {:X} ({})", ver, ver);
453-
454-
let fw_type = if let Variant::String(name) = &val["Name"] {
455-
match name.as_str() {
456-
"System Firmware" => 1,
457-
"Device Firmware" => 2,
458-
_ => 0,
459-
}
460-
} else {
461-
0
462-
};
463433

464-
// TODO: The missing fields are present in Device Manager
465-
// So there must be a way to get at them
466-
let esrt = EsrtResourceEntry {
467-
fw_class: CGuid::from(guid),
468-
fw_type,
469-
fw_version: ver,
470-
// TODO: Not exposed by windows
471-
lowest_supported_fw_version: 0,
472-
// TODO: Not exposed by windows
473-
capsule_flags: 0,
474-
// TODO: Not exposed by windows
475-
last_attempt_version: 0,
476-
// TODO: Not exposed by windows
477-
last_attempt_status: 0,
478-
};
479-
esrt_table.resource_count += 1;
480-
esrt_table.resource_count_max += 1;
481-
esrt_table.entries.push(esrt);
482-
} else {
483-
error!("Strs: {:#?}", strs[0]);
484-
}
485-
} else {
486-
error!("{:#?}", hwid);
487-
}
434+
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
435+
let esrt = hklm.open_subkey("HARDWARE\\UEFI\\ESRT").ok()?;
436+
for subkey in esrt.enum_keys() {
437+
let guid = subkey.ok()?;
438+
let short_guid = guid.trim_matches(|c| c == '{' || c == '}');
439+
let esrt_entry = esrt.open_subkey(&guid).ok()?;
440+
let esrt = EsrtResourceEntry {
441+
fw_class: GUID::parse(&short_guid).ok()?.into(),
442+
fw_type: esrt_entry.get_value("Type").ok()?,
443+
fw_version: esrt_entry.get_value("Version").ok()?,
444+
lowest_supported_fw_version: esrt_entry.get_value("LowestSupportedVersion").ok()?,
445+
capsule_flags: 0,
446+
last_attempt_version: esrt_entry.get_value("LastAttemptVersion").ok()?,
447+
last_attempt_status: esrt_entry.get_value("LastAttemptStatus").ok()?,
448+
};
449+
450+
esrt_table.resource_count += 1;
451+
esrt_table.resource_count_max += 1;
452+
esrt_table.entries.push(esrt);
488453
}
454+
489455
Some(esrt_table)
490456
}
491457

0 commit comments

Comments
 (0)