OcBootManagementLib: Add bootloader detection code from AMF

This commit is contained in:
vit9696 2019-06-26 14:53:52 +03:00
parent 4f887c7117
commit 6cb565cf56
2 changed files with 59 additions and 0 deletions

View File

@ -17,6 +17,8 @@
#include <Library/OcAppleBootPolicyLib.h>
#include <Protocol/LoadedImage.h>
/**
Discovered boot entry.
Note, inner resources must be freed with OcResetBootEntry.
@ -509,4 +511,16 @@ OcGetFileSystemPolicyType (
IN EFI_HANDLE Handle
);
/**
Get loaded image protocol for Apple bootloader.
@param[in] Handle Image handle.
@retval loaded image protocol or NULL for non Apple images.
**/
EFI_LOADED_IMAGE_PROTOCOL *
OcGetAppleBootLoadedImage (
IN EFI_HANDLE ImageHandle
);
#endif // OC_BOOT_MANAGEMENT_LIB_H

View File

@ -27,12 +27,15 @@
#include <Protocol/ApfsEfiBootRecordInfo.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/SimpleTextOut.h>
#include <Protocol/LoadedImage.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/DevicePathLib.h>
#include <Library/OcBootManagementLib.h>
#include <Library/OcDevicePathLib.h>
#include <Library/OcFileLib.h>
#include <Library/OcStringLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
@ -179,3 +182,45 @@ InternalCheckScanPolicy (
return RETURN_SUCCESS;
}
EFI_LOADED_IMAGE_PROTOCOL *
OcGetAppleBootLoadedImage (
IN EFI_HANDLE ImageHandle
)
{
EFI_STATUS Status;
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
EFI_DEVICE_PATH_PROTOCOL *CurrNode;
FILEPATH_DEVICE_PATH *LastNode;
BOOLEAN IsMacOS;
UINTN PathLen;
UINTN Index;
IsMacOS = FALSE;
Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&LoadedImage);
if (!EFI_ERROR (Status) && LoadedImage->FilePath) {
LastNode = NULL;
for (CurrNode = LoadedImage->FilePath; !IsDevicePathEnd (CurrNode); CurrNode = NextDevicePathNode (CurrNode)) {
if (DevicePathType (CurrNode) == MEDIA_DEVICE_PATH && DevicePathSubType (CurrNode) == MEDIA_FILEPATH_DP) {
LastNode = (FILEPATH_DEVICE_PATH *) CurrNode;
}
}
if (LastNode != NULL) {
//
// Detect macOS by boot.efi in the bootloader name.
//
PathLen = OcFileDevicePathNameLen (LastNode);
if (PathLen >= L_STR_LEN ("boot.efi")) {
Index = PathLen - L_STR_LEN ("boot.efi");
IsMacOS = (Index == 0 || LastNode->PathName[Index - 1] == L'\\')
&& CompareMem (&LastNode->PathName[Index], L"boot.efi", L_STR_SIZE (L"boot.efi")) == 0;
}
}
}
return IsMacOS ? LoadedImage : NULL;
}