2 Dump Capsule image information.
4 Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "CapsuleApp.h"
12 Validate if it is valid capsule header
14 This function assumes the caller provided correct CapsuleHeader pointer
17 This function validates the fields in EFI_CAPSULE_HEADER.
19 @param[in] CapsuleHeader Points to a capsule header.
20 @param[in] CapsuleSize Size of the whole capsule image.
24 IsValidCapsuleHeader (
25 IN EFI_CAPSULE_HEADER
*CapsuleHeader
,
30 Dump UX capsule information.
32 @param[in] CapsuleHeader The UX capsule header
36 IN EFI_CAPSULE_HEADER
*CapsuleHeader
39 EFI_DISPLAY_CAPSULE
*DisplayCapsule
;
40 DisplayCapsule
= (EFI_DISPLAY_CAPSULE
*)CapsuleHeader
;
41 Print(L
"[UxCapsule]\n");
42 Print(L
"CapsuleHeader:\n");
43 Print(L
" CapsuleGuid - %g\n", &DisplayCapsule
->CapsuleHeader
.CapsuleGuid
);
44 Print(L
" HeaderSize - 0x%x\n", DisplayCapsule
->CapsuleHeader
.HeaderSize
);
45 Print(L
" Flags - 0x%x\n", DisplayCapsule
->CapsuleHeader
.Flags
);
46 Print(L
" CapsuleImageSize - 0x%x\n", DisplayCapsule
->CapsuleHeader
.CapsuleImageSize
);
47 Print(L
"ImagePayload:\n");
48 Print(L
" Version - 0x%x\n", DisplayCapsule
->ImagePayload
.Version
);
49 Print(L
" Checksum - 0x%x\n", DisplayCapsule
->ImagePayload
.Checksum
);
50 Print(L
" ImageType - 0x%x\n", DisplayCapsule
->ImagePayload
.ImageType
);
51 Print(L
" Mode - 0x%x\n", DisplayCapsule
->ImagePayload
.Mode
);
52 Print(L
" OffsetX - 0x%x\n", DisplayCapsule
->ImagePayload
.OffsetX
);
53 Print(L
" OffsetY - 0x%x\n", DisplayCapsule
->ImagePayload
.OffsetY
);
58 Dump a non-nested FMP capsule.
60 @param[in] CapsuleHeader A pointer to CapsuleHeader
64 IN EFI_CAPSULE_HEADER
*CapsuleHeader
67 EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
*FmpCapsuleHeader
;
68 UINT64
*ItemOffsetList
;
71 EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
*FmpImageHeader
;
73 Print(L
"[FmpCapsule]\n");
74 Print(L
"CapsuleHeader:\n");
75 Print(L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
76 Print(L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
77 Print(L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
78 Print(L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
80 FmpCapsuleHeader
= (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
*)((UINT8
*)CapsuleHeader
+ CapsuleHeader
->HeaderSize
);
81 ItemOffsetList
= (UINT64
*)(FmpCapsuleHeader
+ 1);
82 Print(L
"FmpHeader:\n");
83 Print(L
" Version - 0x%x\n", FmpCapsuleHeader
->Version
);
84 Print(L
" EmbeddedDriverCount - 0x%x\n", FmpCapsuleHeader
->EmbeddedDriverCount
);
85 Print(L
" PayloadItemCount - 0x%x\n", FmpCapsuleHeader
->PayloadItemCount
);
86 Count
= FmpCapsuleHeader
->EmbeddedDriverCount
+ FmpCapsuleHeader
->PayloadItemCount
;
87 for (Index
= 0; Index
< Count
; Index
++) {
88 Print(L
" Offset[%d] - 0x%x\n", Index
, ItemOffsetList
[Index
]);
91 for (Index
= FmpCapsuleHeader
->EmbeddedDriverCount
; Index
< Count
; Index
++) {
92 Print(L
"FmpPayload[%d] ImageHeader:\n", Index
);
93 FmpImageHeader
= (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
*)((UINT8
*)FmpCapsuleHeader
+ ItemOffsetList
[Index
]);
94 Print(L
" Version - 0x%x\n", FmpImageHeader
->Version
);
95 Print(L
" UpdateImageTypeId - %g\n", &FmpImageHeader
->UpdateImageTypeId
);
96 Print(L
" UpdateImageIndex - 0x%x\n", FmpImageHeader
->UpdateImageIndex
);
97 Print(L
" UpdateImageSize - 0x%x\n", FmpImageHeader
->UpdateImageSize
);
98 Print(L
" UpdateVendorCodeSize - 0x%x\n", FmpImageHeader
->UpdateVendorCodeSize
);
99 if (FmpImageHeader
->Version
>= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION
) {
100 Print(L
" UpdateHardwareInstance - 0x%lx\n", FmpImageHeader
->UpdateHardwareInstance
);
106 Return if there is a FMP header below capsule header.
108 @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER
110 @retval TRUE There is a FMP header below capsule header.
111 @retval FALSE There is not a FMP header below capsule header
115 IN EFI_CAPSULE_HEADER
*CapsuleHeader
119 EFI_SYSTEM_RESOURCE_TABLE
*Esrt
;
120 EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
;
122 BOOLEAN EsrtGuidFound
;
123 EFI_CAPSULE_HEADER
*NestedCapsuleHeader
;
124 UINTN NestedCapsuleSize
;
129 EsrtGuidFound
= FALSE
;
130 Status
= EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid
, (VOID
**)&Esrt
);
131 if (!EFI_ERROR(Status
)) {
132 ASSERT (Esrt
!= NULL
);
133 EsrtEntry
= (VOID
*)(Esrt
+ 1);
134 for (Index
= 0; Index
< Esrt
->FwResourceCount
; Index
++, EsrtEntry
++) {
135 if (CompareGuid(&EsrtEntry
->FwClass
, &CapsuleHeader
->CapsuleGuid
)) {
136 EsrtGuidFound
= TRUE
;
142 if (!EsrtGuidFound
) {
147 // Check nested capsule header
148 // FMP GUID after ESRT one
150 NestedCapsuleHeader
= (EFI_CAPSULE_HEADER
*)((UINT8
*)CapsuleHeader
+ CapsuleHeader
->HeaderSize
);
151 NestedCapsuleSize
= (UINTN
)CapsuleHeader
+ CapsuleHeader
->CapsuleImageSize
- (UINTN
)NestedCapsuleHeader
;
152 if (NestedCapsuleSize
< sizeof(EFI_CAPSULE_HEADER
)) {
155 if (!CompareGuid(&NestedCapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
162 Dump capsule information
164 @param[in] CapsuleName The name of the capsule image.
166 @retval EFI_SUCCESS The capsule information is dumped.
167 @retval EFI_UNSUPPORTED Input parameter is not valid.
171 IN CHAR16
*CapsuleName
176 EFI_CAPSULE_HEADER
*CapsuleHeader
;
180 Status
= ReadFileToBuffer(CapsuleName
, &FileSize
, &Buffer
);
181 if (EFI_ERROR(Status
)) {
182 Print(L
"CapsuleApp: Capsule (%s) is not found.\n", CapsuleName
);
185 if (!IsValidCapsuleHeader (Buffer
, FileSize
)) {
186 Print(L
"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName
);
187 Status
= EFI_INVALID_PARAMETER
;
191 CapsuleHeader
= Buffer
;
192 if (CompareGuid(&CapsuleHeader
->CapsuleGuid
, &gWindowsUxCapsuleGuid
)) {
193 DumpUxCapsule(CapsuleHeader
);
194 Status
= EFI_SUCCESS
;
198 if (CompareGuid(&CapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
199 DumpFmpCapsule(CapsuleHeader
);
201 if (IsNestedFmpCapsule(CapsuleHeader
)) {
202 Print(L
"[NestedCapsule]\n");
203 Print(L
"CapsuleHeader:\n");
204 Print(L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
205 Print(L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
206 Print(L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
207 Print(L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
208 DumpFmpCapsule((EFI_CAPSULE_HEADER
*)((UINTN
)CapsuleHeader
+ CapsuleHeader
->HeaderSize
));
212 if (Buffer
!= NULL
) {
219 Dump capsule status variable.
221 @retval EFI_SUCCESS The capsule status variable is dumped.
222 @retval EFI_UNSUPPORTED Input parameter is not valid.
225 DumpCapsuleStatusVariable (
231 CHAR16 CapsuleVarName
[20];
233 EFI_CAPSULE_RESULT_VARIABLE_HEADER
*CapsuleResult
;
234 EFI_CAPSULE_RESULT_VARIABLE_FMP
*CapsuleResultFmp
;
235 UINTN CapsuleFileNameSize
;
236 CHAR16 CapsuleIndexData
[12];
237 CHAR16
*CapsuleIndex
;
238 CHAR16
*CapsuleFileName
;
239 CHAR16
*CapsuleTarget
;
241 Status
= GetVariable2(
243 &gEfiCapsuleReportGuid
,
244 (VOID
**)&CapsuleIndex
,
247 if (!EFI_ERROR(Status
)) {
248 ASSERT (CapsuleIndex
!= NULL
);
249 CopyMem(CapsuleIndexData
, CapsuleIndex
, 11 * sizeof(CHAR16
));
250 CapsuleIndexData
[11] = 0;
251 Print(L
"CapsuleMax - %s\n", CapsuleIndexData
);
252 FreePool(CapsuleIndex
);
254 Status
= GetVariable2(
256 &gEfiCapsuleReportGuid
,
257 (VOID
**)&CapsuleIndex
,
260 if (!EFI_ERROR(Status
)) {
261 ASSERT (CapsuleIndex
!= NULL
);
262 CopyMem(CapsuleIndexData
, CapsuleIndex
, 11 * sizeof(CHAR16
));
263 CapsuleIndexData
[11] = 0;
264 Print(L
"CapsuleLast - %s\n", CapsuleIndexData
);
265 FreePool(CapsuleIndex
);
269 StrCpyS (CapsuleVarName
, sizeof(CapsuleVarName
)/sizeof(CapsuleVarName
[0]), L
"Capsule");
270 TempVarName
= CapsuleVarName
+ StrLen (CapsuleVarName
);
274 UnicodeSPrint (TempVarName
, 5 * sizeof(CHAR16
), L
"%04x", Index
);
276 Status
= GetVariable2 (
278 &gEfiCapsuleReportGuid
,
279 (VOID
**) &CapsuleResult
,
282 if (Status
== EFI_NOT_FOUND
) {
284 } else if (EFI_ERROR(Status
)) {
287 ASSERT (CapsuleResult
!= NULL
);
290 // display capsule process status
292 if (CapsuleResult
->VariableTotalSize
>= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER
)) {
293 Print (L
"CapsuleName: %s\n", CapsuleVarName
);
294 Print (L
" Capsule Guid: %g\n", &CapsuleResult
->CapsuleGuid
);
295 Print (L
" Capsule ProcessedTime: %t\n", &CapsuleResult
->CapsuleProcessed
);
296 Print (L
" Capsule Status: %r\n", CapsuleResult
->CapsuleStatus
);
299 if (CompareGuid(&CapsuleResult
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
300 if (CapsuleResult
->VariableTotalSize
>= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER
) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP
) + sizeof(CHAR16
) * 2) {
301 CapsuleResultFmp
= (EFI_CAPSULE_RESULT_VARIABLE_FMP
*)(CapsuleResult
+ 1);
302 Print(L
" Capsule FMP Version: 0x%x\n", CapsuleResultFmp
->Version
);
303 Print(L
" Capsule FMP PayloadIndex: 0x%x\n", CapsuleResultFmp
->PayloadIndex
);
304 Print(L
" Capsule FMP UpdateImageIndex: 0x%x\n", CapsuleResultFmp
->UpdateImageIndex
);
305 Print(L
" Capsule FMP UpdateImageTypeId: %g\n", &CapsuleResultFmp
->UpdateImageTypeId
);
306 CapsuleFileName
= (CHAR16
*)(CapsuleResultFmp
+ 1);
307 Print(L
" Capsule FMP CapsuleFileName: \"%s\"\n", CapsuleFileName
);
308 CapsuleFileNameSize
= StrSize(CapsuleFileName
);
309 CapsuleTarget
= (CHAR16
*)((UINTN
)CapsuleFileName
+ CapsuleFileNameSize
);
310 Print(L
" Capsule FMP CapsuleTarget: \"%s\"\n", CapsuleTarget
);
314 FreePool(CapsuleResult
);
317 if (Index
> 0xFFFF) {
325 CHAR8
*mFwTypeString
[] = {
332 CHAR8
*mLastAttemptStatusString
[] = {
334 "Error: Unsuccessful",
335 "Error: Insufficient Resources",
336 "Error: Incorrect Version",
337 "Error: Invalid Format",
339 "Error: Power Event AC",
340 "Error: Power Event Battery",
341 "Error: Unsatisfied Dependencies",
345 Convert FwType to a string.
347 @param[in] FwType FwType in ESRT
349 @return a string for FwType.
356 if (FwType
< sizeof(mFwTypeString
) / sizeof(mFwTypeString
[0])) {
357 return mFwTypeString
[FwType
];
364 Convert LastAttemptStatus to a string.
366 @param[in] LastAttemptStatus LastAttemptStatus in FMP or ESRT
368 @return a string for LastAttemptStatus.
371 LastAttemptStatusToString (
372 IN UINT32 LastAttemptStatus
375 if (LastAttemptStatus
< sizeof(mLastAttemptStatusString
) / sizeof(mLastAttemptStatusString
[0])) {
376 return mLastAttemptStatusString
[LastAttemptStatus
];
378 return "Error: Unknown";
385 @param[in] EsrtEntry ESRT entry
389 IN EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
392 Print(L
" FwClass - %g\n", &EsrtEntry
->FwClass
);
393 Print(L
" FwType - 0x%x (%a)\n", EsrtEntry
->FwType
, FwTypeToString(EsrtEntry
->FwType
));
394 Print(L
" FwVersion - 0x%x\n", EsrtEntry
->FwVersion
);
395 Print(L
" LowestSupportedFwVersion - 0x%x\n", EsrtEntry
->LowestSupportedFwVersion
);
396 Print(L
" CapsuleFlags - 0x%x\n", EsrtEntry
->CapsuleFlags
);
397 Print(L
" LastAttemptVersion - 0x%x\n", EsrtEntry
->LastAttemptVersion
);
398 Print(L
" LastAttemptStatus - 0x%x (%a)\n", EsrtEntry
->LastAttemptStatus
, LastAttemptStatusToString(EsrtEntry
->LastAttemptStatus
));
404 @param[in] Esrt ESRT table
408 IN EFI_SYSTEM_RESOURCE_TABLE
*Esrt
412 EFI_SYSTEM_RESOURCE_ENTRY
*EsrtEntry
;
418 Print(L
"EFI_SYSTEM_RESOURCE_TABLE:\n");
419 Print(L
"FwResourceCount - 0x%x\n", Esrt
->FwResourceCount
);
420 Print(L
"FwResourceCountMax - 0x%x\n", Esrt
->FwResourceCountMax
);
421 Print(L
"FwResourceVersion - 0x%lx\n", Esrt
->FwResourceVersion
);
423 EsrtEntry
= (VOID
*)(Esrt
+ 1);
424 for (Index
= 0; Index
< Esrt
->FwResourceCount
; Index
++) {
425 Print(L
"EFI_SYSTEM_RESOURCE_ENTRY (%d):\n", Index
);
426 DumpEsrtEntry(EsrtEntry
);
440 EFI_SYSTEM_RESOURCE_TABLE
*Esrt
;
442 Print(L
"##############\n");
443 Print(L
"# ESRT TABLE #\n");
444 Print(L
"##############\n");
446 Status
= EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid
, (VOID
**)&Esrt
);
447 if (EFI_ERROR(Status
)) {
448 Print(L
"ESRT - %r\n", Status
);
457 Dump capsule information from CapsuleHeader
459 @param[in] CapsuleHeader The CapsuleHeader of the capsule image.
461 @retval EFI_SUCCESS The capsule information is dumped.
465 DumpCapsuleFromBuffer (
466 IN EFI_CAPSULE_HEADER
*CapsuleHeader
469 if (CompareGuid (&CapsuleHeader
->CapsuleGuid
, &gWindowsUxCapsuleGuid
)) {
470 DumpUxCapsule (CapsuleHeader
);
474 if (CompareGuid (&CapsuleHeader
->CapsuleGuid
, &gEfiFmpCapsuleGuid
)) {
475 DumpFmpCapsule (CapsuleHeader
);
477 if (IsNestedFmpCapsule (CapsuleHeader
)) {
478 Print (L
"[NestedCapusule]\n");
479 Print (L
"CapsuleHeader:\n");
480 Print (L
" CapsuleGuid - %g\n", &CapsuleHeader
->CapsuleGuid
);
481 Print (L
" HeaderSize - 0x%x\n", CapsuleHeader
->HeaderSize
);
482 Print (L
" Flags - 0x%x\n", CapsuleHeader
->Flags
);
483 Print (L
" CapsuleImageSize - 0x%x\n", CapsuleHeader
->CapsuleImageSize
);
484 DumpFmpCapsule ((EFI_CAPSULE_HEADER
*)((UINTN
)CapsuleHeader
+ CapsuleHeader
->HeaderSize
));
491 This routine is called to upper case given unicode string.
493 @param[in] Str String to upper case
495 @retval upper cased string after process
506 for (Cptr
= Str
; *Cptr
!= L
'\0'; Cptr
++) {
507 if (L
'a' <= *Cptr
&& *Cptr
<= L
'z') {
508 *Cptr
= *Cptr
- L
'a' + L
'A';
516 This routine is used to return substring before period '.' or '\0'
517 Caller should respsonsible of substr space allocation & free
519 @param[in] Str String to check
520 @param[out] SubStr First part of string before period or '\0'
521 @param[out] SubStrLen Length of first part of string
526 GetSubStringBeforePeriod (
533 for (Index
= 0; Str
[Index
] != L
'.' && Str
[Index
] != L
'\0'; Index
++) {
534 SubStr
[Index
] = Str
[Index
];
537 SubStr
[Index
] = L
'\0';
542 This routine pad the string in tail with input character.
544 @param[in] StrBuf Str buffer to be padded, should be enough room for
545 @param[in] PadLen Expected padding length
546 @param[in] Character Character used to pad
559 for (Index
= 0; StrBuf
[Index
] != L
'\0'; Index
++);
562 StrBuf
[Index
] = Character
;
567 StrBuf
[Index
] = L
'\0';
571 This routine find the offset of the last period '.' of string. if No period exists
572 function FileNameExtension is set to L'\0'
574 @param[in] FileName File name to split between last period
575 @param[out] FileNameFirst First FileName before last period
576 @param[out] FileNameExtension FileName after last period
581 SplitFileNameExtension (
583 OUT CHAR16
*FileNameFirst
,
584 OUT CHAR16
*FileNameExtension
590 StringLen
= StrLen(FileName
);
591 for (Index
= StringLen
; Index
> 0 && FileName
[Index
] != L
'.'; Index
--);
594 // No period exists. No FileName Extension
596 if (Index
== 0 && FileName
[Index
] != L
'.') {
597 FileNameExtension
[0] = L
'\0';
600 StrCpyS (FileNameExtension
, MAX_FILE_NAME_LEN
, &FileName
[Index
+1]);
604 // Copy First file name
606 StrnCpyS (FileNameFirst
, MAX_FILE_NAME_LEN
, FileName
, Index
);
607 FileNameFirst
[Index
] = L
'\0';
611 The function is called by PerformQuickSort to sort file name in alphabet.
613 @param[in] Left The pointer to first buffer.
614 @param[in] Right The pointer to second buffer.
616 @retval 0 Buffer1 equal to Buffer2.
617 @return <0 Buffer1 is less than Buffer2.
618 @return >0 Buffer1 is greater than Buffer2.
622 CompareFileNameInAlphabet (
627 EFI_FILE_INFO
*FileInfo1
;
628 EFI_FILE_INFO
*FileInfo2
;
629 CHAR16 FileName1
[MAX_FILE_NAME_SIZE
];
630 CHAR16 FileExtension1
[MAX_FILE_NAME_SIZE
];
631 CHAR16 FileName2
[MAX_FILE_NAME_SIZE
];
632 CHAR16 FileExtension2
[MAX_FILE_NAME_SIZE
];
633 CHAR16 TempSubStr1
[MAX_FILE_NAME_SIZE
];
634 CHAR16 TempSubStr2
[MAX_FILE_NAME_SIZE
];
637 INTN SubStrCmpResult
;
639 FileInfo1
= (EFI_FILE_INFO
*) (*(UINTN
*)Left
);
640 FileInfo2
= (EFI_FILE_INFO
*) (*(UINTN
*)Right
);
642 SplitFileNameExtension (FileInfo1
->FileName
, FileName1
, FileExtension1
);
643 SplitFileNameExtension (FileInfo2
->FileName
, FileName2
, FileExtension2
);
645 UpperCaseString (FileName1
);
646 UpperCaseString (FileName2
);
648 GetSubStringBeforePeriod (FileName1
, TempSubStr1
, &SubStrLen1
);
649 GetSubStringBeforePeriod (FileName2
, TempSubStr2
, &SubStrLen2
);
651 if (SubStrLen1
> SubStrLen2
) {
653 // Substr in NewFileName is longer. Pad tail with SPACE
655 PadStrInTail (TempSubStr2
, SubStrLen1
- SubStrLen2
, L
' ');
656 } else if (SubStrLen1
< SubStrLen2
){
658 // Substr in ListedFileName is longer. Pad tail with SPACE
660 PadStrInTail (TempSubStr1
, SubStrLen2
- SubStrLen1
, L
' ');
663 SubStrCmpResult
= StrnCmp (TempSubStr1
, TempSubStr2
, MAX_FILE_NAME_LEN
);
664 if (SubStrCmpResult
!= 0) {
665 return SubStrCmpResult
;
668 UpperCaseString (FileExtension1
);
669 UpperCaseString (FileExtension2
);
671 return StrnCmp (FileExtension1
, FileExtension2
, MAX_FILE_NAME_LEN
);
675 Dump capsule information from disk.
677 @param[in] Fs The device path of disk.
678 @param[in] DumpCapsuleInfo The flag to indicate whether to dump the capsule inforomation.
680 @retval EFI_SUCCESS The capsule information is dumped.
684 DumpCapsuleFromDisk (
685 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*Fs
,
686 IN BOOLEAN DumpCapsuleInfo
692 EFI_FILE
*FileHandle
;
696 EFI_FILE_INFO
**FileInfoBuffer
;
697 EFI_FILE_INFO
*FileInfo
;
704 FileInfoBuffer
= NULL
;
709 Status
= Fs
->OpenVolume (Fs
, &Root
);
710 if (EFI_ERROR (Status
)) {
711 Print (L
"Cannot open volume. Status = %r\n", Status
);
715 Status
= Root
->Open (Root
, &DirHandle
, EFI_CAPSULE_FILE_DIRECTORY
, EFI_FILE_MODE_READ
| EFI_FILE_MODE_WRITE
, 0);
716 if (EFI_ERROR (Status
)) {
717 Print (L
"Cannot open %s. Status = %r\n", EFI_CAPSULE_FILE_DIRECTORY
, Status
);
722 // Get file count first
724 Status
= FileHandleFindFirstFile (DirHandle
, &FileInfo
);
726 if (EFI_ERROR (Status
) || FileInfo
== NULL
) {
727 Print (L
"Get File Info Fail. Status = %r\n", Status
);
731 if ((FileInfo
->Attribute
& (EFI_FILE_SYSTEM
| EFI_FILE_ARCHIVE
)) != 0) {
735 Status
= FileHandleFindNextFile (DirHandle
, FileInfo
, &NoFile
);
736 if (EFI_ERROR (Status
)) {
737 Print (L
"Get Next File Fail. Status = %r\n", Status
);
742 if (FileCount
== 0) {
743 Print (L
"Error: No capsule file found!\n");
744 Status
= EFI_NOT_FOUND
;
748 FileInfoBuffer
= AllocateZeroPool (sizeof (FileInfo
) * FileCount
);
749 if (FileInfoBuffer
== NULL
) {
750 Status
= EFI_OUT_OF_RESOURCES
;
758 Status
= FileHandleFindFirstFile (DirHandle
, &FileInfo
);
760 if (EFI_ERROR (Status
) || FileInfo
== NULL
) {
761 Print (L
"Get File Info Fail. Status = %r\n", Status
);
765 if ((FileInfo
->Attribute
& (EFI_FILE_SYSTEM
| EFI_FILE_ARCHIVE
)) != 0) {
766 FileInfoBuffer
[Index
++] = AllocateCopyPool ((UINTN
)FileInfo
->Size
, FileInfo
);
769 Status
= FileHandleFindNextFile (DirHandle
, FileInfo
, &NoFile
);
770 if (EFI_ERROR (Status
)) {
771 Print (L
"Get Next File Fail. Status = %r\n", Status
);
777 // Sort FileInfoBuffer by alphabet order
783 (SORT_COMPARE
) CompareFileNameInAlphabet
786 Print (L
"The capsules will be performed by following order:\n");
788 for (Index
= 0; Index
< FileCount
; Index
++) {
789 Print (L
" %d.%s\n", Index
+ 1, FileInfoBuffer
[Index
]->FileName
);
792 if (!DumpCapsuleInfo
) {
793 Status
= EFI_SUCCESS
;
797 Print(L
"The infomation of the capsules:\n");
799 for (Index
= 0; Index
< FileCount
; Index
++) {
801 Status
= DirHandle
->Open (DirHandle
, &FileHandle
, FileInfoBuffer
[Index
]->FileName
, EFI_FILE_MODE_READ
, 0);
802 if (EFI_ERROR (Status
)) {
806 Status
= FileHandleGetSize (FileHandle
, (UINT64
*) &FileSize
);
807 if (EFI_ERROR (Status
)) {
808 Print (L
"Cannot read file %s. Status = %r\n", FileInfoBuffer
[Index
]->FileName
, Status
);
809 FileHandleClose (FileHandle
);
813 FileBuffer
= AllocatePool (FileSize
);
814 if (FileBuffer
== NULL
) {
815 Status
= EFI_OUT_OF_RESOURCES
;
819 Status
= FileHandleRead (FileHandle
, &FileSize
, FileBuffer
);
820 if (EFI_ERROR (Status
)) {
821 Print (L
"Cannot read file %s. Status = %r\n", FileInfoBuffer
[Index
]->FileName
, Status
);
822 FileHandleClose (FileHandle
);
823 FreePool (FileBuffer
);
827 Print (L
"**************************\n");
828 Print (L
" %d.%s:\n", Index
+ 1, FileInfoBuffer
[Index
]->FileName
);
829 Print (L
"**************************\n");
830 DumpCapsuleFromBuffer ((EFI_CAPSULE_HEADER
*) FileBuffer
);
831 FileHandleClose (FileHandle
);
832 FreePool (FileBuffer
);
836 if (FileInfoBuffer
!= NULL
) {
837 for (Index
= 0; Index
< FileCount
; Index
++) {
838 if (FileInfoBuffer
[Index
] != NULL
) {
839 FreePool (FileInfoBuffer
[Index
]);
842 FreePool (FileInfoBuffer
);
849 Dump capsule inforomation form Gather list.
851 @param[in] BlockDescriptors The block descriptors for the capsule images
852 @param[in] DumpCapsuleInfo The flag to indicate whether to dump the capsule inforomation.
856 DumpBlockDescriptors (
857 IN EFI_CAPSULE_BLOCK_DESCRIPTOR
*BlockDescriptors
,
858 IN BOOLEAN DumpCapsuleInfo
861 EFI_CAPSULE_BLOCK_DESCRIPTOR
*TempBlockPtr
;
863 TempBlockPtr
= BlockDescriptors
;
866 if (TempBlockPtr
->Length
!= 0) {
867 if (DumpCapsuleInfo
) {
868 Print(L
"******************************************************\n");
870 Print(L
"Capsule data starts at 0x%08x with size 0x%08x\n", TempBlockPtr
->Union
.DataBlock
, TempBlockPtr
->Length
);
871 if (DumpCapsuleInfo
) {
872 Print(L
"******************************************************\n");
873 DumpCapsuleFromBuffer ((EFI_CAPSULE_HEADER
*) (UINTN
) TempBlockPtr
->Union
.DataBlock
);
877 if (TempBlockPtr
->Union
.ContinuationPointer
== (UINTN
)NULL
) {
880 TempBlockPtr
= (EFI_CAPSULE_BLOCK_DESCRIPTOR
*) (UINTN
) TempBlockPtr
->Union
.ContinuationPointer
;
887 Dump Provisioned Capsule.
889 @param[in] DumpCapsuleInfo The flag to indicate whether to dump the capsule inforomation.
893 DumpProvisionedCapsule (
894 IN BOOLEAN DumpCapsuleInfo
898 CHAR16 CapsuleVarName
[30];
901 EFI_PHYSICAL_ADDRESS
*CapsuleDataPtr64
;
903 CHAR16 BootOptionName
[20];
904 EFI_BOOT_MANAGER_LOAD_OPTION BootNextOptionEntry
;
905 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
906 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*Fs
;
907 EFI_SHELL_PROTOCOL
*ShellProtocol
;
910 CapsuleDataPtr64
= NULL
;
913 ShellProtocol
= GetShellProtocol ();
914 if (ShellProtocol
== NULL
) {
915 Print (L
"Get Shell Protocol Fail\n");
920 // Dump capsule provisioned on Memory
922 Print (L
"#########################\n");
923 Print (L
"### Capsule on Memory ###\n");
924 Print (L
"#########################\n");
925 StrCpyS (CapsuleVarName
, sizeof(CapsuleVarName
)/sizeof(CHAR16
), EFI_CAPSULE_VARIABLE_NAME
);
926 TempVarName
= CapsuleVarName
+ StrLen (CapsuleVarName
);
929 UnicodeValueToStringS (
931 sizeof (CapsuleVarName
) - ((UINTN
)TempVarName
- (UINTN
)CapsuleVarName
),
938 Status
= GetVariable2 (
940 &gEfiCapsuleVendorGuid
,
941 (VOID
**) &CapsuleDataPtr64
,
944 if (EFI_ERROR (Status
) || CapsuleDataPtr64
== NULL
) {
946 Print (L
"No data.\n");
952 Print (L
"Capsule Description at 0x%08x\n", *CapsuleDataPtr64
);
953 DumpBlockDescriptors ((EFI_CAPSULE_BLOCK_DESCRIPTOR
*) (UINTN
) *CapsuleDataPtr64
, DumpCapsuleInfo
);
957 // Dump capsule provisioned on Disk
959 Print (L
"#########################\n");
960 Print (L
"### Capsule on Disk #####\n");
961 Print (L
"#########################\n");
962 Status
= GetVariable2 (
964 &gEfiGlobalVariableGuid
,
968 if (EFI_ERROR (Status
) || BootNext
== NULL
) {
969 Print (L
"Get BootNext Variable Fail. Status = %r\n", Status
);
971 UnicodeSPrint (BootOptionName
, sizeof (BootOptionName
), L
"Boot%04x", *BootNext
);
972 Status
= EfiBootManagerVariableToLoadOption (BootOptionName
, &BootNextOptionEntry
);
973 if (!EFI_ERROR (Status
)) {
975 // Display description and device path
977 GetEfiSysPartitionFromBootOptionFilePath (BootNextOptionEntry
.FilePath
, &DevicePath
, &Fs
);
978 if(!EFI_ERROR (Status
)) {
979 Print (L
"Capsules are provisioned on BootOption: %s\n", BootNextOptionEntry
.Description
);
980 Print (L
" %s %s\n", ShellProtocol
->GetMapFromDevicePath (&DevicePath
), ConvertDevicePathToText(DevicePath
, TRUE
, TRUE
));
981 DumpCapsuleFromDisk (Fs
, DumpCapsuleInfo
);
988 Dump FMP information.
990 @param[in] ImageInfoSize The size of ImageInfo, in bytes.
991 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.
992 @param[in] DescriptorVersion The version of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
993 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
994 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.
995 @param[in] PackageVersion The version of package.
996 @param[in] PackageVersionName The version name of package.
1000 IN UINTN ImageInfoSize
,
1001 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
,
1002 IN UINT32 DescriptorVersion
,
1003 IN UINT8 DescriptorCount
,
1004 IN UINTN DescriptorSize
,
1005 IN UINT32 PackageVersion
,
1006 IN CHAR16
*PackageVersionName
1009 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*CurrentImageInfo
;
1013 Print(L
" DescriptorVersion - 0x%x\n", DescriptorVersion
);
1014 Print(L
" DescriptorCount - 0x%x\n", DescriptorCount
);
1015 Print(L
" DescriptorSize - 0x%x\n", DescriptorSize
);
1016 Print(L
" PackageVersion - 0x%x\n", PackageVersion
);
1017 Print(L
" PackageVersionName - \"%s\"\n", PackageVersionName
);
1018 CurrentImageInfo
= ImageInfo
;
1019 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
1020 Print(L
" ImageDescriptor (%d)\n", Index
);
1021 Print(L
" ImageIndex - 0x%x\n", CurrentImageInfo
->ImageIndex
);
1022 Print(L
" ImageTypeId - %g\n", &CurrentImageInfo
->ImageTypeId
);
1023 Print(L
" ImageId - 0x%lx\n", CurrentImageInfo
->ImageId
);
1024 Print(L
" ImageIdName - \"%s\"\n", CurrentImageInfo
->ImageIdName
);
1025 Print(L
" Version - 0x%x\n", CurrentImageInfo
->Version
);
1026 Print(L
" VersionName - \"%s\"\n", CurrentImageInfo
->VersionName
);
1027 Print(L
" Size - 0x%x\n", CurrentImageInfo
->Size
);
1028 Print(L
" AttributesSupported - 0x%lx\n", CurrentImageInfo
->AttributesSupported
);
1029 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
1030 Print(L
" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
1031 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
1032 Print(L
" IN_USE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_IN_USE
);
1033 Print(L
" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo
->AttributesSupported
& IMAGE_ATTRIBUTE_UEFI_IMAGE
);
1034 Print(L
" AttributesSetting - 0x%lx\n", CurrentImageInfo
->AttributesSetting
);
1035 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
1036 Print(L
" RESET_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
1037 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
1038 Print(L
" IN_USE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_IN_USE
);
1039 Print(L
" UEFI_IMAGE - 0x%lx\n", CurrentImageInfo
->AttributesSetting
& IMAGE_ATTRIBUTE_UEFI_IMAGE
);
1040 Print(L
" Compatibilities - 0x%lx\n", CurrentImageInfo
->Compatibilities
);
1041 Print(L
" COMPATIB_CHECK_SUPPORTED - 0x%lx\n", CurrentImageInfo
->Compatibilities
& IMAGE_COMPATIBILITY_CHECK_SUPPORTED
);
1042 if (DescriptorVersion
> 1) {
1043 Print(L
" LowestSupportedImageVersion - 0x%x\n", CurrentImageInfo
->LowestSupportedImageVersion
);
1044 if (DescriptorVersion
> 2) {
1045 Print(L
" LastAttemptVersion - 0x%x\n", CurrentImageInfo
->LastAttemptVersion
);
1046 Print(L
" LastAttemptStatus - 0x%x (%a)\n", CurrentImageInfo
->LastAttemptStatus
, LastAttemptStatusToString(CurrentImageInfo
->LastAttemptStatus
));
1047 Print(L
" HardwareInstance - 0x%lx\n", CurrentImageInfo
->HardwareInstance
);
1048 if (DescriptorVersion
> 3) {
1049 Print(L
" Dependencies - ");
1050 if (CurrentImageInfo
->Dependencies
== NULL
) {
1055 Print(L
"%02x ", CurrentImageInfo
->Dependencies
->Dependencies
[Index2
]);
1056 } while (CurrentImageInfo
->Dependencies
->Dependencies
[Index2
++] != EFI_FMP_DEP_END
);
1063 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version
1065 CurrentImageInfo
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR
*)((UINT8
*)CurrentImageInfo
+ DescriptorSize
);
1070 Dump FMP package information.
1072 @param[in] PackageVersion The version of package.
1073 @param[in] PackageVersionName The version name of package.
1074 @param[in] PackageVersionNameMaxLen The maximum length of PackageVersionName.
1075 @param[in] AttributesSupported Package attributes that are supported by this device.
1076 @param[in] AttributesSetting Package attributes.
1079 DumpFmpPackageInfo (
1080 IN UINT32 PackageVersion
,
1081 IN CHAR16
*PackageVersionName
,
1082 IN UINT32 PackageVersionNameMaxLen
,
1083 IN UINT64 AttributesSupported
,
1084 IN UINT64 AttributesSetting
1087 Print(L
" PackageVersion - 0x%x\n", PackageVersion
);
1088 Print(L
" PackageVersionName - \"%s\"\n", PackageVersionName
);
1089 Print(L
" PackageVersionNameMaxLen - 0x%x\n", PackageVersionNameMaxLen
);
1090 Print(L
" AttributesSupported - 0x%lx\n", AttributesSupported
);
1091 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
1092 Print(L
" RESET_REQUIRED - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
1093 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSupported
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
1094 Print(L
" AttributesSetting - 0x%lx\n", AttributesSetting
);
1095 Print(L
" IMAGE_UPDATABLE - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
);
1096 Print(L
" RESET_REQUIRED - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
);
1097 Print(L
" AUTHENTICATION_REQUIRED - 0x%lx\n", AttributesSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
);
1101 Dump FMP protocol info.
1109 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
1110 EFI_HANDLE
*HandleBuffer
;
1111 UINTN NumberOfHandles
;
1113 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*FmpImageInfoBuf
;
1114 UINTN ImageInfoSize
;
1115 UINT32 FmpImageInfoDescriptorVer
;
1116 UINT8 FmpImageInfoCount
;
1117 UINTN DescriptorSize
;
1118 UINT32 PackageVersion
;
1119 CHAR16
*PackageVersionName
;
1120 UINT32 PackageVersionNameMaxLen
;
1121 UINT64 AttributesSupported
;
1122 UINT64 AttributesSetting
;
1124 Print(L
"############\n");
1125 Print(L
"# FMP DATA #\n");
1126 Print(L
"############\n");
1127 Status
= gBS
->LocateHandleBuffer (
1129 &gEfiFirmwareManagementProtocolGuid
,
1134 if (EFI_ERROR(Status
)) {
1135 Print(L
"FMP protocol - %r\n", EFI_NOT_FOUND
);
1139 for (Index
= 0; Index
< NumberOfHandles
; Index
++) {
1140 Status
= gBS
->HandleProtocol(
1141 HandleBuffer
[Index
],
1142 &gEfiFirmwareManagementProtocolGuid
,
1145 if (EFI_ERROR(Status
)) {
1150 Status
= Fmp
->GetImageInfo (
1160 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
1164 FmpImageInfoBuf
= NULL
;
1165 FmpImageInfoBuf
= AllocateZeroPool (ImageInfoSize
);
1166 if (FmpImageInfoBuf
== NULL
) {
1167 Status
= EFI_OUT_OF_RESOURCES
;
1171 PackageVersionName
= NULL
;
1172 Status
= Fmp
->GetImageInfo (
1174 &ImageInfoSize
, // ImageInfoSize
1175 FmpImageInfoBuf
, // ImageInfo
1176 &FmpImageInfoDescriptorVer
, // DescriptorVersion
1177 &FmpImageInfoCount
, // DescriptorCount
1178 &DescriptorSize
, // DescriptorSize
1179 &PackageVersion
, // PackageVersion
1180 &PackageVersionName
// PackageVersionName
1184 // If FMP GetInformation interface failed, skip this resource
1186 if (EFI_ERROR(Status
)) {
1187 Print(L
"FMP (%d) ImageInfo - %r\n", Index
, Status
);
1188 FreePool(FmpImageInfoBuf
);
1192 Print(L
"FMP (%d) ImageInfo:\n", Index
);
1194 ImageInfoSize
, // ImageInfoSize
1195 FmpImageInfoBuf
, // ImageInfo
1196 FmpImageInfoDescriptorVer
, // DescriptorVersion
1197 FmpImageInfoCount
, // DescriptorCount
1198 DescriptorSize
, // DescriptorSize
1199 PackageVersion
, // PackageVersion
1200 PackageVersionName
// PackageVersionName
1203 if (PackageVersionName
!= NULL
) {
1204 FreePool(PackageVersionName
);
1206 FreePool(FmpImageInfoBuf
);
1211 PackageVersionName
= NULL
;
1212 Status
= Fmp
->GetPackageInfo (
1214 &PackageVersion
, // PackageVersion
1215 &PackageVersionName
, // PackageVersionName
1216 &PackageVersionNameMaxLen
, // PackageVersionNameMaxLen
1217 &AttributesSupported
, // AttributesSupported
1218 &AttributesSetting
// AttributesSetting
1220 if (EFI_ERROR(Status
)) {
1221 Print(L
"FMP (%d) PackageInfo - %r\n", Index
, Status
);
1223 Print(L
"FMP (%d) ImageInfo:\n", Index
);
1225 PackageVersion
, // PackageVersion
1226 PackageVersionName
, // PackageVersionName
1227 PackageVersionNameMaxLen
, // PackageVersionNameMaxLen
1228 AttributesSupported
, // AttributesSupported
1229 AttributesSetting
// AttributesSetting
1232 if (PackageVersionName
!= NULL
) {
1233 FreePool(PackageVersionName
);
1240 FreePool(HandleBuffer
);
1244 Check if the ImageInfo includes the ImageTypeId.
1246 @param[in] ImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR.
1247 @param[in] DescriptorCount The count of EFI_FIRMWARE_IMAGE_DESCRIPTOR.
1248 @param[in] DescriptorSize The size of an individual EFI_FIRMWARE_IMAGE_DESCRIPTOR, in bytes.
1249 @param[in] ImageTypeId A unique GUID identifying the firmware image type.
1251 @return TRUE This ImageInfo includes the ImageTypeId
1252 @return FALSE This ImageInfo does not include the ImageTypeId
1255 IsThisFmpImageInfo (
1256 IN EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
,
1257 IN UINT8 DescriptorCount
,
1258 IN UINTN DescriptorSize
,
1259 IN EFI_GUID
*ImageTypeId
1262 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*CurrentImageInfo
;
1265 CurrentImageInfo
= ImageInfo
;
1266 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
1267 if (CompareGuid (&CurrentImageInfo
->ImageTypeId
, ImageTypeId
)) {
1270 CurrentImageInfo
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR
*)((UINT8
*)CurrentImageInfo
+ DescriptorSize
);
1276 return the FMP whoes ImageInfo includes the ImageTypeId.
1278 @param[in] ImageTypeId A unique GUID identifying the firmware image type.
1280 @return The FMP whoes ImageInfo includes the ImageTypeId
1282 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*
1283 FindFmpFromImageTypeId (
1284 IN EFI_GUID
*ImageTypeId
1288 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
1289 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*TargetFmp
;
1290 EFI_HANDLE
*HandleBuffer
;
1291 UINTN NumberOfHandles
;
1293 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*FmpImageInfoBuf
;
1294 UINTN ImageInfoSize
;
1295 UINT32 FmpImageInfoDescriptorVer
;
1296 UINT8 FmpImageInfoCount
;
1297 UINTN DescriptorSize
;
1298 UINT32 PackageVersion
;
1299 CHAR16
*PackageVersionName
;
1301 Status
= gBS
->LocateHandleBuffer (
1303 &gEfiFirmwareManagementProtocolGuid
,
1308 if (EFI_ERROR(Status
)) {
1309 Print(L
"FMP protocol - %r\n", EFI_NOT_FOUND
);
1314 for (Index
= 0; Index
< NumberOfHandles
; Index
++) {
1315 Status
= gBS
->HandleProtocol(
1316 HandleBuffer
[Index
],
1317 &gEfiFirmwareManagementProtocolGuid
,
1320 if (EFI_ERROR(Status
)) {
1325 Status
= Fmp
->GetImageInfo (
1335 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
1339 FmpImageInfoBuf
= NULL
;
1340 FmpImageInfoBuf
= AllocateZeroPool (ImageInfoSize
);
1341 if (FmpImageInfoBuf
== NULL
) {
1342 FreePool(HandleBuffer
);
1343 Print(L
"Out of resource\n");
1347 PackageVersionName
= NULL
;
1348 Status
= Fmp
->GetImageInfo (
1350 &ImageInfoSize
, // ImageInfoSize
1351 FmpImageInfoBuf
, // ImageInfo
1352 &FmpImageInfoDescriptorVer
, // DescriptorVersion
1353 &FmpImageInfoCount
, // DescriptorCount
1354 &DescriptorSize
, // DescriptorSize
1355 &PackageVersion
, // PackageVersion
1356 &PackageVersionName
// PackageVersionName
1360 // If FMP GetInformation interface failed, skip this resource
1362 if (EFI_ERROR(Status
)) {
1363 FreePool(FmpImageInfoBuf
);
1367 if (PackageVersionName
!= NULL
) {
1368 FreePool(PackageVersionName
);
1371 if (IsThisFmpImageInfo (FmpImageInfoBuf
, FmpImageInfoCount
, DescriptorSize
, ImageTypeId
)) {
1374 FreePool(FmpImageInfoBuf
);
1375 if (TargetFmp
!= NULL
) {
1379 FreePool(HandleBuffer
);
1384 Dump FMP image data.
1386 @param[in] ImageTypeId The ImageTypeId of the FMP image.
1387 It is used to identify the FMP protocol.
1388 @param[in] ImageIndex The ImageIndex of the FMP image.
1389 It is the input parameter for FMP->GetImage().
1390 @param[in] ImageName The file name to hold the output FMP image.
1394 IN EFI_GUID
*ImageTypeId
,
1395 IN UINTN ImageIndex
,
1396 IN CHAR16
*ImageName
1400 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*Fmp
;
1404 Fmp
= FindFmpFromImageTypeId (ImageTypeId
);
1406 Print(L
"No FMP include ImageTypeId %g\n", ImageTypeId
);
1410 if (ImageIndex
> 0xFF) {
1411 Print(L
"ImageIndex 0x%x too big\n", ImageIndex
);
1417 Status
= Fmp
->GetImage (Fmp
, (UINT8
)ImageIndex
, Image
, &ImageSize
);
1418 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
1419 Print(L
"Fmp->GetImage - %r\n", Status
);
1423 Image
= AllocatePool (ImageSize
);
1424 if (Image
== NULL
) {
1425 Print(L
"Allocate FmpImage 0x%x - %r\n", ImageSize
, EFI_OUT_OF_RESOURCES
);
1429 Status
= Fmp
->GetImage (Fmp
, (UINT8
)ImageIndex
, Image
, &ImageSize
);
1430 if (EFI_ERROR(Status
)) {
1431 Print(L
"Fmp->GetImage - %r\n", Status
);
1435 Status
= WriteFileFromBuffer(ImageName
, ImageSize
, Image
);
1436 Print(L
"CapsuleApp: Dump %g ImageIndex (0x%x) to %s %r\n", ImageTypeId
, ImageIndex
, ImageName
, Status
);