UEFI 之 代码执行uefi shell命令
概要
这需求就是类似于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;
}
Execute
在 ShellPkg/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命令相关推荐
- python commands用法_python之commands模块(执行Linux Shell命令)
commands模块 用于执行Linux shell命令,要获得shell命令的输出只需要在后面参数写入('命令')就可以了. 需要得到命令执行的状态则需要判断$?的值, 在Python中有一个模块c ...
- adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...
在做Android开发板相关的开发需求的时候,我们有的时候需要去到Android系统的一个linux终端(adbshell)里面来执行一些命令,以便于查看部分文件内容或者修改部分文件权限等需求,通常我 ...
- apache php 执行shell,PHP执行普通shell命令流程解析
这里演示一些普通的shell命令 php执行shell命令,可以使用下面几个函数: string system ( string $command [, int &$return_var ] ...
- linux pssh parallel-ssh 批量执行远程shell命令
目录 pssh简介 pssh参数列表 使用实例 pssh简介 文档地址: https://parallel-ssh.readthedocs.io/en/latest/ python异步并行SSH客户端 ...
- java调用本地shell_java通过ProcessBuilder执行本地shell命令 获取ip配置信息
[java]代码库import java.io.File; import java.io.IOException; import java.io.InputStream; import java.ut ...
- php执行cmd/shell命令 木马小后门
php执行shell命令,可以使用下面几个函数: string system ( string $command [, int &$return_var ] )string exec ( st ...
- 使用Emacs执行外部shell命令
执行shell命令 shell-command(M-!) 若调用的shell命令输出不多,则直接输出在echo area,否则会输出到*Shell Command Output* buffer she ...
- python commands执行不连续_[Python] 利用commands模块执行Linux shell命令
用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要 ...
- java 利用ganymed-ssh2 远程执行linux shell 命令
早期的ganymed-ssh2包也可以实现远程调研linux shell 命令,但是这个包最新版本是2014年之后,就没有更新了,发现linux 操作系统安装 open-ssh 8.5及更高级版本,就 ...
最新文章
- 'htons' was not declared in this scope 解决
- 知乎赴美上市为缓解商业化瓶颈,下一步网络推广知乎想怎么做?
- MySQL root密码找回
- mysql redis 中间件_Docker快速搭建Mysql社区版,Redis,MongoDb、MQ等等中间件。
- CS224n笔记3 高级词向量表示
- 实现ABP中Person类的权限功能
- linux分区创建ext4失败,RedHat/CentOS ext4无法格式化大分区 补充ext4格式化方式
- AI如何提升10倍筛药效率?6月18日华为云携手中科院上海药物所揭开谜底
- java靜態常量_Java靜態變量、靜態常量、靜態方法
- dcdc升压计算器excel_两款低压DC-DC升压转换器应用电路
- 渗透测试报告模板_渗透测试报告编写的几个小技巧
- word删除页眉下面的横线
- 「滴滴-橙心优选」秋招面试复盘总结
- 这家小米生态链公司用AI+学习,重塑儿童手表市场
- 叶荣添给你的11条投机建议!
- 清晰理解红黑树的演变-红黑的含义
- Python 中类的继承
- mybatis批量入库(springboot mybatis 批量入库)
- JS——正则表达式(超详细)
- 信捷伺服刚性调整_信捷伺服电机奇怪的质量问题,做工控多年首次仅见!!!!...