系统中的每个设备都有一个唯一的路径。例如,每次进入shell时,都会打印出系统中的硬盘设备以及设备路径。针对硬盘和文件系统,将在BIOS学习实战中通过获取U盘路径,读取BIOS文件,然后进行更新的具体操作,本文主要说的是一些基础的内容

基础知识

设备路径中的节点称为设备节点,设备路径由设备节点组成的列表构成,列表由结束设备节点结束。

每个设备节点都以EFI_DEVICE_PATH_PROTOCOL开始,结束设备节点是一个特设的设备节点,它的类型为0x7F,次类型为0xFF或0x01,节点长度为2字节

说下重点:

UEFI提供了EFI_DEVICE_PATH_TO_TEXT_PROTOCOL用于将设备路径转换为字符串,其中的成员函数ConvertDevicePathToText用于将设备路径DevicePath转换为字符串。

IsDevicePathEnd(CONST VOID *Node)用于判断设备节点Node是否为设备路径的设备结束节点。

NextDevicePathNode(CONST VOID *Node)用于返回设备节点Node的下一个设备节点。

以打印找到的硬盘设备路径为例,步骤如下:

1、首先要用gBS->LocateHandleBuffer服务找出所有支持DiskIo的设备

2、然后找到DiskIo设备的设备路径

3、调用ConvertDevicePathToText,得到设备路径字符串

4、遍历设备路径的各个节点

代码如下:

#include <DevicePath.h>EFI_STATUSPrintNode(EFI_DEVICE_PATH_PROTOCOL *Node){Print(L"(%d %d)/",Node->Type,Node->SubType);return 0;}EFI_DEVICE_PATH_PROTOCOL*WalkthroughDevicePath(EFI_DEVICE_PATH_PROTOCOL* DevPath,EFI_STATUS (*Callbk)(EFI_DEVICE_PATH_PROTOCOL*)){EFI_DEVICE_PATH_PROTOCOL* pDevPath=DevPath;while(!IsDevicePathEnd(pDevPath)){Callbk(pDevPath);pDevPath= NextDevicePathNode(pDevPath);}return pDevPath;}EFI_STATUSEFIAPIShellAppMain (IN UINTN Argc,IN CHAR16 **Argv){EFI_STATUS          Status ;UINTN               HandleIndex,NumHandles;EFI_HANDLE *ControllerHandle =NULL;EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *Device2TextProtocol = 0;EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath;CHAR16 *TextDevicePath;//第一步,打开EFI_DEVICE_PATH_TO_TEXT_PROTOCOL服务Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid,NULL,(VOID**)&Device2TextProtocol);if (EFI_ERROR(Status)){Print(L"located DevicePathToTextProtocol fail\n");return Status;}//第二步,找出所有支持DiskIo的设备                    Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiDiskIoProtocolGuid,NULL,&NumHandles,&ControllerHandle);if (EFI_ERROR(Status)){Print(L"No Disk\n");return Status;}第三步,遍历每个DiskIo设备,并打开设备上的DevicePathprotocolfor(HandleIndex=0;HandleIndex<NumHandles;HandleIndex++){Status = gBS->OpenProtocol(ControllerHandle[HandleIndex],&gEfiDevicePathProtocolGuid,(VOID**)&DiskDevicePath,gImageHandle,NULL,EFI_OPEN_PROTOCOL_GET_PROTOCOL);if (EFI_ERROR(Status)){continue;}  {TextDevicePath = Device2TextProtocol->ConvertDevicePathToText(DiskDevicePath,TRUE,TRUE);Print(L"%s\n",TextDevicePath);if(TextDevicePath){gBS->FreePool(TextDevicePath);}//遍历设备路径DiskDevicePath里的各个设备节点}WalkthroughDevicePath(DiskDevicePath,PrintNode);Print(L"\n\n");}return Status;}

输出显示:

