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 #include <Protocol/FirmwareVolume2.h>
22 EFI_HANDLE mHandleParsingHiiHandle
= NULL
;
23 HANDLE_INDEX_LIST mHandleList
= {{{NULL
,NULL
},0,0},0};
24 GUID_INFO_BLOCK
*mGuidList
;
28 Function to find the file name associated with a LoadedImageProtocol.
30 @param[in] LoadedImage An instance of LoadedImageProtocol.
32 @retval A string representation of the file name associated
33 with LoadedImage, or NULL if no name can be found.
36 FindLoadedImageFileName (
37 IN EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
42 EFI_FIRMWARE_VOLUME2_PROTOCOL
*Fv
;
45 UINT32 AuthenticationStatus
;
47 if ((LoadedImage
== NULL
) || (LoadedImage
->FilePath
== NULL
)) {
51 NameGuid
= EfiGetNameGuidFromFwVolDevicePathNode((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*)LoadedImage
->FilePath
);
53 if (NameGuid
== NULL
) {
58 // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.
60 Status
= gBS
->HandleProtocol (LoadedImage
->DeviceHandle
, &gEfiFirmwareVolume2ProtocolGuid
, (VOID
**) &Fv
);
63 // FirmwareVolume2Protocol is PI, and is not required to be available.
65 if (EFI_ERROR (Status
)) {
70 // Read the user interface section of the image.
73 Status
= Fv
->ReadSection(Fv
, NameGuid
, EFI_SECTION_USER_INTERFACE
, 0, &Buffer
, &BufferSize
, &AuthenticationStatus
);
75 if (EFI_ERROR (Status
)) {
80 // ReadSection returns just the section data, without any section header. For
81 // a user interface section, the only data is the file name.
87 Function to translate the EFI_MEMORY_TYPE into a string.
89 @param[in] Memory The memory type.
91 @retval A string representation of the type allocated from BS Pool.
95 IN CONST EFI_MEMORY_TYPE Memory
102 case EfiReservedMemoryType
: StrnCatGrow(&RetVal
, NULL
, L
"EfiReservedMemoryType", 0); break;
103 case EfiLoaderCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiLoaderCode", 0); break;
104 case EfiLoaderData
: StrnCatGrow(&RetVal
, NULL
, L
"EfiLoaderData", 0); break;
105 case EfiBootServicesCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiBootServicesCode", 0); break;
106 case EfiBootServicesData
: StrnCatGrow(&RetVal
, NULL
, L
"EfiBootServicesData", 0); break;
107 case EfiRuntimeServicesCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiRuntimeServicesCode", 0); break;
108 case EfiRuntimeServicesData
: StrnCatGrow(&RetVal
, NULL
, L
"EfiRuntimeServicesData", 0); break;
109 case EfiConventionalMemory
: StrnCatGrow(&RetVal
, NULL
, L
"EfiConventionalMemory", 0); break;
110 case EfiUnusableMemory
: StrnCatGrow(&RetVal
, NULL
, L
"EfiUnusableMemory", 0); break;
111 case EfiACPIReclaimMemory
: StrnCatGrow(&RetVal
, NULL
, L
"EfiACPIReclaimMemory", 0); break;
112 case EfiACPIMemoryNVS
: StrnCatGrow(&RetVal
, NULL
, L
"EfiACPIMemoryNVS", 0); break;
113 case EfiMemoryMappedIO
: StrnCatGrow(&RetVal
, NULL
, L
"EfiMemoryMappedIO", 0); break;
114 case EfiMemoryMappedIOPortSpace
: StrnCatGrow(&RetVal
, NULL
, L
"EfiMemoryMappedIOPortSpace", 0); break;
115 case EfiPalCode
: StrnCatGrow(&RetVal
, NULL
, L
"EfiPalCode", 0); break;
116 case EfiMaxMemoryType
: StrnCatGrow(&RetVal
, NULL
, L
"EfiMaxMemoryType", 0); break;
117 default: ASSERT(FALSE
);
123 Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.
125 @param[in] Fmt The format type.
127 @retval A string representation of the type allocated from BS Pool.
131 IN CONST EFI_GRAPHICS_PIXEL_FORMAT Fmt
138 case PixelRedGreenBlueReserved8BitPerColor
: StrnCatGrow(&RetVal
, NULL
, L
"PixelRedGreenBlueReserved8BitPerColor", 0); break;
139 case PixelBlueGreenRedReserved8BitPerColor
: StrnCatGrow(&RetVal
, NULL
, L
"PixelBlueGreenRedReserved8BitPerColor", 0); break;
140 case PixelBitMask
: StrnCatGrow(&RetVal
, NULL
, L
"PixelBitMask", 0); break;
141 case PixelBltOnly
: StrnCatGrow(&RetVal
, NULL
, L
"PixelBltOnly", 0); break;
142 case PixelFormatMax
: StrnCatGrow(&RetVal
, NULL
, L
"PixelFormatMax", 0); break;
143 default: ASSERT(FALSE
);
149 Constructor for the library.
151 @param[in] ImageHandle Ignored.
152 @param[in] SystemTable Ignored.
154 @retval EFI_SUCCESS The operation was successful.
158 HandleParsingLibConstructor (
159 IN EFI_HANDLE ImageHandle
,
160 IN EFI_SYSTEM_TABLE
*SystemTable
167 // Do nothing with mHandleParsingHiiHandle. Initialize HII as needed.
169 return (EFI_SUCCESS
);
173 Initialization function for HII packages.
177 HandleParsingHiiInit (VOID
)
179 if (mHandleParsingHiiHandle
== NULL
) {
180 mHandleParsingHiiHandle
= HiiAddPackages (&gHandleParsingHiiGuid
, gImageHandle
, UefiHandleParsingLibStrings
, NULL
);
181 ASSERT (mHandleParsingHiiHandle
!= NULL
);
186 Destructor for the library. free any resources.
188 @param[in] ImageHandle Ignored.
189 @param[in] SystemTable Ignored.
191 @retval EFI_SUCCESS The operation was successful.
195 HandleParsingLibDestructor (
196 IN EFI_HANDLE ImageHandle
,
197 IN EFI_SYSTEM_TABLE
*SystemTable
202 for (LoopCount
= 0; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++) {
203 SHELL_FREE_NON_NULL(mGuidList
[LoopCount
].GuidId
);
206 SHELL_FREE_NON_NULL(mGuidList
);
207 if (mHandleParsingHiiHandle
!= NULL
) {
208 HiiRemovePackages(mHandleParsingHiiHandle
);
210 return (EFI_SUCCESS
);
214 Function to dump information about LoadedImage.
216 This will allocate the return buffer from boot services pool.
218 @param[in] TheHandle The handle that has LoadedImage installed.
219 @param[in] Verbose TRUE for additional information, FALSE otherwise.
221 @retval A poitner to a string containing the information.
225 LoadedImageProtocolDumpInformation(
226 IN CONST EFI_HANDLE TheHandle
,
227 IN CONST BOOLEAN Verbose
230 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
240 Status
= gBS
->OpenProtocol (
242 &gEfiLoadedImageProtocolGuid
,
243 (VOID
**)&LoadedImage
,
246 EFI_OPEN_PROTOCOL_GET_PROTOCOL
249 if (EFI_ERROR (Status
)) {
253 FileName
= FindLoadedImageFileName(LoadedImage
);
254 FilePath
= ConvertDevicePathToText(LoadedImage
->FilePath
, TRUE
, TRUE
);
256 if (FileName
== NULL
) {
259 SHELL_FREE_NON_NULL(FilePath
);
261 RetVal
= CatSPrint(NULL
, FileName
);
262 SHELL_FREE_NON_NULL(FileName
);
266 HandleParsingHiiInit();
268 if (FileName
!= NULL
) {
269 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_LI_DUMP_NAME
), NULL
);
272 RetVal
= CatSPrint(NULL
, Temp
, FileName
);
275 SHELL_FREE_NON_NULL(Temp
);
276 SHELL_FREE_NON_NULL(FileName
);
279 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_LI_DUMP_MAIN
), NULL
);
283 PdbFileName
= PeCoffLoaderGetPdbPointer (LoadedImage
->ImageBase
);
284 DataType
= ConvertMemoryType(LoadedImage
->ImageDataType
);
285 CodeType
= ConvertMemoryType(LoadedImage
->ImageCodeType
);
290 LoadedImage
->Revision
,
291 LoadedImage
->ParentHandle
,
292 LoadedImage
->SystemTable
,
293 LoadedImage
->DeviceHandle
,
296 LoadedImage
->LoadOptionsSize
,
297 LoadedImage
->LoadOptions
,
298 LoadedImage
->ImageBase
,
299 LoadedImage
->ImageSize
,
306 SHELL_FREE_NON_NULL(Temp
);
307 SHELL_FREE_NON_NULL(FilePath
);
308 SHELL_FREE_NON_NULL(CodeType
);
309 SHELL_FREE_NON_NULL(DataType
);
315 Function to dump information about GOP.
317 This will allocate the return buffer from boot services pool.
319 @param[in] TheHandle The handle that has LoadedImage installed.
320 @param[in] Verbose TRUE for additional information, FALSE otherwise.
322 @retval A poitner to a string containing the information.
326 GraphicsOutputProtocolDumpInformation(
327 IN CONST EFI_HANDLE TheHandle
,
328 IN CONST BOOLEAN Verbose
331 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
339 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*GopInfo
;
342 return (CatSPrint(NULL
, L
"GraphicsOutput"));
345 HandleParsingHiiInit();
347 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_GOP_DUMP_MAIN
), NULL
);
352 Status
= gBS
->OpenProtocol (
354 &gEfiGraphicsOutputProtocolGuid
,
355 (VOID
**)&GraphicsOutput
,
358 EFI_OPEN_PROTOCOL_GET_PROTOCOL
361 if (EFI_ERROR (Status
)) {
362 SHELL_FREE_NON_NULL (Temp
);
366 Fmt
= ConvertPixelFormat(GraphicsOutput
->Mode
->Info
->PixelFormat
);
371 GraphicsOutput
->Mode
->MaxMode
,
372 GraphicsOutput
->Mode
->Mode
,
373 GraphicsOutput
->Mode
->FrameBufferBase
,
374 (UINT64
)GraphicsOutput
->Mode
->FrameBufferSize
,
375 (UINT64
)GraphicsOutput
->Mode
->SizeOfInfo
,
376 GraphicsOutput
->Mode
->Info
->Version
,
377 GraphicsOutput
->Mode
->Info
->HorizontalResolution
,
378 GraphicsOutput
->Mode
->Info
->VerticalResolution
,
380 GraphicsOutput
->Mode
->Info
->PixelsPerScanLine
,
381 GraphicsOutput
->Mode
->Info
->PixelFormat
!=PixelBitMask
?0:GraphicsOutput
->Mode
->Info
->PixelInformation
.RedMask
,
382 GraphicsOutput
->Mode
->Info
->PixelFormat
!=PixelBitMask
?0:GraphicsOutput
->Mode
->Info
->PixelInformation
.GreenMask
,
383 GraphicsOutput
->Mode
->Info
->PixelFormat
!=PixelBitMask
?0:GraphicsOutput
->Mode
->Info
->PixelInformation
.BlueMask
386 SHELL_FREE_NON_NULL (Temp
);
388 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_RES_LIST_MAIN
), NULL
);
390 SHELL_FREE_NON_NULL (RetVal
);
394 TempRetVal
= CatSPrint (RetVal
, Temp
);
395 SHELL_FREE_NON_NULL (RetVal
);
396 if (TempRetVal
== NULL
) {
400 SHELL_FREE_NON_NULL (Temp
);
402 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY
), NULL
);
404 SHELL_FREE_NON_NULL (RetVal
);
409 for (Mode
= 0; Mode
< GraphicsOutput
->Mode
->MaxMode
; Mode
++) {
410 Status
= GraphicsOutput
->QueryMode (
416 if (EFI_ERROR (Status
)) {
420 TempRetVal
= CatSPrint (
424 GopInfo
->HorizontalResolution
,
425 GopInfo
->VerticalResolution
428 SHELL_FREE_NON_NULL (GopInfo
);
429 SHELL_FREE_NON_NULL (RetVal
);
435 SHELL_FREE_NON_NULL(Temp
);
436 SHELL_FREE_NON_NULL(Fmt
);
442 Function to dump information about EDID Discovered Protocol.
444 This will allocate the return buffer from boot services pool.
446 @param[in] TheHandle The handle that has LoadedImage installed.
447 @param[in] Verbose TRUE for additional information, FALSE otherwise.
449 @retval A pointer to a string containing the information.
453 EdidDiscoveredProtocolDumpInformation (
454 IN CONST EFI_HANDLE TheHandle
,
455 IN CONST BOOLEAN Verbose
458 EFI_EDID_DISCOVERED_PROTOCOL
*EdidDiscovered
;
465 return (CatSPrint (NULL
, L
"EDIDDiscovered"));
468 Status
= gBS
->OpenProtocol (
470 &gEfiEdidDiscoveredProtocolGuid
,
471 (VOID
**)&EdidDiscovered
,
474 EFI_OPEN_PROTOCOL_GET_PROTOCOL
477 if (EFI_ERROR (Status
)) {
481 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN
), NULL
);
486 RetVal
= CatSPrint (NULL
, Temp
, EdidDiscovered
->SizeOfEdid
);
487 SHELL_FREE_NON_NULL (Temp
);
489 if (EdidDiscovered
->SizeOfEdid
!= 0) {
490 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_DISCOVERED_DATA
), NULL
);
492 SHELL_FREE_NON_NULL (RetVal
);
495 TempRetVal
= CatSPrint (RetVal
, Temp
);
496 SHELL_FREE_NON_NULL (RetVal
);
499 TempRetVal
= CatSDumpHex (RetVal
, 7, 0, EdidDiscovered
->SizeOfEdid
, EdidDiscovered
->Edid
);
506 Function to dump information about EDID Active Protocol.
508 This will allocate the return buffer from boot services pool.
510 @param[in] TheHandle The handle that has LoadedImage installed.
511 @param[in] Verbose TRUE for additional information, FALSE otherwise.
513 @retval A pointer to a string containing the information.
517 EdidActiveProtocolDumpInformation (
518 IN CONST EFI_HANDLE TheHandle
,
519 IN CONST BOOLEAN Verbose
522 EFI_EDID_ACTIVE_PROTOCOL
*EdidActive
;
529 return (CatSPrint (NULL
, L
"EDIDActive"));
532 Status
= gBS
->OpenProtocol (
534 &gEfiEdidActiveProtocolGuid
,
538 EFI_OPEN_PROTOCOL_GET_PROTOCOL
541 if (EFI_ERROR (Status
)) {
545 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_ACTIVE_MAIN
), NULL
);
550 RetVal
= CatSPrint (NULL
, Temp
, EdidActive
->SizeOfEdid
);
551 SHELL_FREE_NON_NULL (Temp
);
553 if (EdidActive
->SizeOfEdid
!= 0) {
554 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_ACTIVE_DATA
), NULL
);
556 SHELL_FREE_NON_NULL (RetVal
);
559 TempRetVal
= CatSPrint (RetVal
, Temp
);
560 SHELL_FREE_NON_NULL (RetVal
);
563 TempRetVal
= CatSDumpHex (RetVal
, 7, 0, EdidActive
->SizeOfEdid
, EdidActive
->Edid
);
570 Function to dump information about PciRootBridgeIo.
572 This will allocate the return buffer from boot services pool.
574 @param[in] TheHandle The handle that has PciRootBridgeIo installed.
575 @param[in] Verbose TRUE for additional information, FALSE otherwise.
577 @retval A poitner to a string containing the information.
581 PciRootBridgeIoDumpInformation(
582 IN CONST EFI_HANDLE TheHandle
,
583 IN CONST BOOLEAN Verbose
586 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*PciRootBridgeIo
;
587 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*Configuration
;
598 return (CatSPrint(NULL
, L
"PciRootBridgeIo"));
601 HandleParsingHiiInit();
603 Status
= gBS
->HandleProtocol(
605 &gEfiPciRootBridgeIoProtocolGuid
,
606 (VOID
**)&PciRootBridgeIo
);
608 if (EFI_ERROR(Status
)) {
612 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_PH
), NULL
);
616 Temp2
= CatSPrint(L
"\r\n", Temp
, PciRootBridgeIo
->ParentHandle
);
621 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_SEG
), NULL
);
623 SHELL_FREE_NON_NULL(RetVal
);
626 Temp2
= CatSPrint(RetVal
, Temp
, PciRootBridgeIo
->SegmentNumber
);
634 Status
= PciRootBridgeIo
->GetAttributes (PciRootBridgeIo
, &Supports
, &Attributes
);
635 if (!EFI_ERROR(Status
)) {
636 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_ATT
), NULL
);
638 SHELL_FREE_NON_NULL(RetVal
);
641 Temp2
= CatSPrint(RetVal
, Temp
, Attributes
);
647 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS
), NULL
);
649 SHELL_FREE_NON_NULL(RetVal
);
652 Temp2
= CatSPrint(RetVal
, Temp
, Supports
);
659 Configuration
= NULL
;
660 Status
= PciRootBridgeIo
->Configuration (PciRootBridgeIo
, (VOID
**) &Configuration
);
661 if (!EFI_ERROR(Status
) && Configuration
!= NULL
) {
662 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_TITLE
), NULL
);
664 SHELL_FREE_NON_NULL(RetVal
);
667 Temp2
= CatSPrint(RetVal
, Temp
, Supports
);
672 while (Configuration
->Desc
== ACPI_ADDRESS_SPACE_DESCRIPTOR
) {
674 switch (Configuration
->ResType
) {
675 case ACPI_ADDRESS_SPACE_TYPE_MEM
:
676 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_MEM
), NULL
);
678 case ACPI_ADDRESS_SPACE_TYPE_IO
:
679 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_IO
), NULL
);
681 case ACPI_ADDRESS_SPACE_TYPE_BUS
:
682 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_PCIRB_DUMP_BUS
), NULL
);
686 Temp2
= CatSPrint(RetVal
, L
"%s", Temp
);
693 Temp2
= CatSPrint(RetVal
,
694 L
"%H%02x %016lx %016lx %02x%N\r\n",
695 Configuration
->SpecificFlag
,
696 Configuration
->AddrRangeMin
,
697 Configuration
->AddrRangeMax
,
698 Configuration
->AddrSpaceGranularity
710 Function to dump information about SimpleTextOut.
712 This will allocate the return buffer from boot services pool.
714 @param[in] TheHandle The handle that has SimpleTextOut installed.
715 @param[in] Verbose TRUE for additional information, FALSE otherwise.
717 @retval A poitner to a string containing the information.
721 TxtOutProtocolDumpInformation(
722 IN CONST EFI_HANDLE TheHandle
,
723 IN CONST BOOLEAN Verbose
726 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*Dev
;
740 HandleParsingHiiInit();
745 Status
= gBS
->HandleProtocol(
747 &gEfiSimpleTextOutProtocolGuid
,
750 ASSERT_EFI_ERROR(Status
);
751 ASSERT (Dev
!= NULL
&& Dev
->Mode
!= NULL
);
753 Size
= (Dev
->Mode
->MaxMode
+ 1) * 80;
754 RetVal
= AllocateZeroPool(Size
);
756 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_TXT_OUT_DUMP_HEADER
), NULL
);
758 UnicodeSPrint(RetVal
, Size
, Temp
, Dev
, Dev
->Mode
->Attribute
);
765 Temp
= HiiGetString(mHandleParsingHiiHandle
, STRING_TOKEN(STR_TXT_OUT_DUMP_LINE
), NULL
);
766 for (Index
= 0; Index
< Dev
->Mode
->MaxMode
; Index
++) {
767 Status
= Dev
->QueryMode (Dev
, Index
, &Col
, &Row
);
768 NewSize
= Size
- StrSize(RetVal
);
770 RetVal
+ StrLen(RetVal
),
772 Temp
== NULL
?L
"":Temp
,
773 Index
== Dev
->Mode
->Mode
? L
'*' : L
' ',
775 !EFI_ERROR(Status
)?(INTN
)Col
:-1,
776 !EFI_ERROR(Status
)?(INTN
)Row
:-1
783 STATIC CONST UINTN VersionStringSize
= 60;
786 Function to dump information about EfiDriverSupportedEfiVersion protocol.
788 This will allocate the return buffer from boot services pool.
790 @param[in] TheHandle The handle that has the protocol installed.
791 @param[in] Verbose TRUE for additional information, FALSE otherwise.
793 @retval A poitner to a string containing the information.
797 DriverEfiVersionProtocolDumpInformation(
798 IN CONST EFI_HANDLE TheHandle
,
799 IN CONST BOOLEAN Verbose
802 EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL
*DriverEfiVersion
;
806 Status
= gBS
->HandleProtocol(
808 &gEfiDriverSupportedEfiVersionProtocolGuid
,
809 (VOID
**)&DriverEfiVersion
);
811 ASSERT_EFI_ERROR(Status
);
813 RetVal
= AllocateZeroPool(VersionStringSize
);
814 if (RetVal
!= NULL
) {
815 UnicodeSPrint (RetVal
, VersionStringSize
, L
"0x%08x", DriverEfiVersion
->FirmwareVersion
);
820 Function to convert device path to string.
822 This will allocate the return buffer from boot services pool.
824 @param[in] DevPath Pointer to device path instance.
825 @param[in] Verbose TRUE for additional information, FALSE otherwise.
826 @param[in] Length Maximum allowed text length of the device path.
828 @retval A pointer to a string containing the information.
831 ConvertDevicePathToShortText(
832 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath
,
833 IN CONST BOOLEAN Verbose
,
834 IN CONST UINTN Length
842 // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)
844 Temp
= ConvertDevicePathToText(DevPath
, TRUE
, TRUE
);
845 if (!Verbose
&& Temp
!= NULL
&& StrLen(Temp
) > Length
) {
848 Temp2
= StrnCatGrow(&Temp2
, &Size
, L
"..", 0);
849 Temp2
= StrnCatGrow(&Temp2
, &Size
, Temp
+(StrLen(Temp
) - (Length
- 2)), 0);
857 Function to dump protocol information.
859 This will allocate the return buffer from boot services pool.
861 @param[in] TheHandle The handle that has the protocol installed.
862 @param[in] Verbose TRUE for additional information, FALSE otherwise.
863 @param[in] Protocol The protocol is needed to dump.
865 @retval A pointer to a string containing the information.
869 DevicePathProtocolDumpInformationEx (
870 IN CONST EFI_HANDLE TheHandle
,
871 IN CONST BOOLEAN Verbose
,
872 IN EFI_GUID
*Protocol
875 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
877 CHAR16
*DevPathStrTemp
;
881 DevPathStrTemp
= NULL
;
882 Status
= gBS
->OpenProtocol(TheHandle
, Protocol
, (VOID
**)&DevPath
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
883 if (!EFI_ERROR(Status
)) {
884 DevPathStr
= ConvertDevicePathToShortText (DevPath
, Verbose
, 30);
886 Size
= StrSize(DevPathStr
) + sizeof(CHAR16
) * 2;
887 DevPathStrTemp
= AllocateZeroPool (Size
);
888 if (DevPathStrTemp
!= NULL
) {
889 StrnCatS (DevPathStrTemp
, Size
/sizeof(CHAR16
), L
" ", 2);
890 StrnCatS (DevPathStrTemp
, Size
/sizeof(CHAR16
), DevPathStr
, StrLen (DevPathStr
));
892 FreePool (DevPathStr
);
893 DevPathStr
= DevPathStrTemp
;
895 gBS
->CloseProtocol(TheHandle
, Protocol
, gImageHandle
, NULL
);
901 Function to dump information about DevicePath protocol.
903 This will allocate the return buffer from boot services pool.
905 @param[in] TheHandle The handle that has the protocol installed.
906 @param[in] Verbose TRUE for additional information, FALSE otherwise.
908 @retval A pointer to a string containing the information.
912 DevicePathProtocolDumpInformation(
913 IN CONST EFI_HANDLE TheHandle
,
914 IN CONST BOOLEAN Verbose
917 return DevicePathProtocolDumpInformationEx (TheHandle
, Verbose
, &gEfiDevicePathProtocolGuid
);
921 Function to dump information about LoadedImageDevicePath protocol.
923 This will allocate the return buffer from boot services pool.
925 @param[in] TheHandle The handle that has the protocol installed.
926 @param[in] Verbose TRUE for additional information, FALSE otherwise.
928 @retval A pointer to a string containing the information.
932 LoadedImageDevicePathProtocolDumpInformation(
933 IN CONST EFI_HANDLE TheHandle
,
934 IN CONST BOOLEAN Verbose
937 return DevicePathProtocolDumpInformationEx (TheHandle
, Verbose
, &gEfiLoadedImageDevicePathProtocolGuid
);
941 Function to dump information about BusSpecificDriverOverride protocol.
943 This will allocate the return buffer from boot services pool.
945 @param[in] TheHandle The handle that has the protocol installed.
946 @param[in] Verbose TRUE for additional information, FALSE otherwise.
948 @retval A pointer to a string containing the information.
952 BusSpecificDriverOverrideProtocolDumpInformation (
953 IN CONST EFI_HANDLE TheHandle
,
954 IN CONST BOOLEAN Verbose
961 EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL
*BusSpecificDriverOverride
;
962 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
963 EFI_HANDLE ImageHandle
;
975 Status
= gBS
->OpenProtocol (
977 &gEfiBusSpecificDriverOverrideProtocolGuid
,
978 (VOID
**)&BusSpecificDriverOverride
,
981 EFI_OPEN_PROTOCOL_GET_PROTOCOL
983 if (EFI_ERROR (Status
)) {
986 HandleParsingHiiInit ();
987 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_BSDO_DUMP_MAIN
), NULL
);
988 if (GetString
== NULL
) {
992 Status
= BusSpecificDriverOverride
->GetDriver (
993 BusSpecificDriverOverride
,
996 if (!EFI_ERROR (Status
)) {
997 Status
= gBS
->HandleProtocol (
999 &gEfiLoadedImageProtocolGuid
,
1000 (VOID
**) &LoadedImage
1002 if(!EFI_ERROR (Status
)) {
1003 TempRetVal
= CatSPrint (
1006 ConvertHandleToHandleIndex (ImageHandle
),
1007 ConvertDevicePathToText (LoadedImage
->FilePath
, TRUE
, TRUE
)
1009 StrnCatGrow (&RetVal
, &Size
, TempRetVal
, 0);
1010 SHELL_FREE_NON_NULL (TempRetVal
);
1013 } while (!EFI_ERROR (Status
));
1015 SHELL_FREE_NON_NULL (GetString
);
1020 Function to dump information about EfiAdapterInformation Protocol.
1022 @param[in] TheHandle The handle that has the protocol installed.
1023 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1025 @retval A pointer to a string containing the information.
1029 AdapterInformationDumpInformation (
1030 IN CONST EFI_HANDLE TheHandle
,
1031 IN CONST BOOLEAN Verbose
1035 EFI_ADAPTER_INFORMATION_PROTOCOL
*EfiAdptrInfoProtocol
;
1036 UINTN InfoTypesBufferCount
;
1038 EFI_GUID
*InfoTypesBuffer
;
1043 VOID
*InformationBlock
;
1044 UINTN InformationBlockSize
;
1047 return (CatSPrint(NULL
, L
"AdapterInfo"));
1050 InfoTypesBuffer
= NULL
;
1051 InformationBlock
= NULL
;
1054 Status
= gBS
->OpenProtocol (
1055 (EFI_HANDLE
) (TheHandle
),
1056 &gEfiAdapterInformationProtocolGuid
,
1057 (VOID
**) &EfiAdptrInfoProtocol
,
1060 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1063 if (EFI_ERROR (Status
)) {
1068 // Get a list of supported information types for this instance of the protocol.
1070 Status
= EfiAdptrInfoProtocol
->GetSupportedTypes (
1071 EfiAdptrInfoProtocol
,
1073 &InfoTypesBufferCount
1076 if (EFI_ERROR (Status
)) {
1077 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GET_SUPP_TYPES_FAILED
), NULL
);
1078 if (TempStr
!= NULL
) {
1079 RetVal
= CatSPrint (NULL
, TempStr
, Status
);
1084 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_SUPP_TYPE_HEADER
), NULL
);
1085 if (TempStr
== NULL
) {
1088 RetVal
= CatSPrint (NULL
, TempStr
);
1089 SHELL_FREE_NON_NULL (TempStr
);
1091 for (GuidIndex
= 0; GuidIndex
< InfoTypesBufferCount
; GuidIndex
++) {
1092 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GUID_NUMBER
), NULL
);
1093 if (TempStr
== NULL
) {
1096 TempRetVal
= CatSPrint (RetVal
, TempStr
, (GuidIndex
+ 1), &InfoTypesBuffer
[GuidIndex
]);
1097 SHELL_FREE_NON_NULL (RetVal
);
1098 RetVal
= TempRetVal
;
1099 SHELL_FREE_NON_NULL (TempStr
);
1101 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GUID_STRING
), NULL
);
1102 if (TempStr
== NULL
) {
1106 if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoMediaStateGuid
)) {
1107 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoMediaStateGuid");
1108 SHELL_FREE_NON_NULL (RetVal
);
1109 RetVal
= TempRetVal
;
1110 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoNetworkBootGuid
)) {
1111 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoNetworkBootGuid");
1112 SHELL_FREE_NON_NULL (RetVal
);
1113 RetVal
= TempRetVal
;
1114 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoSanMacAddressGuid
)) {
1115 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoSanMacAddressGuid");
1116 SHELL_FREE_NON_NULL (RetVal
);
1117 RetVal
= TempRetVal
;
1118 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
)) {
1119 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoUndiIpv6SupportGuid");
1120 SHELL_FREE_NON_NULL (RetVal
);
1121 RetVal
= TempRetVal
;
1124 GuidStr
= GetStringNameFromGuid (&InfoTypesBuffer
[GuidIndex
], NULL
);
1125 if (GuidStr
== NULL
) {
1126 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"UnknownInfoType");
1127 SHELL_FREE_NON_NULL (RetVal
);
1128 RetVal
= TempRetVal
;
1130 SHELL_FREE_NON_NULL (TempStr
);
1131 SHELL_FREE_NON_NULL(GuidStr
);
1133 // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP
1137 TempRetVal
= CatSPrint (RetVal
, TempStr
, GuidStr
);
1138 SHELL_FREE_NON_NULL (RetVal
);
1139 RetVal
= TempRetVal
;
1140 SHELL_FREE_NON_NULL(GuidStr
);
1144 SHELL_FREE_NON_NULL (TempStr
);
1146 Status
= EfiAdptrInfoProtocol
->GetInformation (
1147 EfiAdptrInfoProtocol
,
1148 &InfoTypesBuffer
[GuidIndex
],
1150 &InformationBlockSize
1153 if (EFI_ERROR (Status
)) {
1154 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_GETINFO_FAILED
), NULL
);
1155 if (TempStr
== NULL
) {
1158 TempRetVal
= CatSPrint (RetVal
, TempStr
, Status
);
1159 SHELL_FREE_NON_NULL (RetVal
);
1160 RetVal
= TempRetVal
;
1162 if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoMediaStateGuid
)) {
1163 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_MEDIA_STATE
), NULL
);
1164 if (TempStr
== NULL
) {
1167 TempRetVal
= CatSPrint (
1170 ((EFI_ADAPTER_INFO_MEDIA_STATE
*)InformationBlock
)->MediaState
,
1171 ((EFI_ADAPTER_INFO_MEDIA_STATE
*)InformationBlock
)->MediaState
1173 SHELL_FREE_NON_NULL (RetVal
);
1174 RetVal
= TempRetVal
;
1175 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoNetworkBootGuid
)) {
1176 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_NETWORK_BOOT_INFO
), NULL
);
1177 if (TempStr
== NULL
) {
1180 TempRetVal
= CatSPrint (
1183 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv4BootCapablity
,
1184 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv6BootCapablity
,
1185 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->FCoeBootCapablity
,
1186 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->OffloadCapability
,
1187 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiMpioCapability
,
1188 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv4Boot
,
1189 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv6Boot
,
1190 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->FCoeBoot
1192 SHELL_FREE_NON_NULL (RetVal
);
1193 RetVal
= TempRetVal
;
1194 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoSanMacAddressGuid
) == TRUE
) {
1195 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_SAN_MAC_ADDRESS_INFO
), NULL
);
1196 if (TempStr
== NULL
) {
1199 TempRetVal
= CatSPrint (
1202 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[0],
1203 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[1],
1204 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[2],
1205 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[3],
1206 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[4],
1207 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[5]
1209 SHELL_FREE_NON_NULL (RetVal
);
1210 RetVal
= TempRetVal
;
1211 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
) == TRUE
) {
1212 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_UNDI_IPV6_INFO
), NULL
);
1213 if (TempStr
== NULL
) {
1217 TempRetVal
= CatSPrint (
1220 ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT
*)InformationBlock
)->Ipv6Support
1222 SHELL_FREE_NON_NULL (RetVal
);
1223 RetVal
= TempRetVal
;
1225 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_UNKNOWN_INFO_TYPE
), NULL
);
1226 if (TempStr
== NULL
) {
1229 TempRetVal
= CatSPrint (RetVal
, TempStr
, &InfoTypesBuffer
[GuidIndex
]);
1230 SHELL_FREE_NON_NULL (RetVal
);
1231 RetVal
= TempRetVal
;
1234 SHELL_FREE_NON_NULL (TempStr
);
1235 SHELL_FREE_NON_NULL (InformationBlock
);
1239 SHELL_FREE_NON_NULL (InfoTypesBuffer
);
1243 SHELL_FREE_NON_NULL (RetVal
);
1244 SHELL_FREE_NON_NULL (InfoTypesBuffer
);
1245 SHELL_FREE_NON_NULL (InformationBlock
);
1250 Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.
1252 @param[in] TheHandle The handle that has the protocol installed.
1253 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1255 @retval A pointer to a string containing the information.
1259 FirmwareManagementDumpInformation (
1260 IN CONST EFI_HANDLE TheHandle
,
1261 IN CONST BOOLEAN Verbose
1265 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*EfiFwMgmtProtocol
;
1266 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
;
1267 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1
*ImageInfoV1
;
1268 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2
*ImageInfoV2
;
1269 UINT64 AttributeSetting
;
1270 UINTN ImageInfoSize
;
1271 UINTN DescriptorSize
;
1272 UINT32 DescriptorVersion
;
1273 UINT32 PackageVersion
;
1274 UINT8 DescriptorCount
;
1278 CHAR16
*PackageVersionName
;
1282 CHAR16
*AttributeSettingStr
;
1284 BOOLEAN AttributeSupported
;
1287 // Initialize local variables
1291 AttributeSetting
= 0;
1293 AttributeSupported
= FALSE
;
1297 PackageVersionName
= NULL
;
1301 AttributeSettingStr
= NULL
;
1304 return (CatSPrint(NULL
, L
"FirmwareManagement"));
1307 Status
= gBS
->OpenProtocol (
1308 (EFI_HANDLE
) (TheHandle
),
1309 &gEfiFirmwareManagementProtocolGuid
,
1310 (VOID
**) &EfiFwMgmtProtocol
,
1313 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1316 if (EFI_ERROR (Status
)) {
1320 Status
= EfiFwMgmtProtocol
->GetImageInfo (
1331 if (Status
== EFI_BUFFER_TOO_SMALL
) {
1332 ImageInfo
= AllocateZeroPool (ImageInfoSize
);
1334 if (ImageInfo
== NULL
) {
1335 Status
= EFI_OUT_OF_RESOURCES
;
1337 Status
= EfiFwMgmtProtocol
->GetImageInfo (
1350 if (EFI_ERROR (Status
)) {
1355 // Decode Image Descriptor data only if its version is supported
1357 if (DescriptorVersion
<= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION
) {
1359 if (ImageInfo
== NULL
) {
1363 ImageInfoV1
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1
*)ImageInfo
;
1364 ImageInfoV2
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2
*)ImageInfo
;
1367 // Set ImageInfoSize in return buffer
1369 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_INFO_SIZE
), NULL
);
1370 if (TempStr
== NULL
) {
1373 RetVal
= CatSPrint (NULL
, TempStr
, ImageInfoSize
);
1374 SHELL_FREE_NON_NULL (TempStr
);
1377 // Set DescriptorVersion in return buffer
1379 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_DESCRIPTOR_VERSION
), NULL
);
1380 if (TempStr
== NULL
) {
1383 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorVersion
);
1384 SHELL_FREE_NON_NULL (RetVal
);
1385 RetVal
= TempRetVal
;
1386 SHELL_FREE_NON_NULL (TempStr
);
1389 // Set DescriptorCount in return buffer
1391 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_DESCRIPTOR_COUNT
), NULL
);
1392 if (TempStr
== NULL
) {
1395 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorCount
);
1396 SHELL_FREE_NON_NULL (RetVal
);
1397 RetVal
= TempRetVal
;
1398 SHELL_FREE_NON_NULL (TempStr
);
1402 // Set DescriptorSize in return buffer
1404 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_DESCRIPTOR_SIZE
), NULL
);
1405 if (TempStr
== NULL
) {
1408 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorSize
);
1409 SHELL_FREE_NON_NULL (RetVal
);
1410 RetVal
= TempRetVal
;
1411 SHELL_FREE_NON_NULL (TempStr
);
1414 // Set PackageVersion in return buffer
1416 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_PACKAGE_VERSION
), NULL
);
1417 if (TempStr
== NULL
) {
1420 TempRetVal
= CatSPrint (RetVal
, TempStr
, PackageVersion
);
1421 SHELL_FREE_NON_NULL (RetVal
);
1422 RetVal
= TempRetVal
;
1423 SHELL_FREE_NON_NULL (TempStr
);
1426 // Set PackageVersionName in return buffer
1428 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_PACKAGE_VERSION_NAME
), NULL
);
1429 if (TempStr
== NULL
) {
1432 TempRetVal
= CatSPrint (RetVal
, TempStr
, PackageVersionName
);
1433 SHELL_FREE_NON_NULL (RetVal
);
1434 RetVal
= TempRetVal
;
1435 SHELL_FREE_NON_NULL (TempStr
);
1437 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
1439 // First check if Attribute is supported
1440 // and generate a string for AttributeSetting field
1442 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1443 AttributeSupported
= FALSE
;
1444 AttributeSetting
= 0;
1445 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1446 if (ImageInfoV1
[Index
].AttributesSupported
!= 0x0) {
1447 AttributeSupported
= TRUE
;
1448 AttributeSetting
= ImageInfoV1
[Index
].AttributesSetting
;
1450 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1451 if (ImageInfoV2
[Index
].AttributesSupported
!= 0x0) {
1452 AttributeSupported
= TRUE
;
1453 AttributeSetting
= ImageInfoV2
[Index
].AttributesSetting
;
1456 if (ImageInfo
[Index
].AttributesSupported
!= 0x0) {
1457 AttributeSupported
= TRUE
;
1458 AttributeSetting
= ImageInfo
[Index
].AttributesSetting
;
1462 if (!AttributeSupported
) {
1463 AttributeSettingStr
= CatSPrint (NULL
, L
"None");
1465 AttributeSettingStr
= CatSPrint (NULL
, L
"(");
1467 if ((AttributeSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
) != 0x0) {
1468 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");
1469 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1470 AttributeSettingStr
= TempRetVal
;
1472 if ((AttributeSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
) != 0x0) {
1473 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_RESET_REQUIRED");
1474 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1475 AttributeSettingStr
= TempRetVal
;
1477 if ((AttributeSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
) != 0x0) {
1478 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");
1479 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1480 AttributeSettingStr
= TempRetVal
;
1482 if ((AttributeSetting
& IMAGE_ATTRIBUTE_IN_USE
) != 0x0) {
1483 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_IN_USE");
1484 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1485 AttributeSettingStr
= TempRetVal
;
1487 if ((AttributeSetting
& IMAGE_ATTRIBUTE_UEFI_IMAGE
) != 0x0) {
1488 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_UEFI_IMAGE");
1489 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1490 AttributeSettingStr
= TempRetVal
;
1492 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" )");
1493 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1494 AttributeSettingStr
= TempRetVal
;
1497 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1498 if (ImageInfoV1
[Index
].ImageIndex
!= 0x0) {
1502 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V1
), NULL
);
1503 if (TempStr
== NULL
) {
1506 TempRetVal
= CatSPrint (
1510 ImageInfoV1
[Index
].ImageIndex
,
1511 &ImageInfoV1
[Index
].ImageTypeId
,
1512 ImageInfoV1
[Index
].ImageId
,
1513 ImageInfoV1
[Index
].ImageIdName
,
1514 ImageInfoV1
[Index
].Version
,
1515 ImageInfoV1
[Index
].VersionName
,
1516 ImageInfoV1
[Index
].Size
,
1517 ImageInfoV1
[Index
].AttributesSupported
,
1518 AttributeSettingStr
,
1519 ImageInfoV1
[Index
].Compatibilities
1521 SHELL_FREE_NON_NULL (RetVal
);
1522 RetVal
= TempRetVal
;
1523 SHELL_FREE_NON_NULL (TempStr
);
1524 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1525 if (ImageInfoV2
[Index
].ImageIndex
!= 0x0) {
1529 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V2
), NULL
);
1530 if (TempStr
== NULL
) {
1533 TempRetVal
= CatSPrint (
1537 ImageInfoV2
[Index
].ImageIndex
,
1538 &ImageInfoV2
[Index
].ImageTypeId
,
1539 ImageInfoV2
[Index
].ImageId
,
1540 ImageInfoV2
[Index
].ImageIdName
,
1541 ImageInfoV2
[Index
].Version
,
1542 ImageInfoV2
[Index
].VersionName
,
1543 ImageInfoV2
[Index
].Size
,
1544 ImageInfoV2
[Index
].AttributesSupported
,
1545 AttributeSettingStr
,
1546 ImageInfoV2
[Index
].Compatibilities
,
1547 ImageInfoV2
[Index
].LowestSupportedImageVersion
1549 SHELL_FREE_NON_NULL (RetVal
);
1550 RetVal
= TempRetVal
;
1551 SHELL_FREE_NON_NULL (TempStr
);
1553 if (ImageInfo
[Index
].ImageIndex
!= 0x0) {
1557 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO
), NULL
);
1558 if (TempStr
== NULL
) {
1561 TempRetVal
= CatSPrint (
1565 ImageInfo
[Index
].ImageIndex
,
1566 &ImageInfo
[Index
].ImageTypeId
,
1567 ImageInfo
[Index
].ImageId
,
1568 ImageInfo
[Index
].ImageIdName
,
1569 ImageInfo
[Index
].Version
,
1570 ImageInfo
[Index
].VersionName
,
1571 ImageInfo
[Index
].Size
,
1572 ImageInfo
[Index
].AttributesSupported
,
1573 AttributeSettingStr
,
1574 ImageInfo
[Index
].Compatibilities
,
1575 ImageInfo
[Index
].LowestSupportedImageVersion
,
1576 ImageInfo
[Index
].LastAttemptVersion
,
1577 ImageInfo
[Index
].LastAttemptStatus
,
1578 ImageInfo
[Index
].HardwareInstance
1580 SHELL_FREE_NON_NULL (RetVal
);
1581 RetVal
= TempRetVal
;
1582 SHELL_FREE_NON_NULL (TempStr
);
1587 if (ImageCount
> 0) {
1588 for (Index
=0; Index
<DescriptorCount
; Index
++) {
1589 for (Index1
=Index
+1; Index1
<DescriptorCount
; Index1
++) {
1590 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1591 if (ImageInfoV1
[Index
].ImageId
== ImageInfoV1
[Index1
].ImageId
) {
1594 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1598 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1599 if (ImageInfoV2
[Index
].ImageId
== ImageInfoV2
[Index1
].ImageId
) {
1602 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1607 if (ImageInfo
[Index
].ImageId
== ImageInfo
[Index1
].ImageId
) {
1610 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1621 // Check if ImageId with duplicate value was found
1624 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN(STR_FMP_IMAGEID_NON_UNIQUE
), NULL
);
1625 if (TempStr
== NULL
) {
1628 TempRetVal
= CatSPrint (RetVal
, TempStr
);
1629 SHELL_FREE_NON_NULL (RetVal
);
1630 RetVal
= TempRetVal
;
1631 SHELL_FREE_NON_NULL (TempStr
);
1634 SHELL_FREE_NON_NULL (ImageInfo
);
1635 SHELL_FREE_NON_NULL (PackageVersionName
);
1636 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1641 SHELL_FREE_NON_NULL (RetVal
);
1642 SHELL_FREE_NON_NULL (ImageInfo
);
1643 SHELL_FREE_NON_NULL (PackageVersionName
);
1644 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1650 // Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg
1652 #define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \
1654 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
1657 #define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \
1659 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
1662 #define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \
1664 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
1666 STATIC CONST EFI_GUID WinNtThunkProtocolGuid
= LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID
;
1667 STATIC CONST EFI_GUID WinNtIoProtocolGuid
= LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID
;
1668 STATIC CONST EFI_GUID WinNtSerialPortGuid
= LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID
;
1671 // Deprecated protocols we dont want to link from IntelFrameworkModulePkg
1673 #define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \
1675 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
1677 #define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \
1679 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \
1681 STATIC CONST EFI_GUID EfiIsaIoProtocolGuid
= LOCAL_EFI_ISA_IO_PROTOCOL_GUID
;
1682 STATIC CONST EFI_GUID EfiIsaAcpiProtocolGuid
= LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID
;
1685 STATIC CONST GUID_INFO_BLOCK mGuidStringListNT
[] = {
1686 {STRING_TOKEN(STR_WINNT_THUNK
), (EFI_GUID
*)&WinNtThunkProtocolGuid
, NULL
},
1687 {STRING_TOKEN(STR_WINNT_DRIVER_IO
), (EFI_GUID
*)&WinNtIoProtocolGuid
, NULL
},
1688 {STRING_TOKEN(STR_WINNT_SERIAL_PORT
), (EFI_GUID
*)&WinNtSerialPortGuid
, NULL
},
1692 STATIC CONST GUID_INFO_BLOCK mGuidStringList
[] = {
1693 {STRING_TOKEN(STR_LOADED_IMAGE
), &gEfiLoadedImageProtocolGuid
, LoadedImageProtocolDumpInformation
},
1694 {STRING_TOKEN(STR_DEVICE_PATH
), &gEfiDevicePathProtocolGuid
, DevicePathProtocolDumpInformation
},
1695 {STRING_TOKEN(STR_IMAGE_PATH
), &gEfiLoadedImageDevicePathProtocolGuid
, LoadedImageDevicePathProtocolDumpInformation
},
1696 {STRING_TOKEN(STR_DEVICE_PATH_UTIL
), &gEfiDevicePathUtilitiesProtocolGuid
, NULL
},
1697 {STRING_TOKEN(STR_DEVICE_PATH_TXT
), &gEfiDevicePathToTextProtocolGuid
, NULL
},
1698 {STRING_TOKEN(STR_DEVICE_PATH_FTXT
), &gEfiDevicePathFromTextProtocolGuid
, NULL
},
1699 {STRING_TOKEN(STR_DEVICE_PATH_PC
), &gEfiPcAnsiGuid
, NULL
},
1700 {STRING_TOKEN(STR_DEVICE_PATH_VT100
), &gEfiVT100Guid
, NULL
},
1701 {STRING_TOKEN(STR_DEVICE_PATH_VT100P
), &gEfiVT100PlusGuid
, NULL
},
1702 {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8
), &gEfiVTUTF8Guid
, NULL
},
1703 {STRING_TOKEN(STR_DRIVER_BINDING
), &gEfiDriverBindingProtocolGuid
, NULL
},
1704 {STRING_TOKEN(STR_PLATFORM_OVERRIDE
), &gEfiPlatformDriverOverrideProtocolGuid
, NULL
},
1705 {STRING_TOKEN(STR_BUS_OVERRIDE
), &gEfiBusSpecificDriverOverrideProtocolGuid
, BusSpecificDriverOverrideProtocolDumpInformation
},
1706 {STRING_TOKEN(STR_DRIVER_DIAG
), &gEfiDriverDiagnosticsProtocolGuid
, NULL
},
1707 {STRING_TOKEN(STR_DRIVER_DIAG2
), &gEfiDriverDiagnostics2ProtocolGuid
, NULL
},
1708 {STRING_TOKEN(STR_DRIVER_CN
), &gEfiComponentNameProtocolGuid
, NULL
},
1709 {STRING_TOKEN(STR_DRIVER_CN2
), &gEfiComponentName2ProtocolGuid
, NULL
},
1710 {STRING_TOKEN(STR_PLAT_DRV_CFG
), &gEfiPlatformToDriverConfigurationProtocolGuid
, NULL
},
1711 {STRING_TOKEN(STR_DRIVER_VERSION
), &gEfiDriverSupportedEfiVersionProtocolGuid
, DriverEfiVersionProtocolDumpInformation
},
1712 {STRING_TOKEN(STR_TXT_IN
), &gEfiSimpleTextInProtocolGuid
, NULL
},
1713 {STRING_TOKEN(STR_TXT_IN_EX
), &gEfiSimpleTextInputExProtocolGuid
, NULL
},
1714 {STRING_TOKEN(STR_TXT_OUT
), &gEfiSimpleTextOutProtocolGuid
, TxtOutProtocolDumpInformation
},
1715 {STRING_TOKEN(STR_SIM_POINTER
), &gEfiSimplePointerProtocolGuid
, NULL
},
1716 {STRING_TOKEN(STR_ABS_POINTER
), &gEfiAbsolutePointerProtocolGuid
, NULL
},
1717 {STRING_TOKEN(STR_SERIAL_IO
), &gEfiSerialIoProtocolGuid
, NULL
},
1718 {STRING_TOKEN(STR_GRAPHICS_OUTPUT
), &gEfiGraphicsOutputProtocolGuid
, GraphicsOutputProtocolDumpInformation
},
1719 {STRING_TOKEN(STR_EDID_DISCOVERED
), &gEfiEdidDiscoveredProtocolGuid
, EdidDiscoveredProtocolDumpInformation
},
1720 {STRING_TOKEN(STR_EDID_ACTIVE
), &gEfiEdidActiveProtocolGuid
, EdidActiveProtocolDumpInformation
},
1721 {STRING_TOKEN(STR_EDID_OVERRIDE
), &gEfiEdidOverrideProtocolGuid
, NULL
},
1722 {STRING_TOKEN(STR_CON_IN
), &gEfiConsoleInDeviceGuid
, NULL
},
1723 {STRING_TOKEN(STR_CON_OUT
), &gEfiConsoleOutDeviceGuid
, NULL
},
1724 {STRING_TOKEN(STR_STD_ERR
), &gEfiStandardErrorDeviceGuid
, NULL
},
1725 {STRING_TOKEN(STR_LOAD_FILE
), &gEfiLoadFileProtocolGuid
, NULL
},
1726 {STRING_TOKEN(STR_LOAD_FILE2
), &gEfiLoadFile2ProtocolGuid
, NULL
},
1727 {STRING_TOKEN(STR_SIMPLE_FILE_SYS
), &gEfiSimpleFileSystemProtocolGuid
, NULL
},
1728 {STRING_TOKEN(STR_TAPE_IO
), &gEfiTapeIoProtocolGuid
, NULL
},
1729 {STRING_TOKEN(STR_DISK_IO
), &gEfiDiskIoProtocolGuid
, NULL
},
1730 {STRING_TOKEN(STR_BLK_IO
), &gEfiBlockIoProtocolGuid
, NULL
},
1731 {STRING_TOKEN(STR_UC
), &gEfiUnicodeCollationProtocolGuid
, NULL
},
1732 {STRING_TOKEN(STR_UC2
), &gEfiUnicodeCollation2ProtocolGuid
, NULL
},
1733 {STRING_TOKEN(STR_PCIRB_IO
), &gEfiPciRootBridgeIoProtocolGuid
, PciRootBridgeIoDumpInformation
},
1734 {STRING_TOKEN(STR_PCI_IO
), &gEfiPciIoProtocolGuid
, NULL
},
1735 {STRING_TOKEN(STR_SCSI_PT
), &gEfiScsiPassThruProtocolGuid
, NULL
},
1736 {STRING_TOKEN(STR_SCSI_IO
), &gEfiScsiIoProtocolGuid
, NULL
},
1737 {STRING_TOKEN(STR_SCSI_PT_EXT
), &gEfiExtScsiPassThruProtocolGuid
, NULL
},
1738 {STRING_TOKEN(STR_ISCSI
), &gEfiIScsiInitiatorNameProtocolGuid
, NULL
},
1739 {STRING_TOKEN(STR_USB_IO
), &gEfiUsbIoProtocolGuid
, NULL
},
1740 {STRING_TOKEN(STR_USB_HC
), &gEfiUsbHcProtocolGuid
, NULL
},
1741 {STRING_TOKEN(STR_USB_HC2
), &gEfiUsb2HcProtocolGuid
, NULL
},
1742 {STRING_TOKEN(STR_DEBUG_SUPPORT
), &gEfiDebugSupportProtocolGuid
, NULL
},
1743 {STRING_TOKEN(STR_DEBUG_PORT
), &gEfiDebugPortProtocolGuid
, NULL
},
1744 {STRING_TOKEN(STR_DECOMPRESS
), &gEfiDecompressProtocolGuid
, NULL
},
1745 {STRING_TOKEN(STR_ACPI_TABLE
), &gEfiAcpiTableProtocolGuid
, NULL
},
1746 {STRING_TOKEN(STR_EBC_INTERPRETER
), &gEfiEbcProtocolGuid
, NULL
},
1747 {STRING_TOKEN(STR_SNP
), &gEfiSimpleNetworkProtocolGuid
, NULL
},
1748 {STRING_TOKEN(STR_NII
), &gEfiNetworkInterfaceIdentifierProtocolGuid
, NULL
},
1749 {STRING_TOKEN(STR_NII_31
), &gEfiNetworkInterfaceIdentifierProtocolGuid_31
, NULL
},
1750 {STRING_TOKEN(STR_PXE_BC
), &gEfiPxeBaseCodeProtocolGuid
, NULL
},
1751 {STRING_TOKEN(STR_PXE_CB
), &gEfiPxeBaseCodeCallbackProtocolGuid
, NULL
},
1752 {STRING_TOKEN(STR_BIS
), &gEfiBisProtocolGuid
, NULL
},
1753 {STRING_TOKEN(STR_MNP_SB
), &gEfiManagedNetworkServiceBindingProtocolGuid
, NULL
},
1754 {STRING_TOKEN(STR_MNP
), &gEfiManagedNetworkProtocolGuid
, NULL
},
1755 {STRING_TOKEN(STR_ARP_SB
), &gEfiArpServiceBindingProtocolGuid
, NULL
},
1756 {STRING_TOKEN(STR_ARP
), &gEfiArpProtocolGuid
, NULL
},
1757 {STRING_TOKEN(STR_DHCPV4_SB
), &gEfiDhcp4ServiceBindingProtocolGuid
, NULL
},
1758 {STRING_TOKEN(STR_DHCPV4
), &gEfiDhcp4ProtocolGuid
, NULL
},
1759 {STRING_TOKEN(STR_TCPV4_SB
), &gEfiTcp4ServiceBindingProtocolGuid
, NULL
},
1760 {STRING_TOKEN(STR_TCPV4
), &gEfiTcp4ProtocolGuid
, NULL
},
1761 {STRING_TOKEN(STR_IPV4_SB
), &gEfiIp4ServiceBindingProtocolGuid
, NULL
},
1762 {STRING_TOKEN(STR_IPV4
), &gEfiIp4ProtocolGuid
, NULL
},
1763 {STRING_TOKEN(STR_IPV4_CFG
), &gEfiIp4ConfigProtocolGuid
, NULL
},
1764 {STRING_TOKEN(STR_IPV4_CFG2
), &gEfiIp4Config2ProtocolGuid
, NULL
},
1765 {STRING_TOKEN(STR_UDPV4_SB
), &gEfiUdp4ServiceBindingProtocolGuid
, NULL
},
1766 {STRING_TOKEN(STR_UDPV4
), &gEfiUdp4ProtocolGuid
, NULL
},
1767 {STRING_TOKEN(STR_MTFTPV4_SB
), &gEfiMtftp4ServiceBindingProtocolGuid
, NULL
},
1768 {STRING_TOKEN(STR_MTFTPV4
), &gEfiMtftp4ProtocolGuid
, NULL
},
1769 {STRING_TOKEN(STR_AUTH_INFO
), &gEfiAuthenticationInfoProtocolGuid
, NULL
},
1770 {STRING_TOKEN(STR_HASH_SB
), &gEfiHashServiceBindingProtocolGuid
, NULL
},
1771 {STRING_TOKEN(STR_HASH
), &gEfiHashProtocolGuid
, NULL
},
1772 {STRING_TOKEN(STR_HII_FONT
), &gEfiHiiFontProtocolGuid
, NULL
},
1773 {STRING_TOKEN(STR_HII_STRING
), &gEfiHiiStringProtocolGuid
, NULL
},
1774 {STRING_TOKEN(STR_HII_IMAGE
), &gEfiHiiImageProtocolGuid
, NULL
},
1775 {STRING_TOKEN(STR_HII_DATABASE
), &gEfiHiiDatabaseProtocolGuid
, NULL
},
1776 {STRING_TOKEN(STR_HII_CONFIG_ROUT
), &gEfiHiiConfigRoutingProtocolGuid
, NULL
},
1777 {STRING_TOKEN(STR_HII_CONFIG_ACC
), &gEfiHiiConfigAccessProtocolGuid
, NULL
},
1778 {STRING_TOKEN(STR_HII_FORM_BROWSER2
), &gEfiFormBrowser2ProtocolGuid
, NULL
},
1779 {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE
), &gEfiDriverFamilyOverrideProtocolGuid
, NULL
},
1780 {STRING_TOKEN(STR_PCD
), &gPcdProtocolGuid
, NULL
},
1781 {STRING_TOKEN(STR_TCG
), &gEfiTcgProtocolGuid
, NULL
},
1782 {STRING_TOKEN(STR_HII_PACKAGE_LIST
), &gEfiHiiPackageListProtocolGuid
, NULL
},
1785 // the ones under this are deprecated by the current UEFI Spec, but may be found anyways...
1787 {STRING_TOKEN(STR_SHELL_INTERFACE
), &gEfiShellInterfaceGuid
, NULL
},
1788 {STRING_TOKEN(STR_SHELL_ENV2
), &gEfiShellEnvironment2Guid
, NULL
},
1789 {STRING_TOKEN(STR_SHELL_ENV
), &gEfiShellEnvironment2Guid
, NULL
},
1790 {STRING_TOKEN(STR_DEVICE_IO
), &gEfiDeviceIoProtocolGuid
, NULL
},
1791 {STRING_TOKEN(STR_UGA_DRAW
), &gEfiUgaDrawProtocolGuid
, NULL
},
1792 {STRING_TOKEN(STR_UGA_IO
), &gEfiUgaIoProtocolGuid
, NULL
},
1793 {STRING_TOKEN(STR_ESP
), &gEfiPartTypeSystemPartGuid
, NULL
},
1794 {STRING_TOKEN(STR_GPT_NBR
), &gEfiPartTypeLegacyMbrGuid
, NULL
},
1795 {STRING_TOKEN(STR_DRIVER_CONFIG
), &gEfiDriverConfigurationProtocolGuid
, NULL
},
1796 {STRING_TOKEN(STR_DRIVER_CONFIG2
), &gEfiDriverConfiguration2ProtocolGuid
, NULL
},
1799 // these are using local (non-global) definitions to reduce package dependancy.
1801 {STRING_TOKEN(STR_ISA_IO
), (EFI_GUID
*)&EfiIsaIoProtocolGuid
, NULL
},
1802 {STRING_TOKEN(STR_ISA_ACPI
), (EFI_GUID
*)&EfiIsaAcpiProtocolGuid
, NULL
},
1805 // the ones under this are GUID identified structs, not protocols
1807 {STRING_TOKEN(STR_FILE_INFO
), &gEfiFileInfoGuid
, NULL
},
1808 {STRING_TOKEN(STR_FILE_SYS_INFO
), &gEfiFileSystemInfoGuid
, NULL
},
1811 // the ones under this are misc GUIDS.
1813 {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE
), &gEfiGlobalVariableGuid
, NULL
},
1818 {STRING_TOKEN(STR_IP6_SB
), &gEfiIp6ServiceBindingProtocolGuid
, NULL
},
1819 {STRING_TOKEN(STR_IP6
), &gEfiIp6ProtocolGuid
, NULL
},
1820 {STRING_TOKEN(STR_IP6_CONFIG
), &gEfiIp6ConfigProtocolGuid
, NULL
},
1821 {STRING_TOKEN(STR_MTFTP6_SB
), &gEfiMtftp6ServiceBindingProtocolGuid
, NULL
},
1822 {STRING_TOKEN(STR_MTFTP6
), &gEfiMtftp6ProtocolGuid
, NULL
},
1823 {STRING_TOKEN(STR_DHCP6_SB
), &gEfiDhcp6ServiceBindingProtocolGuid
, NULL
},
1824 {STRING_TOKEN(STR_DHCP6
), &gEfiDhcp6ProtocolGuid
, NULL
},
1825 {STRING_TOKEN(STR_UDP6_SB
), &gEfiUdp6ServiceBindingProtocolGuid
, NULL
},
1826 {STRING_TOKEN(STR_UDP6
), &gEfiUdp6ProtocolGuid
, NULL
},
1827 {STRING_TOKEN(STR_TCP6_SB
), &gEfiTcp6ServiceBindingProtocolGuid
, NULL
},
1828 {STRING_TOKEN(STR_TCP6
), &gEfiTcp6ProtocolGuid
, NULL
},
1829 {STRING_TOKEN(STR_VLAN_CONFIG
), &gEfiVlanConfigProtocolGuid
, NULL
},
1830 {STRING_TOKEN(STR_EAP
), &gEfiEapProtocolGuid
, NULL
},
1831 {STRING_TOKEN(STR_EAP_MGMT
), &gEfiEapManagementProtocolGuid
, NULL
},
1832 {STRING_TOKEN(STR_FTP4_SB
), &gEfiFtp4ServiceBindingProtocolGuid
, NULL
},
1833 {STRING_TOKEN(STR_FTP4
), &gEfiFtp4ProtocolGuid
, NULL
},
1834 {STRING_TOKEN(STR_IP_SEC_CONFIG
), &gEfiIpSecConfigProtocolGuid
, NULL
},
1835 {STRING_TOKEN(STR_DH
), &gEfiDriverHealthProtocolGuid
, NULL
},
1836 {STRING_TOKEN(STR_DEF_IMG_LOAD
), &gEfiDeferredImageLoadProtocolGuid
, NULL
},
1837 {STRING_TOKEN(STR_USER_CRED
), &gEfiUserCredentialProtocolGuid
, NULL
},
1838 {STRING_TOKEN(STR_USER_MNGR
), &gEfiUserManagerProtocolGuid
, NULL
},
1839 {STRING_TOKEN(STR_ATA_PASS_THRU
), &gEfiAtaPassThruProtocolGuid
, NULL
},
1844 {STRING_TOKEN(STR_FW_MGMT
), &gEfiFirmwareManagementProtocolGuid
, FirmwareManagementDumpInformation
},
1845 {STRING_TOKEN(STR_IP_SEC
), &gEfiIpSecProtocolGuid
, NULL
},
1846 {STRING_TOKEN(STR_IP_SEC2
), &gEfiIpSec2ProtocolGuid
, NULL
},
1851 {STRING_TOKEN(STR_KMS
), &gEfiKmsProtocolGuid
, NULL
},
1852 {STRING_TOKEN(STR_BLK_IO2
), &gEfiBlockIo2ProtocolGuid
, NULL
},
1853 {STRING_TOKEN(STR_SSC
), &gEfiStorageSecurityCommandProtocolGuid
, NULL
},
1854 {STRING_TOKEN(STR_UCRED2
), &gEfiUserCredential2ProtocolGuid
, NULL
},
1859 {STRING_TOKEN(STR_DISK_IO2
), &gEfiDiskIo2ProtocolGuid
, NULL
},
1860 {STRING_TOKEN(STR_ADAPTER_INFO
), &gEfiAdapterInformationProtocolGuid
, AdapterInformationDumpInformation
},
1865 {STRING_TOKEN(STR_IDE_CONT_INIT
), &gEfiIdeControllerInitProtocolGuid
, NULL
},
1866 {STRING_TOKEN(STR_DISK_INFO
), &gEfiDiskInfoProtocolGuid
, NULL
},
1871 {STRING_TOKEN(STR_BDS_ARCH
), &gEfiBdsArchProtocolGuid
, NULL
},
1872 {STRING_TOKEN(STR_CPU_ARCH
), &gEfiCpuArchProtocolGuid
, NULL
},
1873 {STRING_TOKEN(STR_MET_ARCH
), &gEfiMetronomeArchProtocolGuid
, NULL
},
1874 {STRING_TOKEN(STR_MON_ARCH
), &gEfiMonotonicCounterArchProtocolGuid
, NULL
},
1875 {STRING_TOKEN(STR_RTC_ARCH
), &gEfiRealTimeClockArchProtocolGuid
, NULL
},
1876 {STRING_TOKEN(STR_RESET_ARCH
), &gEfiResetArchProtocolGuid
, NULL
},
1877 {STRING_TOKEN(STR_RT_ARCH
), &gEfiRuntimeArchProtocolGuid
, NULL
},
1878 {STRING_TOKEN(STR_SEC_ARCH
), &gEfiSecurityArchProtocolGuid
, NULL
},
1879 {STRING_TOKEN(STR_TIMER_ARCH
), &gEfiTimerArchProtocolGuid
, NULL
},
1880 {STRING_TOKEN(STR_VAR_ARCH
), &gEfiVariableWriteArchProtocolGuid
, NULL
},
1881 {STRING_TOKEN(STR_V_ARCH
), &gEfiVariableArchProtocolGuid
, NULL
},
1882 {STRING_TOKEN(STR_SECP
), &gEfiSecurityPolicyProtocolGuid
, NULL
},
1883 {STRING_TOKEN(STR_WDT_ARCH
), &gEfiWatchdogTimerArchProtocolGuid
, NULL
},
1884 {STRING_TOKEN(STR_SCR
), &gEfiStatusCodeRuntimeProtocolGuid
, NULL
},
1885 {STRING_TOKEN(STR_SMB_HC
), &gEfiSmbusHcProtocolGuid
, NULL
},
1886 {STRING_TOKEN(STR_FV_2
), &gEfiFirmwareVolume2ProtocolGuid
, NULL
},
1887 {STRING_TOKEN(STR_FV_BLOCK
), &gEfiFirmwareVolumeBlockProtocolGuid
, NULL
},
1888 {STRING_TOKEN(STR_CAP_ARCH
), &gEfiCapsuleArchProtocolGuid
, NULL
},
1889 {STRING_TOKEN(STR_MP_SERVICE
), &gEfiMpServiceProtocolGuid
, NULL
},
1890 {STRING_TOKEN(STR_HBRAP
), &gEfiPciHostBridgeResourceAllocationProtocolGuid
, NULL
},
1891 {STRING_TOKEN(STR_PCIP
), &gEfiPciPlatformProtocolGuid
, NULL
},
1892 {STRING_TOKEN(STR_PCIO
), &gEfiPciOverrideProtocolGuid
, NULL
},
1893 {STRING_TOKEN(STR_PCIE
), &gEfiPciEnumerationCompleteProtocolGuid
, NULL
},
1894 {STRING_TOKEN(STR_IPCID
), &gEfiIncompatiblePciDeviceSupportProtocolGuid
, NULL
},
1895 {STRING_TOKEN(STR_PCIHPI
), &gEfiPciHotPlugInitProtocolGuid
, NULL
},
1896 {STRING_TOKEN(STR_PCIHPR
), &gEfiPciHotPlugRequestProtocolGuid
, NULL
},
1897 {STRING_TOKEN(STR_SMBIOS
), &gEfiSmbiosProtocolGuid
, NULL
},
1898 {STRING_TOKEN(STR_S3_SAVE
), &gEfiS3SaveStateProtocolGuid
, NULL
},
1899 {STRING_TOKEN(STR_S3_S_SMM
), &gEfiS3SmmSaveStateProtocolGuid
, NULL
},
1900 {STRING_TOKEN(STR_RSC
), &gEfiRscHandlerProtocolGuid
, NULL
},
1901 {STRING_TOKEN(STR_S_RSC
), &gEfiSmmRscHandlerProtocolGuid
, NULL
},
1902 {STRING_TOKEN(STR_ACPI_SDT
), &gEfiAcpiSdtProtocolGuid
, NULL
},
1903 {STRING_TOKEN(STR_SIO
), &gEfiSioProtocolGuid
, NULL
},
1904 {STRING_TOKEN(STR_S_CPU2
), &gEfiSmmCpuIo2ProtocolGuid
, NULL
},
1905 {STRING_TOKEN(STR_S_BASE2
), &gEfiSmmBase2ProtocolGuid
, NULL
},
1906 {STRING_TOKEN(STR_S_ACC_2
), &gEfiSmmAccess2ProtocolGuid
, NULL
},
1907 {STRING_TOKEN(STR_S_CON_2
), &gEfiSmmControl2ProtocolGuid
, NULL
},
1908 {STRING_TOKEN(STR_S_CONFIG
), &gEfiSmmConfigurationProtocolGuid
, NULL
},
1909 {STRING_TOKEN(STR_S_RTL
), &gEfiSmmReadyToLockProtocolGuid
, NULL
},
1910 {STRING_TOKEN(STR_DS_RTL
), &gEfiDxeSmmReadyToLockProtocolGuid
, NULL
},
1911 {STRING_TOKEN(STR_S_COMM
), &gEfiSmmCommunicationProtocolGuid
, NULL
},
1912 {STRING_TOKEN(STR_S_STAT
), &gEfiSmmStatusCodeProtocolGuid
, NULL
},
1913 {STRING_TOKEN(STR_S_CPU
), &gEfiSmmCpuProtocolGuid
, NULL
},
1914 {STRING_TOKEN(STR_S_PCIRBIO
), &gEfiPciRootBridgeIoProtocolGuid
, NULL
},
1915 {STRING_TOKEN(STR_S_SWD
), &gEfiSmmSwDispatch2ProtocolGuid
, NULL
},
1916 {STRING_TOKEN(STR_S_SXD
), &gEfiSmmSxDispatch2ProtocolGuid
, NULL
},
1917 {STRING_TOKEN(STR_S_PTD2
), &gEfiSmmPeriodicTimerDispatch2ProtocolGuid
, NULL
},
1918 {STRING_TOKEN(STR_S_UD2
), &gEfiSmmUsbDispatch2ProtocolGuid
, NULL
},
1919 {STRING_TOKEN(STR_S_GD2
), &gEfiSmmGpiDispatch2ProtocolGuid
, NULL
},
1920 {STRING_TOKEN(STR_S_SBD2
), &gEfiSmmStandbyButtonDispatch2ProtocolGuid
, NULL
},
1921 {STRING_TOKEN(STR_S_PBD2
), &gEfiSmmPowerButtonDispatch2ProtocolGuid
, NULL
},
1922 {STRING_TOKEN(STR_S_ITD2
), &gEfiSmmIoTrapDispatch2ProtocolGuid
, NULL
},
1923 {STRING_TOKEN(STR_PCD
), &gEfiPcdProtocolGuid
, NULL
},
1924 {STRING_TOKEN(STR_FVB2
), &gEfiFirmwareVolumeBlock2ProtocolGuid
, NULL
},
1925 {STRING_TOKEN(STR_CPUIO2
), &gEfiCpuIo2ProtocolGuid
, NULL
},
1926 {STRING_TOKEN(STR_LEGACY_R2
), &gEfiLegacyRegion2ProtocolGuid
, NULL
},
1927 {STRING_TOKEN(STR_SAL_MIP
), &gEfiSalMcaInitPmiProtocolGuid
, NULL
},
1928 {STRING_TOKEN(STR_ES_BS
), &gEfiExtendedSalBootServiceProtocolGuid
, NULL
},
1929 {STRING_TOKEN(STR_ES_BIO
), &gEfiExtendedSalBaseIoServicesProtocolGuid
, NULL
},
1930 {STRING_TOKEN(STR_ES_STALL
), &gEfiExtendedSalStallServicesProtocolGuid
, NULL
},
1931 {STRING_TOKEN(STR_ES_RTC
), &gEfiExtendedSalRtcServicesProtocolGuid
, NULL
},
1932 {STRING_TOKEN(STR_ES_VS
), &gEfiExtendedSalVariableServicesProtocolGuid
, NULL
},
1933 {STRING_TOKEN(STR_ES_MTC
), &gEfiExtendedSalMtcServicesProtocolGuid
, NULL
},
1934 {STRING_TOKEN(STR_ES_RESET
), &gEfiExtendedSalResetServicesProtocolGuid
, NULL
},
1935 {STRING_TOKEN(STR_ES_SC
), &gEfiExtendedSalStatusCodeServicesProtocolGuid
, NULL
},
1936 {STRING_TOKEN(STR_ES_FBS
), &gEfiExtendedSalFvBlockServicesProtocolGuid
, NULL
},
1937 {STRING_TOKEN(STR_ES_MP
), &gEfiExtendedSalMpServicesProtocolGuid
, NULL
},
1938 {STRING_TOKEN(STR_ES_PAL
), &gEfiExtendedSalPalServicesProtocolGuid
, NULL
},
1939 {STRING_TOKEN(STR_ES_BASE
), &gEfiExtendedSalBaseServicesProtocolGuid
, NULL
},
1940 {STRING_TOKEN(STR_ES_MCA
), &gEfiExtendedSalMcaServicesProtocolGuid
, NULL
},
1941 {STRING_TOKEN(STR_ES_PCI
), &gEfiExtendedSalPciServicesProtocolGuid
, NULL
},
1942 {STRING_TOKEN(STR_ES_CACHE
), &gEfiExtendedSalCacheServicesProtocolGuid
, NULL
},
1943 {STRING_TOKEN(STR_ES_MCA_LOG
), &gEfiExtendedSalMcaLogServicesProtocolGuid
, NULL
},
1944 {STRING_TOKEN(STR_S2ARCH
), &gEfiSecurity2ArchProtocolGuid
, NULL
},
1945 {STRING_TOKEN(STR_EODXE
), &gEfiSmmEndOfDxeProtocolGuid
, NULL
},
1946 {STRING_TOKEN(STR_ISAHC
), &gEfiIsaHcProtocolGuid
, NULL
},
1947 {STRING_TOKEN(STR_ISAHC_B
), &gEfiIsaHcServiceBindingProtocolGuid
, NULL
},
1948 {STRING_TOKEN(STR_SIO_C
), &gEfiSioControlProtocolGuid
, NULL
},
1949 {STRING_TOKEN(STR_GET_PCD
), &gEfiGetPcdInfoProtocolGuid
, NULL
},
1950 {STRING_TOKEN(STR_I2C_M
), &gEfiI2cMasterProtocolGuid
, NULL
},
1951 {STRING_TOKEN(STR_I2CIO
), &gEfiI2cIoProtocolGuid
, NULL
},
1952 {STRING_TOKEN(STR_I2CEN
), &gEfiI2cEnumerateProtocolGuid
, NULL
},
1953 {STRING_TOKEN(STR_I2C_H
), &gEfiI2cHostProtocolGuid
, NULL
},
1954 {STRING_TOKEN(STR_I2C_BCM
), &gEfiI2cBusConfigurationManagementProtocolGuid
, NULL
},
1955 {STRING_TOKEN(STR_TREE
), &gEfiTrEEProtocolGuid
, NULL
},
1956 {STRING_TOKEN(STR_TCG2
), &gEfiTcg2ProtocolGuid
, NULL
},
1957 {STRING_TOKEN(STR_TIMESTAMP
), &gEfiTimestampProtocolGuid
, NULL
},
1958 {STRING_TOKEN(STR_RNG
), &gEfiRngProtocolGuid
, NULL
},
1959 {STRING_TOKEN(STR_NVMEPT
), &gEfiNvmExpressPassThruProtocolGuid
, NULL
},
1960 {STRING_TOKEN(STR_H2_SB
), &gEfiHash2ServiceBindingProtocolGuid
, NULL
},
1961 {STRING_TOKEN(STR_HASH2
), &gEfiHash2ProtocolGuid
, NULL
},
1962 {STRING_TOKEN(STR_BIO_C
), &gEfiBlockIoCryptoProtocolGuid
, NULL
},
1963 {STRING_TOKEN(STR_SCR
), &gEfiSmartCardReaderProtocolGuid
, NULL
},
1964 {STRING_TOKEN(STR_SCE
), &gEfiSmartCardEdgeProtocolGuid
, NULL
},
1965 {STRING_TOKEN(STR_USB_FIO
), &gEfiUsbFunctionIoProtocolGuid
, NULL
},
1966 {STRING_TOKEN(STR_BC_HC
), &gEfiBluetoothHcProtocolGuid
, NULL
},
1967 {STRING_TOKEN(STR_BC_IO_SB
), &gEfiBluetoothIoServiceBindingProtocolGuid
, NULL
},
1968 {STRING_TOKEN(STR_BC_IO
), &gEfiBluetoothIoProtocolGuid
, NULL
},
1969 {STRING_TOKEN(STR_BC_C
), &gEfiBluetoothConfigProtocolGuid
, NULL
},
1970 {STRING_TOKEN(STR_REG_EXP
), &gEfiRegularExpressionProtocolGuid
, NULL
},
1971 {STRING_TOKEN(STR_B_MGR_P
), &gEfiBootManagerPolicyProtocolGuid
, NULL
},
1972 {STRING_TOKEN(STR_CKH
), &gEfiConfigKeywordHandlerProtocolGuid
, NULL
},
1973 {STRING_TOKEN(STR_WIFI
), &gEfiWiFiProtocolGuid
, NULL
},
1974 {STRING_TOKEN(STR_EAP_M
), &gEfiEapManagement2ProtocolGuid
, NULL
},
1975 {STRING_TOKEN(STR_EAP_C
), &gEfiEapConfigurationProtocolGuid
, NULL
},
1976 {STRING_TOKEN(STR_PKCS7
), &gEfiPkcs7VerifyProtocolGuid
, NULL
},
1977 {STRING_TOKEN(STR_NET_DNS4_SB
), &gEfiDns4ServiceBindingProtocolGuid
, NULL
},
1978 {STRING_TOKEN(STR_NET_DNS4
), &gEfiDns4ProtocolGuid
, NULL
},
1979 {STRING_TOKEN(STR_NET_DNS6_SB
), &gEfiDns6ServiceBindingProtocolGuid
, NULL
},
1980 {STRING_TOKEN(STR_NET_DNS6
), &gEfiDns6ProtocolGuid
, NULL
},
1981 {STRING_TOKEN(STR_NET_HTTP_SB
), &gEfiHttpServiceBindingProtocolGuid
, NULL
},
1982 {STRING_TOKEN(STR_NET_HTTP
), &gEfiHttpProtocolGuid
, NULL
},
1983 {STRING_TOKEN(STR_NET_HTTP_U
), &gEfiHttpUtilitiesProtocolGuid
, NULL
},
1984 {STRING_TOKEN(STR_REST
), &gEfiRestProtocolGuid
, NULL
},
1987 // UEFI Shell Spec 2.0
1989 {STRING_TOKEN(STR_SHELL_PARAMETERS
), &gEfiShellParametersProtocolGuid
, NULL
},
1990 {STRING_TOKEN(STR_SHELL
), &gEfiShellProtocolGuid
, NULL
},
1993 // UEFI Shell Spec 2.1
1995 {STRING_TOKEN(STR_SHELL_DYNAMIC
), &gEfiShellDynamicCommandProtocolGuid
, NULL
},
2000 {STRING_TOKEN(STR_PCDINFOPROT
), &gGetPcdInfoProtocolGuid
, NULL
},
2009 Function to get the node for a protocol or struct from it's GUID.
2011 if Guid is NULL, then ASSERT.
2013 @param[in] Guid The GUID to look for the name of.
2017 CONST GUID_INFO_BLOCK
*
2018 InternalShellGetNodeFromGuid(
2019 IN CONST EFI_GUID
* Guid
2022 CONST GUID_INFO_BLOCK
*ListWalker
;
2025 ASSERT(Guid
!= NULL
);
2027 for (LoopCount
= 0, ListWalker
= mGuidList
; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++, ListWalker
++) {
2028 if (CompareGuid(ListWalker
->GuidId
, Guid
)) {
2029 return (ListWalker
);
2033 if (PcdGetBool(PcdShellIncludeNtGuids
)) {
2034 for (ListWalker
= mGuidStringListNT
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2035 if (CompareGuid(ListWalker
->GuidId
, Guid
)) {
2036 return (ListWalker
);
2040 for (ListWalker
= mGuidStringList
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2041 if (CompareGuid(ListWalker
->GuidId
, Guid
)) {
2042 return (ListWalker
);
2049 Function to add a new GUID/Name mapping.
2051 @param[in] Guid The Guid
2052 @param[in] NameID The STRING id of the HII string to use
2053 @param[in] DumpFunc The pointer to the dump function
2056 @retval EFI_SUCCESS The operation was sucessful
2057 @retval EFI_OUT_OF_RESOURCES A memory allocation failed
2058 @retval EFI_INVALID_PARAMETER Guid NameId was invalid
2061 InsertNewGuidNameMapping(
2062 IN CONST EFI_GUID
*Guid
,
2063 IN CONST EFI_STRING_ID NameID
,
2064 IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL
2067 ASSERT(Guid
!= NULL
);
2068 ASSERT(NameID
!= 0);
2070 mGuidList
= ReallocatePool(mGuidListCount
* sizeof(GUID_INFO_BLOCK
), mGuidListCount
+1 * sizeof(GUID_INFO_BLOCK
), mGuidList
);
2071 if (mGuidList
== NULL
) {
2073 return (EFI_OUT_OF_RESOURCES
);
2077 mGuidList
[mGuidListCount
- 1].GuidId
= AllocateCopyPool(sizeof(EFI_GUID
), Guid
);
2078 mGuidList
[mGuidListCount
- 1].StringId
= NameID
;
2079 mGuidList
[mGuidListCount
- 1].DumpInfo
= DumpFunc
;
2081 if (mGuidList
[mGuidListCount
- 1].GuidId
== NULL
) {
2082 return (EFI_OUT_OF_RESOURCES
);
2085 return (EFI_SUCCESS
);
2089 Function to add a new GUID/Name mapping.
2091 This cannot overwrite an existing mapping.
2093 @param[in] Guid The Guid
2094 @param[in] TheName The Guid's name
2095 @param[in] Lang RFC4646 language code list or NULL
2097 @retval EFI_SUCCESS The operation was sucessful
2098 @retval EFI_ACCESS_DENIED There was a duplicate
2099 @retval EFI_OUT_OF_RESOURCES A memory allocation failed
2100 @retval EFI_INVALID_PARAMETER Guid or TheName was NULL
2104 AddNewGuidNameMapping(
2105 IN CONST EFI_GUID
*Guid
,
2106 IN CONST CHAR16
*TheName
,
2107 IN CONST CHAR8
*Lang OPTIONAL
2110 EFI_STRING_ID NameID
;
2112 HandleParsingHiiInit();
2114 if (Guid
== NULL
|| TheName
== NULL
){
2115 return (EFI_INVALID_PARAMETER
);
2118 if ((InternalShellGetNodeFromGuid(Guid
)) != NULL
) {
2119 return (EFI_ACCESS_DENIED
);
2122 NameID
= HiiSetString(mHandleParsingHiiHandle
, 0, (CHAR16
*)TheName
, Lang
);
2124 return (EFI_OUT_OF_RESOURCES
);
2127 return (InsertNewGuidNameMapping(Guid
, NameID
, NULL
));
2131 Function to get the name of a protocol or struct from it's GUID.
2133 if Guid is NULL, then ASSERT.
2135 @param[in] Guid The GUID to look for the name of.
2136 @param[in] Lang The language to use.
2138 @return pointer to string of the name. The caller
2139 is responsible to free this memory.
2143 GetStringNameFromGuid(
2144 IN CONST EFI_GUID
*Guid
,
2145 IN CONST CHAR8
*Lang OPTIONAL
2148 CONST GUID_INFO_BLOCK
*Id
;
2150 HandleParsingHiiInit();
2152 Id
= InternalShellGetNodeFromGuid(Guid
);
2156 return HiiGetString (mHandleParsingHiiHandle
, Id
->StringId
, Lang
);
2160 Function to dump protocol information from a handle.
2162 This function will return a allocated string buffer containing the
2163 information. The caller is responsible for freeing the memory.
2165 If Guid is NULL, ASSERT().
2166 If TheHandle is NULL, ASSERT().
2168 @param[in] TheHandle The handle to dump information from.
2169 @param[in] Guid The GUID of the protocol to dump.
2170 @param[in] Verbose TRUE for extra info. FALSE otherwise.
2172 @return The pointer to string.
2173 @retval NULL An error was encountered.
2177 GetProtocolInformationDump(
2178 IN CONST EFI_HANDLE TheHandle
,
2179 IN CONST EFI_GUID
*Guid
,
2180 IN CONST BOOLEAN Verbose
2183 CONST GUID_INFO_BLOCK
*Id
;
2185 ASSERT(TheHandle
!= NULL
);
2186 ASSERT(Guid
!= NULL
);
2188 if (TheHandle
== NULL
|| Guid
== NULL
) {
2192 Id
= InternalShellGetNodeFromGuid(Guid
);
2193 if (Id
!= NULL
&& Id
->DumpInfo
!= NULL
) {
2194 return (Id
->DumpInfo(TheHandle
, Verbose
));
2200 Function to get the Guid for a protocol or struct based on it's string name.
2202 do not modify the returned Guid.
2204 @param[in] Name The pointer to the string name.
2205 @param[in] Lang The pointer to the language code.
2206 @param[out] Guid The pointer to the Guid.
2208 @retval EFI_SUCCESS The operation was sucessful.
2212 GetGuidFromStringName(
2213 IN CONST CHAR16
*Name
,
2214 IN CONST CHAR8
*Lang OPTIONAL
,
2218 CONST GUID_INFO_BLOCK
*ListWalker
;
2222 HandleParsingHiiInit();
2224 ASSERT(Guid
!= NULL
);
2226 return (EFI_INVALID_PARAMETER
);
2230 if (PcdGetBool(PcdShellIncludeNtGuids
)) {
2231 for (ListWalker
= mGuidStringListNT
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2232 String
= HiiGetString(mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2233 if (Name
!= NULL
&& String
!= NULL
&& StringNoCaseCompare (&Name
, &String
) == 0) {
2234 *Guid
= ListWalker
->GuidId
;
2236 SHELL_FREE_NON_NULL(String
);
2237 if (*Guid
!= NULL
) {
2238 return (EFI_SUCCESS
);
2242 for (ListWalker
= mGuidStringList
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2243 String
= HiiGetString(mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2244 if (Name
!= NULL
&& String
!= NULL
&& StringNoCaseCompare (&Name
, &String
) == 0) {
2245 *Guid
= ListWalker
->GuidId
;
2247 SHELL_FREE_NON_NULL(String
);
2248 if (*Guid
!= NULL
) {
2249 return (EFI_SUCCESS
);
2253 for (LoopCount
= 0, ListWalker
= mGuidList
; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++, ListWalker
++) {
2254 String
= HiiGetString(mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2255 if (Name
!= NULL
&& String
!= NULL
&& StringNoCaseCompare (&Name
, &String
) == 0) {
2256 *Guid
= ListWalker
->GuidId
;
2258 SHELL_FREE_NON_NULL(String
);
2259 if (*Guid
!= NULL
) {
2260 return (EFI_SUCCESS
);
2264 return (EFI_NOT_FOUND
);
2268 Get best support language for this driver.
2270 First base on the user input language to search, second base on the current
2271 platform used language to search, third get the first language from the
2272 support language list. The caller need to free the buffer of the best language.
2274 @param[in] SupportedLanguages The support languages for this driver.
2275 @param[in] InputLanguage The user input language.
2276 @param[in] Iso639Language Whether get language for ISO639.
2278 @return The best support language for this driver.
2282 GetBestLanguageForDriver (
2283 IN CONST CHAR8
*SupportedLanguages
,
2284 IN CONST CHAR8
*InputLanguage
,
2285 IN BOOLEAN Iso639Language
2288 CHAR8
*LanguageVariable
;
2289 CHAR8
*BestLanguage
;
2291 GetVariable2 (Iso639Language
? L
"Lang" : L
"PlatformLang", &gEfiGlobalVariableGuid
, (VOID
**)&LanguageVariable
, NULL
);
2293 BestLanguage
= GetBestLanguage(
2296 (InputLanguage
!= NULL
) ? InputLanguage
: "",
2297 (LanguageVariable
!= NULL
) ? LanguageVariable
: "",
2302 if (LanguageVariable
!= NULL
) {
2303 FreePool (LanguageVariable
);
2306 return BestLanguage
;
2310 Function to retrieve the driver name (if possible) from the ComponentName or
2311 ComponentName2 protocol
2313 @param[in] TheHandle The driver handle to get the name of.
2314 @param[in] Language The language to use.
2316 @retval NULL The name could not be found.
2317 @return A pointer to the string name. Do not de-allocate the memory.
2321 GetStringNameFromHandle(
2322 IN CONST EFI_HANDLE TheHandle
,
2323 IN CONST CHAR8
*Language
2326 EFI_COMPONENT_NAME2_PROTOCOL
*CompNameStruct
;
2333 Status
= gBS
->OpenProtocol(
2335 &gEfiComponentName2ProtocolGuid
,
2336 (VOID
**)&CompNameStruct
,
2339 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
2340 if (!EFI_ERROR(Status
)) {
2341 BestLang
= GetBestLanguageForDriver (CompNameStruct
->SupportedLanguages
, Language
, FALSE
);
2342 Status
= CompNameStruct
->GetDriverName(CompNameStruct
, BestLang
, &RetVal
);
2343 if (BestLang
!= NULL
) {
2344 FreePool (BestLang
);
2347 if (!EFI_ERROR(Status
)) {
2351 Status
= gBS
->OpenProtocol(
2353 &gEfiComponentNameProtocolGuid
,
2354 (VOID
**)&CompNameStruct
,
2357 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
2358 if (!EFI_ERROR(Status
)) {
2359 BestLang
= GetBestLanguageForDriver (CompNameStruct
->SupportedLanguages
, Language
, FALSE
);
2360 Status
= CompNameStruct
->GetDriverName(CompNameStruct
, BestLang
, &RetVal
);
2361 if (BestLang
!= NULL
) {
2362 FreePool (BestLang
);
2364 if (!EFI_ERROR(Status
)) {
2372 Function to initialize the file global mHandleList object for use in
2373 vonverting handles to index and index to handle.
2375 @retval EFI_SUCCESS The operation was successful.
2378 InternalShellInitHandleList(
2383 EFI_HANDLE
*HandleBuffer
;
2385 HANDLE_LIST
*ListWalker
;
2387 if (mHandleList
.NextIndex
!= 0) {
2390 InitializeListHead(&mHandleList
.List
.Link
);
2391 mHandleList
.NextIndex
= 1;
2392 Status
= gBS
->LocateHandleBuffer (
2399 ASSERT_EFI_ERROR(Status
);
2400 if (EFI_ERROR(Status
)) {
2403 for (mHandleList
.NextIndex
= 1 ; mHandleList
.NextIndex
<= HandleCount
; mHandleList
.NextIndex
++){
2404 ListWalker
= AllocateZeroPool(sizeof(HANDLE_LIST
));
2405 if (ListWalker
!= NULL
) {
2406 ListWalker
->TheHandle
= HandleBuffer
[mHandleList
.NextIndex
- 1];
2407 ListWalker
->TheIndex
= mHandleList
.NextIndex
;
2408 InsertTailList (&mHandleList
.List
.Link
, &ListWalker
->Link
);
2411 FreePool(HandleBuffer
);
2412 return (EFI_SUCCESS
);
2416 Function to retrieve the human-friendly index of a given handle. If the handle
2417 does not have a index one will be automatically assigned. The index value is valid
2418 until the termination of the shell application.
2420 @param[in] TheHandle The handle to retrieve an index for.
2422 @retval 0 A memory allocation failed.
2423 @return The index of the handle.
2428 ConvertHandleToHandleIndex(
2429 IN CONST EFI_HANDLE TheHandle
2433 EFI_GUID
**ProtocolBuffer
;
2434 UINTN ProtocolCount
;
2435 HANDLE_LIST
*ListWalker
;
2437 if (TheHandle
== NULL
) {
2441 InternalShellInitHandleList();
2443 for (ListWalker
= (HANDLE_LIST
*)GetFirstNode(&mHandleList
.List
.Link
)
2444 ; !IsNull(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2445 ; ListWalker
= (HANDLE_LIST
*)GetNextNode(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2447 if (ListWalker
->TheHandle
== TheHandle
) {
2449 // Verify that TheHandle is still present in the Handle Database
2451 Status
= gBS
->ProtocolsPerHandle(TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2452 if (EFI_ERROR (Status
)) {
2454 // TheHandle is not present in the Handle Database, so delete from the handle list
2456 RemoveEntryList (&ListWalker
->Link
);
2459 FreePool (ProtocolBuffer
);
2460 return (ListWalker
->TheIndex
);
2465 // Verify that TheHandle is valid handle
2467 Status
= gBS
->ProtocolsPerHandle(TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2468 if (EFI_ERROR (Status
)) {
2470 // TheHandle is not valid, so do not add to handle list
2474 FreePool (ProtocolBuffer
);
2476 ListWalker
= AllocateZeroPool(sizeof(HANDLE_LIST
));
2477 if (ListWalker
== NULL
) {
2480 ListWalker
->TheHandle
= TheHandle
;
2481 ListWalker
->TheIndex
= mHandleList
.NextIndex
++;
2482 InsertTailList(&mHandleList
.List
.Link
,&ListWalker
->Link
);
2483 return (ListWalker
->TheIndex
);
2489 Function to retrieve the EFI_HANDLE from the human-friendly index.
2491 @param[in] TheIndex The index to retrieve the EFI_HANDLE for.
2493 @retval NULL The index was invalid.
2494 @return The EFI_HANDLE that index represents.
2499 ConvertHandleIndexToHandle(
2500 IN CONST UINTN TheIndex
2504 EFI_GUID
**ProtocolBuffer
;
2505 UINTN ProtocolCount
;
2506 HANDLE_LIST
*ListWalker
;
2508 InternalShellInitHandleList();
2510 if (TheIndex
>= mHandleList
.NextIndex
) {
2514 for (ListWalker
= (HANDLE_LIST
*)GetFirstNode(&mHandleList
.List
.Link
)
2515 ; !IsNull(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2516 ; ListWalker
= (HANDLE_LIST
*)GetNextNode(&mHandleList
.List
.Link
,&ListWalker
->Link
)
2518 if (ListWalker
->TheIndex
== TheIndex
&& ListWalker
->TheHandle
!= NULL
) {
2520 // Verify that LinkWalker->TheHandle is valid handle
2522 Status
= gBS
->ProtocolsPerHandle(ListWalker
->TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2523 if (!EFI_ERROR (Status
)) {
2524 FreePool (ProtocolBuffer
);
2527 // TheHandle is not valid, so do not add to handle list
2529 ListWalker
->TheHandle
= NULL
;
2531 return (ListWalker
->TheHandle
);
2538 Gets all the related EFI_HANDLEs based on the mask supplied.
2540 This function scans all EFI_HANDLES in the UEFI environment's handle database
2541 and returns the ones with the specified relationship (Mask) to the specified
2544 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
2545 If MatchingHandleCount is NULL, then ASSERT.
2547 If MatchingHandleBuffer is not NULL upon a successful return the memory must be
2550 @param[in] DriverBindingHandle The handle with Driver Binding protocol on it.
2551 @param[in] ControllerHandle The handle with Device Path protocol on it.
2552 @param[in] MatchingHandleCount The pointer to UINTN that specifies the number of HANDLES in
2553 MatchingHandleBuffer.
2554 @param[out] MatchingHandleBuffer On a successful return, a buffer of MatchingHandleCount
2555 EFI_HANDLEs with a terminating NULL EFI_HANDLE.
2556 @param[out] HandleType An array of type information.
2558 @retval EFI_SUCCESS The operation was successful, and any related handles
2559 are in MatchingHandleBuffer.
2560 @retval EFI_NOT_FOUND No matching handles were found.
2561 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.
2565 ParseHandleDatabaseByRelationshipWithType (
2566 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL
,
2567 IN CONST EFI_HANDLE ControllerHandle OPTIONAL
,
2568 IN UINTN
*HandleCount
,
2569 OUT EFI_HANDLE
**HandleBuffer
,
2570 OUT UINTN
**HandleType
2575 EFI_GUID
**ProtocolGuidArray
;
2577 UINTN ProtocolIndex
;
2578 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
*OpenInfo
;
2579 UINTN OpenInfoCount
;
2580 UINTN OpenInfoIndex
;
2582 INTN DriverBindingHandleIndex
;
2584 ASSERT(HandleCount
!= NULL
);
2585 ASSERT(HandleBuffer
!= NULL
);
2586 ASSERT(HandleType
!= NULL
);
2587 ASSERT(DriverBindingHandle
!= NULL
|| ControllerHandle
!= NULL
);
2590 *HandleBuffer
= NULL
;
2594 // Retrieve the list of all handles from the handle database
2596 Status
= gBS
->LocateHandleBuffer (
2603 if (EFI_ERROR (Status
)) {
2607 *HandleType
= AllocateZeroPool (*HandleCount
* sizeof (UINTN
));
2608 if (*HandleType
== NULL
) {
2609 SHELL_FREE_NON_NULL (*HandleBuffer
);
2611 return EFI_OUT_OF_RESOURCES
;
2614 DriverBindingHandleIndex
= -1;
2615 for (HandleIndex
= 0; HandleIndex
< *HandleCount
; HandleIndex
++) {
2616 if (DriverBindingHandle
!= NULL
&& (*HandleBuffer
)[HandleIndex
] == DriverBindingHandle
) {
2617 DriverBindingHandleIndex
= (INTN
)HandleIndex
;
2621 for (HandleIndex
= 0; HandleIndex
< *HandleCount
; HandleIndex
++) {
2623 // Retrieve the list of all the protocols on each handle
2625 Status
= gBS
->ProtocolsPerHandle (
2626 (*HandleBuffer
)[HandleIndex
],
2630 if (EFI_ERROR (Status
)) {
2634 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
2637 // Set the bit describing what this handle has
2639 if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiLoadedImageProtocolGuid
) ) {
2640 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_IMAGE_HANDLE
;
2641 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverBindingProtocolGuid
) ) {
2642 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_BINDING_HANDLE
;
2643 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverConfiguration2ProtocolGuid
)) {
2644 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_CONFIGURATION_HANDLE
;
2645 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverConfigurationProtocolGuid
) ) {
2646 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_CONFIGURATION_HANDLE
;
2647 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverDiagnostics2ProtocolGuid
) ) {
2648 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_DIAGNOSTICS_HANDLE
;
2649 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverDiagnosticsProtocolGuid
) ) {
2650 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_DIAGNOSTICS_HANDLE
;
2651 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiComponentName2ProtocolGuid
) ) {
2652 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_COMPONENT_NAME_HANDLE
;
2653 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiComponentNameProtocolGuid
) ) {
2654 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_COMPONENT_NAME_HANDLE
;
2655 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDevicePathProtocolGuid
) ) {
2656 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DEVICE_HANDLE
;
2659 // Retrieve the list of agents that have opened each protocol
2661 Status
= gBS
->OpenProtocolInformation (
2662 (*HandleBuffer
)[HandleIndex
],
2663 ProtocolGuidArray
[ProtocolIndex
],
2667 if (EFI_ERROR (Status
)) {
2671 if (ControllerHandle
== NULL
) {
2673 // ControllerHandle == NULL and DriverBindingHandle != NULL.
2674 // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing
2676 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2677 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
&& (OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
2678 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2679 if (DriverBindingHandleIndex
!= -1) {
2680 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
2683 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
&& (OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2684 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2685 if (DriverBindingHandleIndex
!= -1) {
2686 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
2688 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2689 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
2690 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
2696 if (DriverBindingHandle
== NULL
&& ControllerHandle
!= NULL
) {
2697 if (ControllerHandle
== (*HandleBuffer
)[HandleIndex
]) {
2698 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2699 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2700 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
2701 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2702 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
2703 (*HandleType
)[ChildIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
2707 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2708 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2709 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
2710 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
2712 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
2713 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
2719 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2720 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2721 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== ControllerHandle
) {
2722 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_PARENT_HANDLE
);
2728 if (DriverBindingHandle
!= NULL
&& ControllerHandle
!= NULL
) {
2729 if (ControllerHandle
== (*HandleBuffer
)[HandleIndex
]) {
2730 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
2731 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2732 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
2733 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) {
2734 if (DriverBindingHandleIndex
!= -1) {
2735 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
2739 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2740 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) {
2741 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2742 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
2743 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
2748 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
2749 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
2750 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
2756 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
2757 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
2758 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== ControllerHandle
) {
2759 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_PARENT_HANDLE
);
2765 FreePool (OpenInfo
);
2767 FreePool (ProtocolGuidArray
);
2773 Gets all the related EFI_HANDLEs based on the single EFI_HANDLE and the mask
2776 This function will scan all EFI_HANDLES in the UEFI environment's handle database
2777 and return all the ones with the specified relationship (Mask) to the specified
2780 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
2781 If MatchingHandleCount is NULL, then ASSERT.
2783 If MatchingHandleBuffer is not NULL upon a sucessful return the memory must be
2786 @param[in] DriverBindingHandle Handle to a object with Driver Binding protocol
2788 @param[in] ControllerHandle Handle to a device with Device Path protocol on it.
2789 @param[in] Mask Mask of what relationship(s) is desired.
2790 @param[in] MatchingHandleCount Poitner to UINTN specifying number of HANDLES in
2791 MatchingHandleBuffer.
2792 @param[out] MatchingHandleBuffer On a sucessful return a buffer of MatchingHandleCount
2793 EFI_HANDLEs and a terminating NULL EFI_HANDLE.
2795 @retval EFI_SUCCESS The operation was sucessful and any related handles
2796 are in MatchingHandleBuffer;
2797 @retval EFI_NOT_FOUND No matching handles were found.
2798 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.
2802 ParseHandleDatabaseByRelationship (
2803 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL
,
2804 IN CONST EFI_HANDLE ControllerHandle OPTIONAL
,
2805 IN CONST UINTN Mask
,
2806 IN UINTN
*MatchingHandleCount
,
2807 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
2812 EFI_HANDLE
*HandleBuffer
;
2816 ASSERT(MatchingHandleCount
!= NULL
);
2817 ASSERT(DriverBindingHandle
!= NULL
|| ControllerHandle
!= NULL
);
2819 if ((Mask
& HR_VALID_MASK
) != Mask
) {
2820 return (EFI_INVALID_PARAMETER
);
2823 if ((Mask
& HR_CHILD_HANDLE
) != 0 && DriverBindingHandle
== NULL
) {
2824 return (EFI_INVALID_PARAMETER
);
2827 *MatchingHandleCount
= 0;
2828 if (MatchingHandleBuffer
!= NULL
) {
2829 *MatchingHandleBuffer
= NULL
;
2832 HandleBuffer
= NULL
;
2835 Status
= ParseHandleDatabaseByRelationshipWithType (
2836 DriverBindingHandle
,
2842 if (!EFI_ERROR (Status
)) {
2844 // Count the number of handles that match the attributes in Mask
2846 for (HandleIndex
= 0; HandleIndex
< HandleCount
; HandleIndex
++) {
2847 if ((HandleType
[HandleIndex
] & Mask
) == Mask
) {
2848 (*MatchingHandleCount
)++;
2852 // If no handles match the attributes in Mask then return EFI_NOT_FOUND
2854 if (*MatchingHandleCount
== 0) {
2855 Status
= EFI_NOT_FOUND
;
2858 if (MatchingHandleBuffer
== NULL
) {
2860 // Someone just wanted the count...
2862 Status
= EFI_SUCCESS
;
2865 // Allocate a handle buffer for the number of handles that matched the attributes in Mask
2867 *MatchingHandleBuffer
= AllocateZeroPool ((*MatchingHandleCount
+1)* sizeof (EFI_HANDLE
));
2868 if (*MatchingHandleBuffer
== NULL
) {
2869 Status
= EFI_OUT_OF_RESOURCES
;
2871 for (HandleIndex
= 0, *MatchingHandleCount
= 0
2872 ; HandleIndex
< HandleCount
2876 // Fill the allocated buffer with the handles that matched the attributes in Mask
2878 if ((HandleType
[HandleIndex
] & Mask
) == Mask
) {
2879 (*MatchingHandleBuffer
)[(*MatchingHandleCount
)++] = HandleBuffer
[HandleIndex
];
2884 // Make the last one NULL
2886 (*MatchingHandleBuffer
)[*MatchingHandleCount
] = NULL
;
2888 Status
= EFI_SUCCESS
;
2889 } // *MatchingHandleBuffer == NULL (ELSE)
2890 } // MacthingHandleBuffer == NULL (ELSE)
2891 } // *MatchingHandleCount == 0 (ELSE)
2892 } // no error on ParseHandleDatabaseByRelationshipWithType
2894 if (HandleBuffer
!= NULL
) {
2895 FreePool (HandleBuffer
);
2898 if (HandleType
!= NULL
) {
2899 FreePool (HandleType
);
2902 ASSERT ((MatchingHandleBuffer
== NULL
) ||
2903 (*MatchingHandleCount
== 0 && *MatchingHandleBuffer
== NULL
) ||
2904 (*MatchingHandleCount
!= 0 && *MatchingHandleBuffer
!= NULL
));
2909 Gets handles for any child controllers of the passed in controller.
2911 @param[in] ControllerHandle The handle of the "parent controller"
2912 @param[out] MatchingHandleCount Pointer to the number of handles in
2913 MatchingHandleBuffer on return.
2914 @param[out] MatchingHandleBuffer Buffer containing handles on a successful
2918 @retval EFI_SUCCESS The operation was sucessful.
2922 ParseHandleDatabaseForChildControllers(
2923 IN CONST EFI_HANDLE ControllerHandle
,
2924 OUT UINTN
*MatchingHandleCount
,
2925 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
2930 UINTN DriverBindingHandleCount
;
2931 EFI_HANDLE
*DriverBindingHandleBuffer
;
2932 UINTN DriverBindingHandleIndex
;
2933 UINTN ChildControllerHandleCount
;
2934 EFI_HANDLE
*ChildControllerHandleBuffer
;
2935 UINTN ChildControllerHandleIndex
;
2936 EFI_HANDLE
*HandleBufferForReturn
;
2938 if (MatchingHandleCount
== NULL
) {
2939 return (EFI_INVALID_PARAMETER
);
2941 *MatchingHandleCount
= 0;
2943 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
2945 &DriverBindingHandleCount
,
2946 &DriverBindingHandleBuffer
2948 if (EFI_ERROR (Status
)) {
2953 // Get a buffer big enough for all the controllers.
2955 HandleBufferForReturn
= GetHandleListByProtocol(NULL
);
2956 if (HandleBufferForReturn
== NULL
) {
2957 FreePool (DriverBindingHandleBuffer
);
2958 return (EFI_NOT_FOUND
);
2961 for (DriverBindingHandleIndex
= 0; DriverBindingHandleIndex
< DriverBindingHandleCount
; DriverBindingHandleIndex
++) {
2962 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
2963 DriverBindingHandleBuffer
[DriverBindingHandleIndex
],
2965 &ChildControllerHandleCount
,
2966 &ChildControllerHandleBuffer
2968 if (EFI_ERROR (Status
)) {
2972 for (ChildControllerHandleIndex
= 0;
2973 ChildControllerHandleIndex
< ChildControllerHandleCount
;
2974 ChildControllerHandleIndex
++
2976 for (HandleIndex
= 0; HandleIndex
< *MatchingHandleCount
; HandleIndex
++) {
2977 if (HandleBufferForReturn
[HandleIndex
] == ChildControllerHandleBuffer
[ChildControllerHandleIndex
]) {
2981 if (HandleIndex
>= *MatchingHandleCount
) {
2982 HandleBufferForReturn
[(*MatchingHandleCount
)++] = ChildControllerHandleBuffer
[ChildControllerHandleIndex
];
2986 FreePool (ChildControllerHandleBuffer
);
2989 FreePool (DriverBindingHandleBuffer
);
2991 if (MatchingHandleBuffer
== NULL
|| *MatchingHandleCount
== 0) {
2993 // The caller is not interested in the actual handles, or we've found none.
2995 FreePool (HandleBufferForReturn
);
2996 HandleBufferForReturn
= NULL
;
2999 if (MatchingHandleBuffer
!= NULL
) {
3000 *MatchingHandleBuffer
= HandleBufferForReturn
;
3003 ASSERT ((MatchingHandleBuffer
== NULL
) ||
3004 (*MatchingHandleCount
== 0 && *MatchingHandleBuffer
== NULL
) ||
3005 (*MatchingHandleCount
!= 0 && *MatchingHandleBuffer
!= NULL
));
3007 return (EFI_SUCCESS
);
3011 Appends 1 buffer to another buffer. This will re-allocate the destination buffer
3012 if necessary to fit all of the data.
3014 If DestinationBuffer is NULL, then ASSERT().
3016 @param[in, out] DestinationBuffer The pointer to the pointer to the buffer to append onto.
3017 @param[in, out] DestinationSize The pointer to the size of DestinationBuffer.
3018 @param[in] SourceBuffer The pointer to the buffer to append onto DestinationBuffer.
3019 @param[in] SourceSize The number of bytes of SourceBuffer to append.
3021 @retval NULL A memory allocation failed.
3022 @retval NULL A parameter was invalid.
3023 @return A pointer to (*DestinationBuffer).
3027 IN OUT VOID
**DestinationBuffer
,
3028 IN OUT UINTN
*DestinationSize
,
3029 IN VOID
*SourceBuffer
,
3033 UINTN LocalDestinationSize
;
3034 UINTN LocalDestinationFinalSize
;
3036 ASSERT(DestinationBuffer
!= NULL
);
3038 if (SourceSize
== 0 || SourceBuffer
== NULL
) {
3039 return (*DestinationBuffer
);
3042 if (DestinationSize
== NULL
) {
3043 LocalDestinationSize
= 0;
3045 LocalDestinationSize
= *DestinationSize
;
3048 LocalDestinationFinalSize
= LocalDestinationSize
+ SourceSize
;
3050 if (DestinationSize
!= NULL
) {
3051 *DestinationSize
= LocalDestinationSize
;
3054 if (LocalDestinationSize
== 0) {
3056 *DestinationBuffer
= AllocateZeroPool(LocalDestinationFinalSize
);
3059 *DestinationBuffer
= ReallocatePool(LocalDestinationSize
, LocalDestinationFinalSize
, *DestinationBuffer
);
3062 ASSERT(*DestinationBuffer
!= NULL
);
3065 return (CopyMem(((UINT8
*)(*DestinationBuffer
)) + LocalDestinationSize
, SourceBuffer
, SourceSize
));
3069 Gets handles for any child devices produced by the passed in driver.
3071 @param[in] DriverHandle The handle of the driver.
3072 @param[in] MatchingHandleCount Pointer to the number of handles in
3073 MatchingHandleBuffer on return.
3074 @param[out] MatchingHandleBuffer Buffer containing handles on a successful
3076 @retval EFI_SUCCESS The operation was sucessful.
3077 @sa ParseHandleDatabaseByRelationship
3081 ParseHandleDatabaseForChildDevices(
3082 IN CONST EFI_HANDLE DriverHandle
,
3083 IN UINTN
*MatchingHandleCount
,
3084 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
3088 EFI_HANDLE
*Buffer2
;
3093 UINTN HandleBufferSize
;
3095 ASSERT(MatchingHandleCount
!= NULL
);
3097 HandleBufferSize
= 0;
3100 *MatchingHandleCount
= 0;
3102 Status
= PARSE_HANDLE_DATABASE_DEVICES (
3107 if (!EFI_ERROR (Status
)) {
3108 for (HandleIndex
= 0; HandleIndex
< Count1
; HandleIndex
++) {
3110 // now find the children
3112 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
3114 Buffer
[HandleIndex
],
3118 if (EFI_ERROR(Status
)) {
3122 // save out required and optional data elements
3124 *MatchingHandleCount
+= Count2
;
3125 if (MatchingHandleBuffer
!= NULL
) {
3126 *MatchingHandleBuffer
= BuffernCatGrow((VOID
**)MatchingHandleBuffer
, &HandleBufferSize
, Buffer2
, Count2
* sizeof(Buffer2
[0]));
3132 if (Buffer2
!= NULL
) {
3138 if (Buffer
!= NULL
) {
3145 Function to get all handles that support a given protocol or all handles.
3147 @param[in] ProtocolGuid The guid of the protocol to get handles for. If NULL
3148 then the function will return all handles.
3150 @retval NULL A memory allocation failed.
3151 @return A NULL terminated list of handles.
3155 GetHandleListByProtocol (
3156 IN CONST EFI_GUID
*ProtocolGuid OPTIONAL
3159 EFI_HANDLE
*HandleList
;
3167 // We cannot use LocateHandleBuffer since we need that NULL item on the ends of the list!
3169 if (ProtocolGuid
== NULL
) {
3170 Status
= gBS
->LocateHandle(AllHandles
, NULL
, NULL
, &Size
, HandleList
);
3171 if (Status
== EFI_BUFFER_TOO_SMALL
) {
3172 HandleList
= AllocateZeroPool(Size
+ sizeof(EFI_HANDLE
));
3173 if (HandleList
== NULL
) {
3176 Status
= gBS
->LocateHandle(AllHandles
, NULL
, NULL
, &Size
, HandleList
);
3177 HandleList
[Size
/sizeof(EFI_HANDLE
)] = NULL
;
3180 Status
= gBS
->LocateHandle(ByProtocol
, (EFI_GUID
*)ProtocolGuid
, NULL
, &Size
, HandleList
);
3181 if (Status
== EFI_BUFFER_TOO_SMALL
) {
3182 HandleList
= AllocateZeroPool(Size
+ sizeof(EFI_HANDLE
));
3183 if (HandleList
== NULL
) {
3186 Status
= gBS
->LocateHandle(ByProtocol
, (EFI_GUID
*)ProtocolGuid
, NULL
, &Size
, HandleList
);
3187 HandleList
[Size
/sizeof(EFI_HANDLE
)] = NULL
;
3190 if (EFI_ERROR(Status
)) {
3191 if (HandleList
!= NULL
) {
3192 FreePool(HandleList
);
3196 return (HandleList
);
3200 Function to get all handles that support some protocols.
3202 @param[in] ProtocolGuids A NULL terminated list of protocol GUIDs.
3204 @retval NULL A memory allocation failed.
3205 @retval NULL ProtocolGuids was NULL.
3206 @return A NULL terminated list of EFI_HANDLEs.
3210 GetHandleListByProtocolList (
3211 IN CONST EFI_GUID
**ProtocolGuids
3214 EFI_HANDLE
*HandleList
;
3219 CONST EFI_GUID
**GuidWalker
;
3220 EFI_HANDLE
*HandleWalker1
;
3221 EFI_HANDLE
*HandleWalker2
;
3225 TotalSize
= sizeof(EFI_HANDLE
);
3227 for (GuidWalker
= ProtocolGuids
; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
; GuidWalker
++,Size
= 0){
3228 Status
= gBS
->LocateHandle(ByProtocol
, (EFI_GUID
*)(*GuidWalker
), NULL
, &Size
, NULL
);
3229 if (Status
== EFI_BUFFER_TOO_SMALL
) {
3235 // No handles were found...
3237 if (TotalSize
== sizeof(EFI_HANDLE
)) {
3241 HandleList
= AllocateZeroPool(TotalSize
);
3242 if (HandleList
== NULL
) {
3247 for (GuidWalker
= ProtocolGuids
; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
; GuidWalker
++){
3248 TempSize
= TotalSize
- Size
;
3249 Status
= gBS
->LocateHandle(ByProtocol
, (EFI_GUID
*)(*GuidWalker
), NULL
, &TempSize
, HandleList
+(Size
/sizeof(EFI_HANDLE
)));
3252 // Allow for missing protocols... Only update the 'used' size upon success.
3254 if (!EFI_ERROR(Status
)) {
3258 ASSERT(HandleList
[(TotalSize
/sizeof(EFI_HANDLE
))-1] == NULL
);
3260 for (HandleWalker1
= HandleList
; HandleWalker1
!= NULL
&& *HandleWalker1
!= NULL
; HandleWalker1
++) {
3261 for (HandleWalker2
= HandleWalker1
+ 1; HandleWalker2
!= NULL
&& *HandleWalker2
!= NULL
; HandleWalker2
++) {
3262 if (*HandleWalker1
== *HandleWalker2
) {
3264 // copy memory back 1 handle width.
3266 CopyMem(HandleWalker2
, HandleWalker2
+ 1, TotalSize
- ((HandleWalker2
-HandleList
+1)*sizeof(EFI_HANDLE
)));
3271 return (HandleList
);
3275 Return all supported GUIDs.
3277 @param[out] Guids The buffer to return all supported GUIDs.
3278 @param[in, out] Count On input, the count of GUIDs the buffer can hold,
3279 On output, the count of GUIDs to return.
3281 @retval EFI_INVALID_PARAMETER Count is NULL.
3282 @retval EFI_BUFFER_TOO_SMALL Buffer is not enough to hold all GUIDs.
3283 @retval EFI_SUCCESS GUIDs are returned successfully.
3287 GetAllMappingGuids (
3288 OUT EFI_GUID
*Guids
,
3296 if (Count
== NULL
) {
3297 return EFI_INVALID_PARAMETER
;
3301 if (PcdGetBool (PcdShellIncludeNtGuids
)) {
3302 NtGuidCount
= ARRAY_SIZE (mGuidStringListNT
) - 1;
3304 GuidCount
= ARRAY_SIZE (mGuidStringList
) - 1;
3306 if (*Count
< NtGuidCount
+ GuidCount
+ mGuidListCount
) {
3307 *Count
= NtGuidCount
+ GuidCount
+ mGuidListCount
;
3308 return EFI_BUFFER_TOO_SMALL
;
3311 for (Index
= 0; Index
< NtGuidCount
; Index
++) {
3312 CopyGuid (&Guids
[Index
], mGuidStringListNT
[Index
].GuidId
);
3315 for (Index
= 0; Index
< GuidCount
; Index
++) {
3316 CopyGuid (&Guids
[NtGuidCount
+ Index
], mGuidStringList
[Index
].GuidId
);
3319 for (Index
= 0; Index
< mGuidListCount
; Index
++) {
3320 CopyGuid (&Guids
[NtGuidCount
+ GuidCount
+ Index
], mGuidList
[Index
].GuidId
);