[UEFI]ROM镜像的备份与还原

ROM镜像的备份与还原

实现Setup下面BIOS的备份还原

该功能实现两个方面,备份到U盘、从U盘还原

1、备份到U盘

把rom里的数据复制到盘中
1)找到FAT32的文件系统
每个UEFI系统至少有一个ESP(EFI System Partition)分区,在这个分区上存放了启动文件。既然操作系统加载器以文件的形式存放在ESP分区内,UEFI就需要有读写文件的功能。

Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiSimpleFileSystemProtocolGuid,NULL,&HandleCount,&FileSystemHandles);

2) 通过EFI_SIMPLE_FILE_SYSYTEM_PROTOCOL中的OpenVolume,可以获得FAT文件系统上的根目录句柄,目录句柄(EFI_FILE_PROTOCOL)包含了操作该目录里文件的文件操作接口。

struct _EFI_FILE_PROTOCOL {////// The version of the EFI_FILE_PROTOCOL interface. The version specified/// by this specification is EFI_FILE_PROTOCOL_LATEST_REVISION./// Future versions are required to be backward compatible to version 1.0.///UINT64                Revision;EFI_FILE_OPEN         Open;EFI_FILE_CLOSE        Close;EFI_FILE_DELETE       Delete;EFI_FILE_READ         Read;EFI_FILE_WRITE        Write;EFI_FILE_GET_POSITION GetPosition;EFI_FILE_SET_POSITION SetPosition;EFI_FILE_GET_INFO     GetInfo;EFI_FILE_SET_INFO     SetInfo;EFI_FILE_FLUSH        Flush;EFI_FILE_OPEN_EX      OpenEx;EFI_FILE_READ_EX      ReadEx;EFI_FILE_WRITE_EX     WriteEx;EFI_FILE_FLUSH_EX     FlushEx;
};

文件打开方式

文件打开模式用途
EFI_FILE_MODE_READ文件用于读
:EFI_FILE_MODE_WRITE文件用于写
EFI_FILE_MODE_CREATE若文件不存在,则创建:

3)使用SpiFlashRead读BIOS中的数据,再用EFI_FILE_PROTOCOL->Write写到文件中
写文件
FileIo的Write函数

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_WRITE)(IN EFI_FILE_PROTOCOL        *This,        //文件句柄IN OUT UINTN                *BufferSize,        //输入:要写入的数据长度;输出:实际写入的数据长度IN VOID                     *Buffer                     //待写入数据);

Write 只能写数据到文件,不能写数据到目录。通过,Write函数会写BufferSize指定的字节数到文件中(实际写的字节数等于指定要写的字节数),仅在遇到错误时(例如,卷上没有多余空间时)会写部分数据到文件,此时bufferSize返回实际写的字节数。
4)使用gEfiSimpleFileSystemProtocolGuid寻找FAT32 分区,如果U盘或者硬盘没有该分区,也无法备份

2、从U盘恢复镜像

从盘中读数据写到rom上
1)找到FAT32的文件系统
每个UEFI系统至少有一个ESP(EFI System Partition)分区,在这个分区上存放了启动文件。既然操作系统加载器以文件的形式存放在ESP分区内,UEFI就需要有读写文件的功能。

Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiSimpleFileSystemProtocolGuid,NULL,&HandleCount,&FileSystemHandles);

2) 通过EFI_SIMPLE_FILE_SYSYTEM_PROTOCOL中的OpenVolume,可以获得FAT文件系统上的根目录句柄,目录句柄(EFI_FILE_PROTOCOL)包含了操作该目录里文件的文件操作接口。