UEFI原理与编程实践--Device Path相关推荐

  1. UEFI原理与编程实践--EFI System Table中的输入输出

    这一节UEFI原理与编程的书籍里面貌似没有提到,不过在我上次使用飞腾源代码增加功能的过程中发现logo界面的左上角有个光标,后来发现源代码也有,这就让有强迫症的人非常不爽啦,这个光标怎么来的呢,我找了 ...

  2. UEFI原理与编程实践--UEFI系统的启动过程

    看图粗略说一下: SEC: 安全验证阶段,这个阶段,需要用Assembly做一些 C 无法处理的工作,C语言无法处理CPU的特殊寄存器.让CPU进入Protected Mode(Flat Mode)的 ...

  3. UEFI原理与编程实践--UEFI驱动模型之显卡(UEFI方向)驱动分析

    拆开一台国产电脑,会发现,很多重要芯片,其实已经国产化了,CPU.GPU.电源管理芯片等等,刚做了一下GOP的笔记,回头想想,之前包入厂商的显卡驱动一直没怎么关注他们的运行逻辑是什么,那么,这篇文章就 ...

  4. UEFI原理与编程实践--UEFI工程模块文件

    标准应用程序工程模块 该模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块,标准应用程序工程模块,UefiMain就是这个模块的入口函数 EFI_STATUS EFIAPI U ...

  5. UEFI原理与编程实践--PCD的使用

    PCD说白了就是个全局变量,就看你怎么去调用了,先看一下它的定义用法: 然后再看一下通过编译后有AutoGen生成的一个定义: PCD的类型有很多种,但是经常使用的也就是静态PCD与动态PCD 静态P ...

  6. UEFI原理与编程实践--Variable的使用

    基础知识 在书中本章主要说明了系统表,启动服务,运行时服务. 挑简单明了的:系统表(gST)的使用方法: SystemTable->BootServes指向系统的启动服务表,ConIn/ConO ...

  7. UEFI原理与编程实践--硬盘相关的Protocol:BlockIo/DiskIo/DiskInfo/PassThrough

    硬盘是一种块设备,所以每个硬盘设备控制器都安装有一个BlockIo实例.一个BlockIo2实例,然后还安装了一个DiskIo实例.一个DiskIo2实例,这两者的区别就是BlockIo只能按块读写设 ...

  8. UEFI原理与编程(一)

    第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口) 常见缩写及描述: 缩略词 全名 描述 UEFI Unified Extensi ...

  9. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...

    7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...

最新文章

  1. 训练LaneATT遇到CUDA_HOME环境变量问题
  2. 如何修改WINDOWS默认的3389远程端口
  3. BZOJ1857 Scoi2010 传送带 【三分】
  4. 程序员四大忌 你该如何避免呢?
  5. [导入]人的一生能有几天?
  6. python 泛型_Python插件 - 如何创建C#泛型List
  7. local sandbox html里的script tag是如何load到memory里的
  8. leetcode1276. 不浪费原料的汉堡制作方案(贪心)
  9. Spring Cloud实战小贴士:版本依赖关系
  10. mac 2018 idea 无法 import导入或打开maven 项目
  11. WinDriver Kernel Plugin开发
  12. 高中信息技术python练习题_Python基础练习题5
  13. 对于seo优化与sem竞价有什么不同的地方?哪个更适合?
  14. Windows 11 配置Java 环境变量
  15. VM下Centos7虚拟机无法进入图形界面并提示Started Virtualization daemon...ices..shutdown
  16. linux面板切换快捷键,Fedora 25 Gnome常用快捷键、快捷操作
  17. ANSYS分析谐振激励下压头的破岩机理
  18. B站课代表神器--一键获取B站视频的完整字幕
  19. Python计算两个日期间的工作日(交易日),去除周末节假日
  20. 美国计算机科学硕士先修课要求,美国商科研究生对本科先修课的要求

热门文章

  1. 使用 Gitlab 搭建 Docker 私有仓库
  2. 停车场管理系统 java_课内资源 - 基于JAVA的停车场管理系统
  3. 网站建设技术回顾:动态网页
  4. 项目测试分析报告 模板
  5. ASP.NET支持多语言
  6. linux 网卡驱动构架,Linux网卡驱动分析
  7. 因为计算机中丢失msvcp100 dll,计算机中丢失MSVCP100.dll怎么解决在线等  爱问知识人...
  8. 职工福利费有误区,财务老师中招了吗?
  9. 前两天一同学说下载的GHOST重新系统之后,四个盘的硬盘分区变成了一个
  10. 在win7中访问删除linux硬盘分区,win7和linux双系统下,删除linux不能启动win7的解决方法...