/* * Copyright (c) 2026, Apollo Telephone Laboratories. * Provided under the BSD-3 clause. */ #include #include static UINT64 FileSize(EFI_FILE_HANDLE FileHandle) { EFI_FILE_INFO *FileInfo; UINT64 Size; FileInfo = LibFileInfo(FileHandle); Size = FileInfo->FileSize; FreePool(FileInfo); return Size; } EFI_STATUS FileGetVolume(IN EFI_HANDLE ImageHandle, OUT EFI_FILE_HANDLE *Handle) { EFI_LOADED_IMAGE *LoadedImage = NULL; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *IoVolume; EFI_GUID LipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; EFI_GUID FsGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; EFI_FILE_HANDLE Volume; EFI_STATUS Status; Status = FwiHandleProtocol( ImageHandle, &LipGuid, (VOID **)&LoadedImage ); if (EFI_ERROR(Status)) { Print(L"fatal: could not get loaded image\n"); return Status; } Status = FwiHandleProtocol( LoadedImage->DeviceHandle, &FsGuid, (VOID *)&IoVolume ); if (EFI_ERROR(Status)) { Print(L"fatal: could not I/O volume\n"); return Status; } Status = uefi_call_wrapper( IoVolume->OpenVolume, 2, IoVolume, &Volume ); if (EFI_ERROR(Status)) { Print(L"fatal: failed to get volume\n"); return Status; } *Handle = Volume; return EFI_SUCCESS; } EFI_STATUS FileReadToBuffer(IN CHAR16 *FileName, OUT VOID **Buffer) { EFI_FILE_HANDLE Handle; EFI_STATUS Status; UINT64 ReadSize; UINT8 *DataBuffer; Status = uefi_call_wrapper( gBootVolume->Open, 5, gBootVolume, &Handle, FileName, EFI_FILE_MODE_READ, EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM ); if (EFI_ERROR(Status)) { Print(L"fatal: could not open %s\n", FileName); return Status; } ReadSize = FileSize(Handle); Status = uefi_call_wrapper( gBS->AllocatePool, 3, EfiLoaderData, ReadSize, &DataBuffer ); if (EFI_ERROR(Status)) { return EFI_OUT_OF_RESOURCES; } Status = uefi_call_wrapper( Handle->Read, 3, Handle, &ReadSize, DataBuffer ); if (EFI_ERROR(Status)) { Print(L"fatal: could not read %s\n", FileName); FreePool(DataBuffer); return Status; } uefi_call_wrapper( Handle->Close, 1, Handle ); *Buffer = DataBuffer; return EFI_SUCCESS; }