shell应用模块
同样也是工作需要,不知不觉写过两种Uefi_Application,简单一点的是标准应用模块,它只需要build出来一个.efi直接放在shell下执行;复杂一点的是shell应用模块,它build出来也是一个.efi,但是可以带命令行参数。
标准应用模块
1. 标准应用模块入口函数一般设定为UefiMain,入口参数与一般DXE驱动一样为ImageHandle and SystemTable,返回EFI_STATUS;头文件根据需求可能需要包入UefiApplicationEntryPoint.h,UEFILib.h 等文件。
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status = EFI_SUCCESS;
return Status;
}
2. 还需要一个工程文件即.inf,将模块加载到工程中编译;ENTRY_POINT一般设置为UefiMain,MODULE_TYPE必须设置为UEFI_APPLICATION;source/package/library 根据需求填入,让编译无错误完成;这样编译生成的ProjectOEM.efi 即可以在shell下直接使用。
Shell应用模块
1. Shell应用模块入口函数一般为ShellCEntryLib,它会调用ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) ,这个函数可以在执行命令时输入指定参数, 因此我们的源文件中要实现ShellAppMain函数;头文件中需要包入ShellCEntryLib.h ,ShellLib.h 等。
EFIAPI
ShellAppMain (
IN UINTN Argc,
IN CHAR16 **Argv
)
{
EFI_STATUS Status = EFI_SUCCESS;
return Status;
}
Shell 库中SHELL_PARAM_ITEM ParamList[]可以定义命令,ShellCommandLineGetFlag与ShellCommandLineGetRawValue 能读取命令(-dump)以及命令行中的数据(0x650)
app.efi -dump 0x650
2. 工程文件中定义ENTRY_POINT为ShellCEntryLib,MODULE_TYPE设置为UEFI_APPLICATION;[LibraryClasses]中需要ShellCEntryLib, [Packages]中需要引用MdePkg和ShellPkg,其他根据需求填入,保证build pass