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-2021 Hewlett Packard Enterprise Development LP<BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include "UefiHandleParsingLib.h"
12 #include "IndustryStandard/Acpi10.h"
13 #include "IndustryStandard/Pci.h"
15 #include <Protocol/FirmwareVolume2.h>
17 EFI_HII_HANDLE mHandleParsingHiiHandle
= NULL
;
18 HANDLE_INDEX_LIST mHandleList
= {
23 GUID_INFO_BLOCK
*mGuidList
;
27 Function to find the file name associated with a LoadedImageProtocol.
29 @param[in] LoadedImage An instance of LoadedImageProtocol.
31 @retval A string representation of the file name associated
32 with LoadedImage, or NULL if no name can be found.
35 FindLoadedImageFileName (
36 IN EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
41 EFI_FIRMWARE_VOLUME2_PROTOCOL
*Fv
;
44 UINT32 AuthenticationStatus
;
46 if ((LoadedImage
== NULL
) || (LoadedImage
->FilePath
== NULL
)) {
50 NameGuid
= EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*)LoadedImage
->FilePath
);
52 if (NameGuid
== NULL
) {
57 // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.
59 Status
= gBS
->HandleProtocol (LoadedImage
->DeviceHandle
, &gEfiFirmwareVolume2ProtocolGuid
, (VOID
**)&Fv
);
62 // FirmwareVolume2Protocol is PI, and is not required to be available.
64 if (EFI_ERROR (Status
)) {
69 // Read the user interface section of the image.
72 Status
= Fv
->ReadSection (Fv
, NameGuid
, EFI_SECTION_USER_INTERFACE
, 0, &Buffer
, &BufferSize
, &AuthenticationStatus
);
74 if (EFI_ERROR (Status
)) {
79 // ReadSection returns just the section data, without any section header. For
80 // a user interface section, the only data is the file name.
86 Function to translate the EFI_MEMORY_TYPE into a string.
88 @param[in] Memory The memory type.
90 @retval A string representation of the type allocated from BS Pool.
94 IN CONST EFI_MEMORY_TYPE Memory
102 case EfiReservedMemoryType
: StrnCatGrow (&RetVal
, NULL
, L
"EfiReservedMemoryType", 0);
104 case EfiLoaderCode
: StrnCatGrow (&RetVal
, NULL
, L
"EfiLoaderCode", 0);
106 case EfiLoaderData
: StrnCatGrow (&RetVal
, NULL
, L
"EfiLoaderData", 0);
108 case EfiBootServicesCode
: StrnCatGrow (&RetVal
, NULL
, L
"EfiBootServicesCode", 0);
110 case EfiBootServicesData
: StrnCatGrow (&RetVal
, NULL
, L
"EfiBootServicesData", 0);
112 case EfiRuntimeServicesCode
: StrnCatGrow (&RetVal
, NULL
, L
"EfiRuntimeServicesCode", 0);
114 case EfiRuntimeServicesData
: StrnCatGrow (&RetVal
, NULL
, L
"EfiRuntimeServicesData", 0);
116 case EfiConventionalMemory
: StrnCatGrow (&RetVal
, NULL
, L
"EfiConventionalMemory", 0);
118 case EfiUnusableMemory
: StrnCatGrow (&RetVal
, NULL
, L
"EfiUnusableMemory", 0);
120 case EfiACPIReclaimMemory
: StrnCatGrow (&RetVal
, NULL
, L
"EfiACPIReclaimMemory", 0);
122 case EfiACPIMemoryNVS
: StrnCatGrow (&RetVal
, NULL
, L
"EfiACPIMemoryNVS", 0);
124 case EfiMemoryMappedIO
: StrnCatGrow (&RetVal
, NULL
, L
"EfiMemoryMappedIO", 0);
126 case EfiMemoryMappedIOPortSpace
: StrnCatGrow (&RetVal
, NULL
, L
"EfiMemoryMappedIOPortSpace", 0);
128 case EfiPalCode
: StrnCatGrow (&RetVal
, NULL
, L
"EfiPalCode", 0);
130 case EfiMaxMemoryType
: StrnCatGrow (&RetVal
, NULL
, L
"EfiMaxMemoryType", 0);
132 default: ASSERT (FALSE
);
139 Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.
141 @param[in] Fmt The format type.
143 @retval A string representation of the type allocated from BS Pool.
147 IN CONST EFI_GRAPHICS_PIXEL_FORMAT Fmt
155 case PixelRedGreenBlueReserved8BitPerColor
: StrnCatGrow (&RetVal
, NULL
, L
"PixelRedGreenBlueReserved8BitPerColor", 0);
157 case PixelBlueGreenRedReserved8BitPerColor
: StrnCatGrow (&RetVal
, NULL
, L
"PixelBlueGreenRedReserved8BitPerColor", 0);
159 case PixelBitMask
: StrnCatGrow (&RetVal
, NULL
, L
"PixelBitMask", 0);
161 case PixelBltOnly
: StrnCatGrow (&RetVal
, NULL
, L
"PixelBltOnly", 0);
163 case PixelFormatMax
: StrnCatGrow (&RetVal
, NULL
, L
"PixelFormatMax", 0);
165 default: ASSERT (FALSE
);
172 Constructor for the library.
174 @param[in] ImageHandle Ignored.
175 @param[in] SystemTable Ignored.
177 @retval EFI_SUCCESS The operation was successful.
181 HandleParsingLibConstructor (
182 IN EFI_HANDLE ImageHandle
,
183 IN EFI_SYSTEM_TABLE
*SystemTable
190 // Do nothing with mHandleParsingHiiHandle. Initialize HII as needed.
192 return (EFI_SUCCESS
);
196 Initialization function for HII packages.
200 HandleParsingHiiInit (
204 if (mHandleParsingHiiHandle
== NULL
) {
205 mHandleParsingHiiHandle
= HiiAddPackages (&gHandleParsingHiiGuid
, gImageHandle
, UefiHandleParsingLibStrings
, NULL
);
206 ASSERT (mHandleParsingHiiHandle
!= NULL
);
211 Destructor for the library. free any resources.
213 @param[in] ImageHandle Ignored.
214 @param[in] SystemTable Ignored.
216 @retval EFI_SUCCESS The operation was successful.
220 HandleParsingLibDestructor (
221 IN EFI_HANDLE ImageHandle
,
222 IN EFI_SYSTEM_TABLE
*SystemTable
227 for (LoopCount
= 0; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++) {
228 SHELL_FREE_NON_NULL (mGuidList
[LoopCount
].GuidId
);
231 SHELL_FREE_NON_NULL (mGuidList
);
232 if (mHandleParsingHiiHandle
!= NULL
) {
233 HiiRemovePackages (mHandleParsingHiiHandle
);
236 return (EFI_SUCCESS
);
240 Function to dump information about LoadedImage.
242 This will allocate the return buffer from boot services pool.
244 @param[in] TheHandle The handle that has LoadedImage installed.
245 @param[in] Verbose TRUE for additional information, FALSE otherwise.
247 @retval A poitner to a string containing the information.
251 LoadedImageProtocolDumpInformation (
252 IN CONST EFI_HANDLE TheHandle
,
253 IN CONST BOOLEAN Verbose
256 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
266 Status
= gBS
->OpenProtocol (
268 &gEfiLoadedImageProtocolGuid
,
269 (VOID
**)&LoadedImage
,
272 EFI_OPEN_PROTOCOL_GET_PROTOCOL
275 if (EFI_ERROR (Status
)) {
279 FileName
= FindLoadedImageFileName (LoadedImage
);
280 FilePath
= ConvertDevicePathToText (LoadedImage
->FilePath
, TRUE
, TRUE
);
282 if (FileName
== NULL
) {
285 SHELL_FREE_NON_NULL (FilePath
);
291 HandleParsingHiiInit ();
293 if (FileName
!= NULL
) {
294 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_LI_DUMP_NAME
), NULL
);
297 RetVal
= CatSPrint (NULL
, Temp
, FileName
);
300 SHELL_FREE_NON_NULL (Temp
);
301 SHELL_FREE_NON_NULL (FileName
);
304 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_LI_DUMP_MAIN
), NULL
);
309 PdbFileName
= PeCoffLoaderGetPdbPointer (LoadedImage
->ImageBase
);
310 DataType
= ConvertMemoryType (LoadedImage
->ImageDataType
);
311 CodeType
= ConvertMemoryType (LoadedImage
->ImageCodeType
);
316 LoadedImage
->Revision
,
317 LoadedImage
->ParentHandle
,
318 LoadedImage
->SystemTable
,
319 LoadedImage
->DeviceHandle
,
322 LoadedImage
->LoadOptionsSize
,
323 LoadedImage
->LoadOptions
,
324 LoadedImage
->ImageBase
,
325 LoadedImage
->ImageSize
,
331 SHELL_FREE_NON_NULL (Temp
);
332 SHELL_FREE_NON_NULL (FilePath
);
333 SHELL_FREE_NON_NULL (CodeType
);
334 SHELL_FREE_NON_NULL (DataType
);
340 Function to dump information about GOP.
342 This will allocate the return buffer from boot services pool.
344 @param[in] TheHandle The handle that has LoadedImage installed.
345 @param[in] Verbose TRUE for additional information, FALSE otherwise.
347 @retval A poitner to a string containing the information.
351 GraphicsOutputProtocolDumpInformation (
352 IN CONST EFI_HANDLE TheHandle
,
353 IN CONST BOOLEAN Verbose
356 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
364 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*GopInfo
;
367 return (CatSPrint (NULL
, L
"GraphicsOutput"));
370 HandleParsingHiiInit ();
372 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_DUMP_MAIN
), NULL
);
377 Status
= gBS
->OpenProtocol (
379 &gEfiGraphicsOutputProtocolGuid
,
380 (VOID
**)&GraphicsOutput
,
383 EFI_OPEN_PROTOCOL_GET_PROTOCOL
386 if (EFI_ERROR (Status
)) {
387 SHELL_FREE_NON_NULL (Temp
);
391 Fmt
= ConvertPixelFormat (GraphicsOutput
->Mode
->Info
->PixelFormat
);
396 GraphicsOutput
->Mode
->MaxMode
,
397 GraphicsOutput
->Mode
->Mode
,
398 GraphicsOutput
->Mode
->FrameBufferBase
,
399 (UINT64
)GraphicsOutput
->Mode
->FrameBufferSize
,
400 (UINT64
)GraphicsOutput
->Mode
->SizeOfInfo
,
401 GraphicsOutput
->Mode
->Info
->Version
,
402 GraphicsOutput
->Mode
->Info
->HorizontalResolution
,
403 GraphicsOutput
->Mode
->Info
->VerticalResolution
,
405 GraphicsOutput
->Mode
->Info
->PixelsPerScanLine
,
406 GraphicsOutput
->Mode
->Info
->PixelFormat
!= PixelBitMask
? 0 : GraphicsOutput
->Mode
->Info
->PixelInformation
.RedMask
,
407 GraphicsOutput
->Mode
->Info
->PixelFormat
!= PixelBitMask
? 0 : GraphicsOutput
->Mode
->Info
->PixelInformation
.GreenMask
,
408 GraphicsOutput
->Mode
->Info
->PixelFormat
!= PixelBitMask
? 0 : GraphicsOutput
->Mode
->Info
->PixelInformation
.BlueMask
411 SHELL_FREE_NON_NULL (Temp
);
413 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_RES_LIST_MAIN
), NULL
);
415 SHELL_FREE_NON_NULL (RetVal
);
419 TempRetVal
= CatSPrint (RetVal
, Temp
);
420 SHELL_FREE_NON_NULL (RetVal
);
421 if (TempRetVal
== NULL
) {
426 SHELL_FREE_NON_NULL (Temp
);
428 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY
), NULL
);
430 SHELL_FREE_NON_NULL (RetVal
);
434 for (Mode
= 0; Mode
< GraphicsOutput
->Mode
->MaxMode
; Mode
++) {
435 Status
= GraphicsOutput
->QueryMode (
441 if (EFI_ERROR (Status
)) {
445 TempRetVal
= CatSPrint (
449 GopInfo
->HorizontalResolution
,
450 GopInfo
->VerticalResolution
453 SHELL_FREE_NON_NULL (GopInfo
);
454 SHELL_FREE_NON_NULL (RetVal
);
459 SHELL_FREE_NON_NULL (Temp
);
460 SHELL_FREE_NON_NULL (Fmt
);
466 Function to dump information about EDID Discovered Protocol.
468 This will allocate the return buffer from boot services pool.
470 @param[in] TheHandle The handle that has LoadedImage installed.
471 @param[in] Verbose TRUE for additional information, FALSE otherwise.
473 @retval A pointer to a string containing the information.
477 EdidDiscoveredProtocolDumpInformation (
478 IN CONST EFI_HANDLE TheHandle
,
479 IN CONST BOOLEAN Verbose
482 EFI_EDID_DISCOVERED_PROTOCOL
*EdidDiscovered
;
489 return (CatSPrint (NULL
, L
"EDIDDiscovered"));
492 Status
= gBS
->OpenProtocol (
494 &gEfiEdidDiscoveredProtocolGuid
,
495 (VOID
**)&EdidDiscovered
,
498 EFI_OPEN_PROTOCOL_GET_PROTOCOL
501 if (EFI_ERROR (Status
)) {
505 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN
), NULL
);
510 RetVal
= CatSPrint (NULL
, Temp
, EdidDiscovered
->SizeOfEdid
);
511 SHELL_FREE_NON_NULL (Temp
);
513 if (EdidDiscovered
->SizeOfEdid
!= 0) {
514 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_DISCOVERED_DATA
), NULL
);
516 SHELL_FREE_NON_NULL (RetVal
);
520 TempRetVal
= CatSPrint (RetVal
, Temp
);
521 SHELL_FREE_NON_NULL (RetVal
);
524 TempRetVal
= CatSDumpHex (RetVal
, 4, 0, EdidDiscovered
->SizeOfEdid
, EdidDiscovered
->Edid
);
532 Function to dump information about EDID Active Protocol.
534 This will allocate the return buffer from boot services pool.
536 @param[in] TheHandle The handle that has LoadedImage installed.
537 @param[in] Verbose TRUE for additional information, FALSE otherwise.
539 @retval A pointer to a string containing the information.
543 EdidActiveProtocolDumpInformation (
544 IN CONST EFI_HANDLE TheHandle
,
545 IN CONST BOOLEAN Verbose
548 EFI_EDID_ACTIVE_PROTOCOL
*EdidActive
;
555 return (CatSPrint (NULL
, L
"EDIDActive"));
558 Status
= gBS
->OpenProtocol (
560 &gEfiEdidActiveProtocolGuid
,
561 (VOID
**)&EdidActive
,
564 EFI_OPEN_PROTOCOL_GET_PROTOCOL
567 if (EFI_ERROR (Status
)) {
571 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_ACTIVE_MAIN
), NULL
);
576 RetVal
= CatSPrint (NULL
, Temp
, EdidActive
->SizeOfEdid
);
577 SHELL_FREE_NON_NULL (Temp
);
579 if (EdidActive
->SizeOfEdid
!= 0) {
580 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_EDID_ACTIVE_DATA
), NULL
);
582 SHELL_FREE_NON_NULL (RetVal
);
586 TempRetVal
= CatSPrint (RetVal
, Temp
);
587 SHELL_FREE_NON_NULL (RetVal
);
590 TempRetVal
= CatSDumpHex (RetVal
, 4, 0, EdidActive
->SizeOfEdid
, EdidActive
->Edid
);
598 Function to dump information about PciRootBridgeIo.
600 This will allocate the return buffer from boot services pool.
602 @param[in] TheHandle The handle that has PciRootBridgeIo installed.
603 @param[in] Verbose TRUE for additional information, FALSE otherwise.
605 @retval A poitner to a string containing the information.
609 PciRootBridgeIoDumpInformation (
610 IN CONST EFI_HANDLE TheHandle
,
611 IN CONST BOOLEAN Verbose
614 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*PciRootBridgeIo
;
615 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*Configuration
;
626 return (CatSPrint (NULL
, L
"PciRootBridgeIo"));
629 HandleParsingHiiInit ();
631 Status
= gBS
->HandleProtocol (
633 &gEfiPciRootBridgeIoProtocolGuid
,
634 (VOID
**)&PciRootBridgeIo
637 if (EFI_ERROR (Status
)) {
641 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_PH
), NULL
);
646 Temp2
= CatSPrint (NULL
, Temp
, PciRootBridgeIo
->ParentHandle
);
651 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_SEG
), NULL
);
653 SHELL_FREE_NON_NULL (RetVal
);
657 Temp2
= CatSPrint (RetVal
, Temp
, PciRootBridgeIo
->SegmentNumber
);
665 Status
= PciRootBridgeIo
->GetAttributes (PciRootBridgeIo
, &Supports
, &Attributes
);
666 if (!EFI_ERROR (Status
)) {
667 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_ATT
), NULL
);
669 SHELL_FREE_NON_NULL (RetVal
);
673 Temp2
= CatSPrint (RetVal
, Temp
, Attributes
);
679 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_SUPPORTS
), NULL
);
681 SHELL_FREE_NON_NULL (RetVal
);
685 Temp2
= CatSPrint (RetVal
, Temp
, Supports
);
692 Configuration
= NULL
;
693 Status
= PciRootBridgeIo
->Configuration (PciRootBridgeIo
, (VOID
**)&Configuration
);
694 if (!EFI_ERROR (Status
) && (Configuration
!= NULL
)) {
695 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_TITLE
), NULL
);
697 SHELL_FREE_NON_NULL (RetVal
);
701 Temp2
= CatSPrint (RetVal
, Temp
, Supports
);
706 while (Configuration
->Desc
== ACPI_ADDRESS_SPACE_DESCRIPTOR
) {
708 switch (Configuration
->ResType
) {
709 case ACPI_ADDRESS_SPACE_TYPE_MEM
:
710 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_MEM
), NULL
);
712 case ACPI_ADDRESS_SPACE_TYPE_IO
:
713 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_IO
), NULL
);
715 case ACPI_ADDRESS_SPACE_TYPE_BUS
:
716 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIRB_DUMP_BUS
), NULL
);
721 Temp2
= CatSPrint (RetVal
, L
"\r\n%s", Temp
);
730 L
"%%H%02x %016lx %016lx %02x%%N",
731 Configuration
->SpecificFlag
,
732 Configuration
->AddrRangeMin
,
733 Configuration
->AddrRangeMax
,
734 Configuration
->AddrSpaceGranularity
747 Function to dump information about SimpleTextOut.
749 This will allocate the return buffer from boot services pool.
751 @param[in] TheHandle The handle that has SimpleTextOut installed.
752 @param[in] Verbose TRUE for additional information, FALSE otherwise.
754 @retval A poitner to a string containing the information.
758 TxtOutProtocolDumpInformation (
759 IN CONST EFI_HANDLE TheHandle
,
760 IN CONST BOOLEAN Verbose
763 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*Dev
;
777 HandleParsingHiiInit ();
782 Status
= gBS
->HandleProtocol (
784 &gEfiSimpleTextOutProtocolGuid
,
788 ASSERT_EFI_ERROR (Status
);
789 ASSERT (Dev
!= NULL
&& Dev
->Mode
!= NULL
);
791 Size
= (Dev
->Mode
->MaxMode
+ 1) * 80;
792 RetVal
= AllocateZeroPool (Size
);
794 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_TXT_OUT_DUMP_HEADER
), NULL
);
796 UnicodeSPrint (RetVal
, Size
, Temp
, Dev
, Dev
->Mode
->Attribute
);
803 Temp
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_TXT_OUT_DUMP_LINE
), NULL
);
804 for (Index
= 0; Index
< Dev
->Mode
->MaxMode
; Index
++) {
805 Status
= Dev
->QueryMode (Dev
, Index
, &Col
, &Row
);
806 NewSize
= Size
- StrSize (RetVal
);
808 RetVal
+ StrLen (RetVal
),
810 Temp
== NULL
? L
"" : Temp
,
811 Index
== Dev
->Mode
->Mode
? L
'*' : L
' ',
813 !EFI_ERROR (Status
) ? (INTN
)Col
: -1,
814 !EFI_ERROR (Status
) ? (INTN
)Row
: -1
822 STATIC CONST UINTN VersionStringSize
= 60;
825 Function to dump information about EfiDriverSupportedEfiVersion protocol.
827 This will allocate the return buffer from boot services pool.
829 @param[in] TheHandle The handle that has the protocol installed.
830 @param[in] Verbose TRUE for additional information, FALSE otherwise.
832 @retval A poitner to a string containing the information.
836 DriverEfiVersionProtocolDumpInformation (
837 IN CONST EFI_HANDLE TheHandle
,
838 IN CONST BOOLEAN Verbose
841 EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL
*DriverEfiVersion
;
845 Status
= gBS
->HandleProtocol (
847 &gEfiDriverSupportedEfiVersionProtocolGuid
,
848 (VOID
**)&DriverEfiVersion
851 ASSERT_EFI_ERROR (Status
);
853 RetVal
= AllocateZeroPool (VersionStringSize
);
854 if (RetVal
!= NULL
) {
855 UnicodeSPrint (RetVal
, VersionStringSize
, L
"0x%08x", DriverEfiVersion
->FirmwareVersion
);
862 Function to convert device path to string.
864 This will allocate the return buffer from boot services pool.
866 @param[in] DevPath Pointer to device path instance.
867 @param[in] Verbose TRUE for additional information, FALSE otherwise.
868 @param[in] Length Maximum allowed text length of the device path.
870 @retval A pointer to a string containing the information.
873 ConvertDevicePathToShortText (
874 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath
,
875 IN CONST BOOLEAN Verbose
,
876 IN CONST UINTN Length
884 // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)
886 Temp
= ConvertDevicePathToText (DevPath
, TRUE
, TRUE
);
887 if (!Verbose
&& (Temp
!= NULL
) && (StrLen (Temp
) > Length
)) {
890 Temp2
= StrnCatGrow (&Temp2
, &Size
, L
"..", 0);
891 Temp2
= StrnCatGrow (&Temp2
, &Size
, Temp
+(StrLen (Temp
) - (Length
- 2)), 0);
900 Function to dump protocol information.
902 This will allocate the return buffer from boot services pool.
904 @param[in] TheHandle The handle that has the protocol installed.
905 @param[in] Verbose TRUE for additional information, FALSE otherwise.
906 @param[in] Protocol The protocol is needed to dump.
908 @retval A pointer to a string containing the information.
912 DevicePathProtocolDumpInformationEx (
913 IN CONST EFI_HANDLE TheHandle
,
914 IN CONST BOOLEAN Verbose
,
915 IN EFI_GUID
*Protocol
918 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
920 CHAR16
*DevPathStrTemp
;
925 DevPathStrTemp
= NULL
;
926 Status
= gBS
->OpenProtocol (TheHandle
, Protocol
, (VOID
**)&DevPath
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
927 if (!EFI_ERROR (Status
)) {
928 DevPathStr
= ConvertDevicePathToShortText (DevPath
, Verbose
, 30);
930 Size
= StrSize (DevPathStr
) + sizeof (CHAR16
) * 2;
931 DevPathStrTemp
= AllocateZeroPool (Size
);
932 if (DevPathStrTemp
!= NULL
) {
933 StrnCatS (DevPathStrTemp
, Size
/sizeof (CHAR16
), L
" ", 2);
934 StrnCatS (DevPathStrTemp
, Size
/sizeof (CHAR16
), DevPathStr
, StrLen (DevPathStr
));
937 FreePool (DevPathStr
);
938 DevPathStr
= DevPathStrTemp
;
941 gBS
->CloseProtocol (TheHandle
, Protocol
, gImageHandle
, NULL
);
948 Function to dump information about DevicePath protocol.
950 This will allocate the return buffer from boot services pool.
952 @param[in] TheHandle The handle that has the protocol installed.
953 @param[in] Verbose TRUE for additional information, FALSE otherwise.
955 @retval A pointer to a string containing the information.
959 DevicePathProtocolDumpInformation (
960 IN CONST EFI_HANDLE TheHandle
,
961 IN CONST BOOLEAN Verbose
964 return DevicePathProtocolDumpInformationEx (TheHandle
, Verbose
, &gEfiDevicePathProtocolGuid
);
968 Function to dump information about LoadedImageDevicePath protocol.
970 This will allocate the return buffer from boot services pool.
972 @param[in] TheHandle The handle that has the protocol installed.
973 @param[in] Verbose TRUE for additional information, FALSE otherwise.
975 @retval A pointer to a string containing the information.
979 LoadedImageDevicePathProtocolDumpInformation (
980 IN CONST EFI_HANDLE TheHandle
,
981 IN CONST BOOLEAN Verbose
984 return DevicePathProtocolDumpInformationEx (TheHandle
, Verbose
, &gEfiLoadedImageDevicePathProtocolGuid
);
988 Function to dump information about BusSpecificDriverOverride protocol.
990 This will allocate the return buffer from boot services pool.
992 @param[in] TheHandle The handle that has the protocol installed.
993 @param[in] Verbose TRUE for additional information, FALSE otherwise.
995 @retval A pointer to a string containing the information.
999 BusSpecificDriverOverrideProtocolDumpInformation (
1000 IN CONST EFI_HANDLE TheHandle
,
1001 IN CONST BOOLEAN Verbose
1008 EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL
*BusSpecificDriverOverride
;
1009 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
1010 EFI_HANDLE ImageHandle
;
1023 Status
= gBS
->OpenProtocol (
1025 &gEfiBusSpecificDriverOverrideProtocolGuid
,
1026 (VOID
**)&BusSpecificDriverOverride
,
1029 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1031 if (EFI_ERROR (Status
)) {
1035 HandleParsingHiiInit ();
1036 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_BSDO_DUMP_MAIN
), NULL
);
1037 if (GetString
== NULL
) {
1042 Status
= BusSpecificDriverOverride
->GetDriver (
1043 BusSpecificDriverOverride
,
1046 if (!EFI_ERROR (Status
)) {
1047 Status
= gBS
->HandleProtocol (
1049 &gEfiLoadedImageProtocolGuid
,
1050 (VOID
**)&LoadedImage
1052 if (!EFI_ERROR (Status
)) {
1053 TempRetVal
= CatSPrint (
1056 ConvertHandleToHandleIndex (ImageHandle
),
1057 ConvertDevicePathToText (LoadedImage
->FilePath
, TRUE
, TRUE
)
1059 StrnCatGrow (&RetVal
, &Size
, TempRetVal
, 0);
1060 SHELL_FREE_NON_NULL (TempRetVal
);
1063 } while (!EFI_ERROR (Status
));
1065 SHELL_FREE_NON_NULL (GetString
);
1070 Function to dump information about BlockIo protocol.
1072 This will allocate the return buffer from boot services pool.
1074 @param[in] TheHandle The handle that has the protocol installed.
1075 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1077 @retval A pointer to a string containing the information.
1081 BlockIoProtocolDumpInformation (
1082 IN CONST EFI_HANDLE TheHandle
,
1083 IN CONST BOOLEAN Verbose
1087 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
1088 EFI_BLOCK_IO_MEDIA
*BlockMedia
;
1099 Status
= gBS
->OpenProtocol (
1101 &gEfiBlockIoProtocolGuid
,
1105 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1107 if (EFI_ERROR (Status
)) {
1111 BlockMedia
= BlockIo
->Media
;
1114 // The function (ReadBlocks) must return EFI_NO_MEDIA or
1115 // EFI_MEDIA_CHANGED even if LBA, BufferSize, or Buffer are invalid so the caller can probe
1116 // for changes in media state.
1118 BlockIo
->ReadBlocks (
1120 BlockIo
->Media
->MediaId
,
1126 HandleParsingHiiInit ();
1127 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_BLOCKIO_INFO
), NULL
);
1128 if (GetString
== NULL
) {
1132 RetVal
= CatSPrint (
1135 BlockMedia
->RemovableMedia
? L
"Removable " : L
"Fixed ",
1136 BlockMedia
->MediaPresent
? L
"" : L
"not-present ",
1137 BlockMedia
->MediaId
,
1138 BlockMedia
->BlockSize
,
1139 BlockMedia
->LastBlock
,
1140 MultU64x32 (BlockMedia
->LastBlock
+ 1, BlockMedia
->BlockSize
),
1141 BlockMedia
->LogicalPartition
? L
"partition" : L
"raw",
1142 BlockMedia
->ReadOnly
? L
"ro" : L
"rw",
1143 BlockMedia
->WriteCaching
? L
"cached" : L
"!cached"
1146 SHELL_FREE_NON_NULL (GetString
);
1151 Function to dump information about DebugSupport Protocol.
1153 @param[in] TheHandle The handle that has the protocol installed.
1154 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1156 @retval A pointer to a string containing the information.
1160 DebugSupportProtocolDumpInformation (
1161 IN CONST EFI_HANDLE TheHandle
,
1162 IN CONST BOOLEAN Verbose
1166 EFI_DEBUG_SUPPORT_PROTOCOL
*DebugSupport
;
1176 Status
= gBS
->OpenProtocol (
1178 &gEfiDebugSupportProtocolGuid
,
1179 (VOID
**)&DebugSupport
,
1182 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1184 if (EFI_ERROR (Status
)) {
1188 HandleParsingHiiInit ();
1189 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_DEBUGSUPPORT_INFO
), NULL
);
1190 if (GetString
== NULL
) {
1195 // Dump Debug support info
1197 switch (DebugSupport
->Isa
) {
1199 RetVal
= CatSPrint (RetVal
, GetString
, L
"IA-32");
1202 RetVal
= CatSPrint (RetVal
, GetString
, L
"IPF");
1205 RetVal
= CatSPrint (RetVal
, GetString
, L
"EBC");
1208 SHELL_FREE_NON_NULL (GetString
);
1209 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_DEBUGSUPPORT_UNKNOWN
), NULL
);
1210 RetVal
= GetString
!= NULL
? CatSPrint (RetVal
, GetString
, DebugSupport
->Isa
) : NULL
;
1214 SHELL_FREE_NON_NULL (GetString
);
1219 Function to dump information about PciIoProtocol.
1221 This will allocate the return buffer from boot services pool.
1223 @param[in] TheHandle The handle that has PciRootBridgeIo installed.
1224 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1226 @retval A poitner to a string containing the information.
1230 PciIoProtocolDumpInformation (
1231 IN CONST EFI_HANDLE TheHandle
,
1232 IN CONST BOOLEAN Verbose
1236 EFI_PCI_IO_PROTOCOL
*PciIo
;
1254 Status
= gBS
->OpenProtocol (
1256 &gEfiPciIoProtocolGuid
,
1260 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1263 if (EFI_ERROR (Status
)) {
1267 PciIo
->Pci
.Read (PciIo
, EfiPciIoWidthUint8
, 0, sizeof (Pci
), &Pci
);
1268 PciIo
->GetLocation (PciIo
, &Segment
, &Bus
, &Device
, &Function
);
1269 HandleParsingHiiInit ();
1270 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PCIIO_DUMP_MAIN
), NULL
);
1271 if (GetString
== NULL
) {
1275 RetVal
= CatSPrint (
1286 Pci
.Hdr
.ClassCode
[0],
1287 Pci
.Hdr
.ClassCode
[1],
1288 Pci
.Hdr
.ClassCode
[2]
1290 for (Index
= 0; Index
< sizeof (Pci
); Index
++) {
1291 if ((Index
% 0x10) == 0) {
1292 TempRetVal
= CatSPrint (RetVal
, L
"\r\n %02x", *((UINT8
*)(&Pci
) + Index
));
1294 TempRetVal
= CatSPrint (RetVal
, L
"%02x", *((UINT8
*)(&Pci
) + Index
));
1298 RetVal
= TempRetVal
;
1302 FreePool (GetString
);
1307 Function to dump information about UsbIoProtocol.
1309 This will allocate the return buffer from boot services pool.
1311 @param[in] TheHandle The handle that has PciRootBridgeIo installed.
1312 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1314 @retval A poitner to a string containing the information.
1318 UsbIoProtocolDumpInformation (
1319 IN CONST EFI_HANDLE TheHandle
,
1320 IN CONST BOOLEAN Verbose
1324 EFI_USB_IO_PROTOCOL
*UsbIo
;
1325 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDesc
;
1335 Status
= gBS
->OpenProtocol (
1337 &gEfiUsbIoProtocolGuid
,
1341 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1344 if (EFI_ERROR (Status
)) {
1348 UsbIo
->UsbGetInterfaceDescriptor (UsbIo
, &InterfaceDesc
);
1349 HandleParsingHiiInit ();
1350 GetString
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_USBIO_DUMP_MAIN
), NULL
);
1351 if (GetString
== NULL
) {
1355 RetVal
= CatSPrint (
1358 InterfaceDesc
.InterfaceNumber
,
1359 InterfaceDesc
.InterfaceClass
,
1360 InterfaceDesc
.InterfaceSubClass
,
1361 InterfaceDesc
.InterfaceProtocol
1364 FreePool (GetString
);
1369 Function to dump information about EfiAdapterInformation Protocol.
1371 @param[in] TheHandle The handle that has the protocol installed.
1372 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1374 @retval A pointer to a string containing the information.
1378 AdapterInformationDumpInformation (
1379 IN CONST EFI_HANDLE TheHandle
,
1380 IN CONST BOOLEAN Verbose
1384 EFI_ADAPTER_INFORMATION_PROTOCOL
*EfiAdptrInfoProtocol
;
1385 UINTN InfoTypesBufferCount
;
1387 EFI_GUID
*InfoTypesBuffer
;
1392 VOID
*InformationBlock
;
1393 UINTN InformationBlockSize
;
1396 return (CatSPrint (NULL
, L
"AdapterInfo"));
1399 InfoTypesBuffer
= NULL
;
1400 InformationBlock
= NULL
;
1402 Status
= gBS
->OpenProtocol (
1403 (EFI_HANDLE
)(TheHandle
),
1404 &gEfiAdapterInformationProtocolGuid
,
1405 (VOID
**)&EfiAdptrInfoProtocol
,
1408 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1411 if (EFI_ERROR (Status
)) {
1416 // Get a list of supported information types for this instance of the protocol.
1418 Status
= EfiAdptrInfoProtocol
->GetSupportedTypes (
1419 EfiAdptrInfoProtocol
,
1421 &InfoTypesBufferCount
1424 if (EFI_ERROR (Status
)) {
1425 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GET_SUPP_TYPES_FAILED
), NULL
);
1426 if (TempStr
!= NULL
) {
1427 RetVal
= CatSPrint (NULL
, TempStr
, Status
);
1432 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_SUPP_TYPE_HEADER
), NULL
);
1433 if (TempStr
== NULL
) {
1437 RetVal
= CatSPrint (NULL
, TempStr
);
1438 SHELL_FREE_NON_NULL (TempStr
);
1440 for (GuidIndex
= 0; GuidIndex
< InfoTypesBufferCount
; GuidIndex
++) {
1441 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GUID_NUMBER
), NULL
);
1442 if (TempStr
== NULL
) {
1446 TempRetVal
= CatSPrint (RetVal
, TempStr
, (GuidIndex
+ 1), &InfoTypesBuffer
[GuidIndex
]);
1447 SHELL_FREE_NON_NULL (RetVal
);
1448 RetVal
= TempRetVal
;
1449 SHELL_FREE_NON_NULL (TempStr
);
1451 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GUID_STRING
), NULL
);
1452 if (TempStr
== NULL
) {
1456 if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoMediaStateGuid
)) {
1457 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoMediaStateGuid");
1458 SHELL_FREE_NON_NULL (RetVal
);
1459 RetVal
= TempRetVal
;
1460 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoNetworkBootGuid
)) {
1461 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoNetworkBootGuid");
1462 SHELL_FREE_NON_NULL (RetVal
);
1463 RetVal
= TempRetVal
;
1464 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoSanMacAddressGuid
)) {
1465 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoSanMacAddressGuid");
1466 SHELL_FREE_NON_NULL (RetVal
);
1467 RetVal
= TempRetVal
;
1468 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
)) {
1469 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"gEfiAdapterInfoUndiIpv6SupportGuid");
1470 SHELL_FREE_NON_NULL (RetVal
);
1471 RetVal
= TempRetVal
;
1473 GuidStr
= GetStringNameFromGuid (&InfoTypesBuffer
[GuidIndex
], NULL
);
1474 if (GuidStr
== NULL
) {
1475 TempRetVal
= CatSPrint (RetVal
, TempStr
, L
"UnknownInfoType");
1476 SHELL_FREE_NON_NULL (RetVal
);
1477 RetVal
= TempRetVal
;
1479 SHELL_FREE_NON_NULL (TempStr
);
1480 SHELL_FREE_NON_NULL (GuidStr
);
1482 // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP
1486 TempRetVal
= CatSPrint (RetVal
, TempStr
, GuidStr
);
1487 SHELL_FREE_NON_NULL (RetVal
);
1488 RetVal
= TempRetVal
;
1489 SHELL_FREE_NON_NULL (GuidStr
);
1493 SHELL_FREE_NON_NULL (TempStr
);
1495 Status
= EfiAdptrInfoProtocol
->GetInformation (
1496 EfiAdptrInfoProtocol
,
1497 &InfoTypesBuffer
[GuidIndex
],
1499 &InformationBlockSize
1502 if (EFI_ERROR (Status
)) {
1503 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_GETINFO_FAILED
), NULL
);
1504 if (TempStr
== NULL
) {
1508 TempRetVal
= CatSPrint (RetVal
, TempStr
, Status
);
1509 SHELL_FREE_NON_NULL (RetVal
);
1510 RetVal
= TempRetVal
;
1512 if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoMediaStateGuid
)) {
1513 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_MEDIA_STATE
), NULL
);
1514 if (TempStr
== NULL
) {
1518 TempRetVal
= CatSPrint (
1521 ((EFI_ADAPTER_INFO_MEDIA_STATE
*)InformationBlock
)->MediaState
,
1522 ((EFI_ADAPTER_INFO_MEDIA_STATE
*)InformationBlock
)->MediaState
1524 SHELL_FREE_NON_NULL (RetVal
);
1525 RetVal
= TempRetVal
;
1526 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoNetworkBootGuid
)) {
1527 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_NETWORK_BOOT_INFO
), NULL
);
1528 if (TempStr
== NULL
) {
1532 TempRetVal
= CatSPrint (
1535 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv4BootCapablity
,
1536 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv6BootCapablity
,
1537 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->FCoeBootCapablity
,
1538 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->OffloadCapability
,
1539 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiMpioCapability
,
1540 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv4Boot
,
1541 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->iScsiIpv6Boot
,
1542 ((EFI_ADAPTER_INFO_NETWORK_BOOT
*)InformationBlock
)->FCoeBoot
1544 SHELL_FREE_NON_NULL (RetVal
);
1545 RetVal
= TempRetVal
;
1546 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoSanMacAddressGuid
) == TRUE
) {
1547 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_SAN_MAC_ADDRESS_INFO
), NULL
);
1548 if (TempStr
== NULL
) {
1552 TempRetVal
= CatSPrint (
1555 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[0],
1556 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[1],
1557 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[2],
1558 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[3],
1559 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[4],
1560 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS
*)InformationBlock
)->SanMacAddress
.Addr
[5]
1562 SHELL_FREE_NON_NULL (RetVal
);
1563 RetVal
= TempRetVal
;
1564 } else if (CompareGuid (&InfoTypesBuffer
[GuidIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
) == TRUE
) {
1565 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_UNDI_IPV6_INFO
), NULL
);
1566 if (TempStr
== NULL
) {
1570 TempRetVal
= CatSPrint (
1573 ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT
*)InformationBlock
)->Ipv6Support
1575 SHELL_FREE_NON_NULL (RetVal
);
1576 RetVal
= TempRetVal
;
1578 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_UNKNOWN_INFO_TYPE
), NULL
);
1579 if (TempStr
== NULL
) {
1583 TempRetVal
= CatSPrint (RetVal
, TempStr
, &InfoTypesBuffer
[GuidIndex
]);
1584 SHELL_FREE_NON_NULL (RetVal
);
1585 RetVal
= TempRetVal
;
1589 SHELL_FREE_NON_NULL (TempStr
);
1590 SHELL_FREE_NON_NULL (InformationBlock
);
1594 SHELL_FREE_NON_NULL (InfoTypesBuffer
);
1598 SHELL_FREE_NON_NULL (RetVal
);
1599 SHELL_FREE_NON_NULL (InfoTypesBuffer
);
1600 SHELL_FREE_NON_NULL (InformationBlock
);
1605 Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.
1607 @param[in] TheHandle The handle that has the protocol installed.
1608 @param[in] Verbose TRUE for additional information, FALSE otherwise.
1610 @retval A pointer to a string containing the information.
1614 FirmwareManagementDumpInformation (
1615 IN CONST EFI_HANDLE TheHandle
,
1616 IN CONST BOOLEAN Verbose
1620 EFI_FIRMWARE_MANAGEMENT_PROTOCOL
*EfiFwMgmtProtocol
;
1621 EFI_FIRMWARE_IMAGE_DESCRIPTOR
*ImageInfo
;
1622 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1
*ImageInfoV1
;
1623 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2
*ImageInfoV2
;
1624 UINT64 AttributeSetting
;
1625 UINTN ImageInfoSize
;
1626 UINTN DescriptorSize
;
1627 UINT32 DescriptorVersion
;
1628 UINT32 PackageVersion
;
1629 UINT8 DescriptorCount
;
1633 CHAR16
*PackageVersionName
;
1637 CHAR16
*AttributeSettingStr
;
1639 BOOLEAN AttributeSupported
;
1642 // Initialize local variables
1646 AttributeSetting
= 0;
1648 AttributeSupported
= FALSE
;
1652 PackageVersionName
= NULL
;
1656 AttributeSettingStr
= NULL
;
1659 return (CatSPrint (NULL
, L
"FirmwareManagement"));
1662 Status
= gBS
->OpenProtocol (
1663 (EFI_HANDLE
)(TheHandle
),
1664 &gEfiFirmwareManagementProtocolGuid
,
1665 (VOID
**)&EfiFwMgmtProtocol
,
1668 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1671 if (EFI_ERROR (Status
)) {
1675 Status
= EfiFwMgmtProtocol
->GetImageInfo (
1686 if (Status
== EFI_BUFFER_TOO_SMALL
) {
1687 ImageInfo
= AllocateZeroPool (ImageInfoSize
);
1689 if (ImageInfo
== NULL
) {
1690 Status
= EFI_OUT_OF_RESOURCES
;
1692 Status
= EfiFwMgmtProtocol
->GetImageInfo (
1705 if (EFI_ERROR (Status
)) {
1710 // Decode Image Descriptor data only if its version is supported
1712 if (DescriptorVersion
<= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION
) {
1713 if (ImageInfo
== NULL
) {
1717 ImageInfoV1
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1
*)ImageInfo
;
1718 ImageInfoV2
= (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2
*)ImageInfo
;
1721 // Set ImageInfoSize in return buffer
1723 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_IMAGE_INFO_SIZE
), NULL
);
1724 if (TempStr
== NULL
) {
1728 RetVal
= CatSPrint (NULL
, TempStr
, ImageInfoSize
);
1729 SHELL_FREE_NON_NULL (TempStr
);
1732 // Set DescriptorVersion in return buffer
1734 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_DESCRIPTOR_VERSION
), NULL
);
1735 if (TempStr
== NULL
) {
1739 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorVersion
);
1740 SHELL_FREE_NON_NULL (RetVal
);
1741 RetVal
= TempRetVal
;
1742 SHELL_FREE_NON_NULL (TempStr
);
1745 // Set DescriptorCount in return buffer
1747 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_DESCRIPTOR_COUNT
), NULL
);
1748 if (TempStr
== NULL
) {
1752 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorCount
);
1753 SHELL_FREE_NON_NULL (RetVal
);
1754 RetVal
= TempRetVal
;
1755 SHELL_FREE_NON_NULL (TempStr
);
1758 // Set DescriptorSize in return buffer
1760 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_DESCRIPTOR_SIZE
), NULL
);
1761 if (TempStr
== NULL
) {
1765 TempRetVal
= CatSPrint (RetVal
, TempStr
, DescriptorSize
);
1766 SHELL_FREE_NON_NULL (RetVal
);
1767 RetVal
= TempRetVal
;
1768 SHELL_FREE_NON_NULL (TempStr
);
1771 // Set PackageVersion in return buffer
1773 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_PACKAGE_VERSION
), NULL
);
1774 if (TempStr
== NULL
) {
1778 TempRetVal
= CatSPrint (RetVal
, TempStr
, PackageVersion
);
1779 SHELL_FREE_NON_NULL (RetVal
);
1780 RetVal
= TempRetVal
;
1781 SHELL_FREE_NON_NULL (TempStr
);
1784 // Set PackageVersionName in return buffer
1786 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_PACKAGE_VERSION_NAME
), NULL
);
1787 if (TempStr
== NULL
) {
1791 TempRetVal
= CatSPrint (RetVal
, TempStr
, PackageVersionName
);
1792 SHELL_FREE_NON_NULL (RetVal
);
1793 RetVal
= TempRetVal
;
1794 SHELL_FREE_NON_NULL (TempStr
);
1796 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
1798 // First check if Attribute is supported
1799 // and generate a string for AttributeSetting field
1801 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1802 AttributeSupported
= FALSE
;
1803 AttributeSetting
= 0;
1804 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1805 if (ImageInfoV1
[Index
].AttributesSupported
!= 0x0) {
1806 AttributeSupported
= TRUE
;
1807 AttributeSetting
= ImageInfoV1
[Index
].AttributesSetting
;
1809 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1810 if (ImageInfoV2
[Index
].AttributesSupported
!= 0x0) {
1811 AttributeSupported
= TRUE
;
1812 AttributeSetting
= ImageInfoV2
[Index
].AttributesSetting
;
1815 if (ImageInfo
[Index
].AttributesSupported
!= 0x0) {
1816 AttributeSupported
= TRUE
;
1817 AttributeSetting
= ImageInfo
[Index
].AttributesSetting
;
1821 if (!AttributeSupported
) {
1822 AttributeSettingStr
= CatSPrint (NULL
, L
"None");
1824 AttributeSettingStr
= CatSPrint (NULL
, L
"(");
1826 if ((AttributeSetting
& IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
) != 0x0) {
1827 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");
1828 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1829 AttributeSettingStr
= TempRetVal
;
1832 if ((AttributeSetting
& IMAGE_ATTRIBUTE_RESET_REQUIRED
) != 0x0) {
1833 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_RESET_REQUIRED");
1834 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1835 AttributeSettingStr
= TempRetVal
;
1838 if ((AttributeSetting
& IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
) != 0x0) {
1839 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");
1840 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1841 AttributeSettingStr
= TempRetVal
;
1844 if ((AttributeSetting
& IMAGE_ATTRIBUTE_IN_USE
) != 0x0) {
1845 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_IN_USE");
1846 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1847 AttributeSettingStr
= TempRetVal
;
1850 if ((AttributeSetting
& IMAGE_ATTRIBUTE_UEFI_IMAGE
) != 0x0) {
1851 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" IMAGE_ATTRIBUTE_UEFI_IMAGE");
1852 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1853 AttributeSettingStr
= TempRetVal
;
1856 TempRetVal
= CatSPrint (AttributeSettingStr
, L
" )");
1857 SHELL_FREE_NON_NULL (AttributeSettingStr
);
1858 AttributeSettingStr
= TempRetVal
;
1861 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1862 if (ImageInfoV1
[Index
].ImageIndex
!= 0x0) {
1866 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO_V1
), NULL
);
1867 if (TempStr
== NULL
) {
1871 TempRetVal
= CatSPrint (
1875 ImageInfoV1
[Index
].ImageIndex
,
1876 &ImageInfoV1
[Index
].ImageTypeId
,
1877 ImageInfoV1
[Index
].ImageId
,
1878 ImageInfoV1
[Index
].ImageIdName
,
1879 ImageInfoV1
[Index
].Version
,
1880 ImageInfoV1
[Index
].VersionName
,
1881 ImageInfoV1
[Index
].Size
,
1882 ImageInfoV1
[Index
].AttributesSupported
,
1883 AttributeSettingStr
,
1884 ImageInfoV1
[Index
].Compatibilities
1886 SHELL_FREE_NON_NULL (RetVal
);
1887 RetVal
= TempRetVal
;
1888 SHELL_FREE_NON_NULL (TempStr
);
1889 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1890 if (ImageInfoV2
[Index
].ImageIndex
!= 0x0) {
1894 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO_V2
), NULL
);
1895 if (TempStr
== NULL
) {
1899 TempRetVal
= CatSPrint (
1903 ImageInfoV2
[Index
].ImageIndex
,
1904 &ImageInfoV2
[Index
].ImageTypeId
,
1905 ImageInfoV2
[Index
].ImageId
,
1906 ImageInfoV2
[Index
].ImageIdName
,
1907 ImageInfoV2
[Index
].Version
,
1908 ImageInfoV2
[Index
].VersionName
,
1909 ImageInfoV2
[Index
].Size
,
1910 ImageInfoV2
[Index
].AttributesSupported
,
1911 AttributeSettingStr
,
1912 ImageInfoV2
[Index
].Compatibilities
,
1913 ImageInfoV2
[Index
].LowestSupportedImageVersion
1915 SHELL_FREE_NON_NULL (RetVal
);
1916 RetVal
= TempRetVal
;
1917 SHELL_FREE_NON_NULL (TempStr
);
1919 if (ImageInfo
[Index
].ImageIndex
!= 0x0) {
1923 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO
), NULL
);
1924 if (TempStr
== NULL
) {
1928 TempRetVal
= CatSPrint (
1932 ImageInfo
[Index
].ImageIndex
,
1933 &ImageInfo
[Index
].ImageTypeId
,
1934 ImageInfo
[Index
].ImageId
,
1935 ImageInfo
[Index
].ImageIdName
,
1936 ImageInfo
[Index
].Version
,
1937 ImageInfo
[Index
].VersionName
,
1938 ImageInfo
[Index
].Size
,
1939 ImageInfo
[Index
].AttributesSupported
,
1940 AttributeSettingStr
,
1941 ImageInfo
[Index
].Compatibilities
,
1942 ImageInfo
[Index
].LowestSupportedImageVersion
,
1943 ImageInfo
[Index
].LastAttemptVersion
,
1944 ImageInfo
[Index
].LastAttemptStatus
,
1945 ImageInfo
[Index
].HardwareInstance
1947 SHELL_FREE_NON_NULL (RetVal
);
1948 RetVal
= TempRetVal
;
1949 SHELL_FREE_NON_NULL (TempStr
);
1954 if (ImageCount
> 0) {
1955 for (Index
= 0; Index
< DescriptorCount
; Index
++) {
1956 for (Index1
= Index
+1; Index1
< DescriptorCount
; Index1
++) {
1957 if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1
) {
1958 if (ImageInfoV1
[Index
].ImageId
== ImageInfoV1
[Index1
].ImageId
) {
1961 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1965 } else if (DescriptorVersion
== EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2
) {
1966 if (ImageInfoV2
[Index
].ImageId
== ImageInfoV2
[Index1
].ImageId
) {
1969 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1974 if (ImageInfo
[Index
].ImageId
== ImageInfo
[Index1
].ImageId
) {
1977 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
1988 // Check if ImageId with duplicate value was found
1991 TempStr
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_FMP_IMAGEID_NON_UNIQUE
), NULL
);
1992 if (TempStr
== NULL
) {
1996 TempRetVal
= CatSPrint (RetVal
, TempStr
);
1997 SHELL_FREE_NON_NULL (RetVal
);
1998 RetVal
= TempRetVal
;
1999 SHELL_FREE_NON_NULL (TempStr
);
2002 SHELL_FREE_NON_NULL (ImageInfo
);
2003 SHELL_FREE_NON_NULL (PackageVersionName
);
2004 SHELL_FREE_NON_NULL (AttributeSettingStr
);
2009 SHELL_FREE_NON_NULL (RetVal
);
2010 SHELL_FREE_NON_NULL (ImageInfo
);
2011 SHELL_FREE_NON_NULL (PackageVersionName
);
2012 SHELL_FREE_NON_NULL (AttributeSettingStr
);
2018 Function to dump information about Partition Information protocol.
2020 This will allocate the return buffer from boot services pool.
2022 @param[in] TheHandle The handle that has the protocol installed.
2023 @param[in] Verbose TRUE for additional information, FALSE otherwise.
2025 @retval A pointer to a string containing the information.
2029 PartitionInfoProtocolDumpInformation (
2030 IN CONST EFI_HANDLE TheHandle
,
2031 IN CONST BOOLEAN Verbose
2035 EFI_PARTITION_INFO_PROTOCOL
*PartitionInfo
;
2036 CHAR16
*PartitionType
;
2037 CHAR16
*EfiSystemPartition
;
2044 Status
= gBS
->OpenProtocol (
2046 &gEfiPartitionInfoProtocolGuid
,
2047 (VOID
**)&PartitionInfo
,
2050 EFI_OPEN_PROTOCOL_GET_PROTOCOL
2052 if (EFI_ERROR (Status
)) {
2056 HandleParsingHiiInit ();
2058 switch (PartitionInfo
->Type
) {
2059 case PARTITION_TYPE_OTHER
:
2060 PartitionType
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PARTINFO_DUMP_TYPE_OTHER
), NULL
);
2062 case PARTITION_TYPE_MBR
:
2063 PartitionType
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PARTINFO_DUMP_TYPE_MBR
), NULL
);
2065 case PARTITION_TYPE_GPT
:
2066 PartitionType
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PARTINFO_DUMP_TYPE_GPT
), NULL
);
2069 PartitionType
= NULL
;
2073 if (PartitionType
== NULL
) {
2077 if (PartitionInfo
->System
== 1) {
2078 EfiSystemPartition
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PARTINFO_DUMP_EFI_SYS_PART
), NULL
);
2080 EfiSystemPartition
= HiiGetString (mHandleParsingHiiHandle
, STRING_TOKEN (STR_PARTINFO_DUMP_NOT_EFI_SYS_PART
), NULL
);
2083 if (EfiSystemPartition
== NULL
) {
2084 SHELL_FREE_NON_NULL (PartitionType
);
2088 RetVal
= CatSPrint (
2095 SHELL_FREE_NON_NULL (EfiSystemPartition
);
2096 SHELL_FREE_NON_NULL (PartitionType
);
2101 // Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg
2103 #define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \
2105 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
2108 #define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \
2110 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
2113 #define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \
2115 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
2117 STATIC CONST EFI_GUID WinNtThunkProtocolGuid
= LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID
;
2118 STATIC CONST EFI_GUID WinNtIoProtocolGuid
= LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID
;
2119 STATIC CONST EFI_GUID WinNtSerialPortGuid
= LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID
;
2122 // Deprecated protocols we dont want to link from IntelFrameworkModulePkg
2124 #define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \
2126 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
2128 #define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \
2130 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \
2132 STATIC CONST EFI_GUID EfiIsaIoProtocolGuid
= LOCAL_EFI_ISA_IO_PROTOCOL_GUID
;
2133 STATIC CONST EFI_GUID EfiIsaAcpiProtocolGuid
= LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID
;
2135 STATIC CONST GUID_INFO_BLOCK mGuidStringListNT
[] = {
2136 { STRING_TOKEN (STR_WINNT_THUNK
), (EFI_GUID
*)&WinNtThunkProtocolGuid
, NULL
},
2137 { STRING_TOKEN (STR_WINNT_DRIVER_IO
), (EFI_GUID
*)&WinNtIoProtocolGuid
, NULL
},
2138 { STRING_TOKEN (STR_WINNT_SERIAL_PORT
), (EFI_GUID
*)&WinNtSerialPortGuid
, NULL
},
2142 STATIC CONST GUID_INFO_BLOCK mGuidStringList
[] = {
2143 { STRING_TOKEN (STR_LOADED_IMAGE
), &gEfiLoadedImageProtocolGuid
, LoadedImageProtocolDumpInformation
},
2144 { STRING_TOKEN (STR_DEVICE_PATH
), &gEfiDevicePathProtocolGuid
, DevicePathProtocolDumpInformation
},
2145 { STRING_TOKEN (STR_IMAGE_PATH
), &gEfiLoadedImageDevicePathProtocolGuid
, LoadedImageDevicePathProtocolDumpInformation
},
2146 { STRING_TOKEN (STR_DEVICE_PATH_UTIL
), &gEfiDevicePathUtilitiesProtocolGuid
, NULL
},
2147 { STRING_TOKEN (STR_DEVICE_PATH_TXT
), &gEfiDevicePathToTextProtocolGuid
, NULL
},
2148 { STRING_TOKEN (STR_DEVICE_PATH_FTXT
), &gEfiDevicePathFromTextProtocolGuid
, NULL
},
2149 { STRING_TOKEN (STR_DEVICE_PATH_PC
), &gEfiPcAnsiGuid
, NULL
},
2150 { STRING_TOKEN (STR_DEVICE_PATH_VT100
), &gEfiVT100Guid
, NULL
},
2151 { STRING_TOKEN (STR_DEVICE_PATH_VT100P
), &gEfiVT100PlusGuid
, NULL
},
2152 { STRING_TOKEN (STR_DEVICE_PATH_VTUTF8
), &gEfiVTUTF8Guid
, NULL
},
2153 { STRING_TOKEN (STR_DRIVER_BINDING
), &gEfiDriverBindingProtocolGuid
, NULL
},
2154 { STRING_TOKEN (STR_PLATFORM_OVERRIDE
), &gEfiPlatformDriverOverrideProtocolGuid
, NULL
},
2155 { STRING_TOKEN (STR_BUS_OVERRIDE
), &gEfiBusSpecificDriverOverrideProtocolGuid
, BusSpecificDriverOverrideProtocolDumpInformation
},
2156 { STRING_TOKEN (STR_DRIVER_DIAG
), &gEfiDriverDiagnosticsProtocolGuid
, NULL
},
2157 { STRING_TOKEN (STR_DRIVER_DIAG2
), &gEfiDriverDiagnostics2ProtocolGuid
, NULL
},
2158 { STRING_TOKEN (STR_DRIVER_CN
), &gEfiComponentNameProtocolGuid
, NULL
},
2159 { STRING_TOKEN (STR_DRIVER_CN2
), &gEfiComponentName2ProtocolGuid
, NULL
},
2160 { STRING_TOKEN (STR_PLAT_DRV_CFG
), &gEfiPlatformToDriverConfigurationProtocolGuid
, NULL
},
2161 { STRING_TOKEN (STR_DRIVER_VERSION
), &gEfiDriverSupportedEfiVersionProtocolGuid
, DriverEfiVersionProtocolDumpInformation
},
2162 { STRING_TOKEN (STR_TXT_IN
), &gEfiSimpleTextInProtocolGuid
, NULL
},
2163 { STRING_TOKEN (STR_TXT_IN_EX
), &gEfiSimpleTextInputExProtocolGuid
, NULL
},
2164 { STRING_TOKEN (STR_TXT_OUT
), &gEfiSimpleTextOutProtocolGuid
, TxtOutProtocolDumpInformation
},
2165 { STRING_TOKEN (STR_SIM_POINTER
), &gEfiSimplePointerProtocolGuid
, NULL
},
2166 { STRING_TOKEN (STR_ABS_POINTER
), &gEfiAbsolutePointerProtocolGuid
, NULL
},
2167 { STRING_TOKEN (STR_SERIAL_IO
), &gEfiSerialIoProtocolGuid
, NULL
},
2168 { STRING_TOKEN (STR_GRAPHICS_OUTPUT
), &gEfiGraphicsOutputProtocolGuid
, GraphicsOutputProtocolDumpInformation
},
2169 { STRING_TOKEN (STR_EDID_DISCOVERED
), &gEfiEdidDiscoveredProtocolGuid
, EdidDiscoveredProtocolDumpInformation
},
2170 { STRING_TOKEN (STR_EDID_ACTIVE
), &gEfiEdidActiveProtocolGuid
, EdidActiveProtocolDumpInformation
},
2171 { STRING_TOKEN (STR_EDID_OVERRIDE
), &gEfiEdidOverrideProtocolGuid
, NULL
},
2172 { STRING_TOKEN (STR_CON_IN
), &gEfiConsoleInDeviceGuid
, NULL
},
2173 { STRING_TOKEN (STR_CON_OUT
), &gEfiConsoleOutDeviceGuid
, NULL
},
2174 { STRING_TOKEN (STR_STD_ERR
), &gEfiStandardErrorDeviceGuid
, NULL
},
2175 { STRING_TOKEN (STR_LOAD_FILE
), &gEfiLoadFileProtocolGuid
, NULL
},
2176 { STRING_TOKEN (STR_LOAD_FILE2
), &gEfiLoadFile2ProtocolGuid
, NULL
},
2177 { STRING_TOKEN (STR_SIMPLE_FILE_SYS
), &gEfiSimpleFileSystemProtocolGuid
, NULL
},
2178 { STRING_TOKEN (STR_TAPE_IO
), &gEfiTapeIoProtocolGuid
, NULL
},
2179 { STRING_TOKEN (STR_DISK_IO
), &gEfiDiskIoProtocolGuid
, NULL
},
2180 { STRING_TOKEN (STR_BLK_IO
), &gEfiBlockIoProtocolGuid
, BlockIoProtocolDumpInformation
},
2181 { STRING_TOKEN (STR_UC
), &gEfiUnicodeCollationProtocolGuid
, NULL
},
2182 { STRING_TOKEN (STR_UC2
), &gEfiUnicodeCollation2ProtocolGuid
, NULL
},
2183 { STRING_TOKEN (STR_PCIRB_IO
), &gEfiPciRootBridgeIoProtocolGuid
, PciRootBridgeIoDumpInformation
},
2184 { STRING_TOKEN (STR_PCI_IO
), &gEfiPciIoProtocolGuid
, PciIoProtocolDumpInformation
},
2185 { STRING_TOKEN (STR_SCSI_PT
), &gEfiScsiPassThruProtocolGuid
, NULL
},
2186 { STRING_TOKEN (STR_SCSI_IO
), &gEfiScsiIoProtocolGuid
, NULL
},
2187 { STRING_TOKEN (STR_SCSI_PT_EXT
), &gEfiExtScsiPassThruProtocolGuid
, NULL
},
2188 { STRING_TOKEN (STR_ISCSI
), &gEfiIScsiInitiatorNameProtocolGuid
, NULL
},
2189 { STRING_TOKEN (STR_USB_IO
), &gEfiUsbIoProtocolGuid
, UsbIoProtocolDumpInformation
},
2190 { STRING_TOKEN (STR_USB_HC
), &gEfiUsbHcProtocolGuid
, NULL
},
2191 { STRING_TOKEN (STR_USB_HC2
), &gEfiUsb2HcProtocolGuid
, NULL
},
2192 { STRING_TOKEN (STR_DEBUG_SUPPORT
), &gEfiDebugSupportProtocolGuid
, DebugSupportProtocolDumpInformation
},
2193 { STRING_TOKEN (STR_DEBUG_PORT
), &gEfiDebugPortProtocolGuid
, NULL
},
2194 { STRING_TOKEN (STR_DECOMPRESS
), &gEfiDecompressProtocolGuid
, NULL
},
2195 { STRING_TOKEN (STR_ACPI_TABLE
), &gEfiAcpiTableProtocolGuid
, NULL
},
2196 { STRING_TOKEN (STR_EBC_INTERPRETER
), &gEfiEbcProtocolGuid
, NULL
},
2197 { STRING_TOKEN (STR_SNP
), &gEfiSimpleNetworkProtocolGuid
, NULL
},
2198 { STRING_TOKEN (STR_NII
), &gEfiNetworkInterfaceIdentifierProtocolGuid
, NULL
},
2199 { STRING_TOKEN (STR_NII_31
), &gEfiNetworkInterfaceIdentifierProtocolGuid_31
, NULL
},
2200 { STRING_TOKEN (STR_PXE_BC
), &gEfiPxeBaseCodeProtocolGuid
, NULL
},
2201 { STRING_TOKEN (STR_PXE_CB
), &gEfiPxeBaseCodeCallbackProtocolGuid
, NULL
},
2202 { STRING_TOKEN (STR_BIS
), &gEfiBisProtocolGuid
, NULL
},
2203 { STRING_TOKEN (STR_MNP_SB
), &gEfiManagedNetworkServiceBindingProtocolGuid
, NULL
},
2204 { STRING_TOKEN (STR_MNP
), &gEfiManagedNetworkProtocolGuid
, NULL
},
2205 { STRING_TOKEN (STR_ARP_SB
), &gEfiArpServiceBindingProtocolGuid
, NULL
},
2206 { STRING_TOKEN (STR_ARP
), &gEfiArpProtocolGuid
, NULL
},
2207 { STRING_TOKEN (STR_DHCPV4_SB
), &gEfiDhcp4ServiceBindingProtocolGuid
, NULL
},
2208 { STRING_TOKEN (STR_DHCPV4
), &gEfiDhcp4ProtocolGuid
, NULL
},
2209 { STRING_TOKEN (STR_TCPV4_SB
), &gEfiTcp4ServiceBindingProtocolGuid
, NULL
},
2210 { STRING_TOKEN (STR_TCPV4
), &gEfiTcp4ProtocolGuid
, NULL
},
2211 { STRING_TOKEN (STR_IPV4_SB
), &gEfiIp4ServiceBindingProtocolGuid
, NULL
},
2212 { STRING_TOKEN (STR_IPV4
), &gEfiIp4ProtocolGuid
, NULL
},
2213 { STRING_TOKEN (STR_IPV4_CFG
), &gEfiIp4ConfigProtocolGuid
, NULL
},
2214 { STRING_TOKEN (STR_IPV4_CFG2
), &gEfiIp4Config2ProtocolGuid
, NULL
},
2215 { STRING_TOKEN (STR_UDPV4_SB
), &gEfiUdp4ServiceBindingProtocolGuid
, NULL
},
2216 { STRING_TOKEN (STR_UDPV4
), &gEfiUdp4ProtocolGuid
, NULL
},
2217 { STRING_TOKEN (STR_MTFTPV4_SB
), &gEfiMtftp4ServiceBindingProtocolGuid
, NULL
},
2218 { STRING_TOKEN (STR_MTFTPV4
), &gEfiMtftp4ProtocolGuid
, NULL
},
2219 { STRING_TOKEN (STR_AUTH_INFO
), &gEfiAuthenticationInfoProtocolGuid
, NULL
},
2220 { STRING_TOKEN (STR_HASH_SB
), &gEfiHashServiceBindingProtocolGuid
, NULL
},
2221 { STRING_TOKEN (STR_HASH
), &gEfiHashProtocolGuid
, NULL
},
2222 { STRING_TOKEN (STR_HII_FONT
), &gEfiHiiFontProtocolGuid
, NULL
},
2223 { STRING_TOKEN (STR_HII_STRING
), &gEfiHiiStringProtocolGuid
, NULL
},
2224 { STRING_TOKEN (STR_HII_IMAGE
), &gEfiHiiImageProtocolGuid
, NULL
},
2225 { STRING_TOKEN (STR_HII_DATABASE
), &gEfiHiiDatabaseProtocolGuid
, NULL
},
2226 { STRING_TOKEN (STR_HII_CONFIG_ROUT
), &gEfiHiiConfigRoutingProtocolGuid
, NULL
},
2227 { STRING_TOKEN (STR_HII_CONFIG_ACC
), &gEfiHiiConfigAccessProtocolGuid
, NULL
},
2228 { STRING_TOKEN (STR_HII_FORM_BROWSER2
), &gEfiFormBrowser2ProtocolGuid
, NULL
},
2229 { STRING_TOKEN (STR_DRIVER_FAM_OVERRIDE
), &gEfiDriverFamilyOverrideProtocolGuid
, NULL
},
2230 { STRING_TOKEN (STR_PCD
), &gPcdProtocolGuid
, NULL
},
2231 { STRING_TOKEN (STR_TCG
), &gEfiTcgProtocolGuid
, NULL
},
2232 { STRING_TOKEN (STR_HII_PACKAGE_LIST
), &gEfiHiiPackageListProtocolGuid
, NULL
},
2235 // the ones under this are deprecated by the current UEFI Spec, but may be found anyways...
2237 { STRING_TOKEN (STR_SHELL_INTERFACE
), &gEfiShellInterfaceGuid
, NULL
},
2238 { STRING_TOKEN (STR_SHELL_ENV2
), &gEfiShellEnvironment2Guid
, NULL
},
2239 { STRING_TOKEN (STR_SHELL_ENV
), &gEfiShellEnvironment2Guid
, NULL
},
2240 { STRING_TOKEN (STR_DEVICE_IO
), &gEfiDeviceIoProtocolGuid
, NULL
},
2241 { STRING_TOKEN (STR_UGA_DRAW
), &gEfiUgaDrawProtocolGuid
, NULL
},
2242 { STRING_TOKEN (STR_UGA_IO
), &gEfiUgaIoProtocolGuid
, NULL
},
2243 { STRING_TOKEN (STR_ESP
), &gEfiPartTypeSystemPartGuid
, NULL
},
2244 { STRING_TOKEN (STR_GPT_NBR
), &gEfiPartTypeLegacyMbrGuid
, NULL
},
2245 { STRING_TOKEN (STR_DRIVER_CONFIG
), &gEfiDriverConfigurationProtocolGuid
, NULL
},
2246 { STRING_TOKEN (STR_DRIVER_CONFIG2
), &gEfiDriverConfiguration2ProtocolGuid
, NULL
},
2249 // these are using local (non-global) definitions to reduce package dependancy.
2251 { STRING_TOKEN (STR_ISA_IO
), (EFI_GUID
*)&EfiIsaIoProtocolGuid
, NULL
},
2252 { STRING_TOKEN (STR_ISA_ACPI
), (EFI_GUID
*)&EfiIsaAcpiProtocolGuid
, NULL
},
2255 // the ones under this are GUID identified structs, not protocols
2257 { STRING_TOKEN (STR_FILE_INFO
), &gEfiFileInfoGuid
, NULL
},
2258 { STRING_TOKEN (STR_FILE_SYS_INFO
), &gEfiFileSystemInfoGuid
, NULL
},
2261 // the ones under this are misc GUIDS.
2263 { STRING_TOKEN (STR_EFI_GLOBAL_VARIABLE
), &gEfiGlobalVariableGuid
, NULL
},
2268 { STRING_TOKEN (STR_IP6_SB
), &gEfiIp6ServiceBindingProtocolGuid
, NULL
},
2269 { STRING_TOKEN (STR_IP6
), &gEfiIp6ProtocolGuid
, NULL
},
2270 { STRING_TOKEN (STR_IP6_CONFIG
), &gEfiIp6ConfigProtocolGuid
, NULL
},
2271 { STRING_TOKEN (STR_MTFTP6_SB
), &gEfiMtftp6ServiceBindingProtocolGuid
, NULL
},
2272 { STRING_TOKEN (STR_MTFTP6
), &gEfiMtftp6ProtocolGuid
, NULL
},
2273 { STRING_TOKEN (STR_DHCP6_SB
), &gEfiDhcp6ServiceBindingProtocolGuid
, NULL
},
2274 { STRING_TOKEN (STR_DHCP6
), &gEfiDhcp6ProtocolGuid
, NULL
},
2275 { STRING_TOKEN (STR_UDP6_SB
), &gEfiUdp6ServiceBindingProtocolGuid
, NULL
},
2276 { STRING_TOKEN (STR_UDP6
), &gEfiUdp6ProtocolGuid
, NULL
},
2277 { STRING_TOKEN (STR_TCP6_SB
), &gEfiTcp6ServiceBindingProtocolGuid
, NULL
},
2278 { STRING_TOKEN (STR_TCP6
), &gEfiTcp6ProtocolGuid
, NULL
},
2279 { STRING_TOKEN (STR_VLAN_CONFIG
), &gEfiVlanConfigProtocolGuid
, NULL
},
2280 { STRING_TOKEN (STR_EAP
), &gEfiEapProtocolGuid
, NULL
},
2281 { STRING_TOKEN (STR_EAP_MGMT
), &gEfiEapManagementProtocolGuid
, NULL
},
2282 { STRING_TOKEN (STR_FTP4_SB
), &gEfiFtp4ServiceBindingProtocolGuid
, NULL
},
2283 { STRING_TOKEN (STR_FTP4
), &gEfiFtp4ProtocolGuid
, NULL
},
2284 { STRING_TOKEN (STR_IP_SEC_CONFIG
), &gEfiIpSecConfigProtocolGuid
, NULL
},
2285 { STRING_TOKEN (STR_DH
), &gEfiDriverHealthProtocolGuid
, NULL
},
2286 { STRING_TOKEN (STR_DEF_IMG_LOAD
), &gEfiDeferredImageLoadProtocolGuid
, NULL
},
2287 { STRING_TOKEN (STR_USER_CRED
), &gEfiUserCredentialProtocolGuid
, NULL
},
2288 { STRING_TOKEN (STR_USER_MNGR
), &gEfiUserManagerProtocolGuid
, NULL
},
2289 { STRING_TOKEN (STR_ATA_PASS_THRU
), &gEfiAtaPassThruProtocolGuid
, NULL
},
2294 { STRING_TOKEN (STR_FW_MGMT
), &gEfiFirmwareManagementProtocolGuid
, FirmwareManagementDumpInformation
},
2295 { STRING_TOKEN (STR_IP_SEC
), &gEfiIpSecProtocolGuid
, NULL
},
2296 { STRING_TOKEN (STR_IP_SEC2
), &gEfiIpSec2ProtocolGuid
, NULL
},
2301 { STRING_TOKEN (STR_KMS
), &gEfiKmsProtocolGuid
, NULL
},
2302 { STRING_TOKEN (STR_BLK_IO2
), &gEfiBlockIo2ProtocolGuid
, NULL
},
2303 { STRING_TOKEN (STR_SSC
), &gEfiStorageSecurityCommandProtocolGuid
, NULL
},
2304 { STRING_TOKEN (STR_UCRED2
), &gEfiUserCredential2ProtocolGuid
, NULL
},
2309 { STRING_TOKEN (STR_DISK_IO2
), &gEfiDiskIo2ProtocolGuid
, NULL
},
2310 { STRING_TOKEN (STR_ADAPTER_INFO
), &gEfiAdapterInformationProtocolGuid
, AdapterInformationDumpInformation
},
2315 { STRING_TOKEN (STR_TLS_SB
), &gEfiTlsServiceBindingProtocolGuid
, NULL
},
2316 { STRING_TOKEN (STR_TLS
), &gEfiTlsProtocolGuid
, NULL
},
2317 { STRING_TOKEN (STR_TLS_CONFIG
), &gEfiTlsConfigurationProtocolGuid
, NULL
},
2318 { STRING_TOKEN (STR_SUPPLICANT_SB
), &gEfiSupplicantServiceBindingProtocolGuid
, NULL
},
2319 { STRING_TOKEN (STR_SUPPLICANT
), &gEfiSupplicantProtocolGuid
, NULL
},
2324 { STRING_TOKEN (STR_WIFI2
), &gEfiWiFi2ProtocolGuid
, NULL
},
2325 { STRING_TOKEN (STR_RAMDISK
), &gEfiRamDiskProtocolGuid
, NULL
},
2326 { STRING_TOKEN (STR_HII_ID
), &gEfiHiiImageDecoderProtocolGuid
, NULL
},
2327 { STRING_TOKEN (STR_HII_IE
), &gEfiHiiImageExProtocolGuid
, NULL
},
2328 { STRING_TOKEN (STR_SD_MPT
), &gEfiSdMmcPassThruProtocolGuid
, NULL
},
2329 { STRING_TOKEN (STR_ERASE_BLOCK
), &gEfiEraseBlockProtocolGuid
, NULL
},
2334 { STRING_TOKEN (STR_BLUETOOTH_ATTR
), &gEfiBluetoothAttributeProtocolGuid
, NULL
},
2335 { STRING_TOKEN (STR_BLUETOOTH_ATTR_SB
), &gEfiBluetoothAttributeServiceBindingProtocolGuid
, NULL
},
2336 { STRING_TOKEN (STR_BLUETOOTH_LE_CONFIG
), &gEfiBluetoothLeConfigProtocolGuid
, NULL
},
2337 { STRING_TOKEN (STR_UFS_DEV_CONFIG
), &gEfiUfsDeviceConfigProtocolGuid
, NULL
},
2338 { STRING_TOKEN (STR_HTTP_BOOT_CALL
), &gEfiHttpBootCallbackProtocolGuid
, NULL
},
2339 { STRING_TOKEN (STR_RESET_NOTI
), &gEfiResetNotificationProtocolGuid
, NULL
},
2340 { STRING_TOKEN (STR_PARTITION_INFO
), &gEfiPartitionInfoProtocolGuid
, PartitionInfoProtocolDumpInformation
},
2341 { STRING_TOKEN (STR_HII_POPUP
), &gEfiHiiPopupProtocolGuid
, NULL
},
2346 { STRING_TOKEN (STR_REST_EX
), &gEfiRestExProtocolGuid
, NULL
},
2347 { STRING_TOKEN (STR_REDFISH_DISCOVER
), &gEfiRedfishDiscoverProtocolGuid
, NULL
},
2352 { STRING_TOKEN (STR_IDE_CONT_INIT
), &gEfiIdeControllerInitProtocolGuid
, NULL
},
2353 { STRING_TOKEN (STR_DISK_INFO
), &gEfiDiskInfoProtocolGuid
, NULL
},
2358 { STRING_TOKEN (STR_BDS_ARCH
), &gEfiBdsArchProtocolGuid
, NULL
},
2359 { STRING_TOKEN (STR_CPU_ARCH
), &gEfiCpuArchProtocolGuid
, NULL
},
2360 { STRING_TOKEN (STR_MET_ARCH
), &gEfiMetronomeArchProtocolGuid
, NULL
},
2361 { STRING_TOKEN (STR_MON_ARCH
), &gEfiMonotonicCounterArchProtocolGuid
, NULL
},
2362 { STRING_TOKEN (STR_RTC_ARCH
), &gEfiRealTimeClockArchProtocolGuid
, NULL
},
2363 { STRING_TOKEN (STR_RESET_ARCH
), &gEfiResetArchProtocolGuid
, NULL
},
2364 { STRING_TOKEN (STR_RT_ARCH
), &gEfiRuntimeArchProtocolGuid
, NULL
},
2365 { STRING_TOKEN (STR_SEC_ARCH
), &gEfiSecurityArchProtocolGuid
, NULL
},
2366 { STRING_TOKEN (STR_TIMER_ARCH
), &gEfiTimerArchProtocolGuid
, NULL
},
2367 { STRING_TOKEN (STR_VAR_ARCH
), &gEfiVariableWriteArchProtocolGuid
, NULL
},
2368 { STRING_TOKEN (STR_V_ARCH
), &gEfiVariableArchProtocolGuid
, NULL
},
2369 { STRING_TOKEN (STR_SECP
), &gEfiSecurityPolicyProtocolGuid
, NULL
},
2370 { STRING_TOKEN (STR_WDT_ARCH
), &gEfiWatchdogTimerArchProtocolGuid
, NULL
},
2371 { STRING_TOKEN (STR_SCR
), &gEfiStatusCodeRuntimeProtocolGuid
, NULL
},
2372 { STRING_TOKEN (STR_SMB_HC
), &gEfiSmbusHcProtocolGuid
, NULL
},
2373 { STRING_TOKEN (STR_FV_2
), &gEfiFirmwareVolume2ProtocolGuid
, NULL
},
2374 { STRING_TOKEN (STR_FV_BLOCK
), &gEfiFirmwareVolumeBlockProtocolGuid
, NULL
},
2375 { STRING_TOKEN (STR_CAP_ARCH
), &gEfiCapsuleArchProtocolGuid
, NULL
},
2376 { STRING_TOKEN (STR_MP_SERVICE
), &gEfiMpServiceProtocolGuid
, NULL
},
2377 { STRING_TOKEN (STR_HBRAP
), &gEfiPciHostBridgeResourceAllocationProtocolGuid
, NULL
},
2378 { STRING_TOKEN (STR_PCIP
), &gEfiPciPlatformProtocolGuid
, NULL
},
2379 { STRING_TOKEN (STR_PCIO
), &gEfiPciOverrideProtocolGuid
, NULL
},
2380 { STRING_TOKEN (STR_PCIE
), &gEfiPciEnumerationCompleteProtocolGuid
, NULL
},
2381 { STRING_TOKEN (STR_IPCID
), &gEfiIncompatiblePciDeviceSupportProtocolGuid
, NULL
},
2382 { STRING_TOKEN (STR_PCIHPI
), &gEfiPciHotPlugInitProtocolGuid
, NULL
},
2383 { STRING_TOKEN (STR_PCIHPR
), &gEfiPciHotPlugRequestProtocolGuid
, NULL
},
2384 { STRING_TOKEN (STR_SMBIOS
), &gEfiSmbiosProtocolGuid
, NULL
},
2385 { STRING_TOKEN (STR_S3_SAVE
), &gEfiS3SaveStateProtocolGuid
, NULL
},
2386 { STRING_TOKEN (STR_S3_S_SMM
), &gEfiS3SmmSaveStateProtocolGuid
, NULL
},
2387 { STRING_TOKEN (STR_RSC
), &gEfiRscHandlerProtocolGuid
, NULL
},
2388 { STRING_TOKEN (STR_S_RSC
), &gEfiSmmRscHandlerProtocolGuid
, NULL
},
2389 { STRING_TOKEN (STR_ACPI_SDT
), &gEfiAcpiSdtProtocolGuid
, NULL
},
2390 { STRING_TOKEN (STR_SIO
), &gEfiSioProtocolGuid
, NULL
},
2391 { STRING_TOKEN (STR_S_CPU2
), &gEfiSmmCpuIo2ProtocolGuid
, NULL
},
2392 { STRING_TOKEN (STR_S_BASE2
), &gEfiSmmBase2ProtocolGuid
, NULL
},
2393 { STRING_TOKEN (STR_S_ACC_2
), &gEfiSmmAccess2ProtocolGuid
, NULL
},
2394 { STRING_TOKEN (STR_S_CON_2
), &gEfiSmmControl2ProtocolGuid
, NULL
},
2395 { STRING_TOKEN (STR_S_CONFIG
), &gEfiSmmConfigurationProtocolGuid
, NULL
},
2396 { STRING_TOKEN (STR_S_RTL
), &gEfiSmmReadyToLockProtocolGuid
, NULL
},
2397 { STRING_TOKEN (STR_DS_RTL
), &gEfiDxeSmmReadyToLockProtocolGuid
, NULL
},
2398 { STRING_TOKEN (STR_S_COMM
), &gEfiSmmCommunicationProtocolGuid
, NULL
},
2399 { STRING_TOKEN (STR_S_STAT
), &gEfiSmmStatusCodeProtocolGuid
, NULL
},
2400 { STRING_TOKEN (STR_S_CPU
), &gEfiSmmCpuProtocolGuid
, NULL
},
2401 { STRING_TOKEN (STR_S_PCIRBIO
), &gEfiSmmPciRootBridgeIoProtocolGuid
, NULL
},
2402 { STRING_TOKEN (STR_S_SWD
), &gEfiSmmSwDispatch2ProtocolGuid
, NULL
},
2403 { STRING_TOKEN (STR_S_SXD
), &gEfiSmmSxDispatch2ProtocolGuid
, NULL
},
2404 { STRING_TOKEN (STR_S_PTD2
), &gEfiSmmPeriodicTimerDispatch2ProtocolGuid
, NULL
},
2405 { STRING_TOKEN (STR_S_UD2
), &gEfiSmmUsbDispatch2ProtocolGuid
, NULL
},
2406 { STRING_TOKEN (STR_S_GD2
), &gEfiSmmGpiDispatch2ProtocolGuid
, NULL
},
2407 { STRING_TOKEN (STR_S_SBD2
), &gEfiSmmStandbyButtonDispatch2ProtocolGuid
, NULL
},
2408 { STRING_TOKEN (STR_S_PBD2
), &gEfiSmmPowerButtonDispatch2ProtocolGuid
, NULL
},
2409 { STRING_TOKEN (STR_S_ITD2
), &gEfiSmmIoTrapDispatch2ProtocolGuid
, NULL
},
2410 { STRING_TOKEN (STR_PCD
), &gEfiPcdProtocolGuid
, NULL
},
2411 { STRING_TOKEN (STR_FVB2
), &gEfiFirmwareVolumeBlock2ProtocolGuid
, NULL
},
2412 { STRING_TOKEN (STR_CPUIO2
), &gEfiCpuIo2ProtocolGuid
, NULL
},
2413 { STRING_TOKEN (STR_LEGACY_R2
), &gEfiLegacyRegion2ProtocolGuid
, NULL
},
2414 { STRING_TOKEN (STR_S2ARCH
), &gEfiSecurity2ArchProtocolGuid
, NULL
},
2415 { STRING_TOKEN (STR_EODXE
), &gEfiSmmEndOfDxeProtocolGuid
, NULL
},
2416 { STRING_TOKEN (STR_ISAHC
), &gEfiIsaHcProtocolGuid
, NULL
},
2417 { STRING_TOKEN (STR_ISAHC_B
), &gEfiIsaHcServiceBindingProtocolGuid
, NULL
},
2418 { STRING_TOKEN (STR_SIO_C
), &gEfiSioControlProtocolGuid
, NULL
},
2419 { STRING_TOKEN (STR_GET_PCD
), &gEfiGetPcdInfoProtocolGuid
, NULL
},
2420 { STRING_TOKEN (STR_I2C_M
), &gEfiI2cMasterProtocolGuid
, NULL
},
2421 { STRING_TOKEN (STR_I2CIO
), &gEfiI2cIoProtocolGuid
, NULL
},
2422 { STRING_TOKEN (STR_I2CEN
), &gEfiI2cEnumerateProtocolGuid
, NULL
},
2423 { STRING_TOKEN (STR_I2C_H
), &gEfiI2cHostProtocolGuid
, NULL
},
2424 { STRING_TOKEN (STR_I2C_BCM
), &gEfiI2cBusConfigurationManagementProtocolGuid
, NULL
},
2425 { STRING_TOKEN (STR_TCG2
), &gEfiTcg2ProtocolGuid
, NULL
},
2426 { STRING_TOKEN (STR_TIMESTAMP
), &gEfiTimestampProtocolGuid
, NULL
},
2427 { STRING_TOKEN (STR_RNG
), &gEfiRngProtocolGuid
, NULL
},
2428 { STRING_TOKEN (STR_NVMEPT
), &gEfiNvmExpressPassThruProtocolGuid
, NULL
},
2429 { STRING_TOKEN (STR_H2_SB
), &gEfiHash2ServiceBindingProtocolGuid
, NULL
},
2430 { STRING_TOKEN (STR_HASH2
), &gEfiHash2ProtocolGuid
, NULL
},
2431 { STRING_TOKEN (STR_BIO_C
), &gEfiBlockIoCryptoProtocolGuid
, NULL
},
2432 { STRING_TOKEN (STR_SCR
), &gEfiSmartCardReaderProtocolGuid
, NULL
},
2433 { STRING_TOKEN (STR_SCE
), &gEfiSmartCardEdgeProtocolGuid
, NULL
},
2434 { STRING_TOKEN (STR_USB_FIO
), &gEfiUsbFunctionIoProtocolGuid
, NULL
},
2435 { STRING_TOKEN (STR_BC_HC
), &gEfiBluetoothHcProtocolGuid
, NULL
},
2436 { STRING_TOKEN (STR_BC_IO_SB
), &gEfiBluetoothIoServiceBindingProtocolGuid
, NULL
},
2437 { STRING_TOKEN (STR_BC_IO
), &gEfiBluetoothIoProtocolGuid
, NULL
},
2438 { STRING_TOKEN (STR_BC_C
), &gEfiBluetoothConfigProtocolGuid
, NULL
},
2439 { STRING_TOKEN (STR_REG_EXP
), &gEfiRegularExpressionProtocolGuid
, NULL
},
2440 { STRING_TOKEN (STR_B_MGR_P
), &gEfiBootManagerPolicyProtocolGuid
, NULL
},
2441 { STRING_TOKEN (STR_CKH
), &gEfiConfigKeywordHandlerProtocolGuid
, NULL
},
2442 { STRING_TOKEN (STR_WIFI
), &gEfiWiFiProtocolGuid
, NULL
},
2443 { STRING_TOKEN (STR_EAP_M
), &gEfiEapManagement2ProtocolGuid
, NULL
},
2444 { STRING_TOKEN (STR_EAP_C
), &gEfiEapConfigurationProtocolGuid
, NULL
},
2445 { STRING_TOKEN (STR_PKCS7
), &gEfiPkcs7VerifyProtocolGuid
, NULL
},
2446 { STRING_TOKEN (STR_NET_DNS4_SB
), &gEfiDns4ServiceBindingProtocolGuid
, NULL
},
2447 { STRING_TOKEN (STR_NET_DNS4
), &gEfiDns4ProtocolGuid
, NULL
},
2448 { STRING_TOKEN (STR_NET_DNS6_SB
), &gEfiDns6ServiceBindingProtocolGuid
, NULL
},
2449 { STRING_TOKEN (STR_NET_DNS6
), &gEfiDns6ProtocolGuid
, NULL
},
2450 { STRING_TOKEN (STR_NET_HTTP_SB
), &gEfiHttpServiceBindingProtocolGuid
, NULL
},
2451 { STRING_TOKEN (STR_NET_HTTP
), &gEfiHttpProtocolGuid
, NULL
},
2452 { STRING_TOKEN (STR_NET_HTTP_U
), &gEfiHttpUtilitiesProtocolGuid
, NULL
},
2453 { STRING_TOKEN (STR_REST
), &gEfiRestProtocolGuid
, NULL
},
2458 { STRING_TOKEN (STR_MM_EOD
), &gEfiMmEndOfDxeProtocolGuid
, NULL
},
2459 { STRING_TOKEN (STR_MM_ITD
), &gEfiMmIoTrapDispatchProtocolGuid
, NULL
},
2460 { STRING_TOKEN (STR_MM_PBD
), &gEfiMmPowerButtonDispatchProtocolGuid
, NULL
},
2461 { STRING_TOKEN (STR_MM_SBD
), &gEfiMmStandbyButtonDispatchProtocolGuid
, NULL
},
2462 { STRING_TOKEN (STR_MM_GD
), &gEfiMmGpiDispatchProtocolGuid
, NULL
},
2463 { STRING_TOKEN (STR_MM_UD
), &gEfiMmUsbDispatchProtocolGuid
, NULL
},
2464 { STRING_TOKEN (STR_MM_PTD
), &gEfiMmPeriodicTimerDispatchProtocolGuid
, NULL
},
2465 { STRING_TOKEN (STR_MM_SXD
), &gEfiMmSxDispatchProtocolGuid
, NULL
},
2466 { STRING_TOKEN (STR_MM_SWD
), &gEfiMmSwDispatchProtocolGuid
, NULL
},
2467 { STRING_TOKEN (STR_MM_PRBI
), &gEfiMmPciRootBridgeIoProtocolGuid
, NULL
},
2468 { STRING_TOKEN (STR_MM_CPU
), &gEfiMmCpuProtocolGuid
, NULL
},
2469 { STRING_TOKEN (STR_MM_STACODE
), &gEfiMmStatusCodeProtocolGuid
, NULL
},
2470 { STRING_TOKEN (STR_DXEMM_RTL
), &gEfiDxeMmReadyToLockProtocolGuid
, NULL
},
2471 { STRING_TOKEN (STR_MM_CONFIG
), &gEfiMmConfigurationProtocolGuid
, NULL
},
2472 { STRING_TOKEN (STR_MM_RTL
), &gEfiMmReadyToLockProtocolGuid
, NULL
},
2473 { STRING_TOKEN (STR_MM_CONTROL
), &gEfiMmControlProtocolGuid
, NULL
},
2474 { STRING_TOKEN (STR_MM_ACCESS
), &gEfiMmAccessProtocolGuid
, NULL
},
2475 { STRING_TOKEN (STR_MM_BASE
), &gEfiMmBaseProtocolGuid
, NULL
},
2476 { STRING_TOKEN (STR_MM_CPUIO
), &gEfiMmCpuIoProtocolGuid
, NULL
},
2477 { STRING_TOKEN (STR_MM_RH
), &gEfiMmRscHandlerProtocolGuid
, NULL
},
2478 { STRING_TOKEN (STR_MM_COM
), &gEfiMmCommunicationProtocolGuid
, NULL
},
2481 // UEFI Shell Spec 2.0
2483 { STRING_TOKEN (STR_SHELL_PARAMETERS
), &gEfiShellParametersProtocolGuid
, NULL
},
2484 { STRING_TOKEN (STR_SHELL
), &gEfiShellProtocolGuid
, NULL
},
2487 // UEFI Shell Spec 2.1
2489 { STRING_TOKEN (STR_SHELL_DYNAMIC
), &gEfiShellDynamicCommandProtocolGuid
, NULL
},
2494 { STRING_TOKEN (STR_PCDINFOPROT
), &gGetPcdInfoProtocolGuid
, NULL
},
2503 Function to get the node for a protocol or struct from it's GUID.
2505 if Guid is NULL, then ASSERT.
2507 @param[in] Guid The GUID to look for the name of.
2511 CONST GUID_INFO_BLOCK
*
2512 InternalShellGetNodeFromGuid (
2513 IN CONST EFI_GUID
*Guid
2516 CONST GUID_INFO_BLOCK
*ListWalker
;
2519 ASSERT (Guid
!= NULL
);
2521 for (LoopCount
= 0, ListWalker
= mGuidList
; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++, ListWalker
++) {
2522 if (CompareGuid (ListWalker
->GuidId
, Guid
)) {
2523 return (ListWalker
);
2527 if (PcdGetBool (PcdShellIncludeNtGuids
)) {
2528 for (ListWalker
= mGuidStringListNT
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2529 if (CompareGuid (ListWalker
->GuidId
, Guid
)) {
2530 return (ListWalker
);
2535 for (ListWalker
= mGuidStringList
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2536 if (CompareGuid (ListWalker
->GuidId
, Guid
)) {
2537 return (ListWalker
);
2545 Function to add a new GUID/Name mapping.
2547 @param[in] Guid The Guid
2548 @param[in] NameID The STRING id of the HII string to use
2549 @param[in] DumpFunc The pointer to the dump function
2552 @retval EFI_SUCCESS The operation was sucessful
2553 @retval EFI_OUT_OF_RESOURCES A memory allocation failed
2554 @retval EFI_INVALID_PARAMETER Guid NameId was invalid
2557 InsertNewGuidNameMapping (
2558 IN CONST EFI_GUID
*Guid
,
2559 IN CONST EFI_STRING_ID NameID
,
2560 IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL
2563 ASSERT (Guid
!= NULL
);
2564 ASSERT (NameID
!= 0);
2566 mGuidList
= ReallocatePool (
2567 mGuidListCount
* sizeof (GUID_INFO_BLOCK
),
2568 (mGuidListCount
+ 1) * sizeof (GUID_INFO_BLOCK
),
2571 if (mGuidList
== NULL
) {
2573 return (EFI_OUT_OF_RESOURCES
);
2578 mGuidList
[mGuidListCount
- 1].GuidId
= AllocateCopyPool (sizeof (EFI_GUID
), Guid
);
2579 mGuidList
[mGuidListCount
- 1].StringId
= NameID
;
2580 mGuidList
[mGuidListCount
- 1].DumpInfo
= DumpFunc
;
2582 if (mGuidList
[mGuidListCount
- 1].GuidId
== NULL
) {
2583 return (EFI_OUT_OF_RESOURCES
);
2586 return (EFI_SUCCESS
);
2590 Function to add a new GUID/Name mapping.
2592 This cannot overwrite an existing mapping.
2594 @param[in] Guid The Guid
2595 @param[in] TheName The Guid's name
2596 @param[in] Lang RFC4646 language code list or NULL
2598 @retval EFI_SUCCESS The operation was sucessful
2599 @retval EFI_ACCESS_DENIED There was a duplicate
2600 @retval EFI_OUT_OF_RESOURCES A memory allocation failed
2601 @retval EFI_INVALID_PARAMETER Guid or TheName was NULL
2605 AddNewGuidNameMapping (
2606 IN CONST EFI_GUID
*Guid
,
2607 IN CONST CHAR16
*TheName
,
2608 IN CONST CHAR8
*Lang OPTIONAL
2611 EFI_STRING_ID NameID
;
2613 HandleParsingHiiInit ();
2615 if ((Guid
== NULL
) || (TheName
== NULL
)) {
2616 return (EFI_INVALID_PARAMETER
);
2619 if ((InternalShellGetNodeFromGuid (Guid
)) != NULL
) {
2620 return (EFI_ACCESS_DENIED
);
2623 NameID
= HiiSetString (mHandleParsingHiiHandle
, 0, (CHAR16
*)TheName
, Lang
);
2625 return (EFI_OUT_OF_RESOURCES
);
2628 return (InsertNewGuidNameMapping (Guid
, NameID
, NULL
));
2632 Function to get the name of a protocol or struct from it's GUID.
2634 if Guid is NULL, then ASSERT.
2636 @param[in] Guid The GUID to look for the name of.
2637 @param[in] Lang The language to use.
2639 @return pointer to string of the name. The caller
2640 is responsible to free this memory.
2644 GetStringNameFromGuid (
2645 IN CONST EFI_GUID
*Guid
,
2646 IN CONST CHAR8
*Lang OPTIONAL
2649 CONST GUID_INFO_BLOCK
*Id
;
2651 HandleParsingHiiInit ();
2653 Id
= InternalShellGetNodeFromGuid (Guid
);
2658 return HiiGetString (mHandleParsingHiiHandle
, Id
->StringId
, Lang
);
2662 Function to dump protocol information from a handle.
2664 This function will return a allocated string buffer containing the
2665 information. The caller is responsible for freeing the memory.
2667 If Guid is NULL, ASSERT().
2668 If TheHandle is NULL, ASSERT().
2670 @param[in] TheHandle The handle to dump information from.
2671 @param[in] Guid The GUID of the protocol to dump.
2672 @param[in] Verbose TRUE for extra info. FALSE otherwise.
2674 @return The pointer to string.
2675 @retval NULL An error was encountered.
2679 GetProtocolInformationDump (
2680 IN CONST EFI_HANDLE TheHandle
,
2681 IN CONST EFI_GUID
*Guid
,
2682 IN CONST BOOLEAN Verbose
2685 CONST GUID_INFO_BLOCK
*Id
;
2687 ASSERT (TheHandle
!= NULL
);
2688 ASSERT (Guid
!= NULL
);
2690 if ((TheHandle
== NULL
) || (Guid
== NULL
)) {
2694 Id
= InternalShellGetNodeFromGuid (Guid
);
2695 if ((Id
!= NULL
) && (Id
->DumpInfo
!= NULL
)) {
2696 return (Id
->DumpInfo (TheHandle
, Verbose
));
2703 Function to get the Guid for a protocol or struct based on it's string name.
2705 do not modify the returned Guid.
2707 @param[in] Name The pointer to the string name.
2708 @param[in] Lang The pointer to the language code.
2709 @param[out] Guid The pointer to the Guid.
2711 @retval EFI_SUCCESS The operation was sucessful.
2715 GetGuidFromStringName (
2716 IN CONST CHAR16
*Name
,
2717 IN CONST CHAR8
*Lang OPTIONAL
,
2721 CONST GUID_INFO_BLOCK
*ListWalker
;
2725 HandleParsingHiiInit ();
2727 ASSERT (Guid
!= NULL
);
2729 return (EFI_INVALID_PARAMETER
);
2734 if (PcdGetBool (PcdShellIncludeNtGuids
)) {
2735 for (ListWalker
= mGuidStringListNT
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2736 String
= HiiGetString (mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2737 if ((Name
!= NULL
) && (String
!= NULL
) && (StringNoCaseCompare (&Name
, &String
) == 0)) {
2738 *Guid
= ListWalker
->GuidId
;
2741 SHELL_FREE_NON_NULL (String
);
2742 if (*Guid
!= NULL
) {
2743 return (EFI_SUCCESS
);
2748 for (ListWalker
= mGuidStringList
; ListWalker
!= NULL
&& ListWalker
->GuidId
!= NULL
; ListWalker
++) {
2749 String
= HiiGetString (mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2750 if ((Name
!= NULL
) && (String
!= NULL
) && (StringNoCaseCompare (&Name
, &String
) == 0)) {
2751 *Guid
= ListWalker
->GuidId
;
2754 SHELL_FREE_NON_NULL (String
);
2755 if (*Guid
!= NULL
) {
2756 return (EFI_SUCCESS
);
2760 for (LoopCount
= 0, ListWalker
= mGuidList
; mGuidList
!= NULL
&& LoopCount
< mGuidListCount
; LoopCount
++, ListWalker
++) {
2761 String
= HiiGetString (mHandleParsingHiiHandle
, ListWalker
->StringId
, Lang
);
2762 if ((Name
!= NULL
) && (String
!= NULL
) && (StringNoCaseCompare (&Name
, &String
) == 0)) {
2763 *Guid
= ListWalker
->GuidId
;
2766 SHELL_FREE_NON_NULL (String
);
2767 if (*Guid
!= NULL
) {
2768 return (EFI_SUCCESS
);
2772 return (EFI_NOT_FOUND
);
2776 Get best support language for this driver.
2778 First base on the user input language to search, second base on the current
2779 platform used language to search, third get the first language from the
2780 support language list. The caller need to free the buffer of the best language.
2782 @param[in] SupportedLanguages The support languages for this driver.
2783 @param[in] InputLanguage The user input language.
2784 @param[in] Iso639Language Whether get language for ISO639.
2786 @return The best support language for this driver.
2790 GetBestLanguageForDriver (
2791 IN CONST CHAR8
*SupportedLanguages
,
2792 IN CONST CHAR8
*InputLanguage
,
2793 IN BOOLEAN Iso639Language
2796 CHAR8
*LanguageVariable
;
2797 CHAR8
*BestLanguage
;
2799 GetVariable2 (Iso639Language
? L
"Lang" : L
"PlatformLang", &gEfiGlobalVariableGuid
, (VOID
**)&LanguageVariable
, NULL
);
2801 BestLanguage
= GetBestLanguage (
2804 (InputLanguage
!= NULL
) ? InputLanguage
: "",
2805 (LanguageVariable
!= NULL
) ? LanguageVariable
: "",
2810 if (LanguageVariable
!= NULL
) {
2811 FreePool (LanguageVariable
);
2814 return BestLanguage
;
2818 Function to retrieve the driver name (if possible) from the ComponentName or
2819 ComponentName2 protocol
2821 @param[in] TheHandle The driver handle to get the name of.
2822 @param[in] Language The language to use.
2824 @retval NULL The name could not be found.
2825 @return A pointer to the string name. Do not de-allocate the memory.
2829 GetStringNameFromHandle (
2830 IN CONST EFI_HANDLE TheHandle
,
2831 IN CONST CHAR8
*Language
2834 EFI_COMPONENT_NAME2_PROTOCOL
*CompNameStruct
;
2841 Status
= gBS
->OpenProtocol (
2843 &gEfiComponentName2ProtocolGuid
,
2844 (VOID
**)&CompNameStruct
,
2847 EFI_OPEN_PROTOCOL_GET_PROTOCOL
2849 if (!EFI_ERROR (Status
)) {
2850 BestLang
= GetBestLanguageForDriver (CompNameStruct
->SupportedLanguages
, Language
, FALSE
);
2851 Status
= CompNameStruct
->GetDriverName (CompNameStruct
, BestLang
, &RetVal
);
2852 if (BestLang
!= NULL
) {
2853 FreePool (BestLang
);
2857 if (!EFI_ERROR (Status
)) {
2862 Status
= gBS
->OpenProtocol (
2864 &gEfiComponentNameProtocolGuid
,
2865 (VOID
**)&CompNameStruct
,
2868 EFI_OPEN_PROTOCOL_GET_PROTOCOL
2870 if (!EFI_ERROR (Status
)) {
2871 BestLang
= GetBestLanguageForDriver (CompNameStruct
->SupportedLanguages
, Language
, FALSE
);
2872 Status
= CompNameStruct
->GetDriverName (CompNameStruct
, BestLang
, &RetVal
);
2873 if (BestLang
!= NULL
) {
2874 FreePool (BestLang
);
2877 if (!EFI_ERROR (Status
)) {
2886 Function to initialize the file global mHandleList object for use in
2887 vonverting handles to index and index to handle.
2889 @retval EFI_SUCCESS The operation was successful.
2892 InternalShellInitHandleList (
2897 EFI_HANDLE
*HandleBuffer
;
2899 HANDLE_LIST
*ListWalker
;
2901 if (mHandleList
.NextIndex
!= 0) {
2905 InitializeListHead (&mHandleList
.List
.Link
);
2906 mHandleList
.NextIndex
= 1;
2907 Status
= gBS
->LocateHandleBuffer (
2914 ASSERT_EFI_ERROR (Status
);
2915 if (EFI_ERROR (Status
)) {
2919 for (mHandleList
.NextIndex
= 1; mHandleList
.NextIndex
<= HandleCount
; mHandleList
.NextIndex
++) {
2920 ListWalker
= AllocateZeroPool (sizeof (HANDLE_LIST
));
2921 if (ListWalker
!= NULL
) {
2922 ListWalker
->TheHandle
= HandleBuffer
[mHandleList
.NextIndex
- 1];
2923 ListWalker
->TheIndex
= mHandleList
.NextIndex
;
2924 InsertTailList (&mHandleList
.List
.Link
, &ListWalker
->Link
);
2928 FreePool (HandleBuffer
);
2929 return (EFI_SUCCESS
);
2933 Function to retrieve the human-friendly index of a given handle. If the handle
2934 does not have a index one will be automatically assigned. The index value is valid
2935 until the termination of the shell application.
2937 @param[in] TheHandle The handle to retrieve an index for.
2939 @retval 0 A memory allocation failed.
2940 @return The index of the handle.
2945 ConvertHandleToHandleIndex (
2946 IN CONST EFI_HANDLE TheHandle
2950 EFI_GUID
**ProtocolBuffer
;
2951 UINTN ProtocolCount
;
2952 HANDLE_LIST
*ListWalker
;
2954 if (TheHandle
== NULL
) {
2958 InternalShellInitHandleList ();
2960 for (ListWalker
= (HANDLE_LIST
*)GetFirstNode (&mHandleList
.List
.Link
)
2961 ; !IsNull (&mHandleList
.List
.Link
, &ListWalker
->Link
)
2962 ; ListWalker
= (HANDLE_LIST
*)GetNextNode (&mHandleList
.List
.Link
, &ListWalker
->Link
)
2965 if (ListWalker
->TheHandle
== TheHandle
) {
2967 // Verify that TheHandle is still present in the Handle Database
2969 Status
= gBS
->ProtocolsPerHandle (TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2970 if (EFI_ERROR (Status
)) {
2972 // TheHandle is not present in the Handle Database, so delete from the handle list
2974 RemoveEntryList (&ListWalker
->Link
);
2978 FreePool (ProtocolBuffer
);
2979 return (ListWalker
->TheIndex
);
2984 // Verify that TheHandle is valid handle
2986 Status
= gBS
->ProtocolsPerHandle (TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
2987 if (EFI_ERROR (Status
)) {
2989 // TheHandle is not valid, so do not add to handle list
2994 FreePool (ProtocolBuffer
);
2996 ListWalker
= AllocateZeroPool (sizeof (HANDLE_LIST
));
2997 if (ListWalker
== NULL
) {
3001 ListWalker
->TheHandle
= TheHandle
;
3002 ListWalker
->TheIndex
= mHandleList
.NextIndex
++;
3003 InsertTailList (&mHandleList
.List
.Link
, &ListWalker
->Link
);
3004 return (ListWalker
->TheIndex
);
3008 Function to retrieve the EFI_HANDLE from the human-friendly index.
3010 @param[in] TheIndex The index to retrieve the EFI_HANDLE for.
3012 @retval NULL The index was invalid.
3013 @return The EFI_HANDLE that index represents.
3018 ConvertHandleIndexToHandle (
3019 IN CONST UINTN TheIndex
3023 EFI_GUID
**ProtocolBuffer
;
3024 UINTN ProtocolCount
;
3025 HANDLE_LIST
*ListWalker
;
3027 InternalShellInitHandleList ();
3029 if (TheIndex
>= mHandleList
.NextIndex
) {
3033 for (ListWalker
= (HANDLE_LIST
*)GetFirstNode (&mHandleList
.List
.Link
)
3034 ; !IsNull (&mHandleList
.List
.Link
, &ListWalker
->Link
)
3035 ; ListWalker
= (HANDLE_LIST
*)GetNextNode (&mHandleList
.List
.Link
, &ListWalker
->Link
)
3038 if ((ListWalker
->TheIndex
== TheIndex
) && (ListWalker
->TheHandle
!= NULL
)) {
3040 // Verify that LinkWalker->TheHandle is valid handle
3042 Status
= gBS
->ProtocolsPerHandle (ListWalker
->TheHandle
, &ProtocolBuffer
, &ProtocolCount
);
3043 if (!EFI_ERROR (Status
)) {
3044 FreePool (ProtocolBuffer
);
3047 // TheHandle is not valid, so do not add to handle list
3049 ListWalker
->TheHandle
= NULL
;
3052 return (ListWalker
->TheHandle
);
3060 Gets all the related EFI_HANDLEs based on the mask supplied.
3062 This function scans all EFI_HANDLES in the UEFI environment's handle database
3063 and returns the ones with the specified relationship (Mask) to the specified
3066 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
3067 If MatchingHandleCount is NULL, then ASSERT.
3069 If MatchingHandleBuffer is not NULL upon a successful return the memory must be
3072 @param[in] DriverBindingHandle The handle with Driver Binding protocol on it.
3073 @param[in] ControllerHandle The handle with Device Path protocol on it.
3074 @param[in] MatchingHandleCount The pointer to UINTN that specifies the number of HANDLES in
3075 MatchingHandleBuffer.
3076 @param[out] MatchingHandleBuffer On a successful return, a buffer of MatchingHandleCount
3077 EFI_HANDLEs with a terminating NULL EFI_HANDLE.
3078 @param[out] HandleType An array of type information.
3080 @retval EFI_SUCCESS The operation was successful, and any related handles
3081 are in MatchingHandleBuffer.
3082 @retval EFI_NOT_FOUND No matching handles were found.
3083 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.
3087 ParseHandleDatabaseByRelationshipWithType (
3088 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL
,
3089 IN CONST EFI_HANDLE ControllerHandle OPTIONAL
,
3090 IN UINTN
*HandleCount
,
3091 OUT EFI_HANDLE
**HandleBuffer
,
3092 OUT UINTN
**HandleType
3097 EFI_GUID
**ProtocolGuidArray
;
3099 UINTN ProtocolIndex
;
3100 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
*OpenInfo
;
3101 UINTN OpenInfoCount
;
3102 UINTN OpenInfoIndex
;
3104 INTN DriverBindingHandleIndex
;
3106 ASSERT (HandleCount
!= NULL
);
3107 ASSERT (HandleBuffer
!= NULL
);
3108 ASSERT (HandleType
!= NULL
);
3109 ASSERT (DriverBindingHandle
!= NULL
|| ControllerHandle
!= NULL
);
3112 *HandleBuffer
= NULL
;
3116 // Retrieve the list of all handles from the handle database
3118 Status
= gBS
->LocateHandleBuffer (
3125 if (EFI_ERROR (Status
)) {
3129 *HandleType
= AllocateZeroPool (*HandleCount
* sizeof (UINTN
));
3130 if (*HandleType
== NULL
) {
3131 SHELL_FREE_NON_NULL (*HandleBuffer
);
3133 return EFI_OUT_OF_RESOURCES
;
3136 DriverBindingHandleIndex
= -1;
3137 for (HandleIndex
= 0; HandleIndex
< *HandleCount
; HandleIndex
++) {
3138 if ((DriverBindingHandle
!= NULL
) && ((*HandleBuffer
)[HandleIndex
] == DriverBindingHandle
)) {
3139 DriverBindingHandleIndex
= (INTN
)HandleIndex
;
3143 for (HandleIndex
= 0; HandleIndex
< *HandleCount
; HandleIndex
++) {
3145 // Retrieve the list of all the protocols on each handle
3147 Status
= gBS
->ProtocolsPerHandle (
3148 (*HandleBuffer
)[HandleIndex
],
3152 if (EFI_ERROR (Status
)) {
3156 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
3158 // Set the bit describing what this handle has
3160 if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiLoadedImageProtocolGuid
)) {
3161 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_IMAGE_HANDLE
;
3162 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverBindingProtocolGuid
)) {
3163 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_BINDING_HANDLE
;
3164 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverConfiguration2ProtocolGuid
)) {
3165 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_CONFIGURATION_HANDLE
;
3166 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverConfigurationProtocolGuid
)) {
3167 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_CONFIGURATION_HANDLE
;
3168 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverDiagnostics2ProtocolGuid
)) {
3169 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_DIAGNOSTICS_HANDLE
;
3170 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDriverDiagnosticsProtocolGuid
)) {
3171 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DRIVER_DIAGNOSTICS_HANDLE
;
3172 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiComponentName2ProtocolGuid
)) {
3173 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_COMPONENT_NAME_HANDLE
;
3174 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiComponentNameProtocolGuid
)) {
3175 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_COMPONENT_NAME_HANDLE
;
3176 } else if (CompareGuid (ProtocolGuidArray
[ProtocolIndex
], &gEfiDevicePathProtocolGuid
)) {
3177 (*HandleType
)[HandleIndex
] |= (UINTN
)HR_DEVICE_HANDLE
;
3181 // Retrieve the list of agents that have opened each protocol
3183 Status
= gBS
->OpenProtocolInformation (
3184 (*HandleBuffer
)[HandleIndex
],
3185 ProtocolGuidArray
[ProtocolIndex
],
3189 if (EFI_ERROR (Status
)) {
3193 if (ControllerHandle
== NULL
) {
3195 // ControllerHandle == NULL and DriverBindingHandle != NULL.
3196 // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing
3198 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
3199 if ((OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) && ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0)) {
3200 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
3201 if (DriverBindingHandleIndex
!= -1) {
3202 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
3206 if ((OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) && ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0)) {
3207 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
3208 if (DriverBindingHandleIndex
!= -1) {
3209 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
3212 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
3213 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
3214 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
3221 if ((DriverBindingHandle
== NULL
) && (ControllerHandle
!= NULL
)) {
3222 if (ControllerHandle
== (*HandleBuffer
)[HandleIndex
]) {
3223 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
3224 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
3225 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
3226 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
3227 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
3228 (*HandleType
)[ChildIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
3233 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
3234 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
3235 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
3236 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
3239 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
3240 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
3246 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
3247 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
3248 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== ControllerHandle
) {
3249 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_PARENT_HANDLE
);
3256 if ((DriverBindingHandle
!= NULL
) && (ControllerHandle
!= NULL
)) {
3257 if (ControllerHandle
== (*HandleBuffer
)[HandleIndex
]) {
3258 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CONTROLLER_HANDLE
);
3259 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
3260 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_DRIVER
) != 0) {
3261 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) {
3262 if (DriverBindingHandleIndex
!= -1) {
3263 (*HandleType
)[DriverBindingHandleIndex
] |= (UINTN
)HR_DEVICE_DRIVER
;
3268 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
3269 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== DriverBindingHandle
) {
3270 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
3271 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== (*HandleBuffer
)[ChildIndex
]) {
3272 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_CHILD_HANDLE
);
3277 for (ChildIndex
= 0; ChildIndex
< *HandleCount
; ChildIndex
++) {
3278 if (OpenInfo
[OpenInfoIndex
].AgentHandle
== (*HandleBuffer
)[ChildIndex
]) {
3279 (*HandleType
)[ChildIndex
] |= (UINTN
)(HR_BUS_DRIVER
| HR_DEVICE_DRIVER
);
3285 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++) {
3286 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
3287 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
== ControllerHandle
) {
3288 (*HandleType
)[HandleIndex
] |= (UINTN
)(HR_DEVICE_HANDLE
| HR_PARENT_HANDLE
);
3295 FreePool (OpenInfo
);
3298 FreePool (ProtocolGuidArray
);
3305 Gets all the related EFI_HANDLEs based on the single EFI_HANDLE and the mask
3308 This function will scan all EFI_HANDLES in the UEFI environment's handle database
3309 and return all the ones with the specified relationship (Mask) to the specified
3312 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
3313 If MatchingHandleCount is NULL, then ASSERT.
3315 If MatchingHandleBuffer is not NULL upon a sucessful return the memory must be
3318 @param[in] DriverBindingHandle Handle to a object with Driver Binding protocol
3320 @param[in] ControllerHandle Handle to a device with Device Path protocol on it.
3321 @param[in] Mask Mask of what relationship(s) is desired.
3322 @param[in] MatchingHandleCount Poitner to UINTN specifying number of HANDLES in
3323 MatchingHandleBuffer.
3324 @param[out] MatchingHandleBuffer On a sucessful return a buffer of MatchingHandleCount
3325 EFI_HANDLEs and a terminating NULL EFI_HANDLE.
3327 @retval EFI_SUCCESS The operation was sucessful and any related handles
3328 are in MatchingHandleBuffer;
3329 @retval EFI_NOT_FOUND No matching handles were found.
3330 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.
3334 ParseHandleDatabaseByRelationship (
3335 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL
,
3336 IN CONST EFI_HANDLE ControllerHandle OPTIONAL
,
3337 IN CONST UINTN Mask
,
3338 IN UINTN
*MatchingHandleCount
,
3339 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
3344 EFI_HANDLE
*HandleBuffer
;
3348 ASSERT (MatchingHandleCount
!= NULL
);
3349 ASSERT (DriverBindingHandle
!= NULL
|| ControllerHandle
!= NULL
);
3351 if ((Mask
& HR_VALID_MASK
) != Mask
) {
3352 return (EFI_INVALID_PARAMETER
);
3355 if (((Mask
& HR_CHILD_HANDLE
) != 0) && (DriverBindingHandle
== NULL
)) {
3356 return (EFI_INVALID_PARAMETER
);
3359 *MatchingHandleCount
= 0;
3360 if (MatchingHandleBuffer
!= NULL
) {
3361 *MatchingHandleBuffer
= NULL
;
3364 HandleBuffer
= NULL
;
3367 Status
= ParseHandleDatabaseByRelationshipWithType (
3368 DriverBindingHandle
,
3374 if (!EFI_ERROR (Status
)) {
3376 // Count the number of handles that match the attributes in Mask
3378 for (HandleIndex
= 0; HandleIndex
< HandleCount
; HandleIndex
++) {
3379 if ((HandleType
[HandleIndex
] & Mask
) == Mask
) {
3380 (*MatchingHandleCount
)++;
3385 // If no handles match the attributes in Mask then return EFI_NOT_FOUND
3387 if (*MatchingHandleCount
== 0) {
3388 Status
= EFI_NOT_FOUND
;
3390 if (MatchingHandleBuffer
== NULL
) {
3392 // Someone just wanted the count...
3394 Status
= EFI_SUCCESS
;
3397 // Allocate a handle buffer for the number of handles that matched the attributes in Mask
3399 *MatchingHandleBuffer
= AllocateZeroPool ((*MatchingHandleCount
+1)* sizeof (EFI_HANDLE
));
3400 if (*MatchingHandleBuffer
== NULL
) {
3401 Status
= EFI_OUT_OF_RESOURCES
;
3403 for (HandleIndex
= 0, *MatchingHandleCount
= 0
3404 ; HandleIndex
< HandleCount
3409 // Fill the allocated buffer with the handles that matched the attributes in Mask
3411 if ((HandleType
[HandleIndex
] & Mask
) == Mask
) {
3412 (*MatchingHandleBuffer
)[(*MatchingHandleCount
)++] = HandleBuffer
[HandleIndex
];
3417 // Make the last one NULL
3419 (*MatchingHandleBuffer
)[*MatchingHandleCount
] = NULL
;
3421 Status
= EFI_SUCCESS
;
3422 } // *MatchingHandleBuffer == NULL (ELSE)
3423 } // MacthingHandleBuffer == NULL (ELSE)
3424 } // *MatchingHandleCount == 0 (ELSE)
3425 } // no error on ParseHandleDatabaseByRelationshipWithType
3427 if (HandleBuffer
!= NULL
) {
3428 FreePool (HandleBuffer
);
3431 if (HandleType
!= NULL
) {
3432 FreePool (HandleType
);
3436 (MatchingHandleBuffer
== NULL
) ||
3437 (*MatchingHandleCount
== 0 && *MatchingHandleBuffer
== NULL
) ||
3438 (*MatchingHandleCount
!= 0 && *MatchingHandleBuffer
!= NULL
)
3444 Gets handles for any child controllers of the passed in controller.
3446 @param[in] ControllerHandle The handle of the "parent controller"
3447 @param[out] MatchingHandleCount Pointer to the number of handles in
3448 MatchingHandleBuffer on return.
3449 @param[out] MatchingHandleBuffer Buffer containing handles on a successful
3453 @retval EFI_SUCCESS The operation was sucessful.
3457 ParseHandleDatabaseForChildControllers (
3458 IN CONST EFI_HANDLE ControllerHandle
,
3459 OUT UINTN
*MatchingHandleCount
,
3460 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
3465 UINTN DriverBindingHandleCount
;
3466 EFI_HANDLE
*DriverBindingHandleBuffer
;
3467 UINTN DriverBindingHandleIndex
;
3468 UINTN ChildControllerHandleCount
;
3469 EFI_HANDLE
*ChildControllerHandleBuffer
;
3470 UINTN ChildControllerHandleIndex
;
3471 EFI_HANDLE
*HandleBufferForReturn
;
3473 if (MatchingHandleCount
== NULL
) {
3474 return (EFI_INVALID_PARAMETER
);
3477 *MatchingHandleCount
= 0;
3479 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
3481 &DriverBindingHandleCount
,
3482 &DriverBindingHandleBuffer
3484 if (EFI_ERROR (Status
)) {
3489 // Get a buffer big enough for all the controllers.
3491 HandleBufferForReturn
= GetHandleListByProtocol (NULL
);
3492 if (HandleBufferForReturn
== NULL
) {
3493 FreePool (DriverBindingHandleBuffer
);
3494 return (EFI_NOT_FOUND
);
3497 for (DriverBindingHandleIndex
= 0; DriverBindingHandleIndex
< DriverBindingHandleCount
; DriverBindingHandleIndex
++) {
3498 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
3499 DriverBindingHandleBuffer
[DriverBindingHandleIndex
],
3501 &ChildControllerHandleCount
,
3502 &ChildControllerHandleBuffer
3504 if (EFI_ERROR (Status
)) {
3508 for (ChildControllerHandleIndex
= 0;
3509 ChildControllerHandleIndex
< ChildControllerHandleCount
;
3510 ChildControllerHandleIndex
++
3513 for (HandleIndex
= 0; HandleIndex
< *MatchingHandleCount
; HandleIndex
++) {
3514 if (HandleBufferForReturn
[HandleIndex
] == ChildControllerHandleBuffer
[ChildControllerHandleIndex
]) {
3519 if (HandleIndex
>= *MatchingHandleCount
) {
3520 HandleBufferForReturn
[(*MatchingHandleCount
)++] = ChildControllerHandleBuffer
[ChildControllerHandleIndex
];
3524 FreePool (ChildControllerHandleBuffer
);
3527 FreePool (DriverBindingHandleBuffer
);
3529 if ((MatchingHandleBuffer
== NULL
) || (*MatchingHandleCount
== 0)) {
3531 // The caller is not interested in the actual handles, or we've found none.
3533 FreePool (HandleBufferForReturn
);
3534 HandleBufferForReturn
= NULL
;
3537 if (MatchingHandleBuffer
!= NULL
) {
3538 *MatchingHandleBuffer
= HandleBufferForReturn
;
3542 (MatchingHandleBuffer
== NULL
) ||
3543 (*MatchingHandleCount
== 0 && *MatchingHandleBuffer
== NULL
) ||
3544 (*MatchingHandleCount
!= 0 && *MatchingHandleBuffer
!= NULL
)
3547 return (EFI_SUCCESS
);
3551 Appends 1 buffer to another buffer. This will re-allocate the destination buffer
3552 if necessary to fit all of the data.
3554 If DestinationBuffer is NULL, then ASSERT().
3556 @param[in, out] DestinationBuffer The pointer to the pointer to the buffer to append onto.
3557 @param[in, out] DestinationSize The pointer to the size of DestinationBuffer.
3558 @param[in] SourceBuffer The pointer to the buffer to append onto DestinationBuffer.
3559 @param[in] SourceSize The number of bytes of SourceBuffer to append.
3561 @retval NULL A memory allocation failed.
3562 @retval NULL A parameter was invalid.
3563 @return A pointer to (*DestinationBuffer).
3567 IN OUT VOID
**DestinationBuffer
,
3568 IN OUT UINTN
*DestinationSize
,
3569 IN VOID
*SourceBuffer
,
3573 UINTN LocalDestinationSize
;
3574 UINTN LocalDestinationFinalSize
;
3576 ASSERT (DestinationBuffer
!= NULL
);
3578 if ((SourceSize
== 0) || (SourceBuffer
== NULL
)) {
3579 return (*DestinationBuffer
);
3582 if (DestinationSize
== NULL
) {
3583 LocalDestinationSize
= 0;
3585 LocalDestinationSize
= *DestinationSize
;
3588 LocalDestinationFinalSize
= LocalDestinationSize
+ SourceSize
;
3590 if (DestinationSize
!= NULL
) {
3591 *DestinationSize
= LocalDestinationSize
;
3594 if (LocalDestinationSize
== 0) {
3596 *DestinationBuffer
= AllocateZeroPool (LocalDestinationFinalSize
);
3599 *DestinationBuffer
= ReallocatePool (LocalDestinationSize
, LocalDestinationFinalSize
, *DestinationBuffer
);
3602 ASSERT (*DestinationBuffer
!= NULL
);
3605 return (CopyMem (((UINT8
*)(*DestinationBuffer
)) + LocalDestinationSize
, SourceBuffer
, SourceSize
));
3609 Gets handles for any child devices produced by the passed in driver.
3611 @param[in] DriverHandle The handle of the driver.
3612 @param[in] MatchingHandleCount Pointer to the number of handles in
3613 MatchingHandleBuffer on return.
3614 @param[out] MatchingHandleBuffer Buffer containing handles on a successful
3616 @retval EFI_SUCCESS The operation was sucessful.
3617 @sa ParseHandleDatabaseByRelationship
3621 ParseHandleDatabaseForChildDevices (
3622 IN CONST EFI_HANDLE DriverHandle
,
3623 IN UINTN
*MatchingHandleCount
,
3624 OUT EFI_HANDLE
**MatchingHandleBuffer OPTIONAL
3628 EFI_HANDLE
*Buffer2
;
3633 UINTN HandleBufferSize
;
3635 ASSERT (MatchingHandleCount
!= NULL
);
3637 HandleBufferSize
= 0;
3640 *MatchingHandleCount
= 0;
3642 Status
= PARSE_HANDLE_DATABASE_DEVICES (
3647 if (!EFI_ERROR (Status
)) {
3648 for (HandleIndex
= 0; HandleIndex
< Count1
; HandleIndex
++) {
3650 // now find the children
3652 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
3654 Buffer
[HandleIndex
],
3658 if (EFI_ERROR (Status
)) {
3663 // save out required and optional data elements
3665 *MatchingHandleCount
+= Count2
;
3666 if (MatchingHandleBuffer
!= NULL
) {
3667 *MatchingHandleBuffer
= BuffernCatGrow ((VOID
**)MatchingHandleBuffer
, &HandleBufferSize
, Buffer2
, Count2
* sizeof (Buffer2
[0]));
3673 if (Buffer2
!= NULL
) {
3679 if (Buffer
!= NULL
) {
3687 Function to get all handles that support a given protocol or all handles.
3689 @param[in] ProtocolGuid The guid of the protocol to get handles for. If NULL
3690 then the function will return all handles.
3692 @retval NULL A memory allocation failed.
3693 @return A NULL terminated list of handles.
3697 GetHandleListByProtocol (
3698 IN CONST EFI_GUID
*ProtocolGuid OPTIONAL
3701 EFI_HANDLE
*HandleList
;
3709 // We cannot use LocateHandleBuffer since we need that NULL item on the ends of the list!
3711 if (ProtocolGuid
== NULL
) {
3712 Status
= gBS
->LocateHandle (AllHandles
, NULL
, NULL
, &Size
, HandleList
);
3713 if (Status
== EFI_BUFFER_TOO_SMALL
) {
3714 HandleList
= AllocateZeroPool (Size
+ sizeof (EFI_HANDLE
));
3715 if (HandleList
== NULL
) {
3719 Status
= gBS
->LocateHandle (AllHandles
, NULL
, NULL
, &Size
, HandleList
);
3720 HandleList
[Size
/sizeof (EFI_HANDLE
)] = NULL
;
3723 Status
= gBS
->LocateHandle (ByProtocol
, (EFI_GUID
*)ProtocolGuid
, NULL
, &Size
, HandleList
);
3724 if (Status
== EFI_BUFFER_TOO_SMALL
) {
3725 HandleList
= AllocateZeroPool (Size
+ sizeof (EFI_HANDLE
));
3726 if (HandleList
== NULL
) {
3730 Status
= gBS
->LocateHandle (ByProtocol
, (EFI_GUID
*)ProtocolGuid
, NULL
, &Size
, HandleList
);
3731 HandleList
[Size
/sizeof (EFI_HANDLE
)] = NULL
;
3735 if (EFI_ERROR (Status
)) {
3736 if (HandleList
!= NULL
) {
3737 FreePool (HandleList
);
3743 return (HandleList
);
3747 Function to get all handles that support some protocols.
3749 @param[in] ProtocolGuids A NULL terminated list of protocol GUIDs.
3751 @retval NULL A memory allocation failed.
3752 @retval NULL ProtocolGuids was NULL.
3753 @return A NULL terminated list of EFI_HANDLEs.
3757 GetHandleListByProtocolList (
3758 IN CONST EFI_GUID
**ProtocolGuids
3761 EFI_HANDLE
*HandleList
;
3766 CONST EFI_GUID
**GuidWalker
;
3767 EFI_HANDLE
*HandleWalker1
;
3768 EFI_HANDLE
*HandleWalker2
;
3772 TotalSize
= sizeof (EFI_HANDLE
);
3774 for (GuidWalker
= ProtocolGuids
; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
; GuidWalker
++, Size
= 0) {
3775 Status
= gBS
->LocateHandle (ByProtocol
, (EFI_GUID
*)(*GuidWalker
), NULL
, &Size
, NULL
);
3776 if (Status
== EFI_BUFFER_TOO_SMALL
) {
3782 // No handles were found...
3784 if (TotalSize
== sizeof (EFI_HANDLE
)) {
3788 HandleList
= AllocateZeroPool (TotalSize
);
3789 if (HandleList
== NULL
) {
3794 for (GuidWalker
= ProtocolGuids
; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
; GuidWalker
++) {
3795 TempSize
= TotalSize
- Size
;
3796 Status
= gBS
->LocateHandle (ByProtocol
, (EFI_GUID
*)(*GuidWalker
), NULL
, &TempSize
, HandleList
+(Size
/sizeof (EFI_HANDLE
)));
3799 // Allow for missing protocols... Only update the 'used' size upon success.
3801 if (!EFI_ERROR (Status
)) {
3806 ASSERT (HandleList
[(TotalSize
/sizeof (EFI_HANDLE
))-1] == NULL
);
3808 for (HandleWalker1
= HandleList
; HandleWalker1
!= NULL
&& *HandleWalker1
!= NULL
; HandleWalker1
++) {
3809 for (HandleWalker2
= HandleWalker1
+ 1; HandleWalker2
!= NULL
&& *HandleWalker2
!= NULL
; HandleWalker2
++) {
3810 if (*HandleWalker1
== *HandleWalker2
) {
3812 // copy memory back 1 handle width.
3814 CopyMem (HandleWalker2
, HandleWalker2
+ 1, TotalSize
- ((HandleWalker2
-HandleList
+1)*sizeof (EFI_HANDLE
)));
3819 return (HandleList
);
3823 Return all supported GUIDs.
3825 @param[out] Guids The buffer to return all supported GUIDs.
3826 @param[in, out] Count On input, the count of GUIDs the buffer can hold,
3827 On output, the count of GUIDs to return.
3829 @retval EFI_INVALID_PARAMETER Count is NULL.
3830 @retval EFI_BUFFER_TOO_SMALL Buffer is not enough to hold all GUIDs.
3831 @retval EFI_SUCCESS GUIDs are returned successfully.
3835 GetAllMappingGuids (
3836 OUT EFI_GUID
*Guids
,
3844 if (Count
== NULL
) {
3845 return EFI_INVALID_PARAMETER
;
3849 if (PcdGetBool (PcdShellIncludeNtGuids
)) {
3850 NtGuidCount
= ARRAY_SIZE (mGuidStringListNT
) - 1;
3853 GuidCount
= ARRAY_SIZE (mGuidStringList
) - 1;
3855 if (*Count
< NtGuidCount
+ GuidCount
+ mGuidListCount
) {
3856 *Count
= NtGuidCount
+ GuidCount
+ mGuidListCount
;
3857 return EFI_BUFFER_TOO_SMALL
;
3860 for (Index
= 0; Index
< NtGuidCount
; Index
++) {
3861 CopyGuid (&Guids
[Index
], mGuidStringListNT
[Index
].GuidId
);
3864 for (Index
= 0; Index
< GuidCount
; Index
++) {
3865 CopyGuid (&Guids
[NtGuidCount
+ Index
], mGuidStringList
[Index
].GuidId
);
3868 for (Index
= 0; Index
< mGuidListCount
; Index
++) {
3869 CopyGuid (&Guids
[NtGuidCount
+ GuidCount
+ Index
], mGuidList
[Index
].GuidId
);