diff options
author | Konstantin Aladyshev <aladyshev22@gmail.com> | 2021-06-28 16:42:14 +0300 |
---|---|---|
committer | Konstantin Aladyshev <aladyshev22@gmail.com> | 2021-06-28 16:49:08 +0300 |
commit | 52f83512d1ea8e43d7590f7e761302db13932a76 (patch) | |
tree | 927d38fe8eb534a429501d97ae9e571fb4b61b8e /Lesson_20/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c | |
parent | 5669003262cd685d3efc240426d263aa8fbb38bd (diff) | |
download | UEFI-Lessons-52f83512d1ea8e43d7590f7e761302db13932a76.tar.gz UEFI-Lessons-52f83512d1ea8e43d7590f7e761302db13932a76.tar.bz2 UEFI-Lessons-52f83512d1ea8e43d7590f7e761302db13932a76.zip |
Add lesson 20
Diffstat (limited to 'Lesson_20/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c')
-rw-r--r-- | Lesson_20/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Lesson_20/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c b/Lesson_20/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c new file mode 100644 index 0000000..7f6b58c --- /dev/null +++ b/Lesson_20/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c @@ -0,0 +1,93 @@ +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> + +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> + +#include <Library/DevicePathLib.h> +#include <Library/PrintLib.h> + + +EFI_STATUS +GetNvramVariable( CHAR16 *VariableName, + EFI_GUID *VariableOwnerGuid, + VOID **Buffer, + UINTN *BufferSize) +{ + UINTN Size = 0; + *BufferSize = 0; + + EFI_STATUS Status = gRT->GetVariable(VariableName, VariableOwnerGuid, NULL, &Size, NULL); + if (Status != EFI_BUFFER_TOO_SMALL) { + Print(L"Error! 'gRT->GetVariable' call returned %r\n", Status); + return Status; + } + + *Buffer = AllocateZeroPool(Size); + if (!Buffer) { + Print(L"Error! 'AllocateZeroPool' call returned %r\n", Status); + return EFI_OUT_OF_RESOURCES; + } + + Status = gRT->GetVariable(VariableName, VariableOwnerGuid, NULL, &Size, *Buffer); + if (Status == EFI_SUCCESS) { + *BufferSize = Size; + } else { + FreePool( *Buffer ); + *Buffer = NULL; + } + + return Status; +} + + +VOID PrintBootOption(CHAR16* BootOptionName) +{ + UINTN OptionSize; + UINT8* Buffer; + + EFI_STATUS Status = GetNvramVariable(BootOptionName, &gEfiGlobalVariableGuid, (VOID**)&Buffer, &OptionSize); + if (Status == EFI_SUCCESS) { + EFI_LOAD_OPTION* LoadOption = (EFI_LOAD_OPTION*) Buffer; + CHAR16* Description = (CHAR16*)(Buffer + sizeof (EFI_LOAD_OPTION)); + UINTN DescriptionSize = StrSize(Description); + + Print(L"%s\n", Description); + if (LoadOption->FilePathListLength != 0) { + VOID* FilePathList = (UINT8 *)Description + DescriptionSize; + CHAR16* DevPathString = ConvertDevicePathToText(FilePathList, TRUE, FALSE); + Print(L"%s\n", DevPathString); + } + } else { + Print(L"Can't get %s variable\n", BootOptionName); + } +} + + +INTN EFIAPI ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) +{ + UINTN OptionSize; + EFI_STATUS Status; + + UINT16* BootCurrent; + Status = GetNvramVariable(L"BootCurrent", &gEfiGlobalVariableGuid, (VOID**)&BootCurrent, &OptionSize); + if (Status != EFI_SUCCESS) { + Print(L"Can't get BootCurrent variable\n"); + } + + UINT16* BootOrderArray; + Status = GetNvramVariable(L"BootOrder", &gEfiGlobalVariableGuid, (VOID**)&BootOrderArray, &OptionSize); + if (Status == EFI_SUCCESS) { + for (UINTN i=0; i<(OptionSize/sizeof(UINT16)); i++) { + CHAR16 BootOptionStr[sizeof("Boot####")+1]; + UnicodeSPrint(BootOptionStr, (sizeof("Boot####")+1)*sizeof(CHAR16), L"Boot%04x", BootOrderArray[i]); + Print(L"%s%s\n", BootOptionStr, (BootOrderArray[i] == *BootCurrent)? L"*" : L"" ); + PrintBootOption(BootOptionStr); + Print(L"\n"); + } + } else { + Print(L"Can't get BootOrder variable\n"); + } + + return EFI_SUCCESS; +} |