diff options
Diffstat (limited to 'Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT')
| -rw-r--r-- | Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.c | 104 | ||||
| -rw-r--r-- | Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.inf | 23 | 
2 files changed, 127 insertions, 0 deletions
| diff --git a/Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.c b/Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.c new file mode 100644 index 0000000..2fda8d8 --- /dev/null +++ b/Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.c @@ -0,0 +1,104 @@ +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> + +#include <Protocol/AcpiSystemDescriptionTable.h> +#include <Library/ShellLib.h> +#include <IndustryStandard/Bmp.h> + +EFI_STATUS WriteFile(CHAR16* FileName, VOID* Data, UINTN* Size) +{ +  SHELL_FILE_HANDLE FileHandle; +  EFI_STATUS Status = ShellOpenFileByName( +    FileName, +    &FileHandle, +    EFI_FILE_MODE_CREATE | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ, +    0 +  ); +  if (!EFI_ERROR(Status)) { +    Print(L"Save it to %s\n", FileName); +    UINTN ToWrite = *Size; +    Status = ShellWriteFile( +      FileHandle, +      Size, +      Data +    ); +    if (EFI_ERROR(Status)) { +      Print(L"Can't write file: %r\n", Status); +    } +    if (*Size != ToWrite) { +      Print(L"Error! Not all data was written\n"); +    } +    Status = ShellCloseFile( +      &FileHandle +    ); +    if (EFI_ERROR(Status)) { +      Print(L"Can't close file: %r\n", Status); +    } +  } else { +    Print(L"Can't open file: %r\n", Status); +  } +  return Status; +} + +EFI_STATUS +EFIAPI +UefiMain ( +  IN EFI_HANDLE        ImageHandle, +  IN EFI_SYSTEM_TABLE  *SystemTable +  ) +{ +  EFI_ACPI_SDT_PROTOCOL* AcpiSdtProtocol; +  EFI_STATUS Status = gBS->LocateProtocol ( +                  &gEfiAcpiSdtProtocolGuid, +                  NULL, +                  (VOID**)&AcpiSdtProtocol +                  ); +  if (EFI_ERROR (Status)) { +    return Status; +  } + +  BOOLEAN BGRT_found = FALSE; +  UINTN Index = 0; +  EFI_ACPI_SDT_HEADER* Table; +  EFI_ACPI_TABLE_VERSION Version; +  UINTN TableKey; +  while (TRUE) { +    Status = AcpiSdtProtocol->GetAcpiTable(Index, +      &Table, +      &Version, +      &TableKey +    ); +    if (EFI_ERROR(Status)) { +      break; +    } +    if (((CHAR8)((Table->Signature >>  0) & 0xFF) == 'B') && +        ((CHAR8)((Table->Signature >>  8) & 0xFF) == 'G') && +        ((CHAR8)((Table->Signature >> 16) & 0xFF) == 'R') && +        ((CHAR8)((Table->Signature >> 24) & 0xFF) == 'T')) { +      BGRT_found = TRUE; +      break; +    } +    Index++; +  } +  if (!BGRT_found) { +    Print(L"BGRT table is not present in the system\n"); +    return EFI_UNSUPPORTED; +  } + +  EFI_ACPI_6_3_BOOT_GRAPHICS_RESOURCE_TABLE* BGRT = (EFI_ACPI_6_3_BOOT_GRAPHICS_RESOURCE_TABLE*)Table; +  if (BGRT->ImageType == 0) { +    BMP_IMAGE_HEADER* BMP = (BMP_IMAGE_HEADER*)(BGRT->ImageAddress); + +    if ((BMP->CharB != 'B') || (BMP->CharM != 'M')) { +      Print(L"BMP image has wrong signature!\n"); +      return EFI_UNSUPPORTED; +    } +    Print(L"BGRT conatins BMP image with %dx%d resolution\n", BMP->PixelWidth, BMP->PixelHeight); +    UINTN Size = BMP->Size; +    Status = WriteFile(L"BGRT.bmp", BMP, &Size); +    if (EFI_ERROR(Status)) { +      Print(L"Error! Can't write BGRT.bmp file\n"); +    } +  } +  return Status; +} diff --git a/Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.inf b/Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.inf new file mode 100644 index 0000000..93ab1b9 --- /dev/null +++ b/Lessons/Lesson_29/UefiLessonsPkg/SaveBGRT/SaveBGRT.inf @@ -0,0 +1,23 @@ +[Defines] +  INF_VERSION                    = 1.25 +  BASE_NAME                      = SaveBGRT +  FILE_GUID                      = efe33e23-b17c-42b2-9551-87546f215935 +  MODULE_TYPE                    = UEFI_APPLICATION +  VERSION_STRING                 = 1.0 +  ENTRY_POINT                    = UefiMain + +[Sources] +  SaveBGRT.c + +[Packages] +  MdePkg/MdePkg.dec +  ShellPkg/ShellPkg.dec + +[LibraryClasses] +  UefiApplicationEntryPoint +  UefiLib +  ShellLib + +[Protocols] +  gEfiAcpiSdtProtocolGuid + | 
