7.9 Service Driver entry point

A service driver produces one or more protocol interfaces on the driver's image handle or on newly created handles. The example below, shows the Decompress Protocol being installed onto the driver's image handle. A service driver may produce an Unload() service, and that service would be required to uninstall the protocols that were installed in the driver's entry point.

Caution: The Unload() service for a service driver may be a dangerous operation because there is no way for the service driver to know if the protocols that it installed are being used by other UEFI components. If the service driver is unloaded and other UEFI components are still using the protocols that were produced by the unloaded driver, then the system is likely to fail.

Example 104-Service driver entry point using image handle

#include <Uefi.h>
#include <Protocol/Decompress.h>
#include <Library/UefiBootServicesTableLib.h>
//
// Decompress Protocol instance
//
EFI_DECOMPRESS_PROTOCOL gAbcDecompress = {
AbcGetInfo,
AbcDecompress
};
EFI_STATUS
EFIAPI
AbcDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
//
// Install Decompress Protocol onto UEFI Driver's ImageHandle
//
return gBS->InstallMultipleProtocolInterfaces (
&ImageHandle,
&gEfiDecompressProtocolGuid,
&gAbcDecompress,
NULL
);
}

A service driver may also install its protocol interfaces onto one or more new handles in the Handle Database. The following example shows a template for a service driver called Abc that produces the Decompress Protocol on a new handle.

Example 105-Service driver entry point creating new handle

#include <Uefi.h>
#include <Protocol/Decompress.h>
#include <Library/UefiBootServicesTableLib.h>
//
// Handle for the Decompress Protocol
//
EFI_HANDLE gAbcDecompressHandle = NULL;
//
// Decompress Protocol instance
//
EFI_DECOMPRESS_PROTOCOL gAbcDecompress = {
AbcGetInfo,
AbcDecompress
};
EFI_STATUS
EFIAPI
AbcDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
//
// Install Decompress Protocol onto a new handle
//
return gBS->InstallMultipleProtocolInterfaces (
&gAbcDecompressHandle,
&gEfiDecompressProtocolGuid,
&gAbcDecompress,
NULL
);
}