EFI_STATUS Status = EFI_SUCCESS;
EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockPPi = NULL;
DEBUG ((EFI_D_ERROR, "[PPI]\n"));
Status = PeiServicesLocatePpi (
&gEfiPeiVirtualBlockIoPpiGuid,
0,
NULL,
(VOID **)&BlockPPi
);
if (EFI_ERROR(Status)){
DEBUG ((EFI_D_ERROR, "[PPI] Fail\n"));
return Status;
}
为什么这样去找blockIO的ppi会失败?
这段代码是在使用PEI阶段(Pre-EFI Initialization)去找EFI_PEI_RECOVERY_BLOCK_IO_PPI类型的PPI接口。其中gEfiPeiVirtualBlockIoPpiGuid是PPI接口的GUID。
这样的话,如果找不到该PPI接口,会返回EFI_NOT_FOUND错误。这可能是因为在PEI阶段还没有加载该PPI接口,或者是因为在PEI阶段该PPI接口并不存在。
可能的原因有:
1.在系统启动阶段没有加载该PPI接口,或者是加载顺序问题导致的,可以尝试更改加载顺序,或者在系统启动时手动加载该PPI接口。
2.在项目中没有实现该PPI接口,需要添加实现该PPI接口的代码。
3.在系统中没有安装硬盘驱动,导致该PPI接口无法正常工作。
推荐使用EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockPPi = NULL; 代码来查看是否能够找到该接口,如果能够找到,则查看是否实现了该接口。