UEFI 界面实例解析

news2024/10/5 17:18:38

这篇文章主要记录一些setup界面的实例,这些实例都是EDK上的,我们可以看到如下图:

 上面三个为banner,下面的都是通过LABLE动态加载的,代码如下:

 我们可以看到 UiListThirdPartyDrivers (HiiHandle, &gEfiIfrFrontPageGuid, NULL, StartOpCodeHandle);这个函数,就是发现第三方的HII驱动然后给它放到FrontPage也就是主页当中,怎么发现,就是通过VFR中的classguid是不是gEfiIfrFrontPageGuid,这是重要依据,自己创建一个第三方驱动AnthonyPage,其中VFR:

, C文件中保留重要的函数就行,仿照其他第三方驱动,这些驱动以Library形式在DSC文件中被包入,这样就新增了一个页面,在DeviceManager页面,还有一种驱动,这种是独立的驱动

 在Devices List下有六个子项,这六个子项就是六个独立的驱动,以Browser Testcase Engine为例子,查看vfr:

 可以看到重点是EFI_HII_PLATFORM_SETUP_FORMSET_GUID,这个classguid和device manager这个页面是绑定的,在仿照这种驱动的时候,这个classguid必须是EFI_HII_PLATFORM_SETUP_FORMSET_GUID。

打开Browser Testcase Engine页面,一个一个分析:

 

 第一个:My subtitle text:

 title就是My First Setup Page,下面的就是My subtitle text和它的help,一个vfr只有一个formset,其他的就是formid,formid和LABLE同级。

第二个My CPU Speed is :

 第一个text就是左边的文字,第二个就是它的值,这种形式可以看到,它是可以选中但是不能改动的,因为没有key,不能执行action

Exit now!

 text
      help   = STRING_TOKEN(STR_EXIT_TEXT),
      text   = STRING_TOKEN(STR_EXIT_TEXT),
      flags  = INTERACTIVE,   // VfrCompiler will generate opcode EFI_IFR_ACTION for Text marked as INTERACTIVE
      key    = 0x1237;

INTERACTIVE,意味人机交互,也就是可以动作的,通过这个key去进行操作,这种形式选中后按Enter就是执行操作,先理解三个函数,ExtractConfig,导出配置,RouteConfig,存储配置,CallBack,操作Hii数据。执行操作在callback中:

case EFI_BROWSER_ACTION_CHANGED:
    switch (QuestionId) {
      case 0x1237:
        //
        // User press "Exit now", request Browser to exit
        //
        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
        break;

      case 0x1238:
        //
        // User press "Save now", request Browser to save the uncommitted data.
        //
        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;
        break;

直接跳过到My one-of prompt #1,前面几个类似,不介绍了:

 

 //
    // Define oneof (EFI_IFR_ONE_OF)
    //
    oneof name = MyOneOf,                                // Define reference name for Question
      varid   = MyIfrNVData.SuppressGrayOutSomething,    // Use "DataStructure.Member" to reference Buffer Storage
      prompt  = STRING_TOKEN(STR_ONE_OF_PROMPT),
      help    = STRING_TOKEN(STR_ONE_OF_HELP),
      //
      // Define an option (EFI_IFR_ONE_OF_OPTION)
      //
      option text = STRING_TOKEN(STR_ONE_OF_TEXT4), value = 0x0, flags = 0;
      option text = STRING_TOKEN(STR_ONE_OF_TEXT5), value = 0x1, flags = 0;
      //
      // DEFAULT indicate this option will be marked with EFI_IFR_OPTION_DEFAULT
      //
      option text = STRING_TOKEN(STR_ONE_OF_TEXT6), value = 0x2, flags = DEFAULT;
    endoneof;

看代码,one-of也就是其中之一,这里有三个选项,分别是0:让checkbox隐藏,1:让checkbox不可选,2:让checkbox可选,我们尝试更改为Suppress the Checkbox,可以看到:

 下方的checkbox没有了,反而出现了一个Pick 1。这里主要说明不可选和隐藏的使用,

 grayoutif  ideqval MyIfrNVData.SuppressGrayOutSomething == 0x1;
      suppressif questionref(MyOneOf) == 0x0;

        checkbox varid   = MyIfrNVData.ChooseToActivateNuclearWeaponry,
                 prompt   = STRING_TOKEN(STR_CHECK_BOX_PROMPT),
                 help     = STRING_TOKEN(STR_CHECK_BOX_HELP),
                 //
                 // CHECKBOX_DEFAULT indicate this checkbox is marked with EFI_IFR_CHECKBOX_DEFAULT
                 // CHECKBOX_DEFAULT_MFG indicate EFI_IFR_CHECKBOX_DEFAULT_MFG.
                 //
                 flags    = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG,
                 default  = TRUE,
        endcheckbox;
      endif;
    endif;

第一句就是可选与不可选,ideqval只是判断,这句话可以这样理解,grayout  if true,如果是true就不可选,什么条件,也就是SuppressGrayOutSomething 的值为0x1;如果不加判断,直接不可选,那么可以这么写 grayoutif   TRUE;,别 grayoutif  ideqval TRUE,不然会报错。隐藏也是一样,MyOneof只是引用,给该变量取个别名一样,使用是一样的,只是需要加一个questionref。

标准的checkbox如上,简化的如下,需要先初始化变量:

 checkbox varid = MyIfrNVData.SerialPortStatus,
        prompt   = STRING_TOKEN(STR_SERIAL_PORT_STATUS),
        help     = STRING_TOKEN(STR_CHECK_BOX_HELP),
      endcheckbox;

 上图选项更改成LargeBootList,Boot Order会多显示USB选项,这个就是在最后一个USB选项加了个隐藏选项,也就是说隐藏和不可选也可以放在一个选项的内部。

然后再看一下Boot Order,它能显示多个选项,是因为使用了orderedlist,这里可以看到suppressif嵌入在中间:

 orderedlist
                varid       = MyIfrNVData.BootOrder,
                prompt      = STRING_TOKEN(STR_BOOT_OPTIONS),
                help        = STRING_TOKEN(STR_NULL_STRING),
                flags       = RESET_REQUIRED,
                option text = STRING_TOKEN(STR_BOOT_OPTION2), value = 2, flags = 0;
                option text = STRING_TOKEN(STR_BOOT_OPTION1), value = 1, flags = 0;
                option text = STRING_TOKEN(STR_BOOT_OPTION3), value = 3, flags = 0;
              suppressif ideqval MyIfrNVData.BootOrderLarge == 0;
                option text = STRING_TOKEN(STR_BOOT_OPTION4), value = 4, flags = 0;
              endif;
      endlist;

待写----

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel 熔断降级和黑白名单控制

一、熔断降级 1、概述 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,…

【C++ 入坑指南】(06)运算符

文章目录 一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、算法题5.1、拆分位数 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 运算符类型作用算术运算符用于处理四则运算赋值…

交换机配置第十二讲(ACL访问控制)

1.实验介绍 设备规划 类型名称数量终端PC3路由器AR22403 IP规划 主机 ip链接交换机端口网关client1192.168.1.2AR1-g/0/0/0192.168.1.1client2192.168.2.2AR2-g/0/0/1192.168.2.1client3192.168.3.2AR3-g/0/0/1192.168.3.1 2. 连线图介绍 连线顺序 3. 基础配置介绍 我们首…

基于SSM的高校共享单车管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

〖大前端 - 基础入门三大核心之JS篇㉞〗- JavaScript 的「立即执行函数IIFE」

当前子专栏 基础入门三大核心篇 是免费开放阶段。推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V!说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费开放,购买任意白宝书体系化专栏可加入TFS…

Threejs进阶之十四:在uniapp中使用threejs创建三维图形

在uniapp中使用threejs 一、uni-app介绍二、新建uni-app项目三、安装three.js库四、在vue组件中引入three.js库五、创建场景(Scene)和相机(Camera)六、创建渲染器(Renderer)七、创建物体和灯光八、渲染场景(Scene)九、运行测试核心代码 一、uni-app介绍 uni-app是一个基于Vue.…

AutoSar CanNm笔记

文章目录 网络管理目的CanNM与其他模块之间关系主动唤醒和被动唤醒状态管理1. 总线睡眠模式(Bus-Sleep Mode)2. 准备总线睡眠模式(Prepare Bus-Sleep Mode)3. 网络模式(Network Mode)3.1 重复报文状态(Repe…

SD-如何训练自己的Lora模型

官方地址:GitHub - bmaltais/kohya_ss 尝试过mac和Ubuntu,装上后都会有问题 Windows按照官方步骤安装即可 第一步 git clone https://github.com/bmaltais/kohya_ss.git cd kohya_sspython -m venv venv .\venv\Scripts\activatepip install torch1.…

1710_开源pdf阅读器SumatraPDF使用体验

全部学习汇总: GreyZhang/g_GNU: After some years I found that I do need some free air, so dive into GNU again! (github.com) 被很多国产免费软件折腾的电脑有点扛不住了,从昨天起打算在Windows上开始开源之路。先用LibreOffice换掉了之前一直觉得…

ansible roles常用用法

目录 一、说明 二、创建 ansible 环境 三、实验操作 四、install_ansible.sh 脚本内容 一、说明 该文档是日常经常使用的模板,通过该例子让更多的初学者了解ansible 剧本的写法,很多情况,可以按照该模版来套用即可。 读者不需要下载…

GPT前2代版本简介

承接上文ChatGPT进化的过程简介 2018年,Google的Bert和OpenAI的GPT绝代双骄,两者非常像,都是语言模型,都基本上是无监督的方式去训练的,你给我一个文本,我给你一个语言模型出来。 GPT前两代没有什么特别的…

好看的皮囊千篇一律,有趣的书籍万里挑一,学习Java必读的两款书籍推荐

今天给各位学习Java的小伙伴儿们推荐两本Java路线上必不可少的书籍,核心卷1和卷2,大家可根据自己的情况种草。正所谓,书多不压身。 Java核心技术卷1 Java 诞生 27 年来,这本享誉全球的 Java 经典著作《Core Java》一路伴随着 J…

2023年了,快去给你的博客加上一个主题吧~

最近闲逛github,发现了一个不错的博客主题,分享给大家。 这个主题主要是用于博客园的个人主页美化用的。 主题地址:Silence - 专注于阅读的博客园主题 目录 一、获取文件 (1)样式文件 (2)脚本…

【机器学习】第二节:线性回归和线性分类

作者🕵️‍♂️:让机器理解语言か 专栏🎇:机器学习sklearn 描述🎨:本专栏主要分享博主学习机器学习的笔记和一些心得体会。 寄语💓:🐾没有白走的路,每一步都算…

Linux文件描述符和重定向

介绍 文件描述符是与文件输入、输出相关联的整数&#xff0c;在编写脚本时会经常使用标准的文件描述符来将内容重定向输出&#xff0c;0、1、2是文件描述符&#xff08;分别对应stdin、stdout、stderr&#xff09;&#xff0c;< 、>, >>叫做操作符。 概念 stdin(…

《走进对象村7》之内部类基地

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f341;内部类匿名内部类匿名内部类的定义匿名内部类访问内部类的特点 &#x1f341;实例内部类实例内部类的定义实例内部类的如何实例化对象实例内部类访问情况 &#x1f341;静态内部类&#x1f341;局部内部类内部…

谈谈中台建设

大家好&#xff0c;我是易安&#xff01; 中台是数字化转型中备受关注的话题。今天&#xff0c;我们将重点探讨业务中台和数据中台。同时&#xff0c;作为企业数字化中台转型的整体&#xff0c;我们也会探讨前台和后台的设计思路。 平台与中台 中台这一概念源于阿里巴巴&#…

命题逻辑与推理

推理理论(假设前提条件为真推出的结论) 真值表法 直接证明法 常用推理规则—倒着看&#xff0c;推理整理过程 P规则(前提引入) T规则(结论引入) ** 常用推理公式 ** 名称内容附加率 A ⇒ ( A ∨ B ) A ⇒ A → B B ⇒ A → B A\Rightarrow(A\lor B)\qquad\\\neg A\Rightarro…

软件工程开发文档写作教程(10)—需求分析书的适用范围

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 需求分析书的适用范围 软件项目一旦被确定要实施之后&#xff0c;撇开项目的立项投标不谈&a…

Java每日一练(20230515) 阶乘后的零、矩阵置零、两数相除

目录 1. 阶乘后的零 &#x1f31f; 2. 矩阵置零 &#x1f31f;&#x1f31f; 3. 两数相除 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 阶乘后的零 …