use crate::structures::common::{self, StructureError};
#[derive(Debug, Default, Clone)]
pub struct UEFIVolumeHeader {
pub header_crc: usize,
pub header_size: usize,
pub volume_size: usize,
}
pub fn parse_uefi_volume_header(uefi_data: &[u8]) -> Result<UEFIVolumeHeader, StructureError> {
const EXPECTED_REVISION: usize = 2;
let uefi_pi_header_structure = vec![
("volume_size", "u64"),
("magic", "u32"),
("attributes", "u32"),
("header_size", "u16"),
("header_crc", "u16"),
("extended_header_offset", "u16"),
("reserved", "u8"),
("revision", "u8"),
];
if let Ok(uefi_volume_header) = common::parse(uefi_data, &uefi_pi_header_structure, "little") {
if uefi_volume_header["header_size"] < uefi_volume_header["volume_size"] {
if uefi_volume_header["reserved"] == 0 {
if uefi_volume_header["revision"] == EXPECTED_REVISION {
return Ok(UEFIVolumeHeader {
header_crc: uefi_volume_header["header_crc"],
header_size: uefi_volume_header["header_size"],
volume_size: uefi_volume_header["volume_size"],
});
}
}
}
}
Err(StructureError)
}
#[derive(Debug, Default, Clone)]
pub struct UEFICapsuleHeader {
pub total_size: usize,
pub header_size: usize,
}
pub fn parse_uefi_capsule_header(uefi_data: &[u8]) -> Result<UEFICapsuleHeader, StructureError> {
let uefi_capsule_structure = vec![
("guid_p1", "u64"),
("guid_p2", "u64"),
("header_size", "u32"),
("flags", "u32"),
("total_size", "u32"),
];
if let Ok(capsule_header) = common::parse(uefi_data, &uefi_capsule_structure, "little") {
if capsule_header["header_size"] < capsule_header["total_size"] {
return Ok(UEFICapsuleHeader {
total_size: capsule_header["total_size"],
header_size: capsule_header["header_size"],
});
}
}
Err(StructureError)
}