这次实验的是在 OVMF 生成的BIOS中插入一个Binary ,然后在代码中将这个Binary 读取出来。
第一个目标:在 OVMF 中插入 Binary。
1.我们准备一个 message.txt,其中内容是简单的字符串:
This is a test message comes from
www.lab-z.com
2.在\OvmfPkg\OvmfPkgX64.fdf 文件中,加入下面的代码
!if $(E1000_ENABLE)
FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 {
SECTION PE32 = Intel3.5/EFIX64/E3522X2.EFI
}
!endif
#LABZDebug_Start
FILE FREEFORM = C3E36D09-2023-0829-A857-D5288FE33E28 Align=4K {
SECTION RAW = OvmfPkg/LabzBin/message.txt
}
#LABZDebug_End
!include NetworkPkg/Network.fdf.inc
INF OvmfPkg/VirtioNetDxe/VirtioNet.inf
3.使用工具查看放置的FFS,可以看到正确的增加到 BIOS 中
这样,第一个目标已经完成,我们成功的生成了一个FFS文件。
第二个目标,将这个 FFS文件从FV中读取出来。之前我们做过类似的实验,在【参考1】中有介绍。这次我们编写一个 UEFI Shell Application ,显示前面插入的 FFS文件的内容。测试代码如下:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include "PiFirmwareVolume.h"
#include "PiFirmwareFile.h"
#include "FirmwareVolume2.h"
INTN
EFIAPI
ShellAppMain (
IN UINTN Argc,
IN CHAR16 **Argv
)
{
CONST EFI_GUID NameGuid= { 0xC3E36D09, 0x2023, 0x0829,
{ 0xA8, 0x57, 0xD5, 0x28, 0x8F, 0xE3, 0x3E, 0x28 }
};
EFI_SECTION_TYPE SectionType=EFI_SECTION_RAW;
VOID *Buffer=NULL;
UINTN Size=0;
UINT32 AuthenticationStatus=0;
EFI_STATUS Status;
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
Status = gBS->LocateProtocol (
&gEfiFirmwareVolume2ProtocolGuid,
NULL,
(VOID **) &Fv
);
if (EFI_ERROR (Status))
{
Print(L"[EFI_FIRMWARE_VOLUME2_PROTOCOL not found]\n");
return EFI_NOT_FOUND;
}
//
// Read desired section content in NameGuid file
//
Status = Fv->ReadSection (
Fv,
&NameGuid,
SectionType,
0,
&Buffer,
&Size,
&AuthenticationStatus);
UINT8 *P=(UINT8 *)Buffer;
Print(L"[EFI_FIRMWARE_VOLUME2_PROTOCOL %r]\n",Status);
for (UINTN i=0; i<Size; i++)
{
Print(L"%c",P[i]);
}
Print(L"\n");
return(0);
}
运行的结果如下图所示,可以看到正确的读取出我们存放的内容:
完整的代码下载:
参考:
1. https://www.lab-z.com/getffs/ 代码读取一个 FFS