2 Provides interface to advanced shell functionality for parsing both handle and protocol database.
4 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
6 (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "UefiHandleParsingLib.h"
18 #include "IndustryStandard/Acpi10.h"
20 EFI_HANDLE mHandleParsingHiiHandle
= NULL
;
21 HANDLE_INDEX_LIST mHandleList
= {{{NULL
,NULL
},0,0},0};
22 GUID_INFO_BLOCK
*mGuidList
;
25 Function to translate the EFI_MEMORY_TYPE into a string.
27 @param[in] Memory The memory type.
29 @retval A string representation of the type allocated from BS Pool.
33 IN CONST EFI_MEMORY_TYPE Memory
40 case EfiReservedMemoryType
: StrnCatGrow(&RetVal
, NULL
, L
"EfiReservedMemoryType", 0); break;
41 case EfiLoaderCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiLoaderCode", 0); break;
42 case EfiLoaderData
: StrnCatGrow(&RetVal
, NULL
, L
"EfiLoaderData", 0); break;
43 case EfiBootServicesCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiBootServicesCode", 0); break;
44 case EfiBootServicesData
: StrnCatGrow(&RetVal
, NULL
, L
"EfiBootServicesData", 0); break;
45 case EfiRuntimeServicesCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiRuntimeServicesCode", 0); break;
46 case EfiRuntimeServicesData
: StrnCatGrow(&RetVal
, NULL
, L
"EfiRuntimeServicesData", 0); break;
47 case EfiConventionalMemory
: StrnCatGrow(&RetVal
, NULL
, L
"EfiConventionalMemory", 0); break;
48 case EfiUnusableMemory
: StrnCatGrow(&RetVal
, NULL
, L
"EfiUnusableMemory", 0); break;
49 case EfiACPIReclaimMemory
: StrnCatGrow(&RetVal
, NULL
, L
"EfiACPIReclaimMemory", 0); break;
50 case EfiACPIMemoryNVS
: StrnCatGrow(&RetVal
, NULL
, L
"EfiACPIMemoryNVS", 0); break;
51 case EfiMemoryMappedIO
: StrnCatGrow(&RetVal
, NULL
, L
"EfiMemoryMappedIO", 0); break;
52 case EfiMemoryMappedIOPortSpace
: StrnCatGrow(&RetVal
, NULL
, L
"EfiMemoryMappedIOPortSpace", 0); break;
53 case EfiPalCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiPalCode", 0); break;
54 case EfiMaxMemoryType
: StrnCatGrow(&RetVal
, NULL
, L
"EfiMaxMemoryType", 0); break;
55 default: ASSERT(FALSE
);
61 Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.
63 @param[in] Fmt The format type.
65 @retval A string representation of the type allocated from BS Pool.
69 IN CONST EFI_GRAPHICS_PIXEL_FORMAT Fmt
76 case PixelRedGreenBlueReserved8BitPerColor
: StrnCatGrow(&RetVal
, NULL
, L
"PixelRedGreenBlueReserved8BitPerColor", 0); break;
77 case PixelBlueGreenRedReserved8BitPerColor
: StrnCatGrow(&RetVal
, NULL
, L
"PixelBlueGreenRedReserved8BitPerColor", 0); break;
78 case PixelBitMask
: StrnCatGrow(&RetVal
, NULL
, L
"PixelBitMask", 0); break;
79 case PixelBltOnly
: StrnCatGrow(&RetVal
, NULL
, L
"PixelBltOnly", 0); break;
80 case PixelFormatMax
: StrnCatGrow(&RetVal
, NULL
, L
"PixelFormatMax", 0); break;
81 default: ASSERT(FALSE
);
87 Constructor for the library.
89 @param[in] ImageHandle Ignored.
90 @param[in] SystemTable Ignored.
92 @retval EFI_SUCCESS The operation was successful.
96 HandleParsingLibConstructor (
97 IN EFI_HANDLE ImageHandle
,
98 IN EFI_SYSTEM_TABLE
*SystemTable
105 // Do nothing with mHandleParsingHiiHandle. Initialize HII as needed.
107 return (EFI_SUCCESS
);
111 Initialization function for HII packages.
115 HandleParsingHiiInit (VOID
)
117 if (mHandleParsingHiiHandle
== NULL
) {
118 mHandleParsingHiiHandle
= HiiAddPackages (&gHandleParsingHiiGuid
, gImageHandle
, UefiHandleParsingLibStrings
, NULL
);
119 ASSERT (mHandleParsingHiiHandle
!= NULL
);
124 Destructor for the library. free any resources.
126 @param[in] ImageHandle Ignored.
127 @param[in] SystemTable Ignored.
129 @retval EFI_SUCCESS The operation was successful.
133 HandleParsingLibDestructor (
134 IN EFI_HANDLE ImageHandle
,
135 IN EFI_SYSTEM_TABLE
*SystemTable
140 for (LoopCount
= 0; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++) {
141 SHELL_FREE_NON_NULL(mGuidList
[LoopCount
].GuidId
);
144 SHELL_FREE_NON_NULL(mGuidList
);
145 if (mHandleParsingHiiHandle
!= NULL
) {
146 HiiRemovePackages(mHandleParsingHiiHandle
);
148 return (EFI_SUCCESS
);
152 Function to dump information about LoadedImage.
154 This will allocate the return buffer from boot services pool.
156 @param[in] TheHandle The handle that has LoadedImage installed.
157 @param[in] Verbose TRUE for additional information, FALSE otherwise.
159 @retval A poitner to a string containing the information.
163 LoadedImageProtocolDumpInformation(
164 IN CONST EFI_HANDLE TheHandle
,
165 IN CONST BOOLEAN Verbose
168 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
176 return (CatSPrint(NULL
, L
"LoadedImage"));
179 HandleParsingHiiInit();
181 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_LI_DUMP_MAIN
), NULL
);
186 Status
= gBS
->OpenProtocol (
188 &gEfiLoadedImageProtocolGuid
,
189 (VOID
**)&LoadedImage
,
192 EFI_OPEN_PROTOCOL_GET_PROTOCOL
195 if (EFI_ERROR (Status
)) {
196 SHELL_FREE_NON_NULL (Temp
);
200 DataType
= ConvertMemoryType(LoadedImage
->ImageDataType
);
201 CodeType
= ConvertMemoryType(LoadedImage
->ImageCodeType
);
206 LoadedImage
->Revision
,
207 LoadedImage
->ParentHandle
,
208 LoadedImage
->SystemTable
,
209 LoadedImage
->DeviceHandle
,
210 LoadedImage
->FilePath
,
211 LoadedImage
->LoadOptionsSize
,
212 LoadedImage
->LoadOptions
,
213 LoadedImage
->ImageBase
,
214 LoadedImage
->ImageSize
,
221 SHELL_FREE_NON_NULL(Temp
);
222 SHELL_FREE_NON_NULL(CodeType
);
223 SHELL_FREE_NON_NULL(DataType
);
229 Function to dump information about GOP.
231 This will allocate the return buffer from boot services pool.
233 @param[in] TheHandle The handle that has LoadedImage installed.
234 @param[in] Verbose TRUE for additional information, FALSE otherwise.
236 @retval A poitner to a string containing the information.
240 GraphicsOutputProtocolDumpInformation(
241 IN CONST EFI_HANDLE TheHandle
,
242 IN CONST BOOLEAN Verbose
245 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
253 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*GopInfo
;
256 return (CatSPrint(NULL
, L
"GraphicsOutput"));
259 HandleParsingHiiInit();
261 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_GOP_DUMP_MAIN
), NULL
);
266 Status
= gBS
->OpenProtocol (
268 &gEfiGraphicsOutputProtocolGuid
,
269 (VOID
**)&GraphicsOutput
,
272 EFI_OPEN_PROTOCOL_GET_PROTOCOL
275 if (EFI_ERROR (Status
)) {
276 SHELL_FREE_NON_NULL (Temp
);
280 Fmt
= ConvertPixelFormat(GraphicsOutput
->Mode
->Info
->PixelFormat
);
285 GraphicsOutput
->Mode
->MaxMode
,
286 GraphicsOutput
->Mode
->Mode
,
287 GraphicsOutput
->Mode
->FrameBufferBase
,
288 (UINT64
)GraphicsOutput
->Mode
->FrameBufferSize
,
289 (UINT64
)GraphicsOutput
->Mode
->SizeOfInfo
,
290 GraphicsOutput
->Mode
->Info
->Version
,
291 GraphicsOutput
->Mode
->Info
->HorizontalResolution
,
292 GraphicsOutput
->Mode
->Info
->VerticalResolution
,
294 GraphicsOutput
->Mode
->Info
->PixelsPerScanLine
,
295 GraphicsOutput
->Mode
->Info
->PixelFormat
!=PixelBitMask
?0:GraphicsOutput
->Mode
->Info
->PixelInformation
.RedMask
,
296 GraphicsOutput
->Mode
->Info
->PixelFormat
!=PixelBitMask
?0:GraphicsOutput
->Mode
->Info
->PixelInformation
.GreenMask
,
297 GraphicsOutput
->Mode
->Info
->PixelFormat
!=PixelBitMask
?0:GraphicsOutput
->Mode
->Info
->PixelInformation
.BlueMask
300 SHELL_FREE_NON_NULL (Temp
);
302 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_RES_LIST_MAIN
), NULL
);
304 SHELL_FREE_NON_NULL (RetVal
);
308 TempRetVal
= CatSPrint (RetVal
, Temp
);
309 SHELL_FREE_NON_NULL (RetVal
);
310 if (TempRetVal
== NULL
) {
314 SHELL_FREE_NON_NULL (Temp
);
316 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY
), NULL
);
318 SHELL_FREE_NON_NULL (RetVal
);
323 for (Mode
= 0; Mode
< GraphicsOutput
->Mode
->MaxMode
; Mode
++) {
324 Status
= GraphicsOutput
->QueryMode (
330 if (EFI_ERROR (Status
)) {
334 TempRetVal
= CatSPrint (
338 GopInfo
->HorizontalResolution
,
339 GopInfo
->VerticalResolution
342 SHELL_FREE_NON_NULL (GopInfo
);
343 SHELL_FREE_NON_NULL (RetVal
);
349 SHELL_FREE_NON_NULL(Temp
);
350 SHELL_FREE_NON_NULL(Fmt
);
356 Function to dump information about EDID Discovered Protocol.
358 This will allocate the return buffer from boot services pool.
360 @param[in] TheHandle The handle that has LoadedImage installed.
361 @param[in] Verbose TRUE for additional information, FALSE otherwise.
363 @retval A pointer to a string containing the information.
367 EdidDiscoveredProtocolDumpInformation (
368 IN CONST EFI_HANDLE TheHandle
,
369 IN CONST BOOLEAN Verbose
372 EFI_EDID_DISCOVERED_PROTOCOL
*EdidDiscovered
;
379 return (CatSPrint (NULL
, L
"EDIDDiscovered"));
382 Status
= gBS
->OpenProtocol (
384 &gEfiEdidDiscoveredProtocolGuid
,
385 (VOID
**)&EdidDiscovered
,
388 EFI_OPEN_PROTOCOL_GET_PROTOCOL
391 if (EFI_ERROR (Status
)) {
395 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN
), NULL
);
400 RetVal
= CatSPrint (NULL
, Temp
, EdidDiscovered
->SizeOfEdid
);
401 SHELL_FREE_NON_NULL (Temp
);
403 if (EdidDiscovered
->SizeOfEdid
!= 0) {
404 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_DISCOVERED_DATA
), NULL
);
406 SHELL_FREE_NON_NULL (RetVal
);
409 TempRetVal
= CatSPrint (RetVal
, Temp
);
410 SHELL_FREE_NON_NULL (RetVal
);
413 TempRetVal
= CatSDumpHex (RetVal
, 7, 0, EdidDiscovered
->SizeOfEdid
, EdidDiscovered
->Edid
);
420 Function to dump information about EDID Active Protocol.
422 This will allocate the return buffer from boot services pool.
424 @param[in] TheHandle The handle that has LoadedImage installed.
425 @param[in] Verbose TRUE for additional information, FALSE otherwise.
427 @retval A pointer to a string containing the information.
431 EdidActiveProtocolDumpInformation (
432 IN CONST EFI_HANDLE TheHandle
,
433 IN CONST BOOLEAN Verbose
436 EFI_EDID_ACTIVE_PROTOCOL
*EdidActive
;
443 return (CatSPrint (NULL
, L
"EDIDActive"));
446 Status
= gBS
->OpenProtocol (
448 &gEfiEdidActiveProtocolGuid
,
452 EFI_OPEN_PROTOCOL_GET_PROTOCOL
455 if (EFI_ERROR (Status
)) {
459 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_ACTIVE_MAIN
), NULL
);
464 RetVal
= CatSPrint (NULL
, Temp
, EdidActive
->SizeOfEdid
);
465 SHELL_FREE_NON_NULL (Temp
);
467 if (EdidActive
->SizeOfEdid
!= 0) {
468 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_ACTIVE_DATA
), NULL
);
470 SHELL_FREE_NON_NULL (RetVal
);
473 TempRetVal
= CatSPrint (RetVal
, Temp
);
474 SHELL_FREE_NON_NULL (RetVal
);
477 TempRetVal
= CatSDumpHex (RetVal
, 7, 0, EdidActive
->SizeOfEdid
, EdidActive
->Edid
);
484 Function to dump information about PciRootBridgeIo.
486 This will allocate the return buffer from boot services pool.
488 @param[in] TheHandle The handle that has PciRootBridgeIo installed.
489 @param[in] Verbose TRUE for additional information, FALSE otherwise.
491 @retval A poitner to a string containing the information.
495 PciRootBridgeIoDumpInformation(
496 IN CONST EFI_HANDLE TheHandle
,
497 IN CONST BOOLEAN Verbose
500 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*PciRootBridgeIo
;
501 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*Configuration
;
512 return (CatSPrint(NULL
, L
"PciRootBridgeIo"));
515 HandleParsingHiiInit();
517 Status
= gBS
->HandleProtocol(
519 &gEfiPciRootBridgeIoProtocolGuid
,
520 (VOID
**)&PciRootBridgeIo
);
522 if (EFI_ERROR(Status
)) {
526 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_PH
), NULL
);
530 Temp2
= CatSPrint(L
"\r\n", Temp
, PciRootBridgeIo
->ParentHandle
);
535 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_SEG
), NULL
);
537 SHELL_FREE_NON_NULL(RetVal
);
540 Temp2
= CatSPrint(RetVal
, Temp
, PciRootBridgeIo
->SegmentNumber
);
548 Status
= PciRootBridgeIo
->GetAttributes (PciRootBridgeIo
, &Supports
, &Attributes
);
549 if (!EFI_ERROR(Status
)) {
550 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_ATT
), NULL
);
552 SHELL_FREE_NON_NULL(RetVal
);
555 Temp2
= CatSPrint(RetVal
, Temp
, Attributes
);
561 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS
), NULL
);
563 SHELL_FREE_NON_NULL(RetVal
);
566 Temp2
= CatSPrint(RetVal
, Temp
, Supports
);
573 Configuration
= NULL
;
574 Status
= PciRootBridgeIo
->Configuration (PciRootBridgeIo
, (VOID
**) &Configuration
);
575 if (!EFI_ERROR(Status
) && Configuration
!= NULL
) {
576 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_TITLE
), NULL
);
578 SHELL_FREE_NON_NULL(RetVal
);
581 Temp2
= CatSPrint(RetVal
, Temp
, Supports
);
586 while (Configuration
->Desc
== ACPI_ADDRESS_SPACE_DESCRIPTOR
) {
588 switch (Configuration
->ResType
) {
589 case ACPI_ADDRESS_SPACE_TYPE_MEM
:
590 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_MEM
), NULL
);
592 case ACPI_ADDRESS_SPACE_TYPE_IO
:
593 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_IO
), NULL
);
595 case ACPI_ADDRESS_SPACE_TYPE_BUS
:
596 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_BUS
), NULL
);
600 Temp2
= CatSPrint(RetVal
, L
"%s", Temp
);
607 Temp2
= CatSPrint(RetVal
,
608 L
"%H%02x %016lx %016lx %02x%N\r\n",
609 Configuration
->SpecificFlag
,
610 Configuration
->AddrRangeMin
,
611 Configuration
->AddrRangeMax
,
612 Configuration
->AddrSpaceGranularity
624 Function to dump information about SimpleTextOut.
626 This will allocate the return buffer from boot services pool.
628 @param[in] TheHandle The handle that has SimpleTextOut installed.
629 @param[in] Verbose TRUE for additional information, FALSE otherwise.
631 @retval A poitner to a string containing the information.
635 TxtOutProtocolDumpInformation(
636 IN CONST EFI_HANDLE TheHandle
,
637 IN CONST BOOLEAN Verbose
640 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*Dev
;
654 HandleParsingHiiInit();
659 Status
= gBS
->HandleProtocol(
661 &gEfiSimpleTextOutProtocolGuid
,
664 ASSERT_EFI_ERROR(Status
);
665 ASSERT (Dev
!= NULL
&& Dev
->Mode
!= NULL
);
667 Size
= (Dev
->Mode
->MaxMode
+ 1) * 80;
668 RetVal
= AllocateZeroPool(Size
);
670 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_TXT_OUT_DUMP_HEADER
), NULL
);
672 UnicodeSPrint(RetVal
, Size
, Temp
, Dev
, Dev
->Mode
->Attribute
);
679 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_TXT_OUT_DUMP_LINE
), NULL
);
680 for (Index
= 0; Index
< Dev
->Mode
->MaxMode
; Index
++) {
681 Status
= Dev
->QueryMode (Dev
, Index
, &Col
, &Row
);
682 NewSize
= Size
- StrSize(RetVal
);
684 RetVal
+ StrLen(RetVal
),
686 Temp
== NULL
?L
"":Temp
,
687 Index
== Dev
->Mode
->Mode
? L
'*' : L
' ',
689 !EFI_ERROR(Status
)?(INTN
)Col
:-1,
690 !EFI_ERROR(Status
)?(INTN
)Row
:-1
697 STATIC CONST UINTN VersionStringSize
= 60;
700 Function to dump information about EfiDriverSupportedEfiVersion protocol.
702 This will allocate the return buffer from boot services pool.
704 @param[in] TheHandle The handle that has the protocol installed.
705 @param[in] Verbose TRUE for additional information, FALSE otherwise.
707 @retval A poitner to a string containing the information.
711 DriverEfiVersionProtocolDumpInformation(
712 IN CONST EFI_HANDLE TheHandle
,
713 IN CONST BOOLEAN Verbose
716 EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL
*DriverEfiVersion
;
720 Status
= gBS
->HandleProtocol(
722 &gEfiDriverSupportedEfiVersionProtocolGuid
,
723 (VOID
**)&DriverEfiVersion
);
725 ASSERT_EFI_ERROR(Status
);
727 RetVal
= AllocateZeroPool(VersionStringSize
);
728 if (RetVal
!= NULL
) {
729 UnicodeSPrint (RetVal
, VersionStringSize
, L
"0x%08x", DriverEfiVersion
->FirmwareVersion
);
734 Function to convert device path to string.
736 This will allocate the return buffer from boot services pool.
738 @param[in] DevPath Pointer to device path instance.
739 @param[in] Verbose TRUE for additional information, FALSE otherwise.
740 @param[in] Length Maximum allowed text length of the device path.
742 @retval A pointer to a string containing the information.
745 ConvertDevicePathToShortText(
746 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath
,
747 IN CONST BOOLEAN Verbose
,
748 IN CONST UINTN Length
756 // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)
758 Temp
= ConvertDevicePathToText(DevPath
, TRUE
, TRUE
);
759 if (!Verbose
&& Temp
!= NULL
&& StrLen(Temp
) > Length
) {
762 Temp2
= StrnCatGrow(&Temp2
, &Size
, L
"..", 0);
763 Temp2
= StrnCatGrow(&Temp2
, &Size
, Temp
+(StrLen(Temp
) - (Length
- 2)), 0);
771 Function to dump information about DevicePath protocol.
773 This will allocate the return buffer from boot services pool.
775 @param[in] TheHandle The handle that has the protocol installed.
776 @param[in] Verbose TRUE for additional information, FALSE otherwise.
778 @retval A pointer to a string containing the information.
782 DevicePathProtocolDumpInformation(
783 IN CONST EFI_HANDLE TheHandle
,
784 IN CONST BOOLEAN Verbose
787 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
792 Status
= gBS
->OpenProtocol(TheHandle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
793 if (!EFI_ERROR(Status
)) {
794 Temp
= ConvertDevicePathToShortText (DevPath
, Verbose
, 30);
795 gBS
->CloseProtocol(TheHandle
, &gEfiDevicePathProtocolGuid
, gImageHandle
, NULL
);
801 Function to dump information about LoadedImageDevicePath protocol.
803 This will allocate the return buffer from boot services pool.
805 @param[in] TheHandle The handle that has the protocol installed.
806 @param[in] Verbose TRUE for additional information, FALSE otherwise.
808 @retval A pointer to a string containing the information.
812 LoadedImageDevicePathProtocolDumpInformation(
813 IN CONST EFI_HANDLE TheHandle
,
814 IN CONST BOOLEAN Verbose
817 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
822 Status
= gBS
->OpenProtocol(TheHandle
, &gEfiLoadedImageDevicePathProtocolGuid
, (VOID
**)&DevPath
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
823 if (!EFI_ERROR(Status
)) {
824 Temp
= ConvertDevicePathToShortText (DevPath
, Verbose
, 30);
825 gBS
->CloseProtocol(TheHandle
, &gEfiDevicePathProtocolGuid
, gImageHandle
, NULL
);
831 Function to dump information about EfiAdapterInformation Protocol.
833 @param[in] TheHandle The handle that has the protocol installed.
834 @param[in] Verbose TRUE for additional information, FALSE otherwise.
836 @retval A pointer to a string containing the information.
840 AdapterInformationDumpInformation (
841 IN CONST EFI_HANDLE TheHandle
,
842 IN CONST BOOLEAN Verbose
846 EFI_ADAPTER_INFORMATION_PROTOCOL
*EfiAdptrInfoProtocol
;
847 UINTN InfoTypesBufferCount
;
849 EFI_GUID
*InfoTypesBuffer
;
854 VOID
*InformationBlock
;
855 UINTN InformationBlockSize
;
858 return (CatSPrint(NULL
, L
"AdapterInfo"));
861 InfoTypesBuffer
= NULL
;
862 InformationBlock
= NULL
;
865 Status
= gBS
->OpenProtocol (
866 (EFI_HANDLE
) (TheHandle
),
867 &gEfiAdapterInformationProtocolGuid
,
868 (VOID
**) &EfiAdptrInfoProtocol
,
871 EFI_OPEN_PROTOCOL_GET_PROTOCOL
874 if (EFI_ERROR (Status
)) {
879 // Get a list of supported information types for this instance of the protocol.
881 Status
= EfiAdptrInfoProtocol
->GetSupportedTypes (
882 EfiAdptrInfoProtocol
,
884 &InfoTypesBufferCount
887 if (EFI_ERROR (Status
)) {
888 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GET_SUPP_TYPES_FAILED
), NULL
);
889 if (TempStr
!= NULL
) {
890 RetVal
= CatSPrint (NULL
, TempStr
, Status
);
895 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_SUPP_TYPE_HEADER
), NULL
);
896 if (TempStr
== NULL
) {
899 RetVal
= CatSPrint (NULL
, TempStr
);
900 SHELL_FREE_NON_NULL (TempStr
);
902 for (GuidIndex
= 0; GuidIndex
< InfoTypesBufferCount
; GuidIndex
++) {
903 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GUID_NUMBER
), NULL
);
904 if (TempStr
== NULL
) {
907 TempRetVal
= CatSPrint (RetVal
, TempStr
, (GuidIndex
+ 1), &InfoTypesBuffer
[GuidIndex
]);
908 SHELL_FREE_NON_NULL (RetVal
);
910 SHELL_FREE_NON_NULL (TempStr
);
912 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GUID_STRING
), NULL
);
913 if (TempStr
== NULL
) {
917 if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoMediaStateGuid
)) {
918 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoMediaStateGuid");
919 SHELL_FREE_NON_NULL (RetVal
);
921 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoNetworkBootGuid
)) {
922 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoNetworkBootGuid");
923 SHELL_FREE_NON_NULL (RetVal
);
925 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoSanMacAddressGuid
)) {
926 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoSanMacAddressGuid");
927 SHELL_FREE_NON_NULL (RetVal
);
929 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
)) {
930 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoUndiIpv6SupportGuid");
931 SHELL_FREE_NON_NULL (RetVal
);
935 GuidStr
= GetStringNameFromGuid (&InfoTypesBuffer
[GuidIndex
], NULL
);
937 if (GuidStr
!= NULL
) {
938 if (StrCmp(GuidStr
, L
"UnknownDevice") == 0) {
939 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"UnknownInfoType");
940 SHELL_FREE_NON_NULL (RetVal
);
943 SHELL_FREE_NON_NULL (TempStr
);
944 SHELL_FREE_NON_NULL(GuidStr
);
946 // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP
950 TempRetVal
= CatSPrint (RetVal
, TempStr
, GuidStr
);
951 SHELL_FREE_NON_NULL (RetVal
);
953 SHELL_FREE_NON_NULL(GuidStr
);
958 SHELL_FREE_NON_NULL (TempStr
);
960 Status
= EfiAdptrInfoProtocol
->GetInformation (
961 EfiAdptrInfoProtocol
,
962 &InfoTypesBuffer
[GuidIndex
],
964 &InformationBlockSize
967 if (EFI_ERROR (Status
)) {
968 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GETINFO_FAILED
), NULL
);
969 if (TempStr
== NULL
) {
972 TempRetVal
= CatSPrint (RetVal
, TempStr
, Status
);
973 SHELL_FREE_NON_NULL (RetVal
);
976 if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoMediaStateGuid
)) {
977 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_MEDIA_STATE
), NULL
);
978 if (TempStr
== NULL
) {
981 TempRetVal
= CatSPrint (
984 ((EFI_ADAPTER_INFO_MEDIA_STATE
*)InformationBlock
)->MediaState
,
985 ((EFI_ADAPTER_INFO_MEDIA_STATE
*)InformationBlock
)->MediaState
987 SHELL_FREE_NON_NULL (RetVal
);
989 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoNetworkBootGuid
)) {
990 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_NETWORK_BOOT_INFO
), NULL
);
991 if (TempStr
== NULL
) {
994 TempRetVal
= CatSPrint (
997 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv4BootCapablity
,
998 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv6BootCapablity
,
999 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->FCoeBootCapablity
,
1000 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->OffloadCapability
,
1001 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiMpioCapability
,
1002 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv4Boot
,
1003 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv6Boot
,
1004 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->FCoeBoot
1006 SHELL_FREE_NON_NULL (RetVal
);
1007 RetVal
= TempRetVal
;
1008 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoSanMacAddressGuid
) == TRUE
) {
1009 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_SAN_MAC_ADDRESS_INFO
), NULL
);
1010 if (TempStr
== NULL
) {
1013 TempRetVal
= CatSPrint (
1016 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[0],
1017 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[1],
1018 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[2],
1019 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[3],
1020 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[4],
1021 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[5]
1023 SHELL_FREE_NON_NULL (RetVal
);
1024 RetVal
= TempRetVal
;
1025 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
) == TRUE
) {
1026 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_UNDI_IPV6_INFO
), NULL
);
1027 if (TempStr
== NULL
) {
1031 TempRetVal
= CatSPrint (
1034 ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT
*)InformationBlock
)->Ipv6Support
1036 SHELL_FREE_NON_NULL (RetVal
);
1037 RetVal
= TempRetVal
;
1039 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_UNKNOWN_INFO_TYPE
), NULL
);
1040 if (TempStr
== NULL
) {
1043 TempRetVal
= CatSPrint (RetVal
, TempStr
, &InfoTypesBuffer
[GuidIndex
]);
1044 SHELL_FREE_NON_NULL (RetVal
);
1045 RetVal
= TempRetVal
;
1048 SHELL_FREE_NON_NULL (TempStr
);
1049 SHELL_FREE_NON_NULL (InformationBlock
);
1053 SHELL_FREE_NON_NULL (InfoTypesBuffer
);
1057 SHELL_FREE_NON_NULL (RetVal
);
1058 SHELL_FREE_NON_NULL (InfoTypesBuffer
);
1059 SHELL_FREE_NON_NULL (InformationBlock
);
1064 Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.
1066 @param[in] TheHandle The handle that has the protocol installed.
1067 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1069 @retval A pointer to a string containing the information.
1073 FirmwareManagementDumpInformation (
1074 IN CONST EFI_HANDLE TheHandle
,
1075 IN CONST BOOLEAN Verbose
1079 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*EfiFwMgmtProtocol
;
1080 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
;
1081 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1
*ImageInfoV1
;
1082 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2
*ImageInfoV2
;
1083 UINT64 AttributeSetting
;
1084 UINTN ImageInfoSize
;
1085 UINTN DescriptorSize
;
1086 UINT32 DescriptorVersion
;
1087 UINT32 PackageVersion
;
1088 UINT8 DescriptorCount
;
1092 CHAR16
*PackageVersionName
;
1096 CHAR16
*AttributeSettingStr
;
1098 BOOLEAN AttributeSupported
;
1101 // Initialize local variables
1105 AttributeSetting
= 0;
1107 AttributeSupported
= FALSE
;
1111 PackageVersionName
= NULL
;
1115 AttributeSettingStr
= NULL
;
1118 return (CatSPrint(NULL
, L
"FirmwareManagement"));
1121 Status
= gBS
->OpenProtocol (
1122 (EFI_HANDLE
) (TheHandle
),
1123 &gEfiFirmwareManagementProtocolGuid
,
1124 (VOID
**) &EfiFwMgmtProtocol
,
1127 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1130 if (EFI_ERROR (Status
)) {
1134 Status
= EfiFwMgmtProtocol
->GetImageInfo (
1145 if (Status
== EFI_BUFFER_TOO_SMALL
) {
1146 ImageInfo
= AllocateZeroPool (ImageInfoSize
);
1148 if (ImageInfo
== NULL
) {
1149 Status
= EFI_OUT_OF_RESOURCES
;
1151 Status
= EfiFwMgmtProtocol
->GetImageInfo (
1164 if (EFI_ERROR (Status
)) {
1169 // Decode Image Descriptor data only if its version is supported
1171 if (DescriptorVersion
<= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION
) {
1173 if (ImageInfo
== NULL
) {
1177 ImageInfoV1
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1
*)ImageInfo
;
1178 ImageInfoV2
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2
*)ImageInfo
;
1181 // Set ImageInfoSize in return buffer
1183 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_INFO_SIZE
), NULL
);
1184 if (TempStr
== NULL
) {
1187 RetVal
= CatSPrint (NULL
, TempStr
, ImageInfoSize
);
1188 SHELL_FREE_NON_NULL (TempStr
);
1191 // Set DescriptorVersion in return buffer
1193 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_DESCRIPTOR_VERSION
), NULL
);
1194 if (TempStr
== NULL
) {
1197 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorVersion
);
1198 SHELL_FREE_NON_NULL (RetVal
);
1199 RetVal
= TempRetVal
;
1200 SHELL_FREE_NON_NULL (TempStr
);
1203 // Set DescriptorCount in return buffer
1205 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_DESCRIPTOR_COUNT
), NULL
);
1206 if (TempStr
== NULL
) {
1209 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorCount
);
1210 SHELL_FREE_NON_NULL (RetVal
);
1211 RetVal
= TempRetVal
;
1212 SHELL_FREE_NON_NULL (TempStr
);
1216 // Set DescriptorSize in return buffer
1218 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_DESCRIPTOR_SIZE
), NULL
);
1219 if (TempStr
== NULL
) {
1222 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorSize
);
1223 SHELL_FREE_NON_NULL (RetVal
);
1224 RetVal
= TempRetVal
;
1225 SHELL_FREE_NON_NULL (TempStr
);
1228 // Set PackageVersion in return buffer
1230 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_PACKAGE_VERSION
), NULL
);
1231 if (TempStr
== NULL
) {
1234 TempRetVal
= CatSPrint (RetVal
, TempStr
, PackageVersion
);
1235 SHELL_FREE_NON_NULL (RetVal
);
1236 RetVal
= TempRetVal
;
1237 SHELL_FREE_NON_NULL (TempStr
);
1240 // Set PackageVersionName in return buffer
1242 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_PACKAGE_VERSION_NAME
), NULL
);
1243 if (TempStr
== NULL
) {
1246 TempRetVal
= CatSPrint (RetVal
, TempStr
, PackageVersionName
);
1247 SHELL_FREE_NON_NULL (RetVal
);
1248 RetVal
= TempRetVal
;
1249 SHELL_FREE_NON_NULL (TempStr
);
1251 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
1253 // First check if Attribute is supported
1254 // and generate a string for AttributeSetting field
1256 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1257 AttributeSupported
= FALSE
;
1258 AttributeSetting
= 0;
1259 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1260 if (ImageInfoV1
[Index
].AttributesSupported
!= 0x0) {
1261 AttributeSupported
= TRUE
;
1262 AttributeSetting
= ImageInfoV1
[Index
].AttributesSetting
;
1264 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1265 if (ImageInfoV2
[Index
].AttributesSupported
!= 0x0) {
1266 AttributeSupported
= TRUE
;
1267 AttributeSetting
= ImageInfoV2
[Index
].AttributesSetting
;
1270 if (ImageInfo
[Index
].AttributesSupported
!= 0x0) {
1271 AttributeSupported
= TRUE
;
1272 AttributeSetting
= ImageInfo
[Index
].AttributesSetting
;
1276 if (!AttributeSupported
) {
1277 AttributeSettingStr
= CatSPrint (NULL
, L
"None");
1279 AttributeSettingStr
= CatSPrint (NULL
, L
"(");
1281 if ((AttributeSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
) != 0x0) {
1282 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");
1283 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1284 AttributeSettingStr
= TempRetVal
;
1286 if ((AttributeSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
) != 0x0) {
1287 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_RESET_REQUIRED");
1288 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1289 AttributeSettingStr
= TempRetVal
;
1291 if ((AttributeSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
) != 0x0) {
1292 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");
1293 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1294 AttributeSettingStr
= TempRetVal
;
1296 if ((AttributeSetting
& IMAGE_ATTRIBUTE_IN_USE
) != 0x0) {
1297 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_IN_USE");
1298 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1299 AttributeSettingStr
= TempRetVal
;
1301 if ((AttributeSetting
& IMAGE_ATTRIBUTE_UEFI_IMAGE
) != 0x0) {
1302 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_UEFI_IMAGE");
1303 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1304 AttributeSettingStr
= TempRetVal
;
1306 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" )");
1307 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1308 AttributeSettingStr
= TempRetVal
;
1311 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1312 if (ImageInfoV1
[Index
].ImageIndex
!= 0x0) {
1316 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V1
), NULL
);
1317 if (TempStr
== NULL
) {
1320 TempRetVal
= CatSPrint (
1324 ImageInfoV1
[Index
].ImageIndex
,
1325 &ImageInfoV1
[Index
].ImageTypeId
,
1326 ImageInfoV1
[Index
].ImageId
,
1327 ImageInfoV1
[Index
].ImageIdName
,
1328 ImageInfoV1
[Index
].Version
,
1329 ImageInfoV1
[Index
].VersionName
,
1330 ImageInfoV1
[Index
].Size
,
1331 ImageInfoV1
[Index
].AttributesSupported
,
1332 AttributeSettingStr
,
1333 ImageInfoV1
[Index
].Compatibilities
1335 SHELL_FREE_NON_NULL (RetVal
);
1336 RetVal
= TempRetVal
;
1337 SHELL_FREE_NON_NULL (TempStr
);
1338 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1339 if (ImageInfoV2
[Index
].ImageIndex
!= 0x0) {
1343 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V2
), NULL
);
1344 if (TempStr
== NULL
) {
1347 TempRetVal
= CatSPrint (
1351 ImageInfoV2
[Index
].ImageIndex
,
1352 &ImageInfoV2
[Index
].ImageTypeId
,
1353 ImageInfoV2
[Index
].ImageId
,
1354 ImageInfoV2
[Index
].ImageIdName
,
1355 ImageInfoV2
[Index
].Version
,
1356 ImageInfoV2
[Index
].VersionName
,
1357 ImageInfoV2
[Index
].Size
,
1358 ImageInfoV2
[Index
].AttributesSupported
,
1359 AttributeSettingStr
,
1360 ImageInfoV2
[Index
].Compatibilities
,
1361 ImageInfoV2
[Index
].LowestSupportedImageVersion
1363 SHELL_FREE_NON_NULL (RetVal
);
1364 RetVal
= TempRetVal
;
1365 SHELL_FREE_NON_NULL (TempStr
);
1367 if (ImageInfo
[Index
].ImageIndex
!= 0x0) {
1371 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO
), NULL
);
1372 if (TempStr
== NULL
) {
1375 TempRetVal
= CatSPrint (
1379 ImageInfo
[Index
].ImageIndex
,
1380 &ImageInfo
[Index
].ImageTypeId
,
1381 ImageInfo
[Index
].ImageId
,
1382 ImageInfo
[Index
].ImageIdName
,
1383 ImageInfo
[Index
].Version
,
1384 ImageInfo
[Index
].VersionName
,
1385 ImageInfo
[Index
].Size
,
1386 ImageInfo
[Index
].AttributesSupported
,
1387 AttributeSettingStr
,
1388 ImageInfo
[Index
].Compatibilities
,
1389 ImageInfo
[Index
].LowestSupportedImageVersion
,
1390 ImageInfo
[Index
].LastAttemptVersion
,
1391 ImageInfo
[Index
].LastAttemptStatus
,
1392 ImageInfo
[Index
].HardwareInstance
1394 SHELL_FREE_NON_NULL (RetVal
);
1395 RetVal
= TempRetVal
;
1396 SHELL_FREE_NON_NULL (TempStr
);
1401 if (ImageCount
> 0) {
1402 for (Index
=0; Index
<DescriptorCount
; Index
++) {
1403 for (Index1
=Index
+1; Index1
<DescriptorCount
; Index1
++) {
1404 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1405 if (ImageInfoV1
[Index
].ImageId
== ImageInfoV1
[Index1
].ImageId
) {
1408 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1412 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1413 if (ImageInfoV2
[Index
].ImageId
== ImageInfoV2
[Index1
].ImageId
) {
1416 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1421 if (ImageInfo
[Index
].ImageId
== ImageInfo
[Index1
].ImageId
) {
1424 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1435 // Check if ImageId with duplicate value was found
1438 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGEID_NON_UNIQUE
), NULL
);
1439 if (TempStr
== NULL
) {
1442 TempRetVal
= CatSPrint (RetVal
, TempStr
);
1443 SHELL_FREE_NON_NULL (RetVal
);
1444 RetVal
= TempRetVal
;
1445 SHELL_FREE_NON_NULL (TempStr
);
1448 SHELL_FREE_NON_NULL (ImageInfo
);
1449 SHELL_FREE_NON_NULL (PackageVersionName
);
1450 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1455 SHELL_FREE_NON_NULL (RetVal
);
1456 SHELL_FREE_NON_NULL (ImageInfo
);
1457 SHELL_FREE_NON_NULL (PackageVersionName
);
1458 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1464 // Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg
1466 #define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \
1468 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
1471 #define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \
1473 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
1476 #define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \
1478 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
1480 STATIC CONST EFI_GUID WinNtThunkProtocolGuid
= LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID
;
1481 STATIC CONST EFI_GUID WinNtIoProtocolGuid
= LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID
;
1482 STATIC CONST EFI_GUID WinNtSerialPortGuid
= LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID
;
1485 // Deprecated protocols we dont want to link from IntelFrameworkModulePkg
1487 #define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \
1489 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
1491 #define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \
1493 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \
1495 STATIC CONST EFI_GUID EfiIsaIoProtocolGuid
= LOCAL_EFI_ISA_IO_PROTOCOL_GUID
;
1496 STATIC CONST EFI_GUID EfiIsaAcpiProtocolGuid
= LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID
;
1499 STATIC CONST GUID_INFO_BLOCK mGuidStringListNT
[] = {
1500 {STRING_TOKEN(STR_WINNT_THUNK
), (EFI_GUID
*)&WinNtThunkProtocolGuid
, NULL
},
1501 {STRING_TOKEN(STR_WINNT_DRIVER_IO
), (EFI_GUID
*)&WinNtIoProtocolGuid
, NULL
},
1502 {STRING_TOKEN(STR_WINNT_SERIAL_PORT
), (EFI_GUID
*)&WinNtSerialPortGuid
, NULL
},
1503 {STRING_TOKEN(STR_UNKNOWN_DEVICE
), NULL
, NULL
},
1506 STATIC CONST GUID_INFO_BLOCK mGuidStringList
[] = {
1507 {STRING_TOKEN(STR_LOADED_IMAGE
), &gEfiLoadedImageProtocolGuid
, LoadedImageProtocolDumpInformation
},
1508 {STRING_TOKEN(STR_DEVICE_PATH
), &gEfiDevicePathProtocolGuid
, DevicePathProtocolDumpInformation
},
1509 {STRING_TOKEN(STR_IMAGE_PATH
), &gEfiLoadedImageDevicePathProtocolGuid
, LoadedImageDevicePathProtocolDumpInformation
},
1510 {STRING_TOKEN(STR_DEVICE_PATH_UTIL
), &gEfiDevicePathUtilitiesProtocolGuid
, NULL
},
1511 {STRING_TOKEN(STR_DEVICE_PATH_TXT
), &gEfiDevicePathToTextProtocolGuid
, NULL
},
1512 {STRING_TOKEN(STR_DEVICE_PATH_FTXT
), &gEfiDevicePathFromTextProtocolGuid
, NULL
},
1513 {STRING_TOKEN(STR_DEVICE_PATH_PC
), &gEfiPcAnsiGuid
, NULL
},
1514 {STRING_TOKEN(STR_DEVICE_PATH_VT100
), &gEfiVT100Guid
, NULL
},
1515 {STRING_TOKEN(STR_DEVICE_PATH_VT100P
), &gEfiVT100PlusGuid
, NULL
},
1516 {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8
), &gEfiVTUTF8Guid
, NULL
},
1517 {STRING_TOKEN(STR_DRIVER_BINDING
), &gEfiDriverBindingProtocolGuid
, NULL
},
1518 {STRING_TOKEN(STR_PLATFORM_OVERRIDE
), &gEfiPlatformDriverOverrideProtocolGuid
, NULL
},
1519 {STRING_TOKEN(STR_BUS_OVERRIDE
), &gEfiBusSpecificDriverOverrideProtocolGuid
, NULL
},
1520 {STRING_TOKEN(STR_DRIVER_DIAG
), &gEfiDriverDiagnosticsProtocolGuid
, NULL
},
1521 {STRING_TOKEN(STR_DRIVER_DIAG2
), &gEfiDriverDiagnostics2ProtocolGuid
, NULL
},
1522 {STRING_TOKEN(STR_DRIVER_CN
), &gEfiComponentNameProtocolGuid
, NULL
},
1523 {STRING_TOKEN(STR_DRIVER_CN2
), &gEfiComponentName2ProtocolGuid
, NULL
},
1524 {STRING_TOKEN(STR_PLAT_DRV_CFG
), &gEfiPlatformToDriverConfigurationProtocolGuid
, NULL
},
1525 {STRING_TOKEN(STR_DRIVER_VERSION
), &gEfiDriverSupportedEfiVersionProtocolGuid
, DriverEfiVersionProtocolDumpInformation
},
1526 {STRING_TOKEN(STR_TXT_IN
), &gEfiSimpleTextInProtocolGuid
, NULL
},
1527 {STRING_TOKEN(STR_TXT_IN_EX
), &gEfiSimpleTextInputExProtocolGuid
, NULL
},
1528 {STRING_TOKEN(STR_TXT_OUT
), &gEfiSimpleTextOutProtocolGuid
, TxtOutProtocolDumpInformation
},
1529 {STRING_TOKEN(STR_SIM_POINTER
), &gEfiSimplePointerProtocolGuid
, NULL
},
1530 {STRING_TOKEN(STR_ABS_POINTER
), &gEfiAbsolutePointerProtocolGuid
, NULL
},
1531 {STRING_TOKEN(STR_SERIAL_IO
), &gEfiSerialIoProtocolGuid
, NULL
},
1532 {STRING_TOKEN(STR_GRAPHICS_OUTPUT
), &gEfiGraphicsOutputProtocolGuid
, GraphicsOutputProtocolDumpInformation
},
1533 {STRING_TOKEN(STR_EDID_DISCOVERED
), &gEfiEdidDiscoveredProtocolGuid
, EdidDiscoveredProtocolDumpInformation
},
1534 {STRING_TOKEN(STR_EDID_ACTIVE
), &gEfiEdidActiveProtocolGuid
, EdidActiveProtocolDumpInformation
},
1535 {STRING_TOKEN(STR_EDID_OVERRIDE
), &gEfiEdidOverrideProtocolGuid
, NULL
},
1536 {STRING_TOKEN(STR_CON_IN
), &gEfiConsoleInDeviceGuid
, NULL
},
1537 {STRING_TOKEN(STR_CON_OUT
), &gEfiConsoleOutDeviceGuid
, NULL
},
1538 {STRING_TOKEN(STR_STD_ERR
), &gEfiStandardErrorDeviceGuid
, NULL
},
1539 {STRING_TOKEN(STR_LOAD_FILE
), &gEfiLoadFileProtocolGuid
, NULL
},
1540 {STRING_TOKEN(STR_LOAD_FILE2
), &gEfiLoadFile2ProtocolGuid
, NULL
},
1541 {STRING_TOKEN(STR_SIMPLE_FILE_SYS
), &gEfiSimpleFileSystemProtocolGuid
, NULL
},
1542 {STRING_TOKEN(STR_TAPE_IO
), &gEfiTapeIoProtocolGuid
, NULL
},
1543 {STRING_TOKEN(STR_DISK_IO
), &gEfiDiskIoProtocolGuid
, NULL
},
1544 {STRING_TOKEN(STR_BLK_IO
), &gEfiBlockIoProtocolGuid
, NULL
},
1545 {STRING_TOKEN(STR_UC
), &gEfiUnicodeCollationProtocolGuid
, NULL
},
1546 {STRING_TOKEN(STR_UC2
), &gEfiUnicodeCollation2ProtocolGuid
, NULL
},
1547 {STRING_TOKEN(STR_PCIRB_IO
), &gEfiPciRootBridgeIoProtocolGuid
, PciRootBridgeIoDumpInformation
},
1548 {STRING_TOKEN(STR_PCI_IO
), &gEfiPciIoProtocolGuid
, NULL
},
1549 {STRING_TOKEN(STR_SCSI_PT
), &gEfiScsiPassThruProtocolGuid
, NULL
},
1550 {STRING_TOKEN(STR_SCSI_IO
), &gEfiScsiIoProtocolGuid
, NULL
},
1551 {STRING_TOKEN(STR_SCSI_PT_EXT
), &gEfiExtScsiPassThruProtocolGuid
, NULL
},
1552 {STRING_TOKEN(STR_ISCSI
), &gEfiIScsiInitiatorNameProtocolGuid
, NULL
},
1553 {STRING_TOKEN(STR_USB_IO
), &gEfiUsbIoProtocolGuid
, NULL
},
1554 {STRING_TOKEN(STR_USB_HC
), &gEfiUsbHcProtocolGuid
, NULL
},
1555 {STRING_TOKEN(STR_USB_HC2
), &gEfiUsb2HcProtocolGuid
, NULL
},
1556 {STRING_TOKEN(STR_DEBUG_SUPPORT
), &gEfiDebugSupportProtocolGuid
, NULL
},
1557 {STRING_TOKEN(STR_DEBUG_PORT
), &gEfiDebugPortProtocolGuid
, NULL
},
1558 {STRING_TOKEN(STR_DECOMPRESS
), &gEfiDecompressProtocolGuid
, NULL
},
1559 {STRING_TOKEN(STR_ACPI_TABLE
), &gEfiAcpiTableProtocolGuid
, NULL
},
1560 {STRING_TOKEN(STR_EBC_INTERPRETER
), &gEfiEbcProtocolGuid
, NULL
},
1561 {STRING_TOKEN(STR_SNP
), &gEfiSimpleNetworkProtocolGuid
, NULL
},
1562 {STRING_TOKEN(STR_NII
), &gEfiNetworkInterfaceIdentifierProtocolGuid
, NULL
},
1563 {STRING_TOKEN(STR_NII_31
), &gEfiNetworkInterfaceIdentifierProtocolGuid_31
, NULL
},
1564 {STRING_TOKEN(STR_PXE_BC
), &gEfiPxeBaseCodeProtocolGuid
, NULL
},
1565 {STRING_TOKEN(STR_PXE_CB
), &gEfiPxeBaseCodeCallbackProtocolGuid
, NULL
},
1566 {STRING_TOKEN(STR_BIS
), &gEfiBisProtocolGuid
, NULL
},
1567 {STRING_TOKEN(STR_MNP_SB
), &gEfiManagedNetworkServiceBindingProtocolGuid
, NULL
},
1568 {STRING_TOKEN(STR_MNP
), &gEfiManagedNetworkProtocolGuid
, NULL
},
1569 {STRING_TOKEN(STR_ARP_SB
), &gEfiArpServiceBindingProtocolGuid
, NULL
},
1570 {STRING_TOKEN(STR_ARP
), &gEfiArpProtocolGuid
, NULL
},
1571 {STRING_TOKEN(STR_DHCPV4_SB
), &gEfiDhcp4ServiceBindingProtocolGuid
, NULL
},
1572 {STRING_TOKEN(STR_DHCPV4
), &gEfiDhcp4ProtocolGuid
, NULL
},
1573 {STRING_TOKEN(STR_TCPV4_SB
), &gEfiTcp4ServiceBindingProtocolGuid
, NULL
},
1574 {STRING_TOKEN(STR_TCPV4
), &gEfiTcp4ProtocolGuid
, NULL
},
1575 {STRING_TOKEN(STR_IPV4_SB
), &gEfiIp4ServiceBindingProtocolGuid
, NULL
},
1576 {STRING_TOKEN(STR_IPV4
), &gEfiIp4ProtocolGuid
, NULL
},
1577 {STRING_TOKEN(STR_IPV4_CFG
), &gEfiIp4ConfigProtocolGuid
, NULL
},
1578 {STRING_TOKEN(STR_IPV4_CFG2
), &gEfiIp4Config2ProtocolGuid
, NULL
},
1579 {STRING_TOKEN(STR_UDPV4_SB
), &gEfiUdp4ServiceBindingProtocolGuid
, NULL
},
1580 {STRING_TOKEN(STR_UDPV4
), &gEfiUdp4ProtocolGuid
, NULL
},
1581 {STRING_TOKEN(STR_MTFTPV4_SB
), &gEfiMtftp4ServiceBindingProtocolGuid
, NULL
},
1582 {STRING_TOKEN(STR_MTFTPV4
), &gEfiMtftp4ProtocolGuid
, NULL
},
1583 {STRING_TOKEN(STR_AUTH_INFO
), &gEfiAuthenticationInfoProtocolGuid
, NULL
},
1584 {STRING_TOKEN(STR_HASH_SB
), &gEfiHashServiceBindingProtocolGuid
, NULL
},
1585 {STRING_TOKEN(STR_HASH
), &gEfiHashProtocolGuid
, NULL
},
1586 {STRING_TOKEN(STR_HII_FONT
), &gEfiHiiFontProtocolGuid
, NULL
},
1587 {STRING_TOKEN(STR_HII_STRING
), &gEfiHiiStringProtocolGuid
, NULL
},
1588 {STRING_TOKEN(STR_HII_IMAGE
), &gEfiHiiImageProtocolGuid
, NULL
},
1589 {STRING_TOKEN(STR_HII_DATABASE
), &gEfiHiiDatabaseProtocolGuid
, NULL
},
1590 {STRING_TOKEN(STR_HII_CONFIG_ROUT
), &gEfiHiiConfigRoutingProtocolGuid
, NULL
},
1591 {STRING_TOKEN(STR_HII_CONFIG_ACC
), &gEfiHiiConfigAccessProtocolGuid
, NULL
},
1592 {STRING_TOKEN(STR_HII_FORM_BROWSER2
), &gEfiFormBrowser2ProtocolGuid
, NULL
},
1593 {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE
), &gEfiDriverFamilyOverrideProtocolGuid
, NULL
},
1594 {STRING_TOKEN(STR_PCD
), &gPcdProtocolGuid
, NULL
},
1595 {STRING_TOKEN(STR_TCG
), &gEfiTcgProtocolGuid
, NULL
},
1596 {STRING_TOKEN(STR_HII_PACKAGE_LIST
), &gEfiHiiPackageListProtocolGuid
, NULL
},
1599 // the ones under this are deprecated by the current UEFI Spec, but may be found anyways...
1601 {STRING_TOKEN(STR_SHELL_INTERFACE
), &gEfiShellInterfaceGuid
, NULL
},
1602 {STRING_TOKEN(STR_SHELL_ENV2
), &gEfiShellEnvironment2Guid
, NULL
},
1603 {STRING_TOKEN(STR_SHELL_ENV
), &gEfiShellEnvironment2Guid
, NULL
},
1604 {STRING_TOKEN(STR_DEVICE_IO
), &gEfiDeviceIoProtocolGuid
, NULL
},
1605 {STRING_TOKEN(STR_UGA_DRAW
), &gEfiUgaDrawProtocolGuid
, NULL
},
1606 {STRING_TOKEN(STR_UGA_IO
), &gEfiUgaIoProtocolGuid
, NULL
},
1607 {STRING_TOKEN(STR_ESP
), &gEfiPartTypeSystemPartGuid
, NULL
},
1608 {STRING_TOKEN(STR_GPT_NBR
), &gEfiPartTypeLegacyMbrGuid
, NULL
},
1609 {STRING_TOKEN(STR_DRIVER_CONFIG
), &gEfiDriverConfigurationProtocolGuid
, NULL
},
1610 {STRING_TOKEN(STR_DRIVER_CONFIG2
), &gEfiDriverConfiguration2ProtocolGuid
, NULL
},
1613 // these are using local (non-global) definitions to reduce package dependancy.
1615 {STRING_TOKEN(STR_ISA_IO
), (EFI_GUID
*)&EfiIsaIoProtocolGuid
, NULL
},
1616 {STRING_TOKEN(STR_ISA_ACPI
), (EFI_GUID
*)&EfiIsaAcpiProtocolGuid
, NULL
},
1619 // the ones under this are GUID identified structs, not protocols
1621 {STRING_TOKEN(STR_FILE_INFO
), &gEfiFileInfoGuid
, NULL
},
1622 {STRING_TOKEN(STR_FILE_SYS_INFO
), &gEfiFileSystemInfoGuid
, NULL
},
1625 // the ones under this are misc GUIDS.
1627 {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE
), &gEfiGlobalVariableGuid
, NULL
},
1632 {STRING_TOKEN(STR_IP6_SB
), &gEfiIp6ServiceBindingProtocolGuid
, NULL
},
1633 {STRING_TOKEN(STR_IP6
), &gEfiIp6ProtocolGuid
, NULL
},
1634 {STRING_TOKEN(STR_IP6_CONFIG
), &gEfiIp6ConfigProtocolGuid
, NULL
},
1635 {STRING_TOKEN(STR_MTFTP6_SB
), &gEfiMtftp6ServiceBindingProtocolGuid
, NULL
},
1636 {STRING_TOKEN(STR_MTFTP6
), &gEfiMtftp6ProtocolGuid
, NULL
},
1637 {STRING_TOKEN(STR_DHCP6_SB
), &gEfiDhcp6ServiceBindingProtocolGuid
, NULL
},
1638 {STRING_TOKEN(STR_DHCP6
), &gEfiDhcp6ProtocolGuid
, NULL
},
1639 {STRING_TOKEN(STR_UDP6_SB
), &gEfiUdp6ServiceBindingProtocolGuid
, NULL
},
1640 {STRING_TOKEN(STR_UDP6
), &gEfiUdp6ProtocolGuid
, NULL
},
1641 {STRING_TOKEN(STR_TCP6_SB
), &gEfiTcp6ServiceBindingProtocolGuid
, NULL
},
1642 {STRING_TOKEN(STR_TCP6
), &gEfiTcp6ProtocolGuid
, NULL
},
1643 {STRING_TOKEN(STR_VLAN_CONFIG
), &gEfiVlanConfigProtocolGuid
, NULL
},
1644 {STRING_TOKEN(STR_EAP
), &gEfiEapProtocolGuid
, NULL
},
1645 {STRING_TOKEN(STR_EAP_MGMT
), &gEfiEapManagementProtocolGuid
, NULL
},
1646 {STRING_TOKEN(STR_FTP4_SB
), &gEfiFtp4ServiceBindingProtocolGuid
, NULL
},
1647 {STRING_TOKEN(STR_FTP4
), &gEfiFtp4ProtocolGuid
, NULL
},
1648 {STRING_TOKEN(STR_IP_SEC_CONFIG
), &gEfiIpSecConfigProtocolGuid
, NULL
},
1649 {STRING_TOKEN(STR_DH
), &gEfiDriverHealthProtocolGuid
, NULL
},
1650 {STRING_TOKEN(STR_DEF_IMG_LOAD
), &gEfiDeferredImageLoadProtocolGuid
, NULL
},
1651 {STRING_TOKEN(STR_USER_CRED
), &gEfiUserCredentialProtocolGuid
, NULL
},
1652 {STRING_TOKEN(STR_USER_MNGR
), &gEfiUserManagerProtocolGuid
, NULL
},
1653 {STRING_TOKEN(STR_ATA_PASS_THRU
), &gEfiAtaPassThruProtocolGuid
, NULL
},
1658 {STRING_TOKEN(STR_FW_MGMT
), &gEfiFirmwareManagementProtocolGuid
, FirmwareManagementDumpInformation
},
1659 {STRING_TOKEN(STR_IP_SEC
), &gEfiIpSecProtocolGuid
, NULL
},
1660 {STRING_TOKEN(STR_IP_SEC2
), &gEfiIpSec2ProtocolGuid
, NULL
},
1665 {STRING_TOKEN(STR_KMS
), &gEfiKmsProtocolGuid
, NULL
},
1666 {STRING_TOKEN(STR_BLK_IO2
), &gEfiBlockIo2ProtocolGuid
, NULL
},
1667 {STRING_TOKEN(STR_SSC
), &gEfiStorageSecurityCommandProtocolGuid
, NULL
},
1668 {STRING_TOKEN(STR_UCRED2
), &gEfiUserCredential2ProtocolGuid
, NULL
},
1673 {STRING_TOKEN(STR_DISK_IO2
), &gEfiDiskIo2ProtocolGuid
, NULL
},
1674 {STRING_TOKEN(STR_ADAPTER_INFO
), &gEfiAdapterInformationProtocolGuid
, AdapterInformationDumpInformation
},
1679 {STRING_TOKEN(STR_IDE_CONT_INIT
), &gEfiIdeControllerInitProtocolGuid
, NULL
},
1680 {STRING_TOKEN(STR_DISK_INFO
), &gEfiDiskInfoProtocolGuid
, NULL
},
1685 {STRING_TOKEN(STR_BDS_ARCH
), &gEfiBdsArchProtocolGuid
, NULL
},
1686 {STRING_TOKEN(STR_CPU_ARCH
), &gEfiCpuArchProtocolGuid
, NULL
},
1687 {STRING_TOKEN(STR_MET_ARCH
), &gEfiMetronomeArchProtocolGuid
, NULL
},
1688 {STRING_TOKEN(STR_MON_ARCH
), &gEfiMonotonicCounterArchProtocolGuid
, NULL
},
1689 {STRING_TOKEN(STR_RTC_ARCH
), &gEfiRealTimeClockArchProtocolGuid
, NULL
},
1690 {STRING_TOKEN(STR_RESET_ARCH
), &gEfiResetArchProtocolGuid
, NULL
},
1691 {STRING_TOKEN(STR_RT_ARCH
), &gEfiRuntimeArchProtocolGuid
, NULL
},
1692 {STRING_TOKEN(STR_SEC_ARCH
), &gEfiSecurityArchProtocolGuid
, NULL
},
1693 {STRING_TOKEN(STR_TIMER_ARCH
), &gEfiTimerArchProtocolGuid
, NULL
},
1694 {STRING_TOKEN(STR_VAR_ARCH
), &gEfiVariableWriteArchProtocolGuid
, NULL
},
1695 {STRING_TOKEN(STR_V_ARCH
), &gEfiVariableArchProtocolGuid
, NULL
},
1696 {STRING_TOKEN(STR_SECP
), &gEfiSecurityPolicyProtocolGuid
, NULL
},
1697 {STRING_TOKEN(STR_WDT_ARCH
), &gEfiWatchdogTimerArchProtocolGuid
, NULL
},
1698 {STRING_TOKEN(STR_SCR
), &gEfiStatusCodeRuntimeProtocolGuid
, NULL
},
1699 {STRING_TOKEN(STR_SMB_HC
), &gEfiSmbusHcProtocolGuid
, NULL
},
1700 {STRING_TOKEN(STR_FV_2
), &gEfiFirmwareVolume2ProtocolGuid
, NULL
},
1701 {STRING_TOKEN(STR_FV_BLOCK
), &gEfiFirmwareVolumeBlockProtocolGuid
, NULL
},
1702 {STRING_TOKEN(STR_CAP_ARCH
), &gEfiCapsuleArchProtocolGuid
, NULL
},
1703 {STRING_TOKEN(STR_MP_SERVICE
), &gEfiMpServiceProtocolGuid
, NULL
},
1704 {STRING_TOKEN(STR_HBRAP
), &gEfiPciHostBridgeResourceAllocationProtocolGuid
, NULL
},
1705 {STRING_TOKEN(STR_PCIP
), &gEfiPciPlatformProtocolGuid
, NULL
},
1706 {STRING_TOKEN(STR_PCIO
), &gEfiPciOverrideProtocolGuid
, NULL
},
1707 {STRING_TOKEN(STR_PCIE
), &gEfiPciEnumerationCompleteProtocolGuid
, NULL
},
1708 {STRING_TOKEN(STR_IPCID
), &gEfiIncompatiblePciDeviceSupportProtocolGuid
, NULL
},
1709 {STRING_TOKEN(STR_PCIHPI
), &gEfiPciHotPlugInitProtocolGuid
, NULL
},
1710 {STRING_TOKEN(STR_PCIHPR
), &gEfiPciHotPlugRequestProtocolGuid
, NULL
},
1711 {STRING_TOKEN(STR_SMBIOS
), &gEfiSmbiosProtocolGuid
, NULL
},
1712 {STRING_TOKEN(STR_S3_SAVE
), &gEfiS3SaveStateProtocolGuid
, NULL
},
1713 {STRING_TOKEN(STR_S3_S_SMM
), &gEfiS3SmmSaveStateProtocolGuid
, NULL
},
1714 {STRING_TOKEN(STR_RSC
), &gEfiRscHandlerProtocolGuid
, NULL
},
1715 {STRING_TOKEN(STR_S_RSC
), &gEfiSmmRscHandlerProtocolGuid
, NULL
},
1716 {STRING_TOKEN(STR_ACPI_SDT
), &gEfiAcpiSdtProtocolGuid
, NULL
},
1717 {STRING_TOKEN(STR_SIO
), &gEfiSioProtocolGuid
, NULL
},
1718 {STRING_TOKEN(STR_S_CPU2
), &gEfiSmmCpuIo2ProtocolGuid
, NULL
},
1719 {STRING_TOKEN(STR_S_BASE2
), &gEfiSmmBase2ProtocolGuid
, NULL
},
1720 {STRING_TOKEN(STR_S_ACC_2
), &gEfiSmmAccess2ProtocolGuid
, NULL
},
1721 {STRING_TOKEN(STR_S_CON_2
), &gEfiSmmControl2ProtocolGuid
, NULL
},
1722 {STRING_TOKEN(STR_S_CONFIG
), &gEfiSmmConfigurationProtocolGuid
, NULL
},
1723 {STRING_TOKEN(STR_S_RTL
), &gEfiSmmReadyToLockProtocolGuid
, NULL
},
1724 {STRING_TOKEN(STR_DS_RTL
), &gEfiDxeSmmReadyToLockProtocolGuid
, NULL
},
1725 {STRING_TOKEN(STR_S_COMM
), &gEfiSmmCommunicationProtocolGuid
, NULL
},
1726 {STRING_TOKEN(STR_S_STAT
), &gEfiSmmStatusCodeProtocolGuid
, NULL
},
1727 {STRING_TOKEN(STR_S_CPU
), &gEfiSmmCpuProtocolGuid
, NULL
},
1728 {STRING_TOKEN(STR_S_PCIRBIO
), &gEfiPciRootBridgeIoProtocolGuid
, NULL
},
1729 {STRING_TOKEN(STR_S_SWD
), &gEfiSmmSwDispatch2ProtocolGuid
, NULL
},
1730 {STRING_TOKEN(STR_S_SXD
), &gEfiSmmSxDispatch2ProtocolGuid
, NULL
},
1731 {STRING_TOKEN(STR_S_PTD2
), &gEfiSmmPeriodicTimerDispatch2ProtocolGuid
, NULL
},
1732 {STRING_TOKEN(STR_S_UD2
), &gEfiSmmUsbDispatch2ProtocolGuid
, NULL
},
1733 {STRING_TOKEN(STR_S_GD2
), &gEfiSmmGpiDispatch2ProtocolGuid
, NULL
},
1734 {STRING_TOKEN(STR_S_SBD2
), &gEfiSmmStandbyButtonDispatch2ProtocolGuid
, NULL
},
1735 {STRING_TOKEN(STR_S_PBD2
), &gEfiSmmPowerButtonDispatch2ProtocolGuid
, NULL
},
1736 {STRING_TOKEN(STR_S_ITD2
), &gEfiSmmIoTrapDispatch2ProtocolGuid
, NULL
},
1737 {STRING_TOKEN(STR_PCD
), &gEfiPcdProtocolGuid
, NULL
},
1738 {STRING_TOKEN(STR_FVB2
), &gEfiFirmwareVolumeBlock2ProtocolGuid
, NULL
},
1739 {STRING_TOKEN(STR_CPUIO2
), &gEfiCpuIo2ProtocolGuid
, NULL
},
1740 {STRING_TOKEN(STR_LEGACY_R2
), &gEfiLegacyRegion2ProtocolGuid
, NULL
},
1741 {STRING_TOKEN(STR_SAL_MIP
), &gEfiSalMcaInitPmiProtocolGuid
, NULL
},
1742 {STRING_TOKEN(STR_ES_BS
), &gEfiExtendedSalBootServiceProtocolGuid
, NULL
},
1743 {STRING_TOKEN(STR_ES_BIO
), &gEfiExtendedSalBaseIoServicesProtocolGuid
, NULL
},
1744 {STRING_TOKEN(STR_ES_STALL
), &gEfiExtendedSalStallServicesProtocolGuid
, NULL
},
1745 {STRING_TOKEN(STR_ES_RTC
), &gEfiExtendedSalRtcServicesProtocolGuid
, NULL
},
1746 {STRING_TOKEN(STR_ES_VS
), &gEfiExtendedSalVariableServicesProtocolGuid
, NULL
},
1747 {STRING_TOKEN(STR_ES_MTC
), &gEfiExtendedSalMtcServicesProtocolGuid
, NULL
},
1748 {STRING_TOKEN(STR_ES_RESET
), &gEfiExtendedSalResetServicesProtocolGuid
, NULL
},
1749 {STRING_TOKEN(STR_ES_SC
), &gEfiExtendedSalStatusCodeServicesProtocolGuid
, NULL
},
1750 {STRING_TOKEN(STR_ES_FBS
), &gEfiExtendedSalFvBlockServicesProtocolGuid
, NULL
},
1751 {STRING_TOKEN(STR_ES_MP
), &gEfiExtendedSalMpServicesProtocolGuid
, NULL
},
1752 {STRING_TOKEN(STR_ES_PAL
), &gEfiExtendedSalPalServicesProtocolGuid
, NULL
},
1753 {STRING_TOKEN(STR_ES_BASE
), &gEfiExtendedSalBaseServicesProtocolGuid
, NULL
},
1754 {STRING_TOKEN(STR_ES_MCA
), &gEfiExtendedSalMcaServicesProtocolGuid
, NULL
},
1755 {STRING_TOKEN(STR_ES_PCI
), &gEfiExtendedSalPciServicesProtocolGuid
, NULL
},
1756 {STRING_TOKEN(STR_ES_CACHE
), &gEfiExtendedSalCacheServicesProtocolGuid
, NULL
},
1757 {STRING_TOKEN(STR_ES_MCA_LOG
), &gEfiExtendedSalMcaLogServicesProtocolGuid
, NULL
},
1758 {STRING_TOKEN(STR_S2ARCH
), &gEfiSecurity2ArchProtocolGuid
, NULL
},
1759 {STRING_TOKEN(STR_EODXE
), &gEfiSmmEndOfDxeProtocolGuid
, NULL
},
1760 {STRING_TOKEN(STR_ISAHC
), &gEfiIsaHcProtocolGuid
, NULL
},
1761 {STRING_TOKEN(STR_ISAHC_B
), &gEfiIsaHcServiceBindingProtocolGuid
, NULL
},
1762 {STRING_TOKEN(STR_SIO_C
), &gEfiSioControlProtocolGuid
, NULL
},
1763 {STRING_TOKEN(STR_GET_PCD
), &gEfiGetPcdInfoProtocolGuid
, NULL
},
1764 {STRING_TOKEN(STR_I2C_M
), &gEfiI2cMasterProtocolGuid
, NULL
},
1765 {STRING_TOKEN(STR_I2CIO
), &gEfiI2cIoProtocolGuid
, NULL
},
1766 {STRING_TOKEN(STR_I2CEN
), &gEfiI2cEnumerateProtocolGuid
, NULL
},
1767 {STRING_TOKEN(STR_I2C_H
), &gEfiI2cHostProtocolGuid
, NULL
},
1768 {STRING_TOKEN(STR_I2C_BCM
), &gEfiI2cBusConfigurationManagementProtocolGuid
, NULL
},
1769 {STRING_TOKEN(STR_TREE
), &gEfiTrEEProtocolGuid
, NULL
},
1770 {STRING_TOKEN(STR_TCG2
), &gEfiTcg2ProtocolGuid
, NULL
},
1771 {STRING_TOKEN(STR_TIMESTAMP
), &gEfiTimestampProtocolGuid
, NULL
},
1772 {STRING_TOKEN(STR_RNG
), &gEfiRngProtocolGuid
, NULL
},
1773 {STRING_TOKEN(STR_NVMEPT
), &gEfiNvmExpressPassThruProtocolGuid
, NULL
},
1774 {STRING_TOKEN(STR_H2_SB
), &gEfiHash2ServiceBindingProtocolGuid
, NULL
},
1775 {STRING_TOKEN(STR_HASH2
), &gEfiHash2ProtocolGuid
, NULL
},
1776 {STRING_TOKEN(STR_BIO_C
), &gEfiBlockIoCryptoProtocolGuid
, NULL
},
1777 {STRING_TOKEN(STR_SCR
), &gEfiSmartCardReaderProtocolGuid
, NULL
},
1778 {STRING_TOKEN(STR_SCE
), &gEfiSmartCardEdgeProtocolGuid
, NULL
},
1779 {STRING_TOKEN(STR_USB_FIO
), &gEfiUsbFunctionIoProtocolGuid
, NULL
},
1780 {STRING_TOKEN(STR_BC_HC
), &gEfiBluetoothHcProtocolGuid
, NULL
},
1781 {STRING_TOKEN(STR_BC_IO_SB
), &gEfiBluetoothIoServiceBindingProtocolGuid
, NULL
},
1782 {STRING_TOKEN(STR_BC_IO
), &gEfiBluetoothIoProtocolGuid
, NULL
},
1783 {STRING_TOKEN(STR_BC_C
), &gEfiBluetoothConfigProtocolGuid
, NULL
},
1784 {STRING_TOKEN(STR_REG_EXP
), &gEfiRegularExpressionProtocolGuid
, NULL
},
1785 {STRING_TOKEN(STR_B_MGR_P
), &gEfiBootManagerPolicyProtocolGuid
, NULL
},
1786 {STRING_TOKEN(STR_CKH
), &gEfiConfigKeywordHandlerProtocolGuid
, NULL
},
1787 {STRING_TOKEN(STR_WIFI
), &gEfiWiFiProtocolGuid
, NULL
},
1788 {STRING_TOKEN(STR_EAP_M
), &gEfiEapManagement2ProtocolGuid
, NULL
},
1789 {STRING_TOKEN(STR_EAP_C
), &gEfiEapConfigurationProtocolGuid
, NULL
},
1790 {STRING_TOKEN(STR_PKCS7
), &gEfiPkcs7VerifyProtocolGuid
, NULL
},
1791 {STRING_TOKEN(STR_NET_DNS4_SB
), &gEfiDns4ServiceBindingProtocolGuid
, NULL
},
1792 {STRING_TOKEN(STR_NET_DNS4
), &gEfiDns4ProtocolGuid
, NULL
},
1793 {STRING_TOKEN(STR_NET_DNS6_SB
), &gEfiDns6ServiceBindingProtocolGuid
, NULL
},
1794 {STRING_TOKEN(STR_NET_DNS6
), &gEfiDns6ProtocolGuid
, NULL
},
1795 {STRING_TOKEN(STR_NET_HTTP_SB
), &gEfiHttpServiceBindingProtocolGuid
, NULL
},
1796 {STRING_TOKEN(STR_NET_HTTP
), &gEfiHttpProtocolGuid
, NULL
},
1797 {STRING_TOKEN(STR_NET_HTTP_U
), &gEfiHttpUtilitiesProtocolGuid
, NULL
},
1798 {STRING_TOKEN(STR_REST
), &gEfiRestProtocolGuid
, NULL
},
1801 // UEFI Shell Spec 2.0
1803 {STRING_TOKEN(STR_SHELL_PARAMETERS
), &gEfiShellParametersProtocolGuid
, NULL
},
1804 {STRING_TOKEN(STR_SHELL
), &gEfiShellProtocolGuid
, NULL
},
1807 // UEFI Shell Spec 2.1
1809 {STRING_TOKEN(STR_SHELL_DYNAMIC
), &gEfiShellDynamicCommandProtocolGuid
, NULL
},
1814 {STRING_TOKEN(STR_PCDINFOPROT
), &gGetPcdInfoProtocolGuid
, NULL
},
1819 {STRING_TOKEN(STR_UNKNOWN_DEVICE
), NULL
, NULL
},
1823 Function to get the node for a protocol or struct from it's GUID.
1825 if Guid is NULL, then ASSERT.
1827 @param[in] Guid The GUID to look for the name of.
1831 CONST GUID_INFO_BLOCK
*
1832 InternalShellGetNodeFromGuid(
1833 IN CONST EFI_GUID
* Guid
1836 CONST GUID_INFO_BLOCK
*ListWalker
;
1839 ASSERT(Guid
!= NULL
);
1841 for (LoopCount
= 0, ListWalker
= mGuidList
; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++, ListWalker
++) {
1842 if (CompareGuid(ListWalker
->GuidId
, Guid
)) {
1843 return (ListWalker
);
1847 if (PcdGetBool(PcdShellIncludeNtGuids
)) {
1848 for (ListWalker
= mGuidStringListNT
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
1849 if (CompareGuid(ListWalker
->GuidId
, Guid
)) {
1850 return (ListWalker
);
1854 for (ListWalker
= mGuidStringList
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
1855 if (CompareGuid(ListWalker
->GuidId
, Guid
)) {
1856 return (ListWalker
);
1863 Function to add a new GUID/Name mapping.
1865 @param[in] Guid The Guid
1866 @param[in] NameID The STRING id of the HII string to use
1867 @param[in] DumpFunc The pointer to the dump function
1870 @retval EFI_SUCCESS The operation was sucessful
1871 @retval EFI_OUT_OF_RESOURCES A memory allocation failed
1872 @retval EFI_INVALID_PARAMETER Guid NameId was invalid
1875 InsertNewGuidNameMapping(
1876 IN CONST EFI_GUID
*Guid
,
1877 IN CONST EFI_STRING_ID NameID
,
1878 IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL
1881 ASSERT(Guid
!= NULL
);
1882 ASSERT(NameID
!= 0);
1884 mGuidList
= ReallocatePool(mGuidListCount
* sizeof(GUID_INFO_BLOCK
), mGuidListCount
+1 * sizeof(GUID_INFO_BLOCK
), mGuidList
);
1885 if (mGuidList
== NULL
) {
1887 return (EFI_OUT_OF_RESOURCES
);
1891 mGuidList
[mGuidListCount
- 1].GuidId
= AllocateCopyPool(sizeof(EFI_GUID
), Guid
);
1892 mGuidList
[mGuidListCount
- 1].StringId
= NameID
;
1893 mGuidList
[mGuidListCount
- 1].DumpInfo
= DumpFunc
;
1895 if (mGuidList
[mGuidListCount
- 1].GuidId
== NULL
) {
1896 return (EFI_OUT_OF_RESOURCES
);
1899 return (EFI_SUCCESS
);
1903 Function to add a new GUID/Name mapping.
1905 This cannot overwrite an existing mapping.
1907 @param[in] Guid The Guid
1908 @param[in] TheName The Guid's name
1909 @param[in] Lang RFC4646 language code list or NULL
1911 @retval EFI_SUCCESS The operation was sucessful
1912 @retval EFI_ACCESS_DENIED There was a duplicate
1913 @retval EFI_OUT_OF_RESOURCES A memory allocation failed
1914 @retval EFI_INVALID_PARAMETER Guid or TheName was NULL
1918 AddNewGuidNameMapping(
1919 IN CONST EFI_GUID
*Guid
,
1920 IN CONST CHAR16
*TheName
,
1921 IN CONST CHAR8
*Lang OPTIONAL
1924 EFI_STRING_ID NameID
;
1926 HandleParsingHiiInit();
1928 if (Guid
== NULL
|| TheName
== NULL
){
1929 return (EFI_INVALID_PARAMETER
);
1932 if ((InternalShellGetNodeFromGuid(Guid
)) != NULL
) {
1933 return (EFI_ACCESS_DENIED
);
1936 NameID
= HiiSetString(mHandleParsingHiiHandle
, 0, (CHAR16
*)TheName
, Lang
);
1938 return (EFI_OUT_OF_RESOURCES
);
1941 return (InsertNewGuidNameMapping(Guid
, NameID
, NULL
));
1945 Function to get the name of a protocol or struct from it's GUID.
1947 if Guid is NULL, then ASSERT.
1949 @param[in] Guid The GUID to look for the name of.
1950 @param[in] Lang The language to use.
1952 @return pointer to string of the name. The caller
1953 is responsible to free this memory.
1957 GetStringNameFromGuid(
1958 IN CONST EFI_GUID
*Guid
,
1959 IN CONST CHAR8
*Lang OPTIONAL
1962 CONST GUID_INFO_BLOCK
*Id
;
1964 HandleParsingHiiInit();
1966 Id
= InternalShellGetNodeFromGuid(Guid
);
1967 return (HiiGetString(mHandleParsingHiiHandle
, Id
==NULL
?STRING_TOKEN(STR_UNKNOWN_DEVICE
):Id
->StringId
, Lang
));
1971 Function to dump protocol information from a handle.
1973 This function will return a allocated string buffer containing the
1974 information. The caller is responsible for freeing the memory.
1976 If Guid is NULL, ASSERT().
1977 If TheHandle is NULL, ASSERT().
1979 @param[in] TheHandle The handle to dump information from.
1980 @param[in] Guid The GUID of the protocol to dump.
1981 @param[in] Verbose TRUE for extra info. FALSE otherwise.
1983 @return The pointer to string.
1984 @retval NULL An error was encountered.
1988 GetProtocolInformationDump(
1989 IN CONST EFI_HANDLE TheHandle
,
1990 IN CONST EFI_GUID
*Guid
,
1991 IN CONST BOOLEAN Verbose
1994 CONST GUID_INFO_BLOCK
*Id
;
1996 ASSERT(TheHandle
!= NULL
);
1997 ASSERT(Guid
!= NULL
);
1999 if (TheHandle
== NULL
|| Guid
== NULL
) {
2003 Id
= InternalShellGetNodeFromGuid(Guid
);
2004 if (Id
!= NULL
&& Id
->DumpInfo
!= NULL
) {
2005 return (Id
->DumpInfo(TheHandle
, Verbose
));
2011 Function to get the Guid for a protocol or struct based on it's string name.
2013 do not modify the returned Guid.
2015 @param[in] Name The pointer to the string name.
2016 @param[in] Lang The pointer to the language code.
2017 @param[out] Guid The pointer to the Guid.
2019 @retval EFI_SUCCESS The operation was sucessful.
2023 GetGuidFromStringName(
2024 IN CONST CHAR16
*Name
,
2025 IN CONST CHAR8
*Lang OPTIONAL
,
2029 CONST GUID_INFO_BLOCK
*ListWalker
;
2033 HandleParsingHiiInit();
2035 ASSERT(Guid
!= NULL
);
2037 return (EFI_INVALID_PARAMETER
);
2041 if (PcdGetBool(PcdShellIncludeNtGuids
)) {
2042 for (ListWalker
= mGuidStringListNT
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2043 String
= HiiGetString(mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2044 if (Name
!= NULL
&& String
!= NULL
&& StringNoCaseCompare (&Name
, &String
) == 0) {
2045 *Guid
= ListWalker
->GuidId
;
2047 SHELL_FREE_NON_NULL(String
);
2048 if (*Guid
!= NULL
) {
2049 return (EFI_SUCCESS
);
2053 for (ListWalker
= mGuidStringList
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2054 String
= HiiGetString(mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2055 if (Name
!= NULL
&& String
!= NULL
&& StringNoCaseCompare (&Name
, &String
) == 0) {
2056 *Guid
= ListWalker
->GuidId
;
2058 SHELL_FREE_NON_NULL(String
);
2059 if (*Guid
!= NULL
) {
2060 return (EFI_SUCCESS
);
2064 for (LoopCount
= 0, ListWalker
= mGuidList
; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++, ListWalker
++) {
2065 String
= HiiGetString(mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2066 if (Name
!= NULL
&& String
!= NULL
&& StringNoCaseCompare (&Name
, &String
) == 0) {
2067 *Guid
= ListWalker
->GuidId
;
2069 SHELL_FREE_NON_NULL(String
);
2070 if (*Guid
!= NULL
) {
2071 return (EFI_SUCCESS
);
2075 return (EFI_NOT_FOUND
);
2079 Get best support language for this driver.
2081 First base on the user input language to search, second base on the current
2082 platform used language to search, third get the first language from the
2083 support language list. The caller need to free the buffer of the best language.
2085 @param[in] SupportedLanguages The support languages for this driver.
2086 @param[in] InputLanguage The user input language.
2087 @param[in] Iso639Language Whether get language for ISO639.
2089 @return The best support language for this driver.
2093 GetBestLanguageForDriver (
2094 IN CONST CHAR8
*SupportedLanguages
,
2095 IN CONST CHAR8
*InputLanguage
,
2096 IN BOOLEAN Iso639Language
2099 CHAR8
*LanguageVariable
;
2100 CHAR8
*BestLanguage
;
2102 GetVariable2 (Iso639Language
? L
"Lang" : L
"PlatformLang", &gEfiGlobalVariableGuid
, (VOID
**)&LanguageVariable
, NULL
);
2104 BestLanguage
= GetBestLanguage(
2107 (InputLanguage
!= NULL
) ? InputLanguage
: "",
2108 (LanguageVariable
!= NULL
) ? LanguageVariable
: "",
2113 if (LanguageVariable
!= NULL
) {
2114 FreePool (LanguageVariable
);
2117 return BestLanguage
;
2121 Function to retrieve the driver name (if possible) from the ComponentName or
2122 ComponentName2 protocol
2124 @param[in] TheHandle The driver handle to get the name of.
2125 @param[in] Language The language to use.
2127 @retval NULL The name could not be found.
2128 @return A pointer to the string name. Do not de-allocate the memory.
2132 GetStringNameFromHandle(
2133 IN CONST EFI_HANDLE TheHandle
,
2134 IN CONST CHAR8
*Language
2137 EFI_COMPONENT_NAME2_PROTOCOL
*CompNameStruct
;
2144 Status
= gBS
->OpenProtocol(
2146 &gEfiComponentName2ProtocolGuid
,
2147 (VOID
**)&CompNameStruct
,
2150 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
2151 if (!EFI_ERROR(Status
)) {
2152 BestLang
= GetBestLanguageForDriver (CompNameStruct
->SupportedLanguages
, Language
, FALSE
);
2153 Status
= CompNameStruct
->GetDriverName(CompNameStruct
, BestLang
, &RetVal
);
2154 if (BestLang
!= NULL
) {
2155 FreePool (BestLang
);
2158 if (!EFI_ERROR(Status
)) {
2162 Status
= gBS
->OpenProtocol(
2164 &gEfiComponentNameProtocolGuid
,
2165 (VOID
**)&CompNameStruct
,
2168 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
2169 if (!EFI_ERROR(Status
)) {
2170 BestLang
= GetBestLanguageForDriver (CompNameStruct
->SupportedLanguages
, Language
, FALSE
);
2171 Status
= CompNameStruct
->GetDriverName(CompNameStruct
, BestLang
, &RetVal
);
2172 if (BestLang
!= NULL
) {
2173 FreePool (BestLang
);
2175 if (!EFI_ERROR(Status
)) {
2183 Function to initialize the file global mHandleList object for use in
2184 vonverting handles to index and index to handle.
2186 @retval EFI_SUCCESS The operation was successful.
2189 InternalShellInitHandleList(
2194 EFI_HANDLE
*HandleBuffer
;
2196 HANDLE_LIST
*ListWalker
;
2198 if (mHandleList
.NextIndex
!= 0) {
2201 InitializeListHead(&mHandleList
.List
.Link
);
2202 mHandleList
.NextIndex
= 1;
2203 Status
= gBS
->LocateHandleBuffer (
2210 ASSERT_EFI_ERROR(Status
);
2211 if (EFI_ERROR(Status
)) {
2214 for (mHandleList
.NextIndex
= 1 ; mHandleList
.NextIndex
<= HandleCount
; mHandleList
.NextIndex
++){
2215 ListWalker
= AllocateZeroPool(sizeof(HANDLE_LIST
));
2216 if (ListWalker
!= NULL
) {
2217 ListWalker
->TheHandle
= HandleBuffer
[mHandleList
.NextIndex
- 1];
2218 ListWalker
->TheIndex
= mHandleList
.NextIndex
;
2219 InsertTailList (&mHandleList
.List
.Link
, &ListWalker
->Link
);
2222 FreePool(HandleBuffer
);
2223 return (EFI_SUCCESS
);
2227 Function to retrieve the human-friendly index of a given handle. If the handle
2228 does not have a index one will be automatically assigned. The index value is valid
2229 until the termination of the shell application.
2231 @param[in] TheHandle The handle to retrieve an index for.
2233 @retval 0 A memory allocation failed.
2234 @return The index of the handle.
2239 ConvertHandleToHandleIndex(
2240 IN CONST EFI_HANDLE TheHandle
2244 EFI_GUID
**ProtocolBuffer
;
2245 UINTN ProtocolCount
;
2246 HANDLE_LIST
*ListWalker
;
2248 if (TheHandle
== NULL
) {
2252 InternalShellInitHandleList();
2254 for (ListWalker
= (HANDLE_LIST
*)GetFirstNode(&mHandleList
.List
.Link
)
2255 ; !IsNull(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2256 ; ListWalker
= (HANDLE_LIST
*)GetNextNode(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2258 if (ListWalker
->TheHandle
== TheHandle
) {
2260 // Verify that TheHandle is still present in the Handle Database
2262 Status
= gBS
->ProtocolsPerHandle(TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2263 if (EFI_ERROR (Status
)) {
2265 // TheHandle is not present in the Handle Database, so delete from the handle list
2267 RemoveEntryList (&ListWalker
->Link
);
2270 FreePool (ProtocolBuffer
);
2271 return (ListWalker
->TheIndex
);
2276 // Verify that TheHandle is valid handle
2278 Status
= gBS
->ProtocolsPerHandle(TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2279 if (EFI_ERROR (Status
)) {
2281 // TheHandle is not valid, so do not add to handle list
2285 FreePool (ProtocolBuffer
);
2287 ListWalker
= AllocateZeroPool(sizeof(HANDLE_LIST
));
2288 if (ListWalker
== NULL
) {
2291 ListWalker
->TheHandle
= TheHandle
;
2292 ListWalker
->TheIndex
= mHandleList
.NextIndex
++;
2293 InsertTailList(&mHandleList
.List
.Link
,&ListWalker
->Link
);
2294 return (ListWalker
->TheIndex
);
2300 Function to retrieve the EFI_HANDLE from the human-friendly index.
2302 @param[in] TheIndex The index to retrieve the EFI_HANDLE for.
2304 @retval NULL The index was invalid.
2305 @return The EFI_HANDLE that index represents.
2310 ConvertHandleIndexToHandle(
2311 IN CONST UINTN TheIndex
2315 EFI_GUID
**ProtocolBuffer
;
2316 UINTN ProtocolCount
;
2317 HANDLE_LIST
*ListWalker
;
2319 InternalShellInitHandleList();
2321 if (TheIndex
>= mHandleList
.NextIndex
) {
2325 for (ListWalker
= (HANDLE_LIST
*)GetFirstNode(&mHandleList
.List
.Link
)
2326 ; !IsNull(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2327 ; ListWalker
= (HANDLE_LIST
*)GetNextNode(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2329 if (ListWalker
->TheIndex
== TheIndex
&& ListWalker
->TheHandle
!= NULL
) {
2331 // Verify that LinkWalker->TheHandle is valid handle
2333 Status
= gBS
->ProtocolsPerHandle(ListWalker
->TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2334 if (EFI_ERROR (Status
)) {
2336 // TheHandle is not valid, so do not add to handle list
2338 ListWalker
->TheHandle
= NULL
;
2340 return (ListWalker
->TheHandle
);
2347 Gets all the related EFI_HANDLEs based on the mask supplied.
2349 This function scans all EFI_HANDLES in the UEFI environment's handle database
2350 and returns the ones with the specified relationship (Mask) to the specified
2353 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
2354 If MatchingHandleCount is NULL, then ASSERT.
2356 If MatchingHandleBuffer is not NULL upon a successful return the memory must be
2359 @param[in] DriverBindingHandle The handle with Driver Binding protocol on it.
2360 @param[in] ControllerHandle The handle with Device Path protocol on it.
2361 @param[in] MatchingHandleCount The pointer to UINTN that specifies the number of HANDLES in
2362 MatchingHandleBuffer.
2363 @param[out] MatchingHandleBuffer On a successful return, a buffer of MatchingHandleCount
2364 EFI_HANDLEs with a terminating NULL EFI_HANDLE.
2365 @param[out] HandleType An array of type information.
2367 @retval EFI_SUCCESS The operation was successful, and any related handles
2368 are in MatchingHandleBuffer.
2369 @retval EFI_NOT_FOUND No matching handles were found.
2370 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.
2374 ParseHandleDatabaseByRelationshipWithType (
2375 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL
,
2376 IN CONST EFI_HANDLE ControllerHandle OPTIONAL
,
2377 IN UINTN
*HandleCount
,
2378 OUT EFI_HANDLE
**HandleBuffer
,
2379 OUT UINTN
**HandleType
2384 EFI_GUID
**ProtocolGuidArray
;
2386 UINTN ProtocolIndex
;
2387 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
*OpenInfo
;
2388 UINTN OpenInfoCount
;
2389 UINTN OpenInfoIndex
;
2391 INTN DriverBindingHandleIndex
;
2393 ASSERT(HandleCount
!= NULL
);
2394 ASSERT(HandleBuffer
!= NULL
);
2395 ASSERT(HandleType
!= NULL
);
2396 ASSERT(DriverBindingHandle
!= NULL
|| ControllerHandle
!= NULL
);
2399 *HandleBuffer
= NULL
;
2403 // Retrieve the list of all handles from the handle database
2405 Status
= gBS
->LocateHandleBuffer (
2412 if (EFI_ERROR (Status
)) {
2416 *HandleType
= AllocateZeroPool (*HandleCount
* sizeof (UINTN
));
2417 if (*HandleType
== NULL
) {
2418 SHELL_FREE_NON_NULL (*HandleBuffer
);
2420 return EFI_OUT_OF_RESOURCES
;
2423 DriverBindingHandleIndex
= -1;
2424 for (HandleIndex
= 0; HandleIndex
< *HandleCount
; HandleIndex
++) {
2425 if (DriverBindingHandle
!= NULL
&& (*HandleBuffer
)[HandleIndex
] == DriverBindingHandle
) {
2426 DriverBindingHandleIndex
= (INTN
)HandleIndex
;
2430 for (HandleIndex
= 0; HandleIndex
< *HandleCount
; HandleIndex
++) {
2432 // Retrieve the list of all the protocols on each handle
2434 Status
= gBS
->ProtocolsPerHandle (
2435 (*HandleBuffer
)[HandleIndex
],
2439 if (EFI_ERROR (Status
)) {
2443 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
2446 // Set the bit describing what this handle has
2448 if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiLoadedImageProtocolGuid
) ) {
2449 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_IMAGE_HANDLE
;
2450 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverBindingProtocolGuid
) ) {
2451 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_BINDING_HANDLE
;
2452 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverConfiguration2ProtocolGuid
)) {
2453 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_CONFIGURATION_HANDLE
;
2454 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverConfigurationProtocolGuid
) ) {
2455 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_CONFIGURATION_HANDLE
;
2456 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverDiagnostics2ProtocolGuid
) ) {
2457 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_DIAGNOSTICS_HANDLE
;
2458 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverDiagnosticsProtocolGuid
) ) {
2459 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_DIAGNOSTICS_HANDLE
;
2460 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiComponentName2ProtocolGuid
) ) {
2461 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_COMPONENT_NAME_HANDLE
;
2462 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiComponentNameProtocolGuid
) ) {
2463 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_COMPONENT_NAME_HANDLE
;
2464 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDevicePathProtocolGuid
) ) {
2465 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DEVICE_HANDLE
;
2468 // Retrieve the list of agents that have opened each protocol
2470 Status
= gBS
->OpenProtocolInformation (
2471 (*HandleBuffer
)[HandleIndex
],
2472 ProtocolGuidArray
[ProtocolIndex
],
2476 if (EFI_ERROR (Status
)) {
2480 if (ControllerHandle
== NULL
) {
2482 // ControllerHandle == NULL and DriverBindingHandle != NULL.
2483 // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing
2485 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2486 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
&& (OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
2487 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2488 if (DriverBindingHandleIndex
!= -1) {
2489 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
2492 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
&& (OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2493 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2494 if (DriverBindingHandleIndex
!= -1) {
2495 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
2497 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2498 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
2499 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
2505 if (DriverBindingHandle
== NULL
&& ControllerHandle
!= NULL
) {
2506 if (ControllerHandle
== (*HandleBuffer
)[HandleIndex
]) {
2507 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2508 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2509 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
2510 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2511 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
2512 (*HandleType
)[ChildIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
2516 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2517 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2518 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
2519 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
2521 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
2522 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
2528 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2529 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2530 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== ControllerHandle
) {
2531 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_PARENT_HANDLE
);
2537 if (DriverBindingHandle
!= NULL
&& ControllerHandle
!= NULL
) {
2538 if (ControllerHandle
== (*HandleBuffer
)[HandleIndex
]) {
2539 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2540 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2541 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
2542 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) {
2543 if (DriverBindingHandleIndex
!= -1) {
2544 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
2548 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2549 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) {
2550 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2551 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
2552 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
2557 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2558 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
2559 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
2565 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2566 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2567 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== ControllerHandle
) {
2568 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_PARENT_HANDLE
);
2574 FreePool (OpenInfo
);
2576 FreePool (ProtocolGuidArray
);
2582 Gets all the related EFI_HANDLEs based on the single EFI_HANDLE and the mask
2585 This function will scan all EFI_HANDLES in the UEFI environment's handle database
2586 and return all the ones with the specified relationship (Mask) to the specified
2589 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
2590 If MatchingHandleCount is NULL, then ASSERT.
2592 If MatchingHandleBuffer is not NULL upon a sucessful return the memory must be
2595 @param[in] DriverBindingHandle Handle to a object with Driver Binding protocol
2597 @param[in] ControllerHandle Handle to a device with Device Path protocol on it.
2598 @param[in] Mask Mask of what relationship(s) is desired.
2599 @param[in] MatchingHandleCount Poitner to UINTN specifying number of HANDLES in
2600 MatchingHandleBuffer.
2601 @param[out] MatchingHandleBuffer On a sucessful return a buffer of MatchingHandleCount
2602 EFI_HANDLEs and a terminating NULL EFI_HANDLE.
2604 @retval EFI_SUCCESS The operation was sucessful and any related handles
2605 are in MatchingHandleBuffer;
2606 @retval EFI_NOT_FOUND No matching handles were found.
2607 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.
2611 ParseHandleDatabaseByRelationship (
2612 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL
,
2613 IN CONST EFI_HANDLE ControllerHandle OPTIONAL
,
2614 IN CONST UINTN Mask
,
2615 IN UINTN
*MatchingHandleCount
,
2616 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
2621 EFI_HANDLE
*HandleBuffer
;
2625 ASSERT(MatchingHandleCount
!= NULL
);
2626 ASSERT(DriverBindingHandle
!= NULL
|| ControllerHandle
!= NULL
);
2628 if ((Mask
& HR_VALID_MASK
) != Mask
) {
2629 return (EFI_INVALID_PARAMETER
);
2632 if ((Mask
& HR_CHILD_HANDLE
) != 0 && DriverBindingHandle
== NULL
) {
2633 return (EFI_INVALID_PARAMETER
);
2636 *MatchingHandleCount
= 0;
2637 if (MatchingHandleBuffer
!= NULL
) {
2638 *MatchingHandleBuffer
= NULL
;
2641 HandleBuffer
= NULL
;
2644 Status
= ParseHandleDatabaseByRelationshipWithType (
2645 DriverBindingHandle
,
2651 if (!EFI_ERROR (Status
)) {
2653 // Count the number of handles that match the attributes in Mask
2655 for (HandleIndex
= 0; HandleIndex
< HandleCount
; HandleIndex
++) {
2656 if ((HandleType
[HandleIndex
] & Mask
) == Mask
) {
2657 (*MatchingHandleCount
)++;
2661 // If no handles match the attributes in Mask then return EFI_NOT_FOUND
2663 if (*MatchingHandleCount
== 0) {
2664 Status
= EFI_NOT_FOUND
;
2667 if (MatchingHandleBuffer
== NULL
) {
2669 // Someone just wanted the count...
2671 Status
= EFI_SUCCESS
;
2674 // Allocate a handle buffer for the number of handles that matched the attributes in Mask
2676 *MatchingHandleBuffer
= AllocateZeroPool ((*MatchingHandleCount
+1)* sizeof (EFI_HANDLE
));
2677 if (*MatchingHandleBuffer
== NULL
) {
2678 Status
= EFI_OUT_OF_RESOURCES
;
2680 for (HandleIndex
= 0, *MatchingHandleCount
= 0
2681 ; HandleIndex
< HandleCount
2685 // Fill the allocated buffer with the handles that matched the attributes in Mask
2687 if ((HandleType
[HandleIndex
] & Mask
) == Mask
) {
2688 (*MatchingHandleBuffer
)[(*MatchingHandleCount
)++] = HandleBuffer
[HandleIndex
];
2693 // Make the last one NULL
2695 (*MatchingHandleBuffer
)[*MatchingHandleCount
] = NULL
;
2697 Status
= EFI_SUCCESS
;
2698 } // *MatchingHandleBuffer == NULL (ELSE)
2699 } // MacthingHandleBuffer == NULL (ELSE)
2700 } // *MatchingHandleCount == 0 (ELSE)
2701 } // no error on ParseHandleDatabaseByRelationshipWithType
2703 if (HandleBuffer
!= NULL
) {
2704 FreePool (HandleBuffer
);
2707 if (HandleType
!= NULL
) {
2708 FreePool (HandleType
);
2711 ASSERT ((MatchingHandleBuffer
== NULL
) ||
2712 (*MatchingHandleCount
== 0 && *MatchingHandleBuffer
== NULL
) ||
2713 (*MatchingHandleCount
!= 0 && *MatchingHandleBuffer
!= NULL
));
2718 Gets handles for any child controllers of the passed in controller.
2720 @param[in] ControllerHandle The handle of the "parent controller"
2721 @param[out] MatchingHandleCount Pointer to the number of handles in
2722 MatchingHandleBuffer on return.
2723 @param[out] MatchingHandleBuffer Buffer containing handles on a successful
2727 @retval EFI_SUCCESS The operation was sucessful.
2731 ParseHandleDatabaseForChildControllers(
2732 IN CONST EFI_HANDLE ControllerHandle
,
2733 OUT UINTN
*MatchingHandleCount
,
2734 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
2739 UINTN DriverBindingHandleCount
;
2740 EFI_HANDLE
*DriverBindingHandleBuffer
;
2741 UINTN DriverBindingHandleIndex
;
2742 UINTN ChildControllerHandleCount
;
2743 EFI_HANDLE
*ChildControllerHandleBuffer
;
2744 UINTN ChildControllerHandleIndex
;
2745 EFI_HANDLE
*HandleBufferForReturn
;
2747 if (MatchingHandleCount
== NULL
) {
2748 return (EFI_INVALID_PARAMETER
);
2750 *MatchingHandleCount
= 0;
2752 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
2754 &DriverBindingHandleCount
,
2755 &DriverBindingHandleBuffer
2757 if (EFI_ERROR (Status
)) {
2762 // Get a buffer big enough for all the controllers.
2764 HandleBufferForReturn
= GetHandleListByProtocol(NULL
);
2765 if (HandleBufferForReturn
== NULL
) {
2766 FreePool (DriverBindingHandleBuffer
);
2767 return (EFI_NOT_FOUND
);
2770 for (DriverBindingHandleIndex
= 0; DriverBindingHandleIndex
< DriverBindingHandleCount
; DriverBindingHandleIndex
++) {
2771 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
2772 DriverBindingHandleBuffer
[DriverBindingHandleIndex
],
2774 &ChildControllerHandleCount
,
2775 &ChildControllerHandleBuffer
2777 if (EFI_ERROR (Status
)) {
2781 for (ChildControllerHandleIndex
= 0;
2782 ChildControllerHandleIndex
< ChildControllerHandleCount
;
2783 ChildControllerHandleIndex
++
2785 for (HandleIndex
= 0; HandleIndex
< *MatchingHandleCount
; HandleIndex
++) {
2786 if (HandleBufferForReturn
[HandleIndex
] == ChildControllerHandleBuffer
[ChildControllerHandleIndex
]) {
2790 if (HandleIndex
>= *MatchingHandleCount
) {
2791 HandleBufferForReturn
[(*MatchingHandleCount
)++] = ChildControllerHandleBuffer
[ChildControllerHandleIndex
];
2795 FreePool (ChildControllerHandleBuffer
);
2798 FreePool (DriverBindingHandleBuffer
);
2800 if (MatchingHandleBuffer
== NULL
|| *MatchingHandleCount
== 0) {
2802 // The caller is not interested in the actual handles, or we've found none.
2804 FreePool (HandleBufferForReturn
);
2805 HandleBufferForReturn
= NULL
;
2808 if (MatchingHandleBuffer
!= NULL
) {
2809 *MatchingHandleBuffer
= HandleBufferForReturn
;
2812 ASSERT ((MatchingHandleBuffer
== NULL
) ||
2813 (*MatchingHandleCount
== 0 && *MatchingHandleBuffer
== NULL
) ||
2814 (*MatchingHandleCount
!= 0 && *MatchingHandleBuffer
!= NULL
));
2816 return (EFI_SUCCESS
);
2820 Appends 1 buffer to another buffer. This will re-allocate the destination buffer
2821 if necessary to fit all of the data.
2823 If DestinationBuffer is NULL, then ASSERT().
2825 @param[in, out] DestinationBuffer The pointer to the pointer to the buffer to append onto.
2826 @param[in, out] DestinationSize The pointer to the size of DestinationBuffer.
2827 @param[in] SourceBuffer The pointer to the buffer to append onto DestinationBuffer.
2828 @param[in] SourceSize The number of bytes of SourceBuffer to append.
2830 @retval NULL A memory allocation failed.
2831 @retval NULL A parameter was invalid.
2832 @return A pointer to (*DestinationBuffer).
2836 IN OUT VOID
**DestinationBuffer
,
2837 IN OUT UINTN
*DestinationSize
,
2838 IN VOID
*SourceBuffer
,
2842 UINTN LocalDestinationSize
;
2843 UINTN LocalDestinationFinalSize
;
2845 ASSERT(DestinationBuffer
!= NULL
);
2847 if (SourceSize
== 0 || SourceBuffer
== NULL
) {
2848 return (*DestinationBuffer
);
2851 if (DestinationSize
== NULL
) {
2852 LocalDestinationSize
= 0;
2854 LocalDestinationSize
= *DestinationSize
;
2857 LocalDestinationFinalSize
= LocalDestinationSize
+ SourceSize
;
2859 if (DestinationSize
!= NULL
) {
2860 *DestinationSize
= LocalDestinationSize
;