UEFI dh命令查看系统安装Protocol
1、如何在UEFI shell下确定当前系统是否有安装某一特定的Protocol?
方法1:添加调试代码,打印看日志
EFI_GUID ProtocolGuid = xxxxxxxx;
VOID *TestProtocol;
Status = gBS->LocateProtocol(
&ProtocolGuid,
NULL,
(VOID **)&TestProtocol);
if (!EFI_ERROR(Status))
{
Print(L"[Install] %g\n\r",&ProtocolGuid);
}
else
{
Print(L"[NOT Install] %g\n\r",&ProtocolGuid);
}
方法2:使用Shell提供的dh命令(
见下文
)
//显然方法1调试过于繁琐,Shell下提供的dh命令可以直接查询,并不需要我们去写代码调试
2、dh命令基本介绍
列出所有的Handle:dh
列出指定Handle的相关信息:dh [Handler] -d
列出安装了指定Protocol的Handle:dh -p [ProtocolGuid] 或者dh -p [ProtocolName]
注意事项:dh -p [ProtocolGuid] 或者dh -p [ProtocolName]使用的效果是一样的,其中ProtocolName与ProtocolGuid对应关系参考UefiHandleParsingLib.c,一般来说开发调试中我们不会太多的去关注ProtocolName.
3、dh脚本
实际开发过程中由于某些驱动的依赖关系或者硬件未正确初始化,导致相关的Protocol没有安装加载,那么如何去调试某个Protocol是否有加载呢?使用dh -p guid
,可以很方便的帮我们在UEFI开发中查看某个Protocol是否有安装加载。
#dh_protocol.nsh
#clear Screen
echo -off
cls
#gEfiShellProtocolGuid
set gEfiShellProtocolGuid "6302d008-7f9b-4f30-87ac-60c9fef5da4e"
dh -p %gEfiShellProtocolGuid%
echo " "
echo " "
#gEfiDxeIpmiTransportProtocolGuid
set gEfiDxeIpmiTransportProtocolGuid "4a1d0e66-5271-4e22-83fe-90921b748213"
dh -p %gEfiDxeIpmiTransportProtocolGuid%
echo " "
echo " "
#exit shell
:ExitShell
exit /b 1
cls
echo -on
附录
//如下为笔者Edk开发Code Base,仅供参考
https://gitee.com/hostid/edk2_develop.git