morpheus_bootloader/tui/installer_menu/
esp_scan.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// ESP scanning operations

use crate::installer::EspInfo;
use crate::BootServices;
use alloc::vec::Vec;

pub fn scan_for_esps(bs: &BootServices) -> Vec<EspInfo> {
    let mut esp_list = Vec::new();

    // Scan all disks for ESPs
    let mut temp_disk_manager = morpheus_core::disk::manager::DiskManager::new();
    if crate::uefi::disk::enumerate_disks(bs, &mut temp_disk_manager).is_err() {
        return esp_list;
    }

    let disk_count = temp_disk_manager.disk_count();

    for disk_idx in 0..disk_count {
        let block_io_ptr = match crate::uefi::disk::get_disk_protocol(bs, disk_idx) {
            Ok(ptr) => ptr,
            Err(_) => continue,
        };

        let block_io = unsafe { &mut *block_io_ptr };
        let media = unsafe { &*block_io.media };
        let block_size = media.block_size as usize;

        let adapter = match crate::uefi::gpt_adapter::UefiBlockIoAdapter::new(block_io) {
            Ok(a) => a,
            Err(_) => continue,
        };

        let mut partition_table = morpheus_core::disk::partition::PartitionTable::new();
        if morpheus_core::disk::gpt_ops::scan_partitions(adapter, &mut partition_table, block_size)
            .is_err()
        {
            continue;
        }

        // Find all ESP partitions on this disk
        for part_idx in 0..partition_table.count() {
            if let Some(part) = partition_table.get(part_idx) {
                if matches!(
                    part.partition_type,
                    morpheus_core::disk::partition::PartitionType::EfiSystem
                ) {
                    esp_list.push(EspInfo {
                        disk_index: disk_idx,
                        partition_index: part_idx,
                        start_lba: part.start_lba,
                        size_mb: part.size_mb(),
                    });
                }
            }
        }
    }

    esp_list
}