第一个protocol
服务需要常驻内存,只有驱动可以常驻内存,我们就要用驱动的形式提供服务,将服务可以安装到任何控制器或者handle对象上。使用DXE驱动在image初始化时(即执行模块入口函数时),将protocol安装到自身handle即可。
(源文件包括工程文件放在Github里了,链接自取)(https://download.csdn.net/download/m0_49918601/12857555.)
服务接口设计
- firstprotocol.c
#include <firstprotocol.h>
#pragma warning(disable:4133)
EFI_STATUS EFIAPI
MyFirst_Hello(IN EFI_MYFIRST_PROTOCOL *This)
{
DEBUG((EFI_D_INFO, L"Hello World wy\n"));
return EFI_SUCCESS;
}
EFI_STATUS EFIAPI
MyProtocolEntry(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable )
{
EFI_STATUS Status;
EFI_MYFIRST_PROTOCOL *MyFirstDriver = NULL;
MyFirstDriver->Revision = 1;
MyFirstDriver->MyFirst_HelloWorld = MyFirst_Hello;
//Install an instance of EFI MYPROTOCOL into its own HANDLE
Status = gBS->InstallProtocolInterface(
&ImageHandle,
&gEfiMyFirstProtocolGuid,
EFI_NATIVE_INTERFACE,
MyFirstDriver
);
if (Status == EFI_SUCCESS)
DEBUG((EFI_D_INFO, L"install succeess\n"));
else
DEBUG((EFI_D_INFO, L"nstall failed\n"));
return EFI_SUCCESS;
}
- firstprotocol.h
#include<Uefi.h>
#include<Library/DebugLib.h>
#include<Library/UefiBootServicesTableLib.h>
#include<Library/UefiDriverEntryPoint.h>
#ifndef _EFI_MYFIRSTDRIVER_H_
#define _EFI_MYFIRSTDRIVER_H_
#define EFI_MYFIRST_PROTOCOL_GUID \
{0xcd33ac22, 0x5ee3, 0x487d, { 0x91, 0x4f, 0xff, 0xfe, 0x64, 0xcd, 0xa, 0x3a } }
typedef struct _EFI_MYFIRST_PROTOCOL EFI_MYFIRST_PROTOCOL;
typedef EFI_MYFIRST_PROTOCOL EFI_MYPROTOCOL;
typedef EFI_STATUS(EFIAPI *EFI_MYFIRST_HELLOWORLD)(IN EFI_MYPROTOCOL *This);
struct _EFI_MYFIRST_PROTOCOL {
UINT64 Revision;
EFI_MYFIRST_HELLOWORLD MyFirst_HelloWorld;
};
extern EFI_GUID gEfiMyFirstProtocolGuid;
#endif
服务使用
- locateprotocol.c
#include <firstprotocol.h>
EFI_STATUS EFIAPI
LocateProtocolEntry(IN EFI_HANDLE Image, IN EFI_SYSTEM_TABLE *SystemTable)
{
EFI_STATUS Status;
EFI_MYFIRST_PROTOCOL *MyFirstDriver = NULL;
Status = gBS->LocateProtocol(&gEfiMyFirstProtocolGuid, NULL, (void**)&MyFirstDriver);
if (!EFI_ERROR(Status))
{
Status = MyFirstDriver->MyFirst_HelloWorld(MyFirstDriver);
}
else {
DEBUG((EFI_D_ERROR, "Locate Error\n", Status));
}
return EFI_SUCCESS;
}