Untitled

 avatar
unknown
plain_text
a year ago
2.6 kB
24
Indexable
#include <efi.h>
#include <efilib.h>

EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    EFI_STATUS Status;

    // Initialize the EFI library
    InitializeLib(ImageHandle, SystemTable);

    // Get the handle to the device block protocol
    EFI_HANDLE *HandleBuffer;
    UINTN HandleCount;
    Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &HandleBuffer);
    if (EFI_ERROR(Status)) {
        Print(L"Failed to locate block protocol handles\n");
        return Status;
    }

    // Loop through each block protocol handle
    for (UINTN i = 0; i < HandleCount; i++) {
        EFI_BLOCK_IO_PROTOCOL *BlockIo;
        Status = gBS->HandleProtocol(HandleBuffer[i], &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
        if (EFI_ERROR(Status)) {
            Print(L"Failed to get Block IO protocol\n");
            continue;
        }

        // Accessing the partitions - assuming it's a GPT partition table
        // You might need to handle different partition table types here
        EFI_PARTITION_TABLE_HEADER *PartitionTable;
        Status = uefi_call_wrapper(BlockIo->ReadBlocks, 5, BlockIo, BlockIo->Media->MediaId, 1, sizeof(EFI_PARTITION_TABLE_HEADER), (VOID **)&PartitionTable);
        if (EFI_ERROR(Status)) {
            Print(L"Failed to read partition table\n");
            continue;
        }

        // Get the number of partitions
        UINT32 NumberOfPartitions = PartitionTable->NumberOfPartitionEntries;

        // Assuming partition entries are contiguous in memory
        EFI_PARTITION_ENTRY *PartitionEntry = (EFI_PARTITION_ENTRY *)(PartitionTable + 1);

        // Loop through all partition entries
        for (UINTN j = 0; j < NumberOfPartitions; j++) {
            EFI_LBA StartLBA = PartitionEntry[j].StartingLBA;
            EFI_LBA EndLBA = PartitionEntry[j].EndingLBA;

            // Loop through FAT32 partition blocks and print the first 200 bytes
            for (EFI_LBA LBA = StartLBA; LBA < EndLBA; LBA++) {
                CHAR8 Buffer[512];
                Status = uefi_call_wrapper(BlockIo->ReadBlocks, 5, BlockIo, BlockIo->Media->MediaId, LBA, 512, Buffer);
                if (EFI_ERROR(Status)) {
                    Print(L"Failed to read block\n");
                    break;
                }

                // Print the first 200 bytes
                for (UINTN k = 0; k < 200; k++) {
                    Print(L"%02x ", Buffer[k]);
                }
            }
        }
    }

    FreePool(HandleBuffer);
    return EFI_SUCCESS;
}
Editor is loading...
Leave a Comment