10.2 Service Driver
If the UEFI Driver is a Service Driver, the Service Binding Protocol is
installed in the driver entry point. The following example shows an
implementation of a Service Binding Protocol that is installed into the Handle
Database in the driver entry point. A Service Binding Protocol is always paired with another protocol so, for this example, the paired protocol is the ABC_PROTOCOL
.
Global variables are declared for the handle on which the Service Binding
Protocol is installed, the instance of the Service Binding Protocol, and an
instance of the ABC_PROTOCOL
. The ABC_PROTOCOL
instance is installed onto a
new handle every time the Service Binding Protocol service CreateChild()
is
called. The ABC_PROTOCOL
is uninstalled from a child handle every time the
Service Binding Protocol service DestroyChild()
is called.
Example 125-Service Binding Protocol for Service Driver
#include <Uefi.h>
#include <Protocol/ServiceBinding.h>
#include <Library/UefiBootServicesTableLib.h>
typedef struct {
UINT32 AbcField;
} ABC_PROTOCOL;
EFI_HANDLE gAbcServiceBindingHandle = NULL;
EFI_SERVICE_BINDING_PROTOCOL gAbcServiceBinding = {
AbcCreateChild,
AbcDestroyChild
};
ABC_PROTOCOL gAbc = {
0
};
EFI_STATUS
EFIAPI
AbcCreateChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This,
IN OUT EFI_HANDLE *ChildHandle
)
{
EFI_HANDLE NewHandle;
NewHandle = NULL;
return gBS->InstallMultipleProtocolInterfaces (
&NewHandle,
&gAbcProtocolGuid,
&gAbc,
NULL
);
}
EFI_STATUS
EFIAPI
AbcDestroyChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This,
IN EFI_HANDLE ChildHandle
)
{
return gBS->UninstallMultipleProtocolInterfaces (
ChildHandle,
&gAbcProtocolGuid,
&gAbc,
NULL
);
}
EFI_STATUS
EFIAPI
AbcDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
//
// Install Service Binding Protocol for ABC onto a new handle
//
return gBS->InstallMultipleProtocolInterfaces (
&gAbcServiceBindingHandle,
&gAbcServiceBindingProtocolGuid,
&gAbcServiceBinding,
NULL
);
}