概要

这需求就是类似于linux系统下的系统调用接口system("command")

EDK中实现

Shell protocol 实现

包含协议

[Protocols]gEfiShellProtocolGuid                  ## CONSUMES

Demo

EFI_STATUS
EFIAPI
UefiMain (IN EFI_HANDLE                            ImageHandle,IN EFI_SYSTEM_TABLE                      *SystemTable)
{EFI_SHELL_PROTOCOL    *EfiShellProtocol;EFI_STATUS            Status;
//初始化协议Status = gBS->LocateProtocol (&gEfiShellProtocolGuid,NULL,(VOID **)          &EfiShellProtocol);if (EFI_ERROR (Status)) {return Status; }EfiShellProtocol->Execute (&ImageHandle,L"echo map -r",NULL,&Status);return Status;
}

ExecuteShellPkg/Application/Shell/ShellProtocol.c

EFI_STATUS
EFIAPI
EfiShellExecute(IN EFI_HANDLE *ParentImageHandle,IN CHAR16 *CommandLine OPTIONAL,IN CHAR16 **Environment OPTIONAL,OUT EFI_STATUS *StatusCode OPTIONAL)
{EFI_STATUS                Status;CHAR16                    *Temp;EFI_DEVICE_PATH_PROTOCOL  *DevPath;UINTN                     Size;if ((PcdGet8(PcdShellSupportLevel) < 1)) {return (EFI_UNSUPPORTED);}if (NestingEnabled()) {DevPath = AppendDevicePath (ShellInfoObject.ImageDevPath, ShellInfoObject.FileDevPath);DEBUG_CODE_BEGIN();Temp = ConvertDevicePathToText(ShellInfoObject.FileDevPath, TRUE, TRUE);FreePool(Temp);Temp = ConvertDevicePathToText(ShellInfoObject.ImageDevPath, TRUE, TRUE);FreePool(Temp);Temp = ConvertDevicePathToText(DevPath, TRUE, TRUE);FreePool(Temp);DEBUG_CODE_END();Temp = NULL;Size = 0;ASSERT((Temp == NULL && Size == 0) || (Temp != NULL));StrnCatGrow(&Temp, &Size, L"Shell.efi -exit ", 0);StrnCatGrow(&Temp, &Size, CommandLine, 0);Status = InternalShellExecuteDevicePath(ParentImageHandle,DevPath,Temp,(CONST CHAR16**)Environment,StatusCode);//// de-allocate and return//FreePool(DevPath);FreePool(Temp);} else {Status = InternalShellExecute((CONST CHAR16*)CommandLine,(CONST CHAR16**)Environment,StatusCode);}return(Status);
}

需要说明的是NestingEnabled跑到这里会返回无效的参数,InternalShellExecute用这个接口是可以的;我使用的是UDK2018

使用UefiShellLib库的接口,跟方便,位置在ShellPkg/Library/UefiShellLib

#include <Library/ShellLib.h>EFI_STATUS
EFIAPI
UefiMain (IN EFI_HANDLE                            ImageHandle,IN EFI_SYSTEM_TABLE                      *SystemTable)
{EFI_STATUS            Status;ShellExecute (&ImageHandle,L"echo Hello World!",FALSE,NULL,&Status);return Status;
}

其实最终调用的还是EfiShellExecute接口;

参考

https://stackoverflow.com/questions/38738862/run-a-uefi-shell-command-from-inside-uefi-application

UEFI 之 代码执行uefi shell命令相关推荐

  1. python commands用法_python之commands模块(执行Linux Shell命令)

    commands模块 用于执行Linux shell命令,要获得shell命令的输出只需要在后面参数写入('命令')就可以了. 需要得到命令执行的状态则需要判断$?的值, 在Python中有一个模块c ...

  2. adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...

    在做Android开发板相关的开发需求的时候,我们有的时候需要去到Android系统的一个linux终端(adbshell)里面来执行一些命令,以便于查看部分文件内容或者修改部分文件权限等需求,通常我 ...

  3. apache php 执行shell,PHP执行普通shell命令流程解析

    这里演示一些普通的shell命令 php执行shell命令,可以使用下面几个函数: string system ( string $command [, int &$return_var ] ...

  4. linux pssh parallel-ssh 批量执行远程shell命令

    目录 pssh简介 pssh参数列表 使用实例 pssh简介 文档地址: https://parallel-ssh.readthedocs.io/en/latest/ python异步并行SSH客户端 ...

  5. java调用本地shell_java通过ProcessBuilder执行本地shell命令 获取ip配置信息

    [java]代码库import java.io.File; import java.io.IOException; import java.io.InputStream; import java.ut ...

  6. php执行cmd/shell命令 木马小后门

    php执行shell命令,可以使用下面几个函数: string system ( string $command [, int &$return_var ] )string exec ( st ...

  7. 使用Emacs执行外部shell命令

    执行shell命令 shell-command(M-!) 若调用的shell命令输出不多,则直接输出在echo area,否则会输出到*Shell Command Output* buffer she ...

  8. python commands执行不连续_[Python] 利用commands模块执行Linux shell命令

    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要 ...

  9. java 利用ganymed-ssh2 远程执行linux shell 命令

    早期的ganymed-ssh2包也可以实现远程调研linux shell 命令,但是这个包最新版本是2014年之后,就没有更新了,发现linux 操作系统安装 open-ssh 8.5及更高级版本,就 ...

最新文章

  1. 'htons' was not declared in this scope 解决
  2. 知乎赴美上市为缓解商业化瓶颈,下一步网络推广知乎想怎么做?
  3. MySQL root密码找回
  4. mysql redis 中间件_Docker快速搭建Mysql社区版,Redis,MongoDb、MQ等等中间件。
  5. CS224n笔记3 高级词向量表示
  6. 实现ABP中Person类的权限功能
  7. linux分区创建ext4失败,RedHat/CentOS ext4无法格式化大分区 补充ext4格式化方式
  8. AI如何提升10倍筛药效率?6月18日华为云携手中科院上海药物所揭开谜底
  9. java靜態常量_Java靜態變量、靜態常量、靜態方法
  10. dcdc升压计算器excel_两款低压DC-DC升压转换器应用电路
  11. 渗透测试报告模板_渗透测试报告编写的几个小技巧
  12. word删除页眉下面的横线
  13. 「滴滴-橙心优选」秋招面试复盘总结
  14. 这家小米生态链公司用AI+学习,重塑儿童手表市场
  15. 叶荣添给你的11条投机建议!
  16. 清晰理解红黑树的演变-红黑的含义
  17. Python 中类的继承
  18. mybatis批量入库(springboot mybatis 批量入库)
  19. JS——正则表达式(超详细)
  20. 信捷伺服刚性调整_信捷伺服电机奇怪的质量问题,做工控多年首次仅见!!!!...

热门文章

  1. android开发书籍推荐!知乎上已获千赞,已拿offer附真题解析
  2. 冒烟的意思_冒烟-冒烟的意思,拼音及解释
  3. cursortype,LockType,CursorLocation
  4. js:原生ajax【纯js】
  5. 202301-第一周资讯
  6. 定义字母为小数c语言,c语言中小数怎么写
  7. 生产环境10分钟黄金时间快速排障:CPU不定时飙高怎么排查?
  8. wch南京沁恒CH342,usb转串口芯片,兼容cp2105
  9. 【网络安全】如何在 Apache 安装开源 WAF
  10. 用 Python 实现带音乐的雪花飘落雪景图