5.2.8 CalculateCrc32()
Use this service to maintain the checksums in the UEFI System Table, UEFI boot services table, and UEFI runtime services table. A UEFI driver that modifies one of these tables should use this service to update the checksums. A UEFI driver could compute the 32-bit CRC on its own, but the UEFI driver is smaller if it takes advantage of this UEFI boot service. This service can also be used to compute the checksums in Guided Partition Table(GPT) structures.
The following code fragment shows how
CalculateCrc32()
can be used to calculate and update the 32-bit CRC field in the UEFI System Table header. The EDK II library UefiBootServicesTableLib
provides global variables for the UEFI System Table, the UEFI Boot Services Table, and the Image Handle for the currently executing driver. In this example, the global variable for the UEFI System Table called gST
and the global variable for the UEFI Boot Services Table called gBS
are used to reference the UEFI System Table header and call the UEFI Boot Services CalculateCrc32()
. Since the CRC32 field is part of the structure for which the 32-bit CRC is being computed, it must be set to zero before calling CalculateCrc32()
.#include <Uefi.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS Status;
gST->Hdr.CRC32 = 0;
Status = gBS->CalculateCrc32 (
&gST->Hdr,
gST->Hdr.HeaderSize,
&gST->Hdr.CRC32
);
if (EFI_ERROR (Status)) {
return Status;
}
The code fragment below shows how to calculate a 32-bit CRC for an
EXAMPLE_DEVICE
structure. Since the computed 32-bit CRC is not stored within the EXAMPLE_DEVICE
structure, it does not need to be zeroed before calling the CalculateCrc32()
service.#include <Uefi.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS Status;
EXAMPLE_DEVICE Device;
UINT32 Crc;
Status = gBS->CalculateCrc32 (&Device, sizeof (Device), &Crc);
if (EFI_ERROR (Status)) {
return Status;
}
The
CalculateCrc32()
service can also be used to verify a 32-bit CRC value. The code fragment below shows how the 32-bit CRC for the UEFI System Table header can be verified. This algorithm preserves the original contents of the UEFI System Table header. It returns TRUE
if the 32-bit CRC is good. Otherwise, it returns FALSE
.#include <Uefi.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS Status;
UINT32 OriginalCrc32;
UINT32 Crc32;
OriginalCrc32 = gST->Hdr.CRC32;
gST->Hdr.CRC32 = 0;
Status = gBS->CalculateCrc32 (
&gST->Hdr,
gST->Hdr.HeaderSize,
&Crc32
);
gST->Hdr.CRC32 = OriginalCrc32;
if (EFI_ERROR (Status)) {
return FALSE;
}
return (Crc32 == OriginalCrc32);
Last modified 2yr ago