struct _EFI_FILE_PROTOCOL {////// The version of the EFI_FILE_PROTOCOL interface. The version specified/// by this specification is EFI_FILE_PROTOCOL_LATEST_REVISION./// Future versions are required to be backward compatible to version 1.0.///UINT64                Revision;EFI_FILE_OPEN         Open;EFI_FILE_CLOSE        Close;EFI_FILE_DELETE       Delete;EFI_FILE_READ         Read;EFI_FILE_WRITE        Write;EFI_FILE_GET_POSITION GetPosition;EFI_FILE_SET_POSITION SetPosition;EFI_FILE_GET_INFO     GetInfo;EFI_FILE_SET_INFO     SetInfo;EFI_FILE_FLUSH        Flush;EFI_FILE_OPEN_EX      OpenEx;EFI_FILE_READ_EX      ReadEx;EFI_FILE_WRITE_EX     WriteEx;EFI_FILE_FLUSH_EX     FlushEx;
};

3)SPI 接口可以用于连接 FLASH 芯片

struct _EFI_SPI_PROTOCOL {EFI_SPI_INIT      Init;EFI_SPI_LOCK      Lock;EFI_SPI_ERASE     Erase;EFI_SPI_PROGRAM   Program;EFI_SPI_READ      Read;EFI_SPI_EXECUTE   Execute;EFI_SPI_GET_INFO  GetInfo;
};

使用 SpiFlashRead 读BIOS中的数据,
使用 SpiFlashBlockErase 擦掉BIOS中的数据,
使用 SpiFlashWrite 把文件数据写入rom里

3、设备区分

