From 7126a8b3962a4bd298185b2a337fc2d0d86188a5 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Sun, 14 Jul 2024 14:09:02 +0800 Subject: [PATCH 01/12] windows: Add option to dump versions of all drivers Signed-off-by: Daniel Schaefer --- README.md | 1 + framework_lib/src/commandline/clap_std.rs | 5 + framework_lib/src/commandline/mod.rs | 8 + framework_lib/src/commandline/uefi.rs | 1 + framework_lib/src/lib.rs | 2 + framework_lib/src/wmi.rs | 301 ++++++++++++++++++++++ 6 files changed, 318 insertions(+) create mode 100644 framework_lib/src/wmi.rs diff --git a/README.md b/README.md index ab35c0b8..d3a6d39f 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ On UEFI and FreeBSD raw port I/O is used - on Linux this can also be used as a f - [x] HDMI Expansion Card (`--dp-hdmi-update`) - [x] DisplayPort Expansion Card (`--dp-hdmi-update`) - [ ] Audio Expansion Card + - [x] Get driver version for all devices (Windows only) (`--drivers`) ###### System Status diff --git a/framework_lib/src/commandline/clap_std.rs b/framework_lib/src/commandline/clap_std.rs index a2727903..16230322 100644 --- a/framework_lib/src/commandline/clap_std.rs +++ b/framework_lib/src/commandline/clap_std.rs @@ -246,6 +246,10 @@ struct ClapCli { #[arg(long)] s0ix_counter: bool, + /// Display Windows Driver versions + #[arg(long)] + drivers: bool, + /// Hash a file of arbitrary data #[arg(long)] hash: Option, @@ -466,6 +470,7 @@ pub fn parse(args: &[String]) -> Cli { ec_hib_delay: args.ec_hib_delay, uptimeinfo: args.uptimeinfo, s0ix_counter: args.s0ix_counter, + drivers: args.drivers, hash: args.hash.map(|x| x.into_os_string().into_string().unwrap()), driver: args.driver, pd_addrs, diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index 98de02b5..5a33a72f 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -66,6 +66,8 @@ use crate::uefi::enable_page_break; #[cfg(feature = "rusb")] use crate::usbhub::check_usbhub_version; use crate::util::{self, Config, Platform, PlatformFamily}; +#[cfg(target_os = "windows")] +use crate::wmi; #[cfg(feature = "hidapi")] use hidapi::HidApi; use sha2::{Digest, Sha256, Sha384, Sha512}; @@ -217,6 +219,7 @@ pub struct Cli { pub uptimeinfo: bool, pub s0ix_counter: bool, pub hash: Option, + pub drivers: bool, pub pd_addrs: Option<(u16, u16, u16)>, pub pd_ports: Option<(u8, u8, u8)>, pub help: bool, @@ -1687,6 +1690,11 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 { } } else if let Some(ec_bin_path) = &args.flash_rw_ec { flash_ec(&ec, ec_bin_path, EcFlashType::Rw, args.dry_run); + } else if args.drivers { + #[cfg(target_os = "windows")] + wmi::print_drivers(); + #[cfg(not(target_os = "windows"))] + println!("Driver Version only supported on Windows"); } else if let Some(hash_file) = &args.hash { println!("Hashing file: {}", hash_file); #[cfg(feature = "uefi")] diff --git a/framework_lib/src/commandline/uefi.rs b/framework_lib/src/commandline/uefi.rs index cb2b4c5d..115f746d 100644 --- a/framework_lib/src/commandline/uefi.rs +++ b/framework_lib/src/commandline/uefi.rs @@ -80,6 +80,7 @@ pub fn parse(args: &[String]) -> Cli { ec_hib_delay: None, uptimeinfo: false, s0ix_counter: false, + drivers: false, hash: None, // This is the only driver that works on UEFI driver: Some(CrosEcDriverType::Portio), diff --git a/framework_lib/src/lib.rs b/framework_lib/src/lib.rs index 1e76e724..c1d65819 100644 --- a/framework_lib/src/lib.rs +++ b/framework_lib/src/lib.rs @@ -49,6 +49,8 @@ pub mod smbios; #[cfg(feature = "uefi")] pub mod uefi; mod util; +#[cfg(target_os = "windows")] +pub mod wmi; pub mod built_info { // The file has been placed there by the build script. diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs new file mode 100644 index 00000000..62abed76 --- /dev/null +++ b/framework_lib/src/wmi.rs @@ -0,0 +1,301 @@ +use std::collections::HashMap; +use wmi::*; + +// TODO: +// - [ ] Critical +// - [ ] Figure out why the CSME version is old +// - Looks like that depends on the CPU/CSME type +// - [x] Figure out how "Intel Chipset" shows up, I can't find any drivers +// - It's present in Win32_Product +// - [ ] Intel WiFi driver in Win32_SystemDriver is old, but in Win32_PnpSignedDriver is correct. Which one is used? +// - [x] Provide nice alias for driver names +// - [ ] Display drivers even when they're missing to make sure we find those that didn't install +// - [ ] Make more efficient by querying only the drivers we care about +// - [ ] Figure out why IGCC versios shows same as graphics driver +// - [ ] Figure out how to read HSA "Realtek Audio Console" version + +// Helpful commands +// Win32_SystemDriver +// get-wmiobject Win32_SystemDriver | select DisplayName,Name,@{n="version";e={(gi $_.pathname).VersionInfo.FileVersion}},PathName +// Get-WmiObject -query "SELECT * FROM CIM_Datafile WHERE Name = 'C:\Windows\system32\drivers\xinputhid.sys'" +// Get-WmiObject -query "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode <> 0" +// +// Win32_PnpSignedDriver +// get-wmiobject Win32_PnpSignedDriver | select Manufacturer,DeviceName,HardwareID,DriverVersion +// get-wmiobject Win32_PnpSignedDriver | where manufacturer -like 'Goodix' | select Manufacturer,DeviceName,HardwareID,DriverVersion +// get-wmiobject Win32_PnpSignedDriver | where manufacturer -like 'Intel' | select Manufacturer,DeviceName,HardwareID,DriverVersion +// +// Win32_Product +// Get-WmiObject -Class Win32_Product | select IdentifyingNumber, Name, Version + +pub fn print_yellow_bangs() { + println!("Devices with Yellow Bangs"); + debug!("Opening WMI"); + let wmi_con = WMIConnection::new(COMLibrary::new().unwrap()).unwrap(); + debug!("Querying WMI"); + let results: Vec> = wmi_con + .raw_query("SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode <> 0") + .unwrap(); + + if results.is_empty() { + println!(" None"); + return; + } + + for bang in results.iter() { + // println!(" {:#?}", results); + // TODO: Unpack the Variant types + // TODO: Use serde + let description = if let Variant::String(s) = &bang["Description"] { + s + } else { + &"".to_string() + }; + println!(" {}", description); + println!(" Compatible IDs: {:?}", &bang["CompatibleID"]); + println!(" Hardware IDs: {:?}", &bang["HardwareID"]); + println!(" DeviceID: {:?}", &bang["DeviceID"]); + println!(" PNPDeviceID: {:?}", &bang["PNPDeviceID"]); + println!( + " ConfigManagerErrorCode {:?}", + &bang["ConfigManagerErrorCode"] + ); + println!(" Status {:?}", &bang["Status"]); + // Other values that don't seem to have useful information + // ConfigManagerUserConfig: Bool (false) + // ErrorCleared: ? (Null) + // CreationClassName: String ("Win32_PnPEntity") + // Present: Bool (true) + // InstallDate: ? (Null) + // ErrorDescription: ? (Null) + // Caption: String ("Multimedia Audio Controller") + // LastErrorCode: ? (Null) + // Availability: ? (Null) + // PowerManagementCapabilities: Array ([]) + // PowerManagementSupported: ? (Null) + // PNPClass: ? (Null) + // StatusInfo: ? (Null) + } +} + +const PNP_DRIVERS: &[&str] = &[ + // Manufacturer DeviceName HardWareID DriverVersion + // ------------ ---------- ---------- ------------- + // Goodix Framework Fingerprint Reader USB\VID_27C6&PID_609C&REV_0100 3.12804.0.240 + "Framework Fingerprint Reader", + // TODO: Wrong version + // Intel Corporation Intel(R) Graphics Command Center SWC\101.5522_VEN8086_IGCC + // "Intel(R) Graphics Command Center", + + // Intel Corporation Intel(R) Wi-Fi 6E AX210 160MHz PCI\VEN_8086&DEV_2725&SUBSYS_00248086&REV_1A 23.60.0.10 + "Intel(R) Wi-Fi 6E AX210 160MHz", + // Don't need, already in system_drivers + // Intel Corporation Intel(R) Wireless Bluetooth(R) USB\VID_8087&PID_0032&REV_0000 23.60.0.1 + // "Intel(R) Wireless Bluetooth(R)", + + // Intel(R) Platform Monito… Intel(R) Platform Monitoring Technology (PMT) Driver PCI\VEN_8086&DEV_7D0D&SUBSYS_0009F111&REV_01 3.1.2.2 + "Intel(R) Platform Monitoring Technology (PMT) Driver", + // Also in system_drivers + // Not using the one here, because it doesn't show up when the card isn't plugged in + // Genesys Logic Framework SD Expansion Card USB\VID_32AC&PID_0009&REV_0003 4.5.10.201 +]; + +const PRODUCTS: &[&str] = &[ + // TODO: Can I rely on the IdentifyingNumber GUID? + // IdentifyingNumber Name Version + // ----------------- ---- ------- + // {BAB97289-552B-49D5-B1E7-95DB4E4D2DEF} Intel(R) Chipset Device Software 10.1.19627.84… + "Intel(R) Chipset Device Software", + // {00000060-0230-1033-84C8-B8D95FA3C8C3} Intel(R) Wireless Bluetooth(R) 23.60.0.1 + // {1C1EBF97-5EC2-4C01-BCFC-037D140796B4} Intel(R) Serial IO 30.100.2405.44 +]; + +pub fn print_drivers() { + print_yellow_bangs(); + + println!("Drivers"); + let wmi_con = WMIConnection::new(COMLibrary::new().unwrap()).unwrap(); + + // PNP Drivers + let results: Vec> = wmi_con + .raw_query( + "SELECT Manufacturer,DeviceName,HardwareID,DriverVersion FROM Win32_PnpSignedDriver", + ) + .unwrap(); + for val in results.iter() { + let device_name = if let Variant::String(s) = &val["DeviceName"] { + s + } else { + &"".to_string() + }; + let version = if let Variant::String(s) = &val["DriverVersion"] { + s + } else { + &"".to_string() + }; + + // Skip those that we don't care about + if !PNP_DRIVERS.contains(&device_name.as_str()) { + continue; + } + println!(" {}", device_name); + println!(" Version: {}", version); + } + + // Products + let results: Vec> = wmi_con + .raw_query("SELECT IdentifyingNumber, Name, Version FROM Win32_Product") + .unwrap(); + for val in results.iter() { + let name = if let Variant::String(s) = &val["Name"] { + s + } else { + &"".to_string() + }; + let version = if let Variant::String(s) = &val["Version"] { + s + } else { + &"".to_string() + }; + + // Skip those that we don't care about + if !PRODUCTS.contains(&name.as_str()) { + continue; + } + println!(" {}", name); + println!(" Version: {}", version); + } + + // System Drivers + //const system_drivers: HashMap<&str, Option<&str>> = HashMap::from([ + let system_drivers = HashMap::from([ + // [ ] 13 Goodix + // TODO: Can find via Win32_PnpSignedDriver, Manufacturer 'Goodix', DeviceName 'Framework Fingerprint Reader' + // HardwareID: USB\VID_27C6&PID_609C&REV_0100 + + // [ ] 12 Intel Platform Monitoring Technology + // Can find in PNP + + // [x] 11 Intel PROSet Bluetooth + ("ibtusb", None), // Intel(R) Wireless Bluetooth(R) + // [ ] 10 Intel PROSet WiFi + // TODO: The first two show old version - Is the wrong version used? + // "Netwtw14", // Intel® Smart Sound Technology BUS + // "Netwtw10", // Intel® Smart Sound Technology BUS + // "Netwtw16", // This one has the correct version, but it doesn't show up + + // [x] 09 Realtek Audio + ("IntcAzAudAddService", None), // Service for Realtek HD Audio (WDM) + // [x] 08 Intel Smart Sound Technology + ("IntcAudioBus", None), // Intel® Smart Sound Technology BUS + //"IntcOED", // Intel® Smart Sound Technology OED + //"IntcUSB", // Intel® Smart Sound Technology for USB Audio + + // [x] 07 Intel Dynamic Tuning Technology + ("ipf_acpi", Some("Intel Dynamic Tuning Technology")), + // "ipf_cpu", + // "ipf_lf", + + // [x] 06 Intel NPU + ("npu", Some("Intel NPU")), + // [x] 05 Intel Graphics + ("igfxn", Some("Intel Graphics")), // igfxn + // [x] 04 Intel Serial IO + // Don't need to show GPIO and I2C versions, we don't need GPIO driver anyways + // "iaLPSS2_GPIO2_MTL", // Serial IO GPIO Driver v2 + // "iagpio", // Intel Serial IO GPIO Controller Driver + // "iai2c", // Serial IO I2C Host Controller + // "iaLPSS2i_GPIO2" + // "iaLPSS2i_GPIO2_BXT_P", + // "iaLPSS2i_GPIO2_CNL", + // "iaLPSS2i_GPIO2_GLK", + ("iaLPSS2_I2C_MTL", Some("Intel Serial IO")), // Serial IO I2C Driver v2 + // "iaLPSS2i_I2C", + // "iaLPSS2i_I2C_BXT_P", + // "iaLPSS2i_I2C_CNL", + // "iaLPSS2i_I2C_GLK", + + // [ ] 03 Intel Management Engine + // TODO: Shows old version 2406.5.5.0 instead of 2409.5.63.0 + ("MEIx64", None), // Intel(R) Management Engine Interface + // [x] 02 Intel GNA Scoring Accelerator + ("IntelGNA", None), // Intel(R) GNA Scoring Accelerator service + // [ ] 01 Intel Chipset + // TODO: How to find? + // Can't find it anywhere, not in Device Manager, not in Win32_SystemDriver, not in Win32_PnpSignedDriver + + // Framework provided drivers + // Realtek USB FE/1GbE/2.5GbE NIC Family Windows 10 64-bit Driver + ( + "rtux64w10", + Some("Realtek/Framework Ethernet Expansion Card"), + ), + // Genesys Logic Storage Driver + ("GeneStor", Some("Genesys/Framework SD Expansion Card")), + //"IntcAzAudAddService", // Service for Realtek HD Audio (WDM) + //"intelpmax", // Intel(R) Dynamic Device Peak Power Manager Driver + //"IntelPMT", // Intel(R) Platform Monitoring Technology Service + ]); + + let results: Vec> = wmi_con + .raw_query("SELECT DisplayName,Name,PathName FROM Win32_SystemDriver") + .unwrap(); + for val in results.iter() { + let display_name = if let Variant::String(s) = &val["DisplayName"] { + s + } else { + &"".to_string() + }; + let name = if let Variant::String(s) = &val["Name"] { + s + } else { + &"".to_string() + }; + let path_name = if let Variant::String(s) = &val["PathName"] { + s + } else { + &"".to_string() + }; + + // select * from CIM_Datafile" & _ " where Name = '" & Replace(strPath, "\", "\\") & + // C:\Windows\system32\drivers\xinputhid.sys + // Get-WmiObject -query "SELECT Version FROM CIM_Datafile WHERE Name = 'C:\\Windows\\system32\\drivers\\xinputhid.sys'" + if !path_name.starts_with("C:") { + debug!("Skipping path_name: {:?}", path_name); + // TODO: Probably a UNC path, not sure how to handle it, let's skip it + continue; + } + let query = format!( + "SELECT Version FROM CIM_Datafile WHERE Name = '{}'", + path_name.replace("\\", "\\\\") + ); + let results: Vec> = wmi_con.raw_query(query).unwrap(); + let version = if let Variant::String(s) = &results[0]["Version"] { + s + } else { + "" + }; + + // Skip those that we don't care about + let str_name: &str = name; + //if let Ok(alias) = system_drivers.binary_search_by(|(k, _)| k.cmp(&str_name)).map(|x| system_drivers[x].1) { + if let Some(alias) = system_drivers.get(&str_name) { + let alias = if let Some(alias) = alias { + *alias + } else { + display_name + }; + println!(" {}", alias); + debug!(" Display: {}", display_name); + debug!(" Name: {}", name); + debug!(" Path: {}", path_name); + println!(" Version: {}", version); + } else { + //println!("Not found: {}", display_name); + //println!(" Name: '{}'", name); + //debug!(" Path: {}", path_name); + //println!(" Version: {}", version); + continue; + } + } +} From 7a287da70205921364c8d528b9ee35879bfc9181 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 5 Aug 2024 00:35:16 -0700 Subject: [PATCH 02/12] wmi: Add AMD drivers Graphics driver has wrong version Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index 62abed76..b54eaac3 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -21,12 +21,16 @@ use wmi::*; // Get-WmiObject -query "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode <> 0" // // Win32_PnpSignedDriver -// get-wmiobject Win32_PnpSignedDriver | select Manufacturer,DeviceName,HardwareID,DriverVersion +// get-wmiobject Win32_PnpSignedDriver | select Manufacturer,DeviceName,HardwareID,DriverVersion // get-wmiobject Win32_PnpSignedDriver | where manufacturer -like 'Goodix' | select Manufacturer,DeviceName,HardwareID,DriverVersion // get-wmiobject Win32_PnpSignedDriver | where manufacturer -like 'Intel' | select Manufacturer,DeviceName,HardwareID,DriverVersion // // Win32_Product // Get-WmiObject -Class Win32_Product | select IdentifyingNumber, Name, Version +// +// Get-WmiObject -Class Win32_Product | select IdentifyingNumber, Name, Version | Format-Table | Out-String -width 9999 > product.txt +// get-wmiobject Win32_PnpSignedDriver | select Manufacturer,DeviceName,HardwareID,DriverVersion | Format-Table | Out-String -width 9999 > pnp.txt +// get-wmiobject Win32_SystemDriver | select DisplayName,Name,@{n="version";e={(gi $_.pathname).VersionInfo.FileVersion}},PathName | Format-Table | Out-String -width 9999 > system.txt pub fn print_yellow_bangs() { println!("Devices with Yellow Bangs"); @@ -98,6 +102,16 @@ const PNP_DRIVERS: &[&str] = &[ // Also in system_drivers // Not using the one here, because it doesn't show up when the card isn't plugged in // Genesys Logic Framework SD Expansion Card USB\VID_32AC&PID_0009&REV_0003 4.5.10.201 + + // MediaTek, Inc. RZ616 Wi-Fi 6E 160MHz PCI\VEN_14C3&DEV_0616&SUBSYS_E61614C3&REV_00 3.3.0.908 + "RZ616 Wi-Fi 6E 160MHz", + // Mediatek Inc. RZ616 Bluetooth(R) Adapter USB\VID_0E8D&PID_E616&REV_0100&MI_00 1.1037.0.395 + "RZ616 Bluetooth(R) Adapter", + // For both of these WMI shows 31.0.24018.2001 instead of 23.40.18.02. But it's actually the same version + // Advanced Micro Devices, Inc. AMD Radeon(TM) 780M PCI\VEN_1002&DEV_15BF&SUBSYS_0005F111&REV_C1 31.0.24018.2001 + "AMD Radeon(TM) 780M", + // Advanced Micro Devices, Inc. AMD Radeon(TM) RX 7700S PCI\VEN_1002&DEV_7480&SUBSYS_0007F111&REV_C1 31.0.24018.2001 + "AMD Radeon(TM) RX 7700S", ]; const PRODUCTS: &[&str] = &[ @@ -108,6 +122,9 @@ const PRODUCTS: &[&str] = &[ "Intel(R) Chipset Device Software", // {00000060-0230-1033-84C8-B8D95FA3C8C3} Intel(R) Wireless Bluetooth(R) 23.60.0.1 // {1C1EBF97-5EC2-4C01-BCFC-037D140796B4} Intel(R) Serial IO 30.100.2405.44 + + // {35143df0-ba1c-4148-8744-137275e83211} AMD_Chipset_Drivers 5.06.29.310 + "AMD_Chipset_Drivers", ]; pub fn print_drivers() { @@ -235,6 +252,11 @@ pub fn print_drivers() { //"IntcAzAudAddService", // Service for Realtek HD Audio (WDM) //"intelpmax", // Intel(R) Dynamic Device Peak Power Manager Driver //"IntelPMT", // Intel(R) Platform Monitoring Technology Service + + // Mediatek PCI LE Extensible Wireless LAN Card Driver mtkwlex 3.3.0.0908 C:\Windows\system32\drivers\mtkwl6ex.sys + // ("mtkwlex", Some("RZ616 WiFi Driver")), + // MTK BT Filter Driver MTKBTFilterx64 1.1037.0.395 TK C:\Windows\system32\drivers\mtkbtfilterx.sys + // ("MTKBTFilterx64", Some("RZ616 Bluetooth Driver")), ]); let results: Vec> = wmi_con From d74fa1e32e099a2760c2bc7dceacc38ce6e1eea6 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 5 Aug 2024 00:41:40 -0700 Subject: [PATCH 03/12] wmi: Fix string lifetime Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index b54eaac3..32ceed47 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -51,9 +51,9 @@ pub fn print_yellow_bangs() { // TODO: Unpack the Variant types // TODO: Use serde let description = if let Variant::String(s) = &bang["Description"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; println!(" {}", description); println!(" Compatible IDs: {:?}", &bang["CompatibleID"]); @@ -141,14 +141,14 @@ pub fn print_drivers() { .unwrap(); for val in results.iter() { let device_name = if let Variant::String(s) = &val["DeviceName"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; let version = if let Variant::String(s) = &val["DriverVersion"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; // Skip those that we don't care about @@ -165,14 +165,14 @@ pub fn print_drivers() { .unwrap(); for val in results.iter() { let name = if let Variant::String(s) = &val["Name"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; let version = if let Variant::String(s) = &val["Version"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; // Skip those that we don't care about @@ -264,19 +264,19 @@ pub fn print_drivers() { .unwrap(); for val in results.iter() { let display_name = if let Variant::String(s) = &val["DisplayName"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; let name = if let Variant::String(s) = &val["Name"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; let path_name = if let Variant::String(s) = &val["PathName"] { - s + s.clone() } else { - &"".to_string() + "".to_string() }; // select * from CIM_Datafile" & _ " where Name = '" & Replace(strPath, "\", "\\") & @@ -299,13 +299,13 @@ pub fn print_drivers() { }; // Skip those that we don't care about - let str_name: &str = name; + let str_name: &str = &name; //if let Ok(alias) = system_drivers.binary_search_by(|(k, _)| k.cmp(&str_name)).map(|x| system_drivers[x].1) { if let Some(alias) = system_drivers.get(&str_name) { let alias = if let Some(alias) = alias { *alias } else { - display_name + &display_name }; println!(" {}", alias); debug!(" Display: {}", display_name); From fb312e227f683c603c8aa3c5556fe649626b7ab1 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 5 Aug 2024 01:17:53 -0700 Subject: [PATCH 04/12] wmi: Add old AMD graphics driver Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index 32ceed47..8c2f2340 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -108,6 +108,7 @@ const PNP_DRIVERS: &[&str] = &[ // Mediatek Inc. RZ616 Bluetooth(R) Adapter USB\VID_0E8D&PID_E616&REV_0100&MI_00 1.1037.0.395 "RZ616 Bluetooth(R) Adapter", // For both of these WMI shows 31.0.24018.2001 instead of 23.40.18.02. But it's actually the same version + // 31.0.22024.17002 instead of 23.20.24.17 // Advanced Micro Devices, Inc. AMD Radeon(TM) 780M PCI\VEN_1002&DEV_15BF&SUBSYS_0005F111&REV_C1 31.0.24018.2001 "AMD Radeon(TM) 780M", // Advanced Micro Devices, Inc. AMD Radeon(TM) RX 7700S PCI\VEN_1002&DEV_7480&SUBSYS_0007F111&REV_C1 31.0.24018.2001 From 10343f2dcbbf2867d4d234064b512050ec13d934 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 5 Aug 2024 01:26:26 -0700 Subject: [PATCH 05/12] wmi: Add Framework 16 Display Driver Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index 8c2f2340..83c4a69d 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -103,16 +103,18 @@ const PNP_DRIVERS: &[&str] = &[ // Not using the one here, because it doesn't show up when the card isn't plugged in // Genesys Logic Framework SD Expansion Card USB\VID_32AC&PID_0009&REV_0003 4.5.10.201 + // Both present in system drivers // MediaTek, Inc. RZ616 Wi-Fi 6E 160MHz PCI\VEN_14C3&DEV_0616&SUBSYS_E61614C3&REV_00 3.3.0.908 - "RZ616 Wi-Fi 6E 160MHz", // Mediatek Inc. RZ616 Bluetooth(R) Adapter USB\VID_0E8D&PID_E616&REV_0100&MI_00 1.1037.0.395 - "RZ616 Bluetooth(R) Adapter", + // For both of these WMI shows 31.0.24018.2001 instead of 23.40.18.02. But it's actually the same version // 31.0.22024.17002 instead of 23.20.24.17 // Advanced Micro Devices, Inc. AMD Radeon(TM) 780M PCI\VEN_1002&DEV_15BF&SUBSYS_0005F111&REV_C1 31.0.24018.2001 "AMD Radeon(TM) 780M", // Advanced Micro Devices, Inc. AMD Radeon(TM) RX 7700S PCI\VEN_1002&DEV_7480&SUBSYS_0007F111&REV_C1 31.0.24018.2001 "AMD Radeon(TM) RX 7700S", + // Framework Framework NE160QDM-NZ6 MONITOR\BOE0BC9 1.0.0.0 + "Framework NE160QDM-NZ6", ]; const PRODUCTS: &[&str] = &[ @@ -255,9 +257,9 @@ pub fn print_drivers() { //"IntelPMT", // Intel(R) Platform Monitoring Technology Service // Mediatek PCI LE Extensible Wireless LAN Card Driver mtkwlex 3.3.0.0908 C:\Windows\system32\drivers\mtkwl6ex.sys - // ("mtkwlex", Some("RZ616 WiFi Driver")), + ("mtkwlex", Some("RZ616 WiFi Driver")), // MTK BT Filter Driver MTKBTFilterx64 1.1037.0.395 TK C:\Windows\system32\drivers\mtkbtfilterx.sys - // ("MTKBTFilterx64", Some("RZ616 Bluetooth Driver")), + ("MTKBTFilterx64", Some("RZ616 Bluetooth Driver")), ]); let results: Vec> = wmi_con From 68c19dbae7e71033c7b9b79ab19e8198a2b4a74b Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Sun, 29 Sep 2024 14:09:56 +0800 Subject: [PATCH 06/12] wmi: Add RZ717 and AMD DRTM drivers If users upgrade to WiFi 7 chipset. Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index 83c4a69d..df1c71a0 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -103,10 +103,12 @@ const PNP_DRIVERS: &[&str] = &[ // Not using the one here, because it doesn't show up when the card isn't plugged in // Genesys Logic Framework SD Expansion Card USB\VID_32AC&PID_0009&REV_0003 4.5.10.201 - // Both present in system drivers // MediaTek, Inc. RZ616 Wi-Fi 6E 160MHz PCI\VEN_14C3&DEV_0616&SUBSYS_E61614C3&REV_00 3.3.0.908 // Mediatek Inc. RZ616 Bluetooth(R) Adapter USB\VID_0E8D&PID_E616&REV_0100&MI_00 1.1037.0.395 - + "RZ616 Bluetooth(R) Adapter", + // MediaTek, Inc. RZ717 WiFi 7 160MHz PCI\VEN_14C3&DEV_0717&SUBSYS_071714C3&REV_00 5.4.0.1920 + // Mediatek Inc. RZ717 Bluetooth(R) Adapter USB\VID_0E8D&PID_0717&REV_0100&MI_00 1.1037.0.433 + "RZ717 Bluetooth(R) Adapter", // For both of these WMI shows 31.0.24018.2001 instead of 23.40.18.02. But it's actually the same version // 31.0.22024.17002 instead of 23.20.24.17 // Advanced Micro Devices, Inc. AMD Radeon(TM) 780M PCI\VEN_1002&DEV_15BF&SUBSYS_0005F111&REV_C1 31.0.24018.2001 @@ -115,6 +117,8 @@ const PNP_DRIVERS: &[&str] = &[ "AMD Radeon(TM) RX 7700S", // Framework Framework NE160QDM-NZ6 MONITOR\BOE0BC9 1.0.0.0 "Framework NE160QDM-NZ6", + // Advanced Micro Devices, Inc AMD DRTM Boot Driver ACPI\VEN_DRTM&DEV_0001 1.0.18.4 + "AMD DRTM Boot Driver", ]; const PRODUCTS: &[&str] = &[ @@ -258,8 +262,11 @@ pub fn print_drivers() { // Mediatek PCI LE Extensible Wireless LAN Card Driver mtkwlex 3.3.0.0908 C:\Windows\system32\drivers\mtkwl6ex.sys ("mtkwlex", Some("RZ616 WiFi Driver")), + // Mediatek PCI LE Extensible Wireless LAN Card Driver mtkwecx 5.4.0.1920 C:\Windows\system32\DriverStore\FileRepository\mtkwecx.inf_amd64_b64df836c89617f7\mtkwecx.sys + ("mtkwecx", Some("RZ717 WiFi Driver")), + // RZ616 and RZ717 // MTK BT Filter Driver MTKBTFilterx64 1.1037.0.395 TK C:\Windows\system32\drivers\mtkbtfilterx.sys - ("MTKBTFilterx64", Some("RZ616 Bluetooth Driver")), + // ("MTKBTFilterx64", Some("RZ616/RZ717 Bluetooth Driver")), ]); let results: Vec> = wmi_con From 69288258bb37717e8c5c265701f661026ab8898e Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 2 May 2025 02:19:30 -0700 Subject: [PATCH 07/12] drivers: Add support for Framework 12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` > framework_tool.exe --drivers Devices with Yellow Bangs None Drivers Framework EC Version: 0.0.0.6 Framework Sensors Version: 0.0.7.0 ILITEK Wake On Touch Device Version: 10.0.19041.868 Intel(R) Wi-Fi 6E AX211 160MHz Version: 23.60.1.2 Genesys/Framework SD Expansion Card Version: 4.5.10.202 Intel(R) Wireless Bluetooth(R) Version: 23.90.0.8 Intel Graphics Version: 32.0.101.6314 Intel® Smart Sound Technology BUS Version: 10.29.0.10981 Service for Realtek HD Audio (WDM) Version: 6.0.9815.1 Intel(R) GNA Scoring Accelerator service Version: 3.5.0.1578 Intel Dynamic Tuning Technology Version: 1.0.11700.1228 Intel(R) Management Engine Interface Version: 2407.6.1.0 ``` Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index df1c71a0..5d6984ca 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -96,7 +96,8 @@ const PNP_DRIVERS: &[&str] = &[ // Don't need, already in system_drivers // Intel Corporation Intel(R) Wireless Bluetooth(R) USB\VID_8087&PID_0032&REV_0000 23.60.0.1 // "Intel(R) Wireless Bluetooth(R)", - + // Intel Corporation Intel(R) Wi-Fi 6E AX211 160MHz PCI\VEN_8086&DEV_51F1&SUBSYS_00948086&REV_01 + "Intel(R) Wi-Fi 6E AX211 160MHz", // Intel(R) Platform Monito… Intel(R) Platform Monitoring Technology (PMT) Driver PCI\VEN_8086&DEV_7D0D&SUBSYS_0009F111&REV_01 3.1.2.2 "Intel(R) Platform Monitoring Technology (PMT) Driver", // Also in system_drivers @@ -119,6 +120,12 @@ const PNP_DRIVERS: &[&str] = &[ "Framework NE160QDM-NZ6", // Advanced Micro Devices, Inc AMD DRTM Boot Driver ACPI\VEN_DRTM&DEV_0001 1.0.18.4 "AMD DRTM Boot Driver", + // Framework Framework EC ACPI\VEN_FRMW&DEV_C004 + "Framework EC", + // Framework Computer Inc Framework Sensors ACPI\VEN_FRMW&DEV_C006 + "Framework Sensors", + // ILITEK ILITEK Wake On Touch Device ACPI\VEN_ILIT&DEV_2901 + "ILITEK Wake On Touch Device", ]; const PRODUCTS: &[&str] = &[ From e8da4bb24dac81bd365814e105bd7568e2d0be63 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 2 May 2025 02:42:48 -0700 Subject: [PATCH 08/12] drivers: Add support for Framework 12 10.1.19899.8597 includes ADL PCH version 10.1.36.7 Signed-off-by: Daniel Schaefer --- framework_lib/src/wmi.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index 5d6984ca..15282d5b 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -85,6 +85,9 @@ pub fn print_yellow_bangs() { const PNP_DRIVERS: &[&str] = &[ // Manufacturer DeviceName HardWareID DriverVersion // ------------ ---------- ---------- ------------- + // Intel Chipset Raptor Lake Framework 12 + // INTEL Intel(R) LPC Controller - 519D 10.1.36.7 + "Intel(R) LPC Controller - 519D", // Goodix Framework Fingerprint Reader USB\VID_27C6&PID_609C&REV_0100 3.12804.0.240 "Framework Fingerprint Reader", // TODO: Wrong version From e1cfb2aff3d1fb6a98377fb05bb422ca5dac8043 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 14 Jan 2026 01:38:49 +0800 Subject: [PATCH 09/12] wmi: Add TOML-based driver config and baseline comparison Refactor driver detection to use TOML configuration files: - Add drivers.toml for driver name mappings (device -> display alias) - Add platform-specific baseline configs in baselines/*.toml - Add --drivers-baseline command to generate baseline from current system - Update --drivers to compare against platform baseline and show mismatches Supports all Framework platforms defined in util.rs with placeholder baselines that can be updated using --drivers-baseline. Co-Authored-By: Claude Opus 4.5 --- Cargo.lock | 23 ++ framework_lib/Cargo.toml | 3 + .../baselines/framework12_intel_gen13.toml | 24 ++ .../src/baselines/framework13_amd_7080.toml | 22 ++ .../src/baselines/framework13_amd_ai300.toml | 26 ++ .../src/baselines/framework16_amd_7080.toml | 23 ++ .../src/baselines/framework16_amd_ai300.toml | 29 ++ .../framework_desktop_amd_ai_max300.toml | 14 + .../src/baselines/intel_core_ultra1.toml | 25 ++ framework_lib/src/baselines/intel_gen11.toml | 24 ++ framework_lib/src/baselines/intel_gen12.toml | 24 ++ framework_lib/src/baselines/intel_gen13.toml | 25 ++ framework_lib/src/commandline/clap_std.rs | 5 + framework_lib/src/commandline/mod.rs | 14 +- framework_lib/src/commandline/uefi.rs | 1 + framework_lib/src/drivers.toml | 71 ++++ framework_lib/src/wmi.rs | 361 ++++++++++-------- 17 files changed, 544 insertions(+), 170 deletions(-) create mode 100644 framework_lib/src/baselines/framework12_intel_gen13.toml create mode 100644 framework_lib/src/baselines/framework13_amd_7080.toml create mode 100644 framework_lib/src/baselines/framework13_amd_ai300.toml create mode 100644 framework_lib/src/baselines/framework16_amd_7080.toml create mode 100644 framework_lib/src/baselines/framework16_amd_ai300.toml create mode 100644 framework_lib/src/baselines/framework_desktop_amd_ai_max300.toml create mode 100644 framework_lib/src/baselines/intel_core_ultra1.toml create mode 100644 framework_lib/src/baselines/intel_gen11.toml create mode 100644 framework_lib/src/baselines/intel_gen12.toml create mode 100644 framework_lib/src/baselines/intel_gen13.toml create mode 100644 framework_lib/src/drivers.toml diff --git a/Cargo.lock b/Cargo.lock index b1f289ca..62f8aaea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,9 +159,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", + "time", + "wasm-bindgen", "winapi", ] @@ -452,6 +455,7 @@ name = "framework_lib" version = "0.4.5" dependencies = [ "built", + "chrono", "clap", "clap-num", "clap-verbosity-flag", @@ -471,9 +475,11 @@ dependencies = [ "redox_hwio", "regex", "rusb", + "serde", "sha2", "smbios-lib", "spin 0.9.8", + "toml 0.8.22", "uefi", "uefi-services", "windows 0.59.0", @@ -1340,6 +1346,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi", + "winapi", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -1530,6 +1547,12 @@ dependencies = [ "libc", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasm-bindgen" version = "0.2.84" diff --git a/framework_lib/Cargo.toml b/framework_lib/Cargo.toml index 4213b22c..ad901ef8 100644 --- a/framework_lib/Cargo.toml +++ b/framework_lib/Cargo.toml @@ -54,6 +54,9 @@ clap-verbosity-flag = { version = "2.2.1" } windows-version = "0.1.4" winreg = "0.55.0" nvml-wrapper = { version = "0.11.0", optional = true } +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } +chrono = "0.4" [target.'cfg(unix)'.dependencies] libc = "0.2.155" diff --git a/framework_lib/src/baselines/framework12_intel_gen13.toml b/framework_lib/src/baselines/framework12_intel_gen13.toml new file mode 100644 index 00000000..61cd2f5b --- /dev/null +++ b/framework_lib/src/baselines/framework12_intel_gen13.toml @@ -0,0 +1,24 @@ +# Driver baseline for Framework 12 Intel 13th Gen +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# Intel Drivers +"Intel Chipset" = "0.0.0.0" +"Intel Graphics" = "0.0.0.0" +"Intel WiFi Driver" = "0.0.0.0" +"Intel Wireless Bluetooth" = "0.0.0.0" +"Intel Smart Sound Technology" = "0.0.0.0" +"Intel Dynamic Tuning Technology" = "0.0.0.0" +"Intel Serial IO" = "0.0.0.0" +"Intel Management Engine" = "0.0.0.0" +"Intel PMT Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/framework13_amd_7080.toml b/framework_lib/src/baselines/framework13_amd_7080.toml new file mode 100644 index 00000000..1cf7c1b8 --- /dev/null +++ b/framework_lib/src/baselines/framework13_amd_7080.toml @@ -0,0 +1,22 @@ +# Driver baseline for Framework 13 AMD Ryzen 7080 Series +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# AMD Drivers +"AMD Chipset Driver" = "0.0.0.0" +"AMD Graphics Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" +"Realtek Audio Console" = "0.0.0.0" + +# MediaTek Wireless +"RZ616 WiFi Driver" = "0.0.0.0" +"RZ616 Bluetooth Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/framework13_amd_ai300.toml b/framework_lib/src/baselines/framework13_amd_ai300.toml new file mode 100644 index 00000000..5514bcf8 --- /dev/null +++ b/framework_lib/src/baselines/framework13_amd_ai300.toml @@ -0,0 +1,26 @@ +# Driver baseline for Framework 13 AMD Ryzen AI 300 Series +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# AMD Drivers +"AMD Chipset Driver" = "0.0.0.0" +"AMD Graphics Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" +"Realtek Audio Console" = "0.0.0.0" +"Camera Driver" = "0.0.0.0" + +# MediaTek Wireless +"RZ717 WiFi Driver" = "0.0.0.0" +"RZ717 Bluetooth Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Microsoft +"MEP Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/framework16_amd_7080.toml b/framework_lib/src/baselines/framework16_amd_7080.toml new file mode 100644 index 00000000..06a860e2 --- /dev/null +++ b/framework_lib/src/baselines/framework16_amd_7080.toml @@ -0,0 +1,23 @@ +# Driver baseline for Framework 16 AMD Ryzen 7080 Series +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# AMD Drivers +"AMD Chipset Driver" = "0.0.0.0" +"AMD Graphics Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" +"Realtek Audio Console" = "0.0.0.0" +"Camera Driver" = "0.0.0.0" + +# MediaTek Wireless +"RZ616 WiFi Driver" = "0.0.0.0" +"RZ616 Bluetooth Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/framework16_amd_ai300.toml b/framework_lib/src/baselines/framework16_amd_ai300.toml new file mode 100644 index 00000000..de1b70a5 --- /dev/null +++ b/framework_lib/src/baselines/framework16_amd_ai300.toml @@ -0,0 +1,29 @@ +# Driver baseline for Framework 16 AMD Ryzen AI 300 Series (Tulip) +# Last updated: 2026-01-14 + +[versions] +# AMD Drivers +"AMD Chipset Driver" = "7.06.02.123" +"AMD Graphics Driver" = "32.0.22021.1009" +"AMD DRTM Driver" = "1.0.18.4" + +# NVIDIA dGPU (optional) +"NVIDIA Graphics Driver" = "32.0.15.9144" + +# Realtek Drivers +"Realtek Audio Driver" = "6.0.9859.1" +"Realtek Audio Console" = "11.0.6000.374" +"Camera Driver" = "10.0.22000.20357" + +# MediaTek Wireless +"RZ717 WiFi Driver" = "5.6.0.4444" +"RZ717 Bluetooth Driver" = "1.1043.0.555" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "3.12804.1.270" + +# Microsoft +"MEP Driver" = "2.0.16.0" + +# Framework +"Framework EC" = "0.0.0.6" diff --git a/framework_lib/src/baselines/framework_desktop_amd_ai_max300.toml b/framework_lib/src/baselines/framework_desktop_amd_ai_max300.toml new file mode 100644 index 00000000..db60d646 --- /dev/null +++ b/framework_lib/src/baselines/framework_desktop_amd_ai_max300.toml @@ -0,0 +1,14 @@ +# Driver baseline for Framework Desktop AMD Ryzen AI Max 300 +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# AMD Drivers +"AMD Chipset Driver" = "0.0.0.0" +"AMD Graphics Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/intel_core_ultra1.toml b/framework_lib/src/baselines/intel_core_ultra1.toml new file mode 100644 index 00000000..e66e4a6d --- /dev/null +++ b/framework_lib/src/baselines/intel_core_ultra1.toml @@ -0,0 +1,25 @@ +# Driver baseline for Framework 13 Intel Core Ultra Series 1 (MeteorLake) +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# Intel Drivers +"Intel Chipset Driver" = "0.0.0.0" +"Intel Graphics" = "0.0.0.0" +"Intel WiFi Driver" = "0.0.0.0" +"Intel Wireless Bluetooth" = "0.0.0.0" +"Intel Smart Sound Technology" = "0.0.0.0" +"Intel Dynamic Tuning Technology" = "0.0.0.0" +"Intel Serial IO" = "0.0.0.0" +"Intel Management Engine" = "0.0.0.0" +"Intel NPU" = "0.0.0.0" +"Intel PMT Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/intel_gen11.toml b/framework_lib/src/baselines/intel_gen11.toml new file mode 100644 index 00000000..b424cac4 --- /dev/null +++ b/framework_lib/src/baselines/intel_gen11.toml @@ -0,0 +1,24 @@ +# Driver baseline for Framework 13 Intel 11th Gen (TigerLake) +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# Intel Drivers +"Intel Chipset Driver" = "0.0.0.0" +"Intel Graphics" = "0.0.0.0" +"Intel WiFi Driver" = "0.0.0.0" +"Intel Wireless Bluetooth" = "0.0.0.0" +"Intel Smart Sound Technology" = "0.0.0.0" +"Intel Dynamic Tuning Technology" = "0.0.0.0" +"Intel Serial IO" = "0.0.0.0" +"Intel Management Engine" = "0.0.0.0" +"Intel GNA Scoring Accelerator" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/intel_gen12.toml b/framework_lib/src/baselines/intel_gen12.toml new file mode 100644 index 00000000..78a6b0b5 --- /dev/null +++ b/framework_lib/src/baselines/intel_gen12.toml @@ -0,0 +1,24 @@ +# Driver baseline for Framework 13 Intel 12th Gen (AlderLake) +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# Intel Drivers +"Intel Chipset Driver" = "0.0.0.0" +"Intel Graphics" = "0.0.0.0" +"Intel WiFi Driver" = "0.0.0.0" +"Intel Wireless Bluetooth" = "0.0.0.0" +"Intel Smart Sound Technology" = "0.0.0.0" +"Intel Dynamic Tuning Technology" = "0.0.0.0" +"Intel Serial IO" = "0.0.0.0" +"Intel Management Engine" = "0.0.0.0" +"Intel GNA Scoring Accelerator" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/baselines/intel_gen13.toml b/framework_lib/src/baselines/intel_gen13.toml new file mode 100644 index 00000000..e19afadb --- /dev/null +++ b/framework_lib/src/baselines/intel_gen13.toml @@ -0,0 +1,25 @@ +# Driver baseline for Framework 13 Intel 13th Gen (RaptorLake) +# Last updated: 2026-01-14 +# NOTE: Placeholder versions - update with actual values + +[versions] +# Intel Drivers +"Intel Chipset Driver" = "0.0.0.0" +"Intel Graphics" = "0.0.0.0" +"Intel WiFi Driver" = "0.0.0.0" +"Intel Wireless Bluetooth" = "0.0.0.0" +"Intel Smart Sound Technology" = "0.0.0.0" +"Intel Dynamic Tuning Technology" = "0.0.0.0" +"Intel Serial IO" = "0.0.0.0" +"Intel Management Engine" = "0.0.0.0" +"Intel GNA Scoring Accelerator" = "0.0.0.0" +"Intel PMT Driver" = "0.0.0.0" + +# Realtek Drivers +"Realtek Audio Driver" = "0.0.0.0" + +# Goodix Fingerprint +"Goodix Fingerprint Driver" = "0.0.0.0" + +# Framework +"Framework EC" = "0.0.0.0" diff --git a/framework_lib/src/commandline/clap_std.rs b/framework_lib/src/commandline/clap_std.rs index 16230322..a730f83a 100644 --- a/framework_lib/src/commandline/clap_std.rs +++ b/framework_lib/src/commandline/clap_std.rs @@ -250,6 +250,10 @@ struct ClapCli { #[arg(long)] drivers: bool, + /// Generate driver version baseline for current system + #[arg(long)] + drivers_baseline: bool, + /// Hash a file of arbitrary data #[arg(long)] hash: Option, @@ -471,6 +475,7 @@ pub fn parse(args: &[String]) -> Cli { uptimeinfo: args.uptimeinfo, s0ix_counter: args.s0ix_counter, drivers: args.drivers, + drivers_baseline: args.drivers_baseline, hash: args.hash.map(|x| x.into_os_string().into_string().unwrap()), driver: args.driver, pd_addrs, diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index 5a33a72f..057c0d1f 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -220,6 +220,7 @@ pub struct Cli { pub s0ix_counter: bool, pub hash: Option, pub drivers: bool, + pub drivers_baseline: bool, pub pd_addrs: Option<(u16, u16, u16)>, pub pd_ports: Option<(u8, u8, u8)>, pub help: bool, @@ -1692,9 +1693,20 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 { flash_ec(&ec, ec_bin_path, EcFlashType::Rw, args.dry_run); } else if args.drivers { #[cfg(target_os = "windows")] - wmi::print_drivers(); + { + let platform = smbios::get_platform(); + wmi::print_drivers_with_baseline(platform.as_ref()); + } #[cfg(not(target_os = "windows"))] println!("Driver Version only supported on Windows"); + } else if args.drivers_baseline { + #[cfg(target_os = "windows")] + { + let detected = wmi::collect_drivers(); + println!("{}", detected.to_toml()); + } + #[cfg(not(target_os = "windows"))] + println!("Driver baseline only supported on Windows"); } else if let Some(hash_file) = &args.hash { println!("Hashing file: {}", hash_file); #[cfg(feature = "uefi")] diff --git a/framework_lib/src/commandline/uefi.rs b/framework_lib/src/commandline/uefi.rs index 115f746d..34df3764 100644 --- a/framework_lib/src/commandline/uefi.rs +++ b/framework_lib/src/commandline/uefi.rs @@ -81,6 +81,7 @@ pub fn parse(args: &[String]) -> Cli { uptimeinfo: false, s0ix_counter: false, drivers: false, + drivers_baseline: false, hash: None, // This is the only driver that works on UEFI driver: Some(CrosEcDriverType::Portio), diff --git a/framework_lib/src/drivers.toml b/framework_lib/src/drivers.toml new file mode 100644 index 00000000..738584aa --- /dev/null +++ b/framework_lib/src/drivers.toml @@ -0,0 +1,71 @@ +# Driver configuration for Framework systems +# This file defines which drivers to detect and their display names + +# PNP Drivers - detected via Win32_PnpSignedDriver +# Format: device_name = "display_alias" + +[pnp_drivers] +# Framework Drivers +"Framework EC" = "Framework EC" +"Framework Fingerprint Reader" = "Goodix Fingerprint Driver" +"Framework Sensors" = "Framework Sensors" +"Framework NE160QDM-NZ6" = "Framework Panel" + +# AMD Drivers (for AMD platforms) +"AMD Radeon(TM) 780M" = "AMD Graphics Driver" +"AMD Radeon(TM) 860M Graphics" = "AMD Graphics Driver" +"AMD Radeon(TM) RX 7700S" = "AMD Graphics Driver" +"AMD DRTM Boot Driver" = "AMD DRTM Driver" + +# NVIDIA Drivers (for dGPU) +"NVIDIA GeForce RTX 5070 Laptop GPU" = "NVIDIA Graphics Driver" + +# Realtek Drivers +"Realtek PC Camera Driver" = "Camera Driver" +"Realtek Hardware Support Application" = "Realtek Audio Console" + +# MediaTek Drivers +"RZ616 Bluetooth(R) Adapter" = "RZ616 Bluetooth Driver" +"RZ717 Bluetooth(R) Adapter" = "RZ717 Bluetooth Driver" + +# Microsoft Drivers +"Windows Camera Effects" = "MEP Driver" + +# Intel Drivers (for Intel platforms) +"Intel(R) LPC Controller - 519D" = "Intel Chipset" +"Intel(R) Wi-Fi 6E AX210 160MHz" = "Intel WiFi Driver" +"Intel(R) Wi-Fi 6E AX211 160MHz" = "Intel WiFi Driver" +"Intel(R) Platform Monitoring Technology (PMT) Driver" = "Intel PMT Driver" + +# Other +"ILITEK Wake On Touch Device" = "ILITEK Touch Device" + +# Products - detected via Win32_Product +# Format: product_name = "display_alias" + +[products] +"Intel(R) Chipset Device Software" = "Intel Chipset Driver" +"AMD_Chipset_Drivers" = "AMD Chipset Driver" + +# System Drivers - detected via Win32_SystemDriver +# Format: driver_name = "display_alias" + +[system_drivers] +# Intel Drivers (for Intel platforms) +ibtusb = "Intel Wireless Bluetooth" +IntcAzAudAddService = "Realtek Audio Driver" +IntcAudioBus = "Intel Smart Sound Technology" +ipf_acpi = "Intel Dynamic Tuning Technology" +npu = "Intel NPU" +igfxn = "Intel Graphics" +iaLPSS2_I2C_MTL = "Intel Serial IO" +MEIx64 = "Intel Management Engine" +IntelGNA = "Intel GNA Scoring Accelerator" + +# Framework Expansion Cards +rtux64w10 = "Framework Ethernet Expansion Card" +GeneStor = "Framework SD Expansion Card" + +# MediaTek WiFi Drivers +mtkwlex = "RZ616 WiFi Driver" +mtkwecx = "RZ717 WiFi Driver" diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index 15282d5b..f400070d 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -1,6 +1,77 @@ +use crate::util::Platform; +use serde::Deserialize; use std::collections::HashMap; use wmi::*; +/// Driver configuration loaded from TOML +#[derive(Debug, Deserialize)] +struct DriversConfig { + pnp_drivers: HashMap, + products: HashMap, + system_drivers: HashMap, +} + +/// Platform-specific baseline configuration +#[derive(Debug, Deserialize, Default)] +struct BaselineConfig { + versions: HashMap, +} + +/// Load driver configuration from embedded TOML +fn load_drivers_config() -> DriversConfig { + const CONFIG_STR: &str = include_str!("drivers.toml"); + toml::from_str(CONFIG_STR).expect("Failed to parse drivers.toml") +} + +/// Load baseline configuration for a specific platform +fn load_baseline_for_platform(platform: &Platform) -> BaselineConfig { + let config_str = match platform { + Platform::Framework12IntelGen13 => { + include_str!("baselines/framework12_intel_gen13.toml") + } + Platform::IntelGen11 => include_str!("baselines/intel_gen11.toml"), + Platform::IntelGen12 => include_str!("baselines/intel_gen12.toml"), + Platform::IntelGen13 => include_str!("baselines/intel_gen13.toml"), + Platform::IntelCoreUltra1 => include_str!("baselines/intel_core_ultra1.toml"), + Platform::Framework13Amd7080 => include_str!("baselines/framework13_amd_7080.toml"), + Platform::Framework13AmdAi300 => include_str!("baselines/framework13_amd_ai300.toml"), + Platform::Framework16Amd7080 => include_str!("baselines/framework16_amd_7080.toml"), + Platform::Framework16AmdAi300 => include_str!("baselines/framework16_amd_ai300.toml"), + Platform::FrameworkDesktopAmdAiMax300 => { + include_str!("baselines/framework_desktop_amd_ai_max300.toml") + } + Platform::GenericFramework(..) | Platform::UnknownSystem => { + return BaselineConfig::default(); + } + }; + toml::from_str(config_str).unwrap_or_default() +} + +/// Collected driver information for baseline updates +#[derive(Debug, Default)] +pub struct DetectedDrivers { + pub drivers: HashMap, +} + +impl DetectedDrivers { + /// Generate TOML baseline content from detected drivers + pub fn to_toml(&self) -> String { + let mut output = String::new(); + output.push_str("# Driver baseline - auto-generated\n"); + output.push_str("# Last updated: "); + output.push_str(&chrono::Local::now().format("%Y-%m-%d").to_string()); + output.push_str("\n\n[versions]\n"); + + let mut sorted: Vec<_> = self.drivers.iter().collect(); + sorted.sort_by_key(|(k, _)| k.as_str()); + + for (name, version) in sorted { + output.push_str(&format!("\"{}\" = \"{}\"\n", name, version)); + } + output + } +} + // TODO: // - [ ] Critical // - [ ] Figure out why the CSME version is old @@ -82,71 +153,13 @@ pub fn print_yellow_bangs() { } } -const PNP_DRIVERS: &[&str] = &[ - // Manufacturer DeviceName HardWareID DriverVersion - // ------------ ---------- ---------- ------------- - // Intel Chipset Raptor Lake Framework 12 - // INTEL Intel(R) LPC Controller - 519D 10.1.36.7 - "Intel(R) LPC Controller - 519D", - // Goodix Framework Fingerprint Reader USB\VID_27C6&PID_609C&REV_0100 3.12804.0.240 - "Framework Fingerprint Reader", - // TODO: Wrong version - // Intel Corporation Intel(R) Graphics Command Center SWC\101.5522_VEN8086_IGCC - // "Intel(R) Graphics Command Center", - - // Intel Corporation Intel(R) Wi-Fi 6E AX210 160MHz PCI\VEN_8086&DEV_2725&SUBSYS_00248086&REV_1A 23.60.0.10 - "Intel(R) Wi-Fi 6E AX210 160MHz", - // Don't need, already in system_drivers - // Intel Corporation Intel(R) Wireless Bluetooth(R) USB\VID_8087&PID_0032&REV_0000 23.60.0.1 - // "Intel(R) Wireless Bluetooth(R)", - // Intel Corporation Intel(R) Wi-Fi 6E AX211 160MHz PCI\VEN_8086&DEV_51F1&SUBSYS_00948086&REV_01 - "Intel(R) Wi-Fi 6E AX211 160MHz", - // Intel(R) Platform Monito… Intel(R) Platform Monitoring Technology (PMT) Driver PCI\VEN_8086&DEV_7D0D&SUBSYS_0009F111&REV_01 3.1.2.2 - "Intel(R) Platform Monitoring Technology (PMT) Driver", - // Also in system_drivers - // Not using the one here, because it doesn't show up when the card isn't plugged in - // Genesys Logic Framework SD Expansion Card USB\VID_32AC&PID_0009&REV_0003 4.5.10.201 - - // MediaTek, Inc. RZ616 Wi-Fi 6E 160MHz PCI\VEN_14C3&DEV_0616&SUBSYS_E61614C3&REV_00 3.3.0.908 - // Mediatek Inc. RZ616 Bluetooth(R) Adapter USB\VID_0E8D&PID_E616&REV_0100&MI_00 1.1037.0.395 - "RZ616 Bluetooth(R) Adapter", - // MediaTek, Inc. RZ717 WiFi 7 160MHz PCI\VEN_14C3&DEV_0717&SUBSYS_071714C3&REV_00 5.4.0.1920 - // Mediatek Inc. RZ717 Bluetooth(R) Adapter USB\VID_0E8D&PID_0717&REV_0100&MI_00 1.1037.0.433 - "RZ717 Bluetooth(R) Adapter", - // For both of these WMI shows 31.0.24018.2001 instead of 23.40.18.02. But it's actually the same version - // 31.0.22024.17002 instead of 23.20.24.17 - // Advanced Micro Devices, Inc. AMD Radeon(TM) 780M PCI\VEN_1002&DEV_15BF&SUBSYS_0005F111&REV_C1 31.0.24018.2001 - "AMD Radeon(TM) 780M", - // Advanced Micro Devices, Inc. AMD Radeon(TM) RX 7700S PCI\VEN_1002&DEV_7480&SUBSYS_0007F111&REV_C1 31.0.24018.2001 - "AMD Radeon(TM) RX 7700S", - // Framework Framework NE160QDM-NZ6 MONITOR\BOE0BC9 1.0.0.0 - "Framework NE160QDM-NZ6", - // Advanced Micro Devices, Inc AMD DRTM Boot Driver ACPI\VEN_DRTM&DEV_0001 1.0.18.4 - "AMD DRTM Boot Driver", - // Framework Framework EC ACPI\VEN_FRMW&DEV_C004 - "Framework EC", - // Framework Computer Inc Framework Sensors ACPI\VEN_FRMW&DEV_C006 - "Framework Sensors", - // ILITEK ILITEK Wake On Touch Device ACPI\VEN_ILIT&DEV_2901 - "ILITEK Wake On Touch Device", -]; - -const PRODUCTS: &[&str] = &[ - // TODO: Can I rely on the IdentifyingNumber GUID? - // IdentifyingNumber Name Version - // ----------------- ---- ------- - // {BAB97289-552B-49D5-B1E7-95DB4E4D2DEF} Intel(R) Chipset Device Software 10.1.19627.84… - "Intel(R) Chipset Device Software", - // {00000060-0230-1033-84C8-B8D95FA3C8C3} Intel(R) Wireless Bluetooth(R) 23.60.0.1 - // {1C1EBF97-5EC2-4C01-BCFC-037D140796B4} Intel(R) Serial IO 30.100.2405.44 - - // {35143df0-ba1c-4148-8744-137275e83211} AMD_Chipset_Drivers 5.06.29.310 - "AMD_Chipset_Drivers", -]; - -pub fn print_drivers() { +/// Print drivers with optional baseline comparison +pub fn print_drivers_with_baseline(platform: Option<&Platform>) { print_yellow_bangs(); + let config = load_drivers_config(); + let baseline = platform.map(load_baseline_for_platform).unwrap_or_default(); + println!("Drivers"); let wmi_con = WMIConnection::new(COMLibrary::new().unwrap()).unwrap(); @@ -168,12 +181,11 @@ pub fn print_drivers() { "".to_string() }; - // Skip those that we don't care about - if !PNP_DRIVERS.contains(&device_name.as_str()) { - continue; + // Find matching driver entry + if let Some(alias) = config.pnp_drivers.get(&device_name) { + println!(" {}", alias); + print_version_with_baseline(&version, alias, &baseline); } - println!(" {}", device_name); - println!(" Version: {}", version); } // Products @@ -192,92 +204,15 @@ pub fn print_drivers() { "".to_string() }; - // Skip those that we don't care about - if !PRODUCTS.contains(&name.as_str()) { - continue; + // Find matching product entry + if let Some(alias) = config.products.get(&name) { + println!(" {}", alias); + print_version_with_baseline(&version, alias, &baseline); } - println!(" {}", name); - println!(" Version: {}", version); } // System Drivers - //const system_drivers: HashMap<&str, Option<&str>> = HashMap::from([ - let system_drivers = HashMap::from([ - // [ ] 13 Goodix - // TODO: Can find via Win32_PnpSignedDriver, Manufacturer 'Goodix', DeviceName 'Framework Fingerprint Reader' - // HardwareID: USB\VID_27C6&PID_609C&REV_0100 - - // [ ] 12 Intel Platform Monitoring Technology - // Can find in PNP - - // [x] 11 Intel PROSet Bluetooth - ("ibtusb", None), // Intel(R) Wireless Bluetooth(R) - // [ ] 10 Intel PROSet WiFi - // TODO: The first two show old version - Is the wrong version used? - // "Netwtw14", // Intel® Smart Sound Technology BUS - // "Netwtw10", // Intel® Smart Sound Technology BUS - // "Netwtw16", // This one has the correct version, but it doesn't show up - - // [x] 09 Realtek Audio - ("IntcAzAudAddService", None), // Service for Realtek HD Audio (WDM) - // [x] 08 Intel Smart Sound Technology - ("IntcAudioBus", None), // Intel® Smart Sound Technology BUS - //"IntcOED", // Intel® Smart Sound Technology OED - //"IntcUSB", // Intel® Smart Sound Technology for USB Audio - - // [x] 07 Intel Dynamic Tuning Technology - ("ipf_acpi", Some("Intel Dynamic Tuning Technology")), - // "ipf_cpu", - // "ipf_lf", - - // [x] 06 Intel NPU - ("npu", Some("Intel NPU")), - // [x] 05 Intel Graphics - ("igfxn", Some("Intel Graphics")), // igfxn - // [x] 04 Intel Serial IO - // Don't need to show GPIO and I2C versions, we don't need GPIO driver anyways - // "iaLPSS2_GPIO2_MTL", // Serial IO GPIO Driver v2 - // "iagpio", // Intel Serial IO GPIO Controller Driver - // "iai2c", // Serial IO I2C Host Controller - // "iaLPSS2i_GPIO2" - // "iaLPSS2i_GPIO2_BXT_P", - // "iaLPSS2i_GPIO2_CNL", - // "iaLPSS2i_GPIO2_GLK", - ("iaLPSS2_I2C_MTL", Some("Intel Serial IO")), // Serial IO I2C Driver v2 - // "iaLPSS2i_I2C", - // "iaLPSS2i_I2C_BXT_P", - // "iaLPSS2i_I2C_CNL", - // "iaLPSS2i_I2C_GLK", - - // [ ] 03 Intel Management Engine - // TODO: Shows old version 2406.5.5.0 instead of 2409.5.63.0 - ("MEIx64", None), // Intel(R) Management Engine Interface - // [x] 02 Intel GNA Scoring Accelerator - ("IntelGNA", None), // Intel(R) GNA Scoring Accelerator service - // [ ] 01 Intel Chipset - // TODO: How to find? - // Can't find it anywhere, not in Device Manager, not in Win32_SystemDriver, not in Win32_PnpSignedDriver - - // Framework provided drivers - // Realtek USB FE/1GbE/2.5GbE NIC Family Windows 10 64-bit Driver - ( - "rtux64w10", - Some("Realtek/Framework Ethernet Expansion Card"), - ), - // Genesys Logic Storage Driver - ("GeneStor", Some("Genesys/Framework SD Expansion Card")), - //"IntcAzAudAddService", // Service for Realtek HD Audio (WDM) - //"intelpmax", // Intel(R) Dynamic Device Peak Power Manager Driver - //"IntelPMT", // Intel(R) Platform Monitoring Technology Service - - // Mediatek PCI LE Extensible Wireless LAN Card Driver mtkwlex 3.3.0.0908 C:\Windows\system32\drivers\mtkwl6ex.sys - ("mtkwlex", Some("RZ616 WiFi Driver")), - // Mediatek PCI LE Extensible Wireless LAN Card Driver mtkwecx 5.4.0.1920 C:\Windows\system32\DriverStore\FileRepository\mtkwecx.inf_amd64_b64df836c89617f7\mtkwecx.sys - ("mtkwecx", Some("RZ717 WiFi Driver")), - // RZ616 and RZ717 - // MTK BT Filter Driver MTKBTFilterx64 1.1037.0.395 TK C:\Windows\system32\drivers\mtkbtfilterx.sys - // ("MTKBTFilterx64", Some("RZ616/RZ717 Bluetooth Driver")), - ]); + let system_drivers = &config.system_drivers; let results: Vec> = wmi_con .raw_query("SELECT DisplayName,Name,PathName FROM Win32_SystemDriver") @@ -299,12 +234,8 @@ pub fn print_drivers() { "".to_string() }; - // select * from CIM_Datafile" & _ " where Name = '" & Replace(strPath, "\", "\\") & - // C:\Windows\system32\drivers\xinputhid.sys - // Get-WmiObject -query "SELECT Version FROM CIM_Datafile WHERE Name = 'C:\\Windows\\system32\\drivers\\xinputhid.sys'" if !path_name.starts_with("C:") { debug!("Skipping path_name: {:?}", path_name); - // TODO: Probably a UNC path, not sure how to handle it, let's skip it continue; } let query = format!( @@ -313,31 +244,123 @@ pub fn print_drivers() { ); let results: Vec> = wmi_con.raw_query(query).unwrap(); let version = if let Variant::String(s) = &results[0]["Version"] { - s + s.clone() } else { - "" + "".to_string() }; - // Skip those that we don't care about - let str_name: &str = &name; - //if let Ok(alias) = system_drivers.binary_search_by(|(k, _)| k.cmp(&str_name)).map(|x| system_drivers[x].1) { - if let Some(alias) = system_drivers.get(&str_name) { - let alias = if let Some(alias) = alias { - *alias - } else { - &display_name - }; + if let Some(alias) = system_drivers.get(&name) { println!(" {}", alias); debug!(" Display: {}", display_name); debug!(" Name: {}", name); debug!(" Path: {}", path_name); + print_version_with_baseline(&version, alias, &baseline); + } + } +} + +/// Print version with baseline comparison +fn print_version_with_baseline(version: &str, alias: &str, baseline: &BaselineConfig) { + if let Some(expected) = baseline.versions.get(alias) { + if expected != "0.0.0.0" && version != expected { + println!(" Version: {} (expected: {})", version, expected); + } else { println!(" Version: {}", version); + } + } else { + println!(" Version: {}", version); + } +} + +/// Print drivers without baseline comparison (backwards compatible) +pub fn print_drivers() { + print_drivers_with_baseline(None); +} + +/// Collect all detected drivers (for generating baselines) +pub fn collect_drivers() -> DetectedDrivers { + let config = load_drivers_config(); + let mut detected = DetectedDrivers::default(); + let wmi_con = WMIConnection::new(COMLibrary::new().unwrap()).unwrap(); + + // PNP Drivers + let results: Vec> = wmi_con + .raw_query( + "SELECT Manufacturer,DeviceName,HardwareID,DriverVersion FROM Win32_PnpSignedDriver", + ) + .unwrap(); + for val in results.iter() { + let device_name = if let Variant::String(s) = &val["DeviceName"] { + s.clone() } else { - //println!("Not found: {}", display_name); - //println!(" Name: '{}'", name); - //debug!(" Path: {}", path_name); - //println!(" Version: {}", version); continue; + }; + let version = if let Variant::String(s) = &val["DriverVersion"] { + s.clone() + } else { + continue; + }; + + if let Some(alias) = config.pnp_drivers.get(&device_name) { + detected.drivers.insert(alias.clone(), version); } } + + // Products + let results: Vec> = wmi_con + .raw_query("SELECT IdentifyingNumber, Name, Version FROM Win32_Product") + .unwrap(); + for val in results.iter() { + let name = if let Variant::String(s) = &val["Name"] { + s.clone() + } else { + continue; + }; + let version = if let Variant::String(s) = &val["Version"] { + s.clone() + } else { + continue; + }; + + if let Some(alias) = config.products.get(&name) { + detected.drivers.insert(alias.clone(), version); + } + } + + // System Drivers + let system_drivers = &config.system_drivers; + let results: Vec> = wmi_con + .raw_query("SELECT DisplayName,Name,PathName FROM Win32_SystemDriver") + .unwrap(); + for val in results.iter() { + let name = if let Variant::String(s) = &val["Name"] { + s.clone() + } else { + continue; + }; + let path_name = if let Variant::String(s) = &val["PathName"] { + s.clone() + } else { + continue; + }; + + if !path_name.starts_with("C:") { + continue; + } + let query = format!( + "SELECT Version FROM CIM_Datafile WHERE Name = '{}'", + path_name.replace("\\", "\\\\") + ); + if let Ok(results) = wmi_con.raw_query::>(&query) { + if !results.is_empty() { + if let Variant::String(version) = &results[0]["Version"] { + if let Some(alias) = system_drivers.get(&name) { + detected.drivers.insert(alias.to_string(), version.clone()); + } + } + } + } + } + + detected } From d80b8e9e8ab132015211f9bbe3e46196a35e153a Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 14 Jan 2026 01:55:33 +0800 Subject: [PATCH 10/12] wmi: Add INF file parsing for boot-only drivers Parse driver versions from INF files in the Windows driver store for drivers that are not loaded at runtime (like AMD DRTM). This allows detection of boot-only drivers that don't appear via WMI. Changes: - Add inf_drivers section to drivers.toml for INF-based detection - Add find_inf_driver_version() to scan driver store directories - Add parse_inf_version() with UTF-8 and UTF-16 LE support - Fix clippy warnings in chromium_ec and esrt modules Detects: AMD DRTM Driver, Realtek MEP Opt-in Driver Co-Authored-By: Claude Opus 4.5 --- framework_lib/src/chromium_ec/mod.rs | 1 + framework_lib/src/drivers.toml | 8 ++ framework_lib/src/esrt/mod.rs | 2 +- framework_lib/src/wmi.rs | 106 +++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 1 deletion(-) diff --git a/framework_lib/src/chromium_ec/mod.rs b/framework_lib/src/chromium_ec/mod.rs index f69e395e..3752a09b 100644 --- a/framework_lib/src/chromium_ec/mod.rs +++ b/framework_lib/src/chromium_ec/mod.rs @@ -227,6 +227,7 @@ impl Default for CrosEc { /// Find out which drivers are available /// /// Depending on the availability we choose the first one as default +#[allow(clippy::vec_init_then_push)] fn available_drivers() -> Vec { let mut drivers = vec![]; diff --git a/framework_lib/src/drivers.toml b/framework_lib/src/drivers.toml index 738584aa..b1d67483 100644 --- a/framework_lib/src/drivers.toml +++ b/framework_lib/src/drivers.toml @@ -69,3 +69,11 @@ GeneStor = "Framework SD Expansion Card" # MediaTek WiFi Drivers mtkwlex = "RZ616 WiFi Driver" mtkwecx = "RZ717 WiFi Driver" + +# INF Drivers - detected via driver store INF file parsing +# These are boot-only drivers not visible via WMI at runtime +# Format: inf_name (without .inf) = "display_alias" + +[inf_drivers] +amddrtm = "AMD DRTM Driver" +rtextfw = "Realtek MEP Opt-in Driver" diff --git a/framework_lib/src/esrt/mod.rs b/framework_lib/src/esrt/mod.rs index 645c5669..0ccc8a39 100644 --- a/framework_lib/src/esrt/mod.rs +++ b/framework_lib/src/esrt/mod.rs @@ -438,7 +438,7 @@ pub fn get_esrt() -> Option { let short_guid = guid.trim_matches(|c| c == '{' || c == '}'); let esrt_entry = esrt.open_subkey(&guid).ok()?; let esrt = EsrtResourceEntry { - fw_class: GUID::parse(&short_guid).ok()?.into(), + fw_class: GUID::parse(short_guid).ok()?.into(), fw_type: esrt_entry.get_value("Type").ok()?, fw_version: esrt_entry.get_value("Version").ok()?, lowest_supported_fw_version: esrt_entry.get_value("LowestSupportedVersion").ok()?, diff --git a/framework_lib/src/wmi.rs b/framework_lib/src/wmi.rs index f400070d..ca68fc10 100644 --- a/framework_lib/src/wmi.rs +++ b/framework_lib/src/wmi.rs @@ -1,6 +1,8 @@ use crate::util::Platform; use serde::Deserialize; use std::collections::HashMap; +use std::fs; +use std::path::Path; use wmi::*; /// Driver configuration loaded from TOML @@ -9,6 +11,8 @@ struct DriversConfig { pnp_drivers: HashMap, products: HashMap, system_drivers: HashMap, + #[serde(default)] + inf_drivers: HashMap, } /// Platform-specific baseline configuration @@ -47,6 +51,93 @@ fn load_baseline_for_platform(platform: &Platform) -> BaselineConfig { toml::from_str(config_str).unwrap_or_default() } +const DRIVER_STORE_PATH: &str = r"C:\Windows\System32\DriverStore\FileRepository"; + +/// Find driver INF file in the driver store and extract version +fn find_inf_driver_version(inf_name: &str) -> Option { + let driver_store = Path::new(DRIVER_STORE_PATH); + if !driver_store.exists() { + return None; + } + + // Look for directories matching the INF name pattern (e.g., amddrtm.inf_amd64_*) + let pattern = format!("{}.inf_", inf_name); + let mut best_match: Option<(String, std::time::SystemTime)> = None; + + if let Ok(entries) = fs::read_dir(driver_store) { + for entry in entries.flatten() { + if let Ok(name) = entry.file_name().into_string() { + if name.starts_with(&pattern) { + // Only consider directories, not files like .ini + if let Ok(metadata) = entry.metadata() { + if !metadata.is_dir() { + continue; + } + // Get the modification time to find the newest version + if let Ok(modified) = metadata.modified() { + let should_update = match &best_match { + None => true, + Some((_, prev_time)) => modified > *prev_time, + }; + if should_update { + best_match = + Some((entry.path().to_string_lossy().to_string(), modified)); + } + } + } + } + } + } + } + + // If we found a matching directory, read the INF file and extract version + if let Some((dir_path, _)) = best_match { + let inf_file = Path::new(&dir_path).join(format!("{}.inf", inf_name)); + if inf_file.exists() { + return parse_inf_version(&inf_file); + } + } + + None +} + +/// Parse INF file and extract DriverVer version number +fn parse_inf_version(inf_path: &Path) -> Option { + // Try reading as UTF-8 first, then as UTF-16 LE (common for Windows INF files) + let content = match fs::read_to_string(inf_path) { + Ok(c) => c, + Err(_) => { + // Try reading as UTF-16 LE + let bytes = fs::read(inf_path).ok()?; + // Skip BOM if present and convert UTF-16 LE to String + let start = if bytes.len() >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE { + 2 + } else { + 0 + }; + let u16_chars: Vec = bytes[start..] + .chunks_exact(2) + .map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]])) + .collect(); + String::from_utf16(&u16_chars).ok()? + } + }; + + // Look for DriverVer line, e.g.: DriverVer = 11/11/2024,1.0.18.4 + for line in content.lines() { + let trimmed = line.trim(); + if trimmed.to_lowercase().starts_with("driverver") { + // Extract version after the comma + if let Some(comma_pos) = trimmed.find(',') { + let version = trimmed[comma_pos + 1..].trim(); + return Some(version.to_string()); + } + } + } + + None +} + /// Collected driver information for baseline updates #[derive(Debug, Default)] pub struct DetectedDrivers { @@ -257,6 +348,14 @@ pub fn print_drivers_with_baseline(platform: Option<&Platform>) { print_version_with_baseline(&version, alias, &baseline); } } + + // INF Drivers (boot-only drivers from driver store) + for (inf_name, alias) in &config.inf_drivers { + if let Some(version) = find_inf_driver_version(inf_name) { + println!(" {}", alias); + print_version_with_baseline(&version, alias, &baseline); + } + } } /// Print version with baseline comparison @@ -362,5 +461,12 @@ pub fn collect_drivers() -> DetectedDrivers { } } + // INF Drivers (boot-only drivers from driver store) + for (inf_name, alias) in &config.inf_drivers { + if let Some(version) = find_inf_driver_version(inf_name) { + detected.drivers.insert(alias.clone(), version); + } + } + detected } From 80fe53d0544dd37cd81bc779c7da746f1c9afa92 Mon Sep 17 00:00:00 2001 From: Quin Chou Date: Wed, 14 Jan 2026 15:08:30 +0800 Subject: [PATCH 11/12] Update lilac baseline version to meet Drv105 --- .../src/baselines/framework13_amd_ai300.toml | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/framework_lib/src/baselines/framework13_amd_ai300.toml b/framework_lib/src/baselines/framework13_amd_ai300.toml index 5514bcf8..4b9e7957 100644 --- a/framework_lib/src/baselines/framework13_amd_ai300.toml +++ b/framework_lib/src/baselines/framework13_amd_ai300.toml @@ -4,23 +4,26 @@ [versions] # AMD Drivers -"AMD Chipset Driver" = "0.0.0.0" -"AMD Graphics Driver" = "0.0.0.0" +"AMD Chipset Driver" = "7.06.02.123" +"AMD Graphics Driver" = "32.0.22021.1009" +"AMD MEP_ext Driver" = "32.2.0.1" +"AMD DRTM Driver" = "1.0.18.4" # Realtek Drivers -"Realtek Audio Driver" = "0.0.0.0" -"Realtek Audio Console" = "0.0.0.0" -"Camera Driver" = "0.0.0.0" +"Realtek Audio Driver" = "6.0.9859.1" +"Realtek Audio Console" = "1.53.374.0" +"Camera Driver" = "10.0.22000.20357" +"Realtek MEP Opt-in Driver" = "10.0.22000.10003" # MediaTek Wireless -"RZ717 WiFi Driver" = "0.0.0.0" -"RZ717 Bluetooth Driver" = "0.0.0.0" +"RZ717 WiFi Driver" = "5.6.0.4444" +"RZ717 Bluetooth Driver" = "1.1043.0.555" # Goodix Fingerprint -"Goodix Fingerprint Driver" = "0.0.0.0" +"Goodix Fingerprint Driver" = "3.12804.1.270" # Microsoft -"MEP Driver" = "0.0.0.0" +"MEP Driver" = "2.0.16" # Framework -"Framework EC" = "0.0.0.0" +"Framework EC" = "0.0.0.6" From 8485f7bc1d3d1a6bd3582a539b4d9db67b145dec Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 14 Jan 2026 08:55:59 -0800 Subject: [PATCH 12/12] drivers: Add Sunflower 1.01 baseline Signed-off-by: Daniel Schaefer --- .../baselines/framework12_intel_gen13.toml | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/framework_lib/src/baselines/framework12_intel_gen13.toml b/framework_lib/src/baselines/framework12_intel_gen13.toml index 61cd2f5b..60ff8117 100644 --- a/framework_lib/src/baselines/framework12_intel_gen13.toml +++ b/framework_lib/src/baselines/framework12_intel_gen13.toml @@ -4,21 +4,23 @@ [versions] # Intel Drivers -"Intel Chipset" = "0.0.0.0" -"Intel Graphics" = "0.0.0.0" -"Intel WiFi Driver" = "0.0.0.0" -"Intel Wireless Bluetooth" = "0.0.0.0" -"Intel Smart Sound Technology" = "0.0.0.0" -"Intel Dynamic Tuning Technology" = "0.0.0.0" -"Intel Serial IO" = "0.0.0.0" -"Intel Management Engine" = "0.0.0.0" -"Intel PMT Driver" = "0.0.0.0" +"Intel Chipset" = "10.1.19899.8597" +"Intel Graphics" = "32.0.101.7026" +"Intel WiFi Driver" = "23.160.1.1" +"Intel Wireless Bluetooth" = "23.160.9.9" +"Intel Smart Sound Technology" = "10.29.0.10981" +"Intel Dynamic Tuning Technology" = "1.0.11700.1228" +"Intel Serial IO" = "30.100.2417.30" +"Intel Management Engine" = "2425.6.26.0" # Realtek Drivers -"Realtek Audio Driver" = "0.0.0.0" - -# Goodix Fingerprint -"Goodix Fingerprint Driver" = "0.0.0.0" +"Realtek Audio Driver" = "6.0.9859.1" # Framework -"Framework EC" = "0.0.0.0" +"Framework EC" = "0.0.0.6" +"Framework Sensors" = "0.0.7.0" + +# "Realtek Audio Console" 1.53.374.0 +# "ILITEK Touch Device" 10.0.19041.868 +# GNA 3.5.0.1578 +# Intel HSA 1.100.5688.0