Protocol是服务器和客户端的一种约定,他们按照这种约定互通信息。 UEFI使用C语言实现的但是Protocol使用了面向对象的思想。用struct模拟class,用函数指针模拟成员函数,此种函数第一个参数必须是指向Protocol的指针模拟this。

每个Protocol必须有一个GUID,可以根据GUID来寻找Protocol。成员函数的第一个参数是指向所属Protocol的this指针,这也是成员函数区别于一般函数的重要特征。

EFI_HANDLE是指向某种对象的指针,UEFI扫描总线后会为每个设备建立一个controller对象,用于控制设备,所有该设备的驱动以Protocol的形式安装到这个controller之中,这个controller就是EFI_HANDLE。

每个EFI_HANDLE都有一个Protocols链表用来存放Protocol,所有HANDLE通过AllHandles连接起来。Protocols是一个双向链表链表中存放PROTOCOL_INTERFACE,通过PROTOCOL_INTERFACE的Protocol指针可以找到对应的GUID。

使用OpenProtocol HandleProtocol LocateHandle三种服务用于找出指定的 Protocol。

Open用于打开指定句柄上的Protocol,Handle是简化版的Open,Locate用于找出指定Protocol在系统中的第一个实例,一般要使用服务需要得到设备的句柄而找句柄并不是很容易,而不在意Protocol在哪个设备上时可使用Locate服务。

使用Protocol:

1.使用gBS->O、H、L(其中一个)找出Protocol对象

2.使用其提供的服务

3.通过gBS->CloseProtocol关闭。

LocateHandleBuffer和LocateHandle服务提供找到支持某个Protocol设备的服务。函数有三种SearchType:1.AllHandles用于找到系统中的所有Handle;2.ByRegisterNotify用于在RegisterNotify中找出匹配SearchKey的Handle;3.ByProtocol用于从系统Handle数据库中找到支持指定Protocol的Handle。