Parse ME version from FVI table Returns the highest major version found from components 1, 2, or 3 (ME version is typically higher than reference code versions)
(raw: &RawStructure, valid_handles: &[u16])
| 540 | /// Returns the highest major version found from components 1, 2, or 3 |
| 541 | /// (ME version is typically higher than reference code versions) |
| 542 | fn parse_me_fvi_version(raw: &RawStructure, valid_handles: &[u16]) -> Option<MeFviVersion> { |
| 543 | if raw.info != InfoType::Oem(SMBIOS_TYPE_ME_FVI) { |
| 544 | return None; |
| 545 | } |
| 546 | |
| 547 | let handle = raw.handle; |
| 548 | let length = raw.length as usize; |
| 549 | |
| 550 | let is_valid_handle = if valid_handles.is_empty() { |
| 551 | handle == SMBIOS_DD_HANDLE_ME || handle == SMBIOS_DD_HANDLE_ME2 |
| 552 | } else { |
| 553 | valid_handles.contains(&handle) |
| 554 | }; |
| 555 | |
| 556 | if !is_valid_handle { |
| 557 | return None; |
| 558 | } |
| 559 | |
| 560 | let count = raw.get::<u8>(4).ok()?; |
| 561 | if count == 0 { |
| 562 | return None; |
| 563 | } |
| 564 | |
| 565 | let record_size = 7; |
| 566 | let records_offset = 5; |
| 567 | |
| 568 | let mut best_version: Option<MeFviVersion> = None; |
| 569 | |
| 570 | for i in 0..count { |
| 571 | let offset = records_offset + (i as usize * record_size); |
| 572 | if offset + record_size > length { |
| 573 | break; |
| 574 | } |
| 575 | |
| 576 | let component_name = raw.get::<u8>(offset).ok()?; |
| 577 | |
| 578 | // Check components 1, 2, and 3 - ME version location varies by system |
| 579 | if component_name == 1 || component_name == 2 || component_name == 3 { |
| 580 | let major = raw.get::<u8>(offset + 2).ok()?; |
| 581 | let minor = raw.get::<u8>(offset + 3).ok()?; |
| 582 | let patch = raw.get::<u8>(offset + 4).ok()?; |
| 583 | let build = raw.get::<u16>(offset + 5).ok()?; |
| 584 | |
| 585 | // Skip invalid versions (all 0xFF) |
| 586 | if major == 0xFF && minor == 0xFF && patch == 0xFF { |
| 587 | continue; |
| 588 | } |
| 589 | |
| 590 | // Keep the highest major version (ME version is typically higher than reference code) |
| 591 | if best_version.is_none() || major > best_version.as_ref().unwrap().major { |
| 592 | best_version = Some(MeFviVersion { |
| 593 | major, |
| 594 | minor, |
| 595 | patch, |
| 596 | build, |
| 597 | }); |
| 598 | } |
| 599 | } |
no outgoing calls
no test coverage detected