From 0ba0723c769f95d312835967c47e34e444fea368 Mon Sep 17 00:00:00 2001 From: kavsrf Date: Tue, 13 Jun 2017 17:19:47 +0300 Subject: solution of HP problem via DrverOrder and BML modified driver --- Library/CommonLib/CommonLib.inf | 1 + Library/CommonLib/EfiBml.c | 57 +++++++++++++++++++++++++++++++++++++++++ Library/CommonLib/EfiVar.c | 27 +++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 Library/CommonLib/EfiBml.c (limited to 'Library') diff --git a/Library/CommonLib/CommonLib.inf b/Library/CommonLib/CommonLib.inf index dde5c61..ec658d7 100644 --- a/Library/CommonLib/CommonLib.inf +++ b/Library/CommonLib/CommonLib.inf @@ -39,6 +39,7 @@ EfiBluetooth.c EfiTpm.c GptRead.c + EfiBml.c [Sources.IA32] IA32/EfiCpuHalt.asm diff --git a/Library/CommonLib/EfiBml.c b/Library/CommonLib/EfiBml.c new file mode 100644 index 0000000..184ca75 --- /dev/null +++ b/Library/CommonLib/EfiBml.c @@ -0,0 +1,57 @@ +/** @file +EFI DCS BML helpers routines/wrappers + +Copyright (c) 2016. Disk Cryptography Services for EFI (DCS), Alex Kolotnikov +Copyright (c) 2016. VeraCrypt, Mounir IDRASSI + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the GNU Lesser General Public License, version 3.0 (LGPL-3.0). + +The full text of the license may be found at +https://opensource.org/licenses/LGPL-3.0 +**/ + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// +// BML +////////////////////////////////////////////////////////////////////////// +EFI_HANDLE* gBmlHandles = NULL; +UINTN gBmlCount = 0; +EFI_DCSBML_PROTOCOL* gBml = NULL; +EFI_GUID gBmlGuid = EFI_DCSBML_INTERFACE_PROTOCOL_GUID; + +EFI_STATUS +BmlSelect( + IN UINTN index) { + if (index < gBmlCount) { + return gBS->HandleProtocol(gBmlHandles[index], &gBmlGuid, (VOID**)&gBml); + } + return EFI_NOT_FOUND; +} + +EFI_STATUS +InitBml() { + EFI_STATUS res; + // BML control if supported + res = EfiGetHandles(ByProtocol, &gBmlGuid, 0, &gBmlHandles, &gBmlCount); + if (gBmlCount > 0) { + return BmlSelect(gBmlCount - 1); + } + return EFI_NOT_FOUND; +} + + +EFI_STATUS +BmlLock( + IN BOOLEAN lock + ) +{ + if (gBml != NULL) { + return gBml->BootMenuLock(gBml, lock); + } + return EFI_UNSUPPORTED; +} + diff --git a/Library/CommonLib/EfiVar.c b/Library/CommonLib/EfiVar.c index fad6eb5..e9c1082 100644 --- a/Library/CommonLib/EfiVar.c +++ b/Library/CommonLib/EfiVar.c @@ -145,6 +145,33 @@ BootOrderRemove( return res; } +EFI_STATUS +BootOrderPresent( + IN CHAR16 *OrderVarName, + UINT16 value) +{ + EFI_STATUS res = EFI_NOT_READY; + UINT16* varBootOrder; + UINTN varBootOrderSize; + UINT32 varBootOrderAttr; + UINTN BootOrderCount; + UINTN i; + UINTN j; + + res = EfiGetVar(OrderVarName, &gEfiGlobalVariableGuid, &varBootOrder, &varBootOrderSize, &varBootOrderAttr); + if (EFI_ERROR(res)) return res; + BootOrderCount = varBootOrderSize / sizeof(UINT16); + res = EFI_NOT_FOUND; + for (j = 0, i = 0; i < BootOrderCount; ++i) { + if (varBootOrder[i] == value) { + MEM_FREE(varBootOrder); + res = EFI_SUCCESS; + break; + } + } + return res; +} + EFI_STATUS BootMenuItemRemove( IN CHAR16 *VarName -- cgit v1.2.3