当前位置: 代码迷 >> 综合 >> locate ppi 详解
  详细解决方案

locate ppi 详解

热度:91   发布时间:2023-12-14 22:43:09.0

废话少说,先上代码

**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_STATUS
EFIAPI
PeiLocatePpi (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.

typedef
EFI_STATUS
(EFIAPI *EFI_PEI_LOCATE_PPI) (IN CONST EFI_PEI_SERVICES		**PeiServices,IN CONST EFI_GUID 				*Guid,IN UINTN						Instance,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). 那么通过 身份证号码就能很方便的把张三找到,然后要他帮忙

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



  相关解决方案