如果多个FAT文件块,怎么区分备份到U盘还是SATA盘

Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiSimpleFileSystemProtocolGuid,NULL,&HandleCount,&FileSystemHandles);
for (Index = 0; Index < HandleCount; Index++){
Status = gBS->HandleProtocol (FileSystemHandles[Index],&gEfiBlockIoProtocolGuid,(VOID **) &BlkIo 

USB:BlkIo->Media->RemovableMedia = 1
SATA:BlkIo->Media->RemovableMedia = 0

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

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

相关文章

深度解析SD-WAN和混合WAN的网络方案区别

在企业网络的不断发展中&#xff0c;根据业务需要选择不同的广域网&#xff08;WAN&#xff09;解决方案显得至关重要。传统的基于传输控制协议/因特网协议&#xff08;TCP/IP&#xff09;的WAN是一种私有广域网&#xff0c;由企业网络和互联网服务提供商&#xff08;ISP&#…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

【PyTorch】6.Learn about the optimization loop 了解优化循环

Learn about the optimization loop 了解优化循环 Optimizing Model Parameters 优化模型参数 现在我们有了模型和数据&#xff0c;是时候通过优化数据上的参数来训练、验证和测试我们的模型了。训练模型是一个迭代过程&#xff1b;在每次迭代中&#xff0c;模型都会对输出进…

Vue 动态组件与异步组件:深入理解与全面应用

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 动态组件实现原理&#xff1a;用法示例&#xff1a; 2. 异步组件实现原理&#xff1a;用法示例&#xff1a; 3. 异步组件的高级应用a. 异步组件的命名&#xff1a;b. 异步组件的加载状态管理&#xff1a; ⭐ 写在最后 ⭐ 专栏简…

element plus表格的表头和内容居中

文章目录 需求分析 需求 对于 element-plus 中的 table 进行表头和内容的居中显示 分析 单列的表头和内容居中 &#xff1a; 在对应的那一列加上align“center” 即可 <el-table-column prop"name" label"商品名称" align"center" />…

c++QT文件IO

1、QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗。弹出的结果&#xff08;选择文件的路径&#xff09;通过返回值获取。 1&#xff09;获取一个打开或保存的文件路径 // 获取一个打开或保存的文件路…

WEB前端IDE的使用以及CSS的应用

IDE的使用 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

Unity3D控制人物移动的多种方法

系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…

从编程中思考:大脑的局部与全局模式(一)

郭靖正在帐篷中用Unity写代码&#xff0c;刚写完一段代码。欧阳锋从帐篷外走进来&#xff0c;正要说点什么&#xff0c;郭靖反应敏捷&#xff0c;转身反手一招神龙摆尾击出&#xff0c;将欧阳锋震出帐篷&#xff0c;灰溜溜逃跑。 using UnityEngine;public class LocalGlobalD…

Maven 综合案例

1. 项目需求和结构分析 需求案例&#xff1a;搭建一个电商平台项目&#xff0c;该平台包括用户服务、订单服务、通用工具模块等。 项目架构&#xff1a; 用户服务&#xff1a;负责处理用户相关的逻辑&#xff0c;例如用户信息的管理、用户注册、登录等。 spring-context 6.0.…

P1320 压缩技术(续集版)(C语言)

基本思路是&#xff1a; 1.读入字符串并计算n值 2.字符串连接&#xff08;要用到strcat&#xff09; 3.输出n值 4.计算字符数并输出 其中输出时第一个数字是0的个数&#xff0c;这个很容易被遗漏。 #include<stdio.h> #include<string.h> int main() {char a[…

centos 7.6 进入单用户模式

1、重启服务器&#xff0c;在选择内核界面使用上下箭头移动 2、选择内核并按“e” 将“RO”改成 rw ,删除 rhgb quiet 添加 init/bin/bash Ctrl X 进入单用户模式 为防止乱码&#xff0c;修改语言为英语 修改完密码建议输入&#xff1a;touch /.autorelabel 更新系统信…

imgaug库图像增强指南(34):揭秘【iaa.Clouds】——打造梦幻般的云朵效果

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

vue页面样式在微信中不生效

有几个可能的原因导致你的Vue页面样式在微信中不生效&#xff1a; 缓存问题&#xff1a;微信客户端可能会缓存页面的样式文件。你可以尝试在开发环境下清除缓存&#xff0c;或者在部署时给样式文件添加一个版本号&#xff0c;强制客户端重新加载最新的样式。 兼容性问题&#…

mysql 导入数据 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘

前言: mysql 导入数据 遇到这个错误 1273 - Unknown collation: utf8mb4_0900_ai_ci 具体原因没有深究 但应该是设计数据库的 字符集类型会出现这个问题 例如: char varchar text..... utf8mb4 类型可以存储表情 在现在这个时代会用很多 以后会用的更多 所以不建议改…

GBASE南大通用分享,适用于 GBase 8s ESQL/C的Insert 游标

关闭 Insert 游标 由于 GBase 8s 在 SPL 例程中不支持 Insert 游标&#xff0c;本节有关 Insert 游标的讨论仅适用于 GBase 8s ESQL/C。在 SPL 例程中&#xff0c;只能执行 DECLARE 语句定义的 Select 或 Function 游标的 CLOSE 语句。&#xff08;SPL 的 FOREACH 语句在其语…

SV-7101V网络音频终端产品简介

SV-7101V网络音频终端产品简介 网络广播终端SV-7101V&#xff0c;接收网络音频流&#xff0c;实时解码播放。本设备只有网络广播功能&#xff0c;是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。18123651365微信 产品特点 ■ 提供固件网络远程升级■ 标准RJ…

XML 注入漏洞原理以及修复方法

漏洞名称&#xff1a;XML注入 漏洞描述&#xff1a;可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;用于标记电子文件使其具 有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XM…

CSS之边框样式

让我为大家介绍一下边框样式吧&#xff01;如果大家想更进一步了解边框的使用&#xff0c;可以阅读这一篇文章&#xff1a;CSS边框border 属性描述none没有边框,即忽略所有边框的宽度(默认值)solid边框为单实线dashed边框为虚线dotted边框为点线double边框为双实线 代码演示&…

教你怎么用Docker 部署前端

越来越多的前端团队选择用 Docker 部署前端项目&#xff0c;方法是将项目打包成一个镜像&#xff0c;然后在服务端直接拉镜像启动项目。这种方式可以忽略服务器环境差异&#xff0c;更容易做版本管理。 但我们平常使用 Docker 拉取镜像时&#xff0c;默认会从 Docker Hub 这个…