14UINTN NumberOfDescriptors = 1;
15UINTN CapsuleFirstIndex;
16UINTN CapsuleLastIndex;
30 CHAR16 *OutputCapsuleName;
34 UINT8 *FullCapsuleBuffer;
35 UINTN FullCapsuleBufferSize;
45 Status =
gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid,
NULL, (VOID **)&Gop);
46 if (EFI_ERROR (Status)) {
47 Print (L
"CapsuleApp: NO GOP is found.\n");
48 return EFI_UNSUPPORTED;
59 Print (L
"CapsuleApp: Incorrect parameter count.\n");
60 return EFI_UNSUPPORTED;
63 if (
StrCmp (Argv[3], L
"-O") != 0) {
64 Print (L
"CapsuleApp: NO output capsule name.\n");
65 return EFI_UNSUPPORTED;
68 OutputCapsuleName = Argv[4];
72 FullCapsuleBuffer =
NULL;
76 if (EFI_ERROR (Status)) {
77 Print (L
"CapsuleApp: BMP image (%s) is not found.\n", BmpName);
90 if (EFI_ERROR (Status)) {
91 Print (L
"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
99 Print (L
"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
102 Status = EFI_INVALID_PARAMETER;
103 Print (L
"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
108 Status = EFI_INVALID_PARAMETER;
109 Print (L
"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
114 FullCapsuleBuffer =
AllocatePool (FullCapsuleBufferSize);
115 if (FullCapsuleBuffer ==
NULL) {
116 Print (L
"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
117 Status = EFI_OUT_OF_RESOURCES;
123 DisplayCapsule->CapsuleHeader.
HeaderSize =
sizeof (DisplayCapsule->CapsuleHeader);
124 DisplayCapsule->CapsuleHeader.
Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
125 DisplayCapsule->CapsuleHeader.
CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
127 DisplayCapsule->ImagePayload.Version = 1;
128 DisplayCapsule->ImagePayload.Checksum = 0;
129 DisplayCapsule->ImagePayload.ImageType = 0;
130 DisplayCapsule->ImagePayload.Reserved = 0;
131 DisplayCapsule->ImagePayload.Mode = Gop->
Mode->
Mode;
142 DisplayCapsule->ImagePayload.OffsetY =
149 L
"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
151 DisplayCapsule->ImagePayload.OffsetX,
152 DisplayCapsule->ImagePayload.OffsetY
155 CopyMem ((DisplayCapsule + 1), BmpBuffer, FileSize);
157 DisplayCapsule->ImagePayload.Checksum =
CalculateCheckSum8 (FullCapsuleBuffer, FullCapsuleBufferSize);
159 Status =
WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
160 Print (L
"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
163 if (BmpBuffer !=
NULL) {
167 if (FullCapsuleBuffer !=
NULL) {
187 UINT64 *ItemOffsetList;
191 ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);
221 if (!EFI_ERROR (Status)) {
222 ASSERT (Esrt !=
NULL);
223 EsrtEntry = (VOID *)(Esrt + 1);
249 IN UINT64 CapsuleSize
256 if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {
260 if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {
284 if (
CompareGuid (&gEfiFmpCapsuleGuid, CapsuleGuid)) {
304 CHAR16 *OutputCapsuleName;
308 UINT8 *FullCapsuleBuffer;
309 UINTN FullCapsuleBufferSize;
316 Print (L
"CapsuleApp: Incorrect parameter count.\n");
317 return EFI_UNSUPPORTED;
320 if (
StrCmp (Argv[3], L
"-O") != 0) {
321 Print (L
"CapsuleApp: NO output capsule name.\n");
322 return EFI_UNSUPPORTED;
325 OutputCapsuleName = Argv[4];
327 CapsuleBuffer =
NULL;
329 FullCapsuleBuffer =
NULL;
331 CapsuleName = Argv[2];
333 if (EFI_ERROR (Status)) {
334 Print (L
"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);
339 Print (L
"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
340 Status = EFI_INVALID_PARAMETER;
345 Print (L
"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);
346 Status = EFI_INVALID_PARAMETER;
351 if (ImageTypeId ==
NULL) {
352 Print (L
"CapsuleApp: Capsule ImageTypeId is not found.\n");
353 Status = EFI_INVALID_PARAMETER;
358 if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) {
359 Print (L
"CapsuleApp: Capsule FwType is invalid.\n");
360 Status = EFI_INVALID_PARAMETER;
364 FullCapsuleBufferSize = NESTED_CAPSULE_HEADER_SIZE + FileSize;
365 FullCapsuleBuffer =
AllocatePool (FullCapsuleBufferSize);
366 if (FullCapsuleBuffer ==
NULL) {
367 Print (L
"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
368 Status = EFI_OUT_OF_RESOURCES;
373 ZeroMem (NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);
375 NestedCapsuleHeader->
HeaderSize = NESTED_CAPSULE_HEADER_SIZE;
376 NestedCapsuleHeader->
Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;
379 CopyMem ((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->
HeaderSize, CapsuleBuffer, FileSize);
381 Status =
WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
382 Print (L
"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
385 if (CapsuleBuffer !=
NULL) {
389 if (FullCapsuleBuffer !=
NULL) {
408 CHAR16 CapsuleVarName[20];
412 StrCpyS (CapsuleVarName,
sizeof (CapsuleVarName)/
sizeof (CapsuleVarName[0]), L
"Capsule");
413 TempVarName = CapsuleVarName +
StrLen (CapsuleVarName);
418 UnicodeSPrint (TempVarName, 5 *
sizeof (CHAR16), L
"%04x", Index);
420 Status =
gRT->SetVariable (
422 &gEfiCapsuleReportGuid,
427 if (Status == EFI_NOT_FOUND) {
436 Print (L
"Clear %s %r\n", CapsuleVarName, Status);
439 if (Index > 0xFFFF) {
445 Print (L
"No any Capsule#### variable found\n");
463 IN VOID **CapsuleBuffer,
483 BlockDescriptors1 =
NULL;
484 BlockDescriptors2 =
NULL;
485 BlockDescriptorPre =
NULL;
486 BlockDescriptorsHeader =
NULL;
488 for (Index = 0; Index < CapsuleNum; Index++) {
492 if (NumberOfDescriptors == 1) {
495 Count = (INT32)(NumberOfDescriptors + 2) / 2;
500 if (BlockDescriptors1 ==
NULL) {
501 Print (L
"CapsuleApp: failed to allocate memory for descriptors\n");
502 Status = EFI_OUT_OF_RESOURCES;
505 Print (L
"CapsuleApp: creating capsule descriptors at 0x%X\n", (
UINTN)BlockDescriptors1);
506 Print (L
"CapsuleApp: capsule data starts at 0x%X with size 0x%X\n", (
UINTN)CapsuleBuffer[Index], FileSize[Index]);
513 BlockDescriptorsHeader = BlockDescriptors1;
516 if (BlockDescriptorPre !=
NULL) {
518 BlockDescriptorPre->
Length = 0;
524 TempBlockPtr = BlockDescriptors1;
525 TempDataPtr = CapsuleBuffer[Index];
526 SizeLeft = FileSize[Index];
527 for (Number = 0; (Number < Count - 1) && (SizeLeft != 0); Number++) {
531 if (NumberOfDescriptors != 1) {
542 TempBlockPtr->
Length = Size;
543 Print (L
"CapsuleApp: capsule block/size 0x%X/0x%X\n", (
UINTN)TempDataPtr, Size);
555 if ((NumberOfDescriptors != 1) && (SizeLeft != 0)) {
556 Count = (INT32)(NumberOfDescriptors + 2) - Count;
563 if (BlockDescriptors2 ==
NULL) {
564 Print (L
"CapsuleApp: failed to allocate memory for descriptors\n");
565 Status = EFI_OUT_OF_RESOURCES;
575 TempBlockPtr = BlockDescriptors2;
576 for (Number = 0; Number < Count - 1; Number++) {
580 if (Number == (Count - 2)) {
594 TempBlockPtr->
Length = Size;
595 Print (L
"CapsuleApp: capsule block/size 0x%X/0x%X\n", (
UINTN)TempDataPtr, Size);
605 BlockDescriptorPre = TempBlockPtr;
606 BlockDescriptors1 =
NULL;
612 if (TempBlockPtr !=
NULL) {
615 *BlockDescriptors = BlockDescriptorsHeader;
621 if (BlockDescriptors1 !=
NULL) {
625 if (BlockDescriptors2 !=
NULL) {
649 if (BlockDescriptors !=
NULL) {
650 TempBlockPtr1 = BlockDescriptors;
652 TempBlockPtr = TempBlockPtr1;
653 for (Index = 0; Index < CapsuleNum; Index++) {
654 if (TempBlockPtr[Index].Length == 0) {
665 TempBlockPtr1 = TempBlockPtr2;
678 Print (L
"CapsuleApp: usage\n");
679 Print (L
" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n");
680 Print (L
" CapsuleApp -S\n");
681 Print (L
" CapsuleApp -C\n");
682 Print (L
" CapsuleApp -P\n");
683 Print (L
" CapsuleApp -E\n");
684 Print (L
" CapsuleApp -L\n");
685 Print (L
" CapsuleApp -L INFO\n");
686 Print (L
" CapsuleApp -F\n");
687 Print (L
" CapsuleApp -G <BMP> -O <Capsule>\n");
688 Print (L
" CapsuleApp -N <Capsule> -O <NestedCapsule>\n");
689 Print (L
" CapsuleApp -D <Capsule>\n");
690 Print (L
" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");
691 Print (L
"Parameter:\n");
692 Print (L
" -NR: No reset will be triggered for the capsule\n");
693 Print (L
" with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET.\n");
694 Print (L
" -OD: Delivery of Capsules via file on Mass Storage device.\n");
695 Print (L
" -S: Dump capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");
696 Print (L
" which is defined in UEFI specification.\n");
697 Print (L
" -C: Clear capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");
698 Print (L
" which is defined in UEFI specification.\n");
699 Print (L
" -P: Dump UEFI FMP protocol info, or get image with specified\n");
700 Print (L
" ImageTypeId and Index (decimal format) to a file if 'GET'\n");
701 Print (L
" option is used.\n");
702 Print (L
" -E: Dump UEFI ESRT table info.\n");
703 Print (L
" -L: Dump provisioned capsule image information.\n");
704 Print (L
" -F: Dump all EFI System Partition.\n");
705 Print (L
" -G: Convert a BMP file to be an UX capsule,\n");
706 Print (L
" according to Windows Firmware Update document\n");
707 Print (L
" -N: Append a Capsule Header to an existing FMP capsule image\n");
708 Print (L
" with its ImageTypeId supported by the system,\n");
709 Print (L
" according to Windows Firmware Update document\n");
710 Print (L
" -O: Output new Capsule file name\n");
711 Print (L
" -D: Dump Capsule image header information, image payload\n");
712 Print (L
" information if it is an UX capsule and FMP header\n");
713 Print (L
" information if it is a FMP capsule.\n");
735 RETURN_STATUS RStatus;
736 UINTN CapsuleBufferSize[MAX_CAPSULE_NUM];
737 VOID *CapsuleBuffer[MAX_CAPSULE_NUM];
740 UINT64 MaxCapsuleSize;
744 BOOLEAN CapsuleOnDisk;
746 CHAR16 *CapsuleNames[MAX_CAPSULE_NUM];
755 BlockDescriptors =
NULL;
760 if (EFI_ERROR (Status)) {
761 Print (L
"Please use UEFI SHELL to run this application!\n", Status);
767 return EFI_UNSUPPORTED;
770 if (
StrCmp (Argv[1], L
"-D") == 0) {
772 Print (L
"CapsuleApp: Incorrect parameter count.\n");
773 return EFI_UNSUPPORTED;
780 if (
StrCmp (Argv[1], L
"-G") == 0) {
785 if (
StrCmp (Argv[1], L
"-N") == 0) {
790 if (
StrCmp (Argv[1], L
"-S") == 0) {
795 if (
StrCmp (Argv[1], L
"-C") == 0) {
800 if (
StrCmp (Argv[1], L
"-P") == 0) {
806 if (
StrCmp (Argv[2], L
"GET") != 0) {
807 Print (L
"CapsuleApp: Unrecognized option(%s).\n", Argv[2]);
808 return EFI_UNSUPPORTED;
811 Print (L
"CapsuleApp: Incorrect parameter count.\n");
812 return EFI_UNSUPPORTED;
818 RStatus =
StrToGuid (Argv[3], &ImageTypeId);
819 if (
RETURN_ERROR (RStatus) || (Argv[3][GUID_STRING_LENGTH] != L
'\0')) {
820 Print (L
"Invalid ImageTypeId - %s\n", Argv[3]);
821 return EFI_INVALID_PARAMETER;
825 if (
StrCmp (Argv[5], L
"-O") != 0) {
826 Print (L
"CapsuleApp: NO output file name.\n");
827 return EFI_UNSUPPORTED;
837 if (
StrCmp (Argv[1], L
"-E") == 0) {
842 if (
StrCmp (Argv[1], L
"-L") == 0) {
843 if ((Argc >= 3) && (
StrCmp (Argv[2], L
"INFO") == 0)) {
852 if (
StrCmp (Argv[1], L
"-F") == 0) {
857 if (Argv[1][0] == L
'-') {
858 Print (L
"CapsuleApp: Unrecognized option(%s).\n", Argv[1]);
859 return EFI_UNSUPPORTED;
862 CapsuleFirstIndex = 1;
864 CapsuleOnDisk =
FALSE;
868 for (Index = 1; Index < Argc; Index++) {
869 if (
StrCmp (Argv[Index], L
"-OD") == 0) {
871 CapsuleOnDisk =
TRUE;
872 }
else if (
StrCmp (Argv[Index], L
"-NR") == 0) {
878 if (ParaOdIndex > ParaNrIndex) {
879 if (ParaNrIndex != 0) {
880 CapsuleLastIndex = ParaNrIndex - 1;
882 CapsuleLastIndex = ParaOdIndex - 1;
885 if (ParaOdIndex == Argc -1) {
887 }
else if (ParaOdIndex == Argc - 2) {
888 MapFsStr = Argv[Argc-1];
890 Print (L
"CapsuleApp: Cannot specify more than one FS mapping!\n");
891 Status = EFI_INVALID_PARAMETER;
894 }
else if (ParaOdIndex < ParaNrIndex) {
895 if (ParaOdIndex != 0) {
896 CapsuleLastIndex = ParaOdIndex - 1;
897 if (ParaOdIndex == ParaNrIndex - 1) {
899 }
else if (ParaOdIndex == ParaNrIndex - 2) {
900 MapFsStr = Argv[ParaOdIndex + 1];
902 Print (L
"CapsuleApp: Cannot specify more than one FS mapping!\n");
903 Status = EFI_INVALID_PARAMETER;
907 CapsuleLastIndex = ParaNrIndex - 1;
910 CapsuleLastIndex = Argc - 1;
913 CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1;
915 if (CapsuleFirstIndex > CapsuleLastIndex) {
916 Print (L
"CapsuleApp: NO capsule image.\n");
917 return EFI_UNSUPPORTED;
920 if (CapsuleNum > MAX_CAPSULE_NUM) {
921 Print (L
"CapsuleApp: Too many capsule images.\n");
922 return EFI_UNSUPPORTED;
925 ZeroMem (&CapsuleBuffer,
sizeof (CapsuleBuffer));
926 ZeroMem (&CapsuleBufferSize,
sizeof (CapsuleBufferSize));
927 BlockDescriptors =
NULL;
929 for (Index = 0; Index < CapsuleNum; Index++) {
930 CapsuleName = Argv[CapsuleFirstIndex + Index];
931 Status =
ReadFileToBuffer (CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]);
932 if (EFI_ERROR (Status)) {
933 Print (L
"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);
938 Print (L
"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
939 return EFI_INVALID_PARAMETER;
942 CapsuleNames[Index] = CapsuleName;
948 Status =
BuildGatherList (CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors);
949 if (EFI_ERROR (Status)) {
957 for (Index = 0; Index < CapsuleNum; Index++) {
959 if ((CapsuleHeaderArray[Index]->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {
964 CapsuleHeaderArray[CapsuleNum] =
NULL;
969 Status =
gRT->QueryCapsuleCapabilities (CapsuleHeaderArray, CapsuleNum, &MaxCapsuleSize, &ResetType);
970 if (EFI_ERROR (Status)) {
971 Print (L
"CapsuleApp: failed to query capsule capability - %r\n", Status);
975 for (Index = 0; Index < CapsuleNum; Index++) {
976 if (CapsuleBufferSize[Index] > MaxCapsuleSize) {
977 Print (L
"CapsuleApp: capsule is too large to update, %ld is allowed\n", MaxCapsuleSize);
978 Status = EFI_UNSUPPORTED;
987 Status =
ProcessCapsuleOnDisk (CapsuleBuffer, CapsuleBufferSize, CapsuleNames, MapFsStr, CapsuleNum);
989 Print (L
"CapsuleApp: failed to update capsule - %r\n", Status);
1004 Status =
gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (
UINTN)BlockDescriptors);
1006 Print (L
"CapsuleApp: failed to update capsule - %r\n", Status);
1029 Status =
gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (
UINTN)BlockDescriptors);
1031 Print (L
"CapsuleApp: failed to update capsule - %r\n", Status);
1038 for (Index = 0; Index < CapsuleNum; Index++) {
1039 if (CapsuleBuffer[Index] !=
NULL) {
EFI_STATUS ReadFileToBuffer(IN CHAR16 *FileName, OUT UINTN *BufferSize, OUT VOID **Buffer)
EFI_STATUS WriteFileFromBuffer(IN CHAR16 *FileName, IN UINTN BufferSize, IN VOID *Buffer)
RETURN_STATUS EFIAPI StrCpyS(OUT CHAR16 *Destination, IN UINTN DestMax, IN CONST CHAR16 *Source)
UINTN EFIAPI StrDecimalToUintn(IN CONST CHAR16 *String)
INTN EFIAPI StrCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString)
UINT8 EFIAPI CalculateCheckSum8(IN CONST UINT8 *Buffer, IN UINTN Length)
RETURN_STATUS EFIAPI StrToGuid(IN CONST CHAR16 *String, OUT GUID *Guid)
UINTN EFIAPI StrLen(IN CONST CHAR16 *String)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
RETURN_STATUS EFIAPI TranslateBmpToGopBlt(IN VOID *BmpImage, IN UINTN BmpImageSize, IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL **GopBlt, IN OUT UINTN *GopBltSize, OUT UINTN *PixelHeight, OUT UINTN *PixelWidth)
BOOLEAN IsFmpCapsuleGuid(IN EFI_GUID *CapsuleGuid)
EFI_GUID * GetCapsuleImageTypeId(IN EFI_CAPSULE_HEADER *CapsuleHeader)
VOID CleanGatherList(IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors, IN UINTN CapsuleNum)
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS CreateNestedFmp(VOID)
EFI_STATUS BuildGatherList(IN VOID **CapsuleBuffer, IN UINTN *FileSize, IN UINTN CapsuleNum, OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors)
BOOLEAN IsValidCapsuleHeader(IN EFI_CAPSULE_HEADER *CapsuleHeader, IN UINT64 CapsuleSize)
EFI_STATUS ClearCapsuleStatusVariable(VOID)
UINT32 GetEsrtFwType(IN EFI_GUID *ImageTypeId)
EFI_STATUS CreateBmpFmp(VOID)
VOID DumpProvisionedCapsule(IN BOOLEAN DumpCapsuleInfo)
VOID DumpAllEfiSysPartition(VOID)
EFI_STATUS DumpCapsuleStatusVariable(VOID)
EFI_STATUS DumpCapsule(IN CHAR16 *CapsuleName)
VOID DumpFmpImage(IN EFI_GUID *ImageTypeId, IN UINTN ImageIndex, IN CHAR16 *ImageName)
EFI_STATUS ProcessCapsuleOnDisk(IN VOID **CapsuleBuffer, IN UINTN *CapsuleBufferSize, IN CHAR16 **FilePath, IN CHAR16 *Map, IN UINTN CapsuleNum)
VOID EFIAPI FreePool(IN VOID *Buffer)
VOID *EFIAPI AllocateRuntimeZeroPool(IN UINTN AllocationSize)
UINTN EFIAPI UnicodeSPrint(OUT CHAR16 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR16 *FormatString,...)
EFI_RUNTIME_SERVICES * gRT
#define RETURN_ERROR(StatusCode)
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
#define ESRT_FW_TYPE_UNKNOWN
EFI_STATUS EFIAPI EfiGetSystemConfigurationTable(IN EFI_GUID *TableGuid, OUT VOID **Table)
UINTN EFIAPI Print(IN CONST CHAR16 *Format,...)
#define EFI_VARIABLE_NON_VOLATILE
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE * Mode
EFI_PHYSICAL_ADDRESS DataBlock
EFI_PHYSICAL_ADDRESS ContinuationPointer
UINT16 EmbeddedDriverCount
EFI_GUID UpdateImageTypeId
UINT32 VerticalResolution
UINT32 HorizontalResolution
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION * Info