diff --git a/framework_lib/src/chromium_ec/portio.rs b/framework_lib/src/chromium_ec/portio.rs index 5ec0212e..b453c41c 100644 --- a/framework_lib/src/chromium_ec/portio.rs +++ b/framework_lib/src/chromium_ec/portio.rs @@ -126,7 +126,8 @@ struct EcHostResponse { /// Reserved byte in protocol v3. Must be 0 pub reserved: u16, } -const _HEADER_LEN: usize = std::mem::size_of::(); +#[allow(dead_code)] +pub const HEADER_LEN: usize = std::mem::size_of::(); fn transfer_write(buffer: &[u8]) { if has_mec() { diff --git a/framework_lib/src/chromium_ec/windows.rs b/framework_lib/src/chromium_ec/windows.rs index e16d5002..4e026663 100644 --- a/framework_lib/src/chromium_ec/windows.rs +++ b/framework_lib/src/chromium_ec/windows.rs @@ -11,6 +11,7 @@ use windows::{ }, }; +use crate::chromium_ec::portio::HEADER_LEN; use crate::chromium_ec::EC_MEMMAP_SIZE; use crate::chromium_ec::{EcError, EcResponseStatus, EcResult}; @@ -89,16 +90,18 @@ pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult< version: command_version as u32, command: command as u32, outsize: data.len() as u32, - insize: CROSEC_CMD_MAX_REQUEST as u32, + insize: (CROSEC_CMD_MAX_REQUEST - HEADER_LEN) as u32, result: 0xFF, - buffer: [0_u8; 256], + buffer: [0_u8; CROSEC_CMD_MAX_REQUEST], }; cmd.buffer[0..data.len()].clone_from_slice(data); - let size = std::mem::size_of::(); + let buf_size = std::mem::size_of::(); + // Must keep 8 bytes of space for the EC command request/response headers + let cmd_len = buf_size - HEADER_LEN; + let out_len = buf_size - HEADER_LEN; let const_ptr = &mut cmd as *const _ as *const ::core::ffi::c_void; let mut_ptr = &mut cmd as *mut _ as *mut ::core::ffi::c_void; - let _ptr_size = std::mem::size_of::() as u32; let mut returned: u32 = 0; @@ -113,9 +116,9 @@ pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult< device.0, IOCTL_CROSEC_XCMD, Some(const_ptr), - size.try_into().unwrap(), + cmd_len.try_into().unwrap(), Some(mut_ptr), - size.try_into().unwrap(), + out_len.try_into().unwrap(), Some(&mut returned as *mut u32), None, ) @@ -129,7 +132,7 @@ pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult< } // TODO: Figure out why that's sometimes bigger - let end = std::cmp::min(returned, 256); + let end = std::cmp::min(returned, CROSEC_CMD_MAX_REQUEST as u32); let out_buffer = &cmd.buffer[..(end as usize)]; Ok(out_buffer.to_vec()) diff --git a/framework_lib/src/esrt/mod.rs b/framework_lib/src/esrt/mod.rs index cba4131d..521c6352 100644 --- a/framework_lib/src/esrt/mod.rs +++ b/framework_lib/src/esrt/mod.rs @@ -348,12 +348,12 @@ pub fn get_esrt() -> Option { debug!("Querying WMI"); let results: Vec> = wmi_con.raw_query("SELECT HardwareID, Name FROM Win32_PnPEntity WHERE ClassGUID = '{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}'").unwrap(); + let re = regex::Regex::new(r"([\-a-h0-9]+)\}&REV_([A-F0-9]+)").expect("Bad regex"); for (i, val) in results.iter().enumerate() { let hwid = &val["HardwareID"]; if let Variant::Array(strs) = hwid { if let Variant::String(s) = &strs[0] { // Sample "UEFI\\RES_{c57fd615-2ac9-4154-bf34-4dc715344408}&REV_CF" - let re = regex::Regex::new(r"([\-a-h0-9]+)\}&REV_([A-F0-9]+)").expect("Bad regex"); let caps = re.captures(s).expect("No caps"); let guid_str = caps.get(1).unwrap().as_str().to_string(); let ver_str = caps.get(2).unwrap().as_str().to_string();