UEFI 之SMBIOS解析系列2——SMBIOS源码分析(下)

UEFI SMBIOS系列文章目录

UEFI 之SMBIOS解析系列1——SMBIOS概述
UEFI 之SMBIOS解析系列2——SMBIOS源码分析(上)


文章目录

  • UEFI SMBIOS系列文章目录
  • 前言
  • 一、SmbiosAdd函数
  • 二、SmbiosUpdateString 函数
  • 三、SmbiosRemove 函数
  • 总结


前言

上一章节,我们主要讲了SMBIOS源码中增删改查涉及的数据结构和内部结构之间的数据组织关系,今天,我们继续分析SMBIOS源码中的增删改查涉及的操作函数,深入理解背后实现的逻辑。


一、SmbiosAdd函数

SmbiosAdd函数增加一个新的SMBIOS type内容在DataListHead 链表中,同时增加一个新的SMBIOS句柄在AllocatedHandleListHead 链表中。

SmbiosAdd代码实现和注释:

EFI_STATUS
EFIAPI
SmbiosAdd (
  IN CONST EFI_SMBIOS_PROTOCOL  *This,
  IN EFI_HANDLE                 ProducerHandle, OPTIONAL
  IN OUT EFI_SMBIOS_HANDLE      *SmbiosHandle,
  IN EFI_SMBIOS_TABLE_HEADER    *Record
  )
{
   
   
  VOID                        *Raw;
  UINTN                       TotalSize;
  UINTN                       RecordSize;
  UINTN                       StructureSize;
  UINTN                       NumberOfStrings;
  EFI_STATUS                  Status;
  LIST_ENTRY                  *Head;
  SMBIOS_INSTANCE             *Private;
  EFI_SMBIOS_ENTRY            *SmbiosEntry;
  EFI_SMBIOS_HANDLE           MaxSmbiosHandle;
  SMBIOS_HANDLE_ENTRY         *HandleEntry;
  EFI_SMBIOS_RECORD_HEADER    *InternalRecord;
  BOOLEAN                     Smbios32BitTable;
  BOOLEAN                     Smbios64BitTable;
  
  if (SmbiosHandle == NULL) {
   
   
    return EFI_INVALID_PARAMETER;
  }
  Private = SMBIOS_INSTANCE_FROM_THIS (This);
  // 检查入参SmbiosHandle是否已经被使用(在AllocatedHandleListHead 链表中查找)
  Head = &Private->AllocatedHandleListHead;
  if (*SmbiosHandle != SMBIOS_HANDLE_PI_RESERVED && CheckSmbiosHandleExistance(Head, *SmbiosHandle)) {
   
   
    return EFI_ALREADY_STARTED;
  }
  // 当入参SmbiosHandle=0xFFFE, 分配一个可使用的SmbiosHandle
  if (*SmbiosHandle == SMBIOS_HANDLE_PI_RESERVED) {
   
   
    Status = GetAvailableSmbiosHandle(This, SmbiosHandle);
    if (EFI_ERROR(Status)) {
   
   
      return Status;
    }
  } else {
   
   
    // 检查入参SmbiosHandle是否有效
    GetMaxSmbiosHandle(This, &MaxSmbiosHandle);
    if (*SmbiosHandle > MaxSmbiosHandle) {
   
   
      return EFI_INVALID_PARAMETER;
    }
  }
  // 计算添加的smbios type数据的大小StructureSize和包含的字符串个数NumberOfStrings
  Status = GetSmbiosStructureSize(This, Record, &StructureSize, &NumberOfStrings);
  if (EFI_ERROR(Status)) {
   
   
    return Status;
  }
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值