linux_bootloader/
uefi_helpers.rs1use core::ffi::c_void;
2
3use uefi::{prelude::BootServices, proto::loaded_image::LoadedImage, Result};
4
5#[derive(Debug, Clone, Copy)]
6pub struct PeInMemory {
7 image_base: *const c_void,
8 image_size: usize,
9}
10
11impl PeInMemory {
12 pub unsafe fn as_slice(&self) -> &'static [u8] {
23 unsafe { core::slice::from_raw_parts(self.image_base as *const u8, self.image_size) }
24 }
25}
26
27pub fn booted_image_file(boot_services: &BootServices) -> Result<PeInMemory> {
29 let loaded_image =
30 boot_services.open_protocol_exclusive::<LoadedImage>(boot_services.image_handle())?;
31 let (image_base, image_size) = loaded_image.info();
32
33 Ok(PeInMemory {
34 image_base,
35 image_size: usize::try_from(image_size).map_err(|_| uefi::Status::INVALID_PARAMETER)?,
36 })
37}