废话少说,先上代码
**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). 那么通过 身份证号码就能很方便的把张三找到,然后要他帮忙
把砖搬了(不给钱的哟).