locate ppi 详解

来源:互联网 发布:科比2003年总决赛数据 编辑:程序博客网 时间:2024/06/03 16:44

废话少说,先上代码

**  Locate a given named PPI.  @param PeiServices        An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.  @param Guid               Pointer to GUID of the PPI.  @param Instance           Instance Number to discover.  @param PpiDescriptor      Pointer to reference the found descriptor. If not NULL,                            returns a pointer to the descriptor (includes flags, etc)  @param Ppi                Pointer to reference the found PPI  @retval EFI_SUCCESS   if the PPI is in the database  @retval EFI_NOT_FOUND if the PPI is not in the database**/EFI_STATUSEFIAPIPeiLocatePpi (  IN CONST EFI_PEI_SERVICES        **PeiServices,  IN CONST EFI_GUID                *Guid,  IN UINTN                         Instance,  IN OUT EFI_PEI_PPI_DESCRIPTOR    **PpiDescriptor,  IN OUT VOID                      **Ppi  ){  PEI_CORE_INSTANCE   *PrivateData;  INTN                Index;  EFI_GUID            *CheckGuid;  EFI_PEI_PPI_DESCRIPTOR  *TempPtr;  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);  //  // Search the data base for the matching instance of the GUIDed PPI.  //  for (Index = 0; Index < PrivateData->PpiData.PpiListEnd; Index++) {    TempPtr = PrivateData->PpiData.PpiListPtrs[Index].Ppi;    CheckGuid = TempPtr->Guid;    //    // Don't use CompareGuid function here for performance reasons.    // Instead we compare the GUID as INT32 at a time and branch    // on the first failed comparison.    //    if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&        (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&        (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&        (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3])) {      if (Instance == 0) {        if (PpiDescriptor != NULL) {          *PpiDescriptor = TempPtr;        }        if (Ppi != NULL) {          *Ppi = TempPtr->Ppi;        }        return EFI_SUCCESS;      }      Instance--;    }  }  return EFI_NOT_FOUND;}


这个函数主要是通过GUID 去找到一个interface.

typedefEFI_STATUS(EFIAPI *EFI_PEI_LOCATE_PPI) (  IN CONST EFI_PEI_SERVICES**PeiServices,  IN CONST EFI_GUID *Guid,  IN UINTNInstance,  IN OUT EFI_PEI_PPI_DESCRIPTOR   **PpiDescriptor  OPTIONAL,  IN OUT VOID   **Ppi);参数列表:PeiServices一个指向EFI_PEI_SERVICES的二级指针。Guid指向GUID 的指针,该GUID 对应于我们要找的interface.PpiDescriptor指向EFI_PEI_PPI_DESCRIPTOR的实例。Ppi指向一个interface的实例,个人理解,指向函数实现。



PEIM  M就是module 的意思,每个模块都有他的功能,打个比方,张三和李四都是一个PEIM, 张三会搬砖, 李四会编程。

现在我做为一个peim,要完成某个事情,需要找个会搬砖的,那么最好的办法就是把张三请过来。那怎么请呢?

原来张三在人才中心登记的时候,留下了他的身份证号码(GUID). 那么通过 身份证号码就能很方便的把张三找到,然后要他帮忙

把砖搬了(不给钱的哟).



2 0
原创粉丝点击