2 Main file for Dh shell Driver1 function.
4 (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
6 (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include "UefiShellDriver1CommandsLib.h"
13 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
17 {L
"-verbose", TypeFlag
},
23 STATIC CONST EFI_GUID
*UefiDriverModelProtocolsGuidArray
[] = {
24 &gEfiDriverBindingProtocolGuid
,
25 &gEfiPlatformDriverOverrideProtocolGuid
,
26 &gEfiBusSpecificDriverOverrideProtocolGuid
,
27 &gEfiDriverDiagnosticsProtocolGuid
,
28 &gEfiDriverDiagnostics2ProtocolGuid
,
29 &gEfiComponentNameProtocolGuid
,
30 &gEfiComponentName2ProtocolGuid
,
31 &gEfiPlatformToDriverConfigurationProtocolGuid
,
32 &gEfiDriverSupportedEfiVersionProtocolGuid
,
33 &gEfiDriverFamilyOverrideProtocolGuid
,
34 &gEfiDriverHealthProtocolGuid
,
35 &gEfiLoadedImageProtocolGuid
,
39 UINTN mGuidDataLen
[] = {8, 4, 4, 4, 12};
41 Function to determine if the string can convert to a GUID.
42 The string must be restricted as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" format.
44 @param[in] String The string to test.
46 @retval TRUE The string can convert to a GUID.
47 @retval FALSE The string can't convert to a GUID.
51 IN CONST CHAR16
*String
55 CONST CHAR16
*PrevWalker
;
66 while (Walker
!= NULL
&& *Walker
!= CHAR_NULL
) {
67 if ( (*Walker
>= '0' && *Walker
<= '9') ||
68 (*Walker
>= 'a' && *Walker
<= 'f') ||
69 (*Walker
>= 'A' && *Walker
<= 'F')
73 if (*Walker
== L
'-' && (((UINTN
)Walker
- (UINTN
)PrevWalker
) / sizeof (CHAR16
)) == mGuidDataLen
[Index
]) {
83 if ((((UINTN
)Walker
- (UINTN
)PrevWalker
) / sizeof (CHAR16
)) == mGuidDataLen
[Index
]) {
91 Convert a hex-character to decimal value.
93 This internal function only deal with Unicode character
94 which maps to a valid hexadecimal ASII character, i.e.
95 L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other
96 Unicode character, the value returned does not make sense.
98 @param[in] Char The character to convert.
100 @retval The numerical value converted.
107 if (Char
>= '0' && Char
<= '9') {
109 } else if (Char
>= 'a' && Char
<= 'f') {
110 return Char
- L
'a' + 10;
112 return Char
- L
'A' + 10;
117 Function try to convert a string to GUID format.
119 @param[in] String The string will be converted.
120 @param[out] Guid Save the result convert from string.
122 @retval EFI_SUCCESS The string was successfully converted to a GUID.
123 @retval EFI_UNSUPPORTED The input string is not in registry format.
127 IN CONST CHAR16
*String
,
131 CONST CHAR16
*Walker
;
135 if (String
== NULL
|| !IsValidGuidString (String
)) {
136 return EFI_UNSUPPORTED
;
142 Guid
->Data1
= (UINT32
)StrHexToUint64 (Walker
);
145 Guid
->Data2
= (UINT16
)StrHexToUint64 (Walker
);
148 Guid
->Data3
= (UINT16
)StrHexToUint64 (Walker
);
151 while (Walker
!= NULL
&& *Walker
!= CHAR_NULL
) {
152 if (*Walker
== L
'-') {
155 TempValue
= (UINT8
)HexCharToDecimal (*Walker
);
156 TempValue
= (UINT8
)LShiftU64 (TempValue
, 4);
159 TempValue
+= (UINT8
)HexCharToDecimal (*Walker
);
162 Guid
->Data4
[Index
] = TempValue
;
171 Get the name of a driver by it's handle.
173 If a name is found the memory must be callee freed.
175 @param[in] TheHandle The driver's handle.
176 @param[in] Language The language to use.
177 @param[in] NameFound Upon a successful return the name found.
179 @retval EFI_SUCCESS The name was found.
183 IN EFI_HANDLE TheHandle
,
184 IN CONST CHAR8
*Language
,
185 IN CHAR16
**NameFound
190 EFI_COMPONENT_NAME2_PROTOCOL
*CompName2
;
191 CHAR16
*NameToReturn
;
193 // Go through those handles until we get one that passes for GetComponentName
195 Status
= gBS
->OpenProtocol(
197 &gEfiComponentName2ProtocolGuid
,
201 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
202 if (EFI_ERROR(Status
)) {
203 Status
= gBS
->OpenProtocol(
205 &gEfiComponentNameProtocolGuid
,
209 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
212 if (EFI_ERROR(Status
)) {
213 return (EFI_NOT_FOUND
);
215 Lang
= GetBestLanguageForDriver (CompName2
->SupportedLanguages
, Language
, FALSE
);
216 Status
= CompName2
->GetDriverName(CompName2
, Lang
, &NameToReturn
);
219 if (!EFI_ERROR(Status
) && NameToReturn
!= NULL
) {
221 StrnCatGrow(NameFound
, NULL
, NameToReturn
, 0);
227 Discover if a protocol guid is one of the UEFI Driver Model Protocols.
229 @param[in] Guid The guid to test.
231 @retval TRUE The guid does represent a driver model protocol.
232 @retval FALSE The guid does not represent a driver model protocol.
236 IN CONST EFI_GUID
*Guid
239 CONST EFI_GUID
**GuidWalker
;
242 for (GuidWalker
= UefiDriverModelProtocolsGuidArray
243 ; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
246 if (CompareGuid(*GuidWalker
, Guid
)) {
255 Get information for a handle.
257 @param[in] TheHandle The handles to show info on.
258 @param[in] Language Language string per UEFI specification.
259 @param[in] Separator Separator string between information blocks.
260 @param[in] Verbose TRUE for extra info, FALSE otherwise.
261 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.
263 @retval SHELL_SUCCESS The operation was successful.
264 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
267 GetProtocolInfoString(
268 IN CONST EFI_HANDLE TheHandle
,
269 IN CONST CHAR8
*Language
,
270 IN CONST CHAR16
*Separator
,
271 IN CONST BOOLEAN Verbose
,
272 IN CONST BOOLEAN ExtraInfo
275 EFI_GUID
**ProtocolGuidArray
;
284 CHAR16 InstanceStr
[17];
286 ProtocolGuidArray
= NULL
;
290 Status
= gBS
->ProtocolsPerHandle (
295 if (!EFI_ERROR (Status
)) {
296 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
297 Temp
= GetStringNameFromGuid(ProtocolGuidArray
[ProtocolIndex
], Language
);
298 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
300 StrnCatGrow(&RetVal
, &Size
, Separator
, 0);
302 StrnCatGrow(&RetVal
, &Size
, L
"%H", 0);
304 UnicodeSPrint (GuidStr
, sizeof (GuidStr
), L
"%g", ProtocolGuidArray
[ProtocolIndex
]);
305 StrnCatGrow (&RetVal
, &Size
, GuidStr
, 0);
307 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
310 StrnCatGrow(&RetVal
, &Size
, L
"%N", 0);
313 Status
= gBS
->HandleProtocol (TheHandle
, ProtocolGuidArray
[ProtocolIndex
], &Instance
);
314 if (!EFI_ERROR (Status
)) {
315 StrnCatGrow (&RetVal
, &Size
, L
"(%H", 0);
316 UnicodeSPrint (InstanceStr
, sizeof (InstanceStr
), L
"%x", Instance
);
317 StrnCatGrow (&RetVal
, &Size
, InstanceStr
, 0);
318 StrnCatGrow (&RetVal
, &Size
, L
"%N)", 0);
323 Temp
= GetProtocolInformationDump(TheHandle
, ProtocolGuidArray
[ProtocolIndex
], Verbose
);
325 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
327 StrnCatGrow(&RetVal
, &Size
, L
"(", 0);
328 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
329 StrnCatGrow(&RetVal
, &Size
, L
")", 0);
331 StrnCatGrow(&RetVal
, &Size
, Separator
, 0);
332 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
340 SHELL_FREE_NON_NULL(ProtocolGuidArray
);
342 if (RetVal
== NULL
) {
346 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
347 StrnCatGrow(&RetVal
, &Size
, Separator
, 0);
352 Gets the name of the loaded image.
354 @param[in] TheHandle The handle of the driver to get info on.
355 @param[out] Name The pointer to the pointer. Valid upon a successful return.
357 @retval EFI_SUCCESS The operation was successful.
361 IN EFI_HANDLE TheHandle
,
365 // get loaded image and devicepathtotext on image->Filepath
366 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
368 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
370 if (TheHandle
== NULL
|| Name
== NULL
) {
371 return (EFI_INVALID_PARAMETER
);
374 Status
= gBS
->OpenProtocol (
376 &gEfiLoadedImageProtocolGuid
,
377 (VOID
**) &LoadedImage
,
380 EFI_OPEN_PROTOCOL_GET_PROTOCOL
382 if (EFI_ERROR(Status
)) {
385 DevicePath
= LoadedImage
->FilePath
;
386 *Name
= ConvertDevicePathToText(DevicePath
, TRUE
, TRUE
);
387 return (EFI_SUCCESS
);
391 Display driver model information for a given handle.
393 @param[in] Handle The handle to display info on.
394 @param[in] BestName Use the best name?
395 @param[in] Language The language to output in.
398 DisplayDriverModelHandle (
399 IN EFI_HANDLE Handle
,
401 IN CONST CHAR8
*Language OPTIONAL
405 BOOLEAN ConfigurationStatus
;
406 BOOLEAN DiagnosticsStatus
;
407 UINTN DriverBindingHandleCount
;
408 EFI_HANDLE
*DriverBindingHandleBuffer
;
409 UINTN ParentControllerHandleCount
;
410 EFI_HANDLE
*ParentControllerHandleBuffer
;
411 UINTN ChildControllerHandleCount
;
412 EFI_HANDLE
*ChildControllerHandleBuffer
;
413 CHAR16
*TempStringPointer
;
414 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
417 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
418 UINTN NumberOfChildren
;
420 UINTN ControllerHandleCount
;
421 EFI_HANDLE
*ControllerHandleBuffer
;
428 // See if Handle is a device handle and display its details.
430 DriverBindingHandleBuffer
= NULL
;
431 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
433 &DriverBindingHandleCount
,
434 &DriverBindingHandleBuffer
437 ParentControllerHandleBuffer
= NULL
;
438 Status
= PARSE_HANDLE_DATABASE_PARENTS (
440 &ParentControllerHandleCount
,
441 &ParentControllerHandleBuffer
444 ChildControllerHandleBuffer
= NULL
;
445 Status
= ParseHandleDatabaseForChildControllers (
447 &ChildControllerHandleCount
,
448 &ChildControllerHandleBuffer
451 DiagnosticsStatus
= FALSE
;
452 ConfigurationStatus
= FALSE
;
454 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
455 ConfigurationStatus
= TRUE
;
457 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
458 ConfigurationStatus
= TRUE
;
460 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
461 DiagnosticsStatus
= TRUE
;
463 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
464 DiagnosticsStatus
= TRUE
;
467 Status
= EFI_SUCCESS
;
469 if (DriverBindingHandleCount
> 0 || ParentControllerHandleCount
> 0 || ChildControllerHandleCount
> 0) {
474 TempStringPointer
= NULL
;
475 Status
= gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevicePath
);
477 Status
= gEfiShellProtocol
->GetDeviceName(Handle
, EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
478 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1
), gShellDriver1HiiHandle
, TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>");
479 SHELL_FREE_NON_NULL(TempStringPointer
);
481 TempStringPointer
= ConvertDevicePathToText(DevicePath
, TRUE
, FALSE
);
486 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2
),
487 gShellDriver1HiiHandle
,
488 TempStringPointer
!=NULL
?TempStringPointer
:L
"<None>",
489 ParentControllerHandleCount
== 0?L
"ROOT":(ChildControllerHandleCount
> 0)?L
"BUS":L
"DEVICE",
490 ConfigurationStatus
?L
"YES":L
"NO",
491 DiagnosticsStatus
?L
"YES":L
"NO"
494 SHELL_FREE_NON_NULL(TempStringPointer
);
496 if (DriverBindingHandleCount
== 0) {
501 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
502 gShellDriver1HiiHandle
,
510 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
511 gShellDriver1HiiHandle
,
514 for (Index
= 0; Index
< DriverBindingHandleCount
; Index
++) {
516 Status
= GetDriverName (
517 DriverBindingHandleBuffer
[Index
],
521 if (EFI_ERROR (Status
)) {
522 Status
= GetDriverImageName (
523 DriverBindingHandleBuffer
[Index
],
526 if (EFI_ERROR (Status
)) {
536 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A
),
537 gShellDriver1HiiHandle
,
538 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
539 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
546 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B
),
547 gShellDriver1HiiHandle
,
548 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
549 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
552 SHELL_FREE_NON_NULL(DriverName
);
556 if (ParentControllerHandleCount
== 0) {
561 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
562 gShellDriver1HiiHandle
,
570 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
571 gShellDriver1HiiHandle
,
574 for (Index
= 0; Index
< ParentControllerHandleCount
; Index
++) {
575 Status
= gEfiShellProtocol
->GetDeviceName(ParentControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
580 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B
),
581 gShellDriver1HiiHandle
,
582 ConvertHandleToHandleIndex (ParentControllerHandleBuffer
[Index
]),
583 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
585 SHELL_FREE_NON_NULL(TempStringPointer
);
589 if (ChildControllerHandleCount
== 0) {
594 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
595 gShellDriver1HiiHandle
,
603 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
604 gShellDriver1HiiHandle
,
607 for (Index
= 0; Index
< ChildControllerHandleCount
; Index
++) {
608 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
613 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
614 gShellDriver1HiiHandle
,
615 ConvertHandleToHandleIndex (ChildControllerHandleBuffer
[Index
]),
616 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
618 SHELL_FREE_NON_NULL(TempStringPointer
);
623 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer
);
625 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer
);
627 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer
);
629 if (EFI_ERROR (Status
)) {
633 // See if Handle is a driver binding handle and display its details.
635 Status
= gBS
->OpenProtocol (
637 &gEfiDriverBindingProtocolGuid
,
638 (VOID
**) &DriverBinding
,
641 EFI_OPEN_PROTOCOL_GET_PROTOCOL
643 if (EFI_ERROR (Status
)) {
647 NumberOfChildren
= 0;
648 ControllerHandleBuffer
= NULL
;
649 Status
= PARSE_HANDLE_DATABASE_DEVICES (
651 &ControllerHandleCount
,
652 &ControllerHandleBuffer
654 if (ControllerHandleCount
> 0) {
655 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
656 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
658 ControllerHandleBuffer
[HandleIndex
],
659 &ChildControllerHandleCount
,
662 NumberOfChildren
+= ChildControllerHandleCount
;
666 Status
= GetDriverName (Handle
, Language
, &DriverName
);
667 if (EFI_ERROR (Status
)) {
675 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7
),
676 gShellDriver1HiiHandle
,
677 ConvertHandleToHandleIndex(Handle
),
678 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
680 SHELL_FREE_NON_NULL(DriverName
);
681 Status
= GetDriverImageName (
685 if (EFI_ERROR (Status
)) {
692 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B
),
693 gShellDriver1HiiHandle
,
694 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
696 SHELL_FREE_NON_NULL(DriverName
);
702 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8
),
703 gShellDriver1HiiHandle
,
704 DriverBinding
->Version
,
705 NumberOfChildren
> 0?L
"Bus":ControllerHandleCount
> 0?L
"Device":L
"<Unknown>",
706 ConfigurationStatus
?L
"YES":L
"NO",
707 DiagnosticsStatus
?L
"YES":L
"NO"
710 if (ControllerHandleCount
== 0) {
715 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9
),
716 gShellDriver1HiiHandle
,
724 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9
),
725 gShellDriver1HiiHandle
,
728 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
729 Status
= gEfiShellProtocol
->GetDeviceName(ControllerHandleBuffer
[HandleIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
735 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B
),
736 gShellDriver1HiiHandle
,
737 ConvertHandleToHandleIndex(ControllerHandleBuffer
[HandleIndex
]),
738 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
740 SHELL_FREE_NON_NULL(TempStringPointer
);
742 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
744 ControllerHandleBuffer
[HandleIndex
],
745 &ChildControllerHandleCount
,
746 &ChildControllerHandleBuffer
748 if (!EFI_ERROR (Status
)) {
749 for (ChildIndex
= 0; ChildIndex
< ChildControllerHandleCount
; ChildIndex
++) {
750 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[ChildIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
756 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6C
),
757 gShellDriver1HiiHandle
,
758 ConvertHandleToHandleIndex(ChildControllerHandleBuffer
[ChildIndex
]),
759 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
761 SHELL_FREE_NON_NULL(TempStringPointer
);
764 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer
);
768 SHELL_FREE_NON_NULL (ControllerHandleBuffer
);
775 Display information for a handle.
777 @param[in] TheHandle The handles to show info on.
778 @param[in] Verbose TRUE for extra info, FALSE otherwise.
779 @param[in] Sfo TRUE to output in standard format output (spec).
780 @param[in] Language Language string per UEFI specification.
781 @param[in] DriverInfo TRUE to show all info about the handle.
782 @param[in] Multiple TRUE indicates more than will be output,
783 FALSE for a single one.
787 IN CONST EFI_HANDLE TheHandle
,
788 IN CONST BOOLEAN Verbose
,
789 IN CONST BOOLEAN Sfo
,
790 IN CONST CHAR8
*Language
,
791 IN CONST BOOLEAN DriverInfo
,
792 IN CONST BOOLEAN Multiple
795 CHAR16
*ProtocolInfoString
;
797 ProtocolInfoString
= NULL
;
801 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
" ", Verbose
, TRUE
);
806 STRING_TOKEN (STR_DH_OUTPUT
),
807 gShellDriver1HiiHandle
,
808 ConvertHandleToHandleIndex(TheHandle
),
809 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
812 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, Verbose
? L
"\r\n" : L
" ", Verbose
, TRUE
);
818 STRING_TOKEN (STR_DH_OUTPUT_SINGLE
),
819 gShellDriver1HiiHandle
,
820 ConvertHandleToHandleIndex(TheHandle
),
822 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
829 STRING_TOKEN (STR_DH_OUTPUT_SINGLE_D
),
830 gShellDriver1HiiHandle
,
831 ConvertHandleToHandleIndex(TheHandle
),
832 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
838 DisplayDriverModelHandle ((EFI_HANDLE
)TheHandle
, TRUE
, Language
);
841 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
";", FALSE
, FALSE
);
846 STRING_TOKEN (STR_DH_OUTPUT_SFO
),
847 gShellDriver1HiiHandle
,
848 Multiple
?L
"HandlesInfo":L
"HandleInfo",
851 ConvertHandleToHandleIndex(TheHandle
),
853 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
857 if (ProtocolInfoString
!= NULL
) {
858 FreePool(ProtocolInfoString
);
863 Display information for all handles on a list.
865 @param[in] HandleList The NULL-terminated list of handles.
866 @param[in] Verbose TRUE for extra info, FALSE otherwise.
867 @param[in] Sfo TRUE to output in standard format output (spec).
868 @param[in] Language Language string per UEFI specification.
869 @param[in] DriverInfo TRUE to show all info about the handle.
871 @retval SHELL_SUCCESS The operation was successful.
872 @retval SHELL_ABORTED The operation was aborted.
876 IN CONST EFI_HANDLE
*HandleList
,
877 IN CONST BOOLEAN Verbose
,
878 IN CONST BOOLEAN Sfo
,
879 IN CONST CHAR8
*Language
,
880 IN CONST BOOLEAN DriverInfo
883 CONST EFI_HANDLE
*HandleWalker
;
884 SHELL_STATUS ShellStatus
;
886 ShellStatus
= SHELL_SUCCESS
;
887 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
; HandleWalker
++) {
888 DoDhByHandle (*HandleWalker
, Verbose
, Sfo
, Language
, DriverInfo
, TRUE
);
889 if (ShellGetExecutionBreakFlag ()) {
890 ShellStatus
= SHELL_ABORTED
;
894 return (ShellStatus
);
898 Display information for a GUID of protocol.
900 @param[in] Guid The pointer to the name of the protocol.
901 @param[in] Verbose TRUE for extra info, FALSE otherwise.
902 @param[in] Sfo TRUE to output in standard format output (spec).
903 @param[in] Language Language string per UEFI specification.
904 @param[in] DriverInfo TRUE to show all info about the handle.
906 @retval SHELL_SUCCESS The operation was successful.
907 @retval SHELL_NOT_FOUND The GUID was not found.
908 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
913 IN CONST BOOLEAN Verbose
,
914 IN CONST BOOLEAN Sfo
,
915 IN CONST CHAR8
*Language
,
916 IN CONST BOOLEAN DriverInfo
920 SHELL_STATUS ShellStatus
;
921 EFI_HANDLE
*HandleList
;
925 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER
), gShellDriver1HiiHandle
);
927 Name
= GetStringNameFromGuid (Guid
, NULL
);
929 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER
), gShellDriver1HiiHandle
, Guid
);
931 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER
), gShellDriver1HiiHandle
, Name
);
935 HandleList
= GetHandleListByProtocol(Guid
);
936 ShellStatus
= DoDhForHandleList(HandleList
, Verbose
, Sfo
, Language
, DriverInfo
);
937 SHELL_FREE_NON_NULL(HandleList
);
943 Function to determine use which method to print information.
944 If Protocol is NULL, The function will print all information.
946 @param[in] Protocol The pointer to the name or GUID of protocol or NULL.
947 @param[in] Verbose TRUE for extra info, FALSE otherwise.
948 @param[in] Sfo TRUE to output in standard format output (spec).
949 @param[in] Language Language string per UEFI specification.
950 @param[in] DriverInfo TRUE to show all info about the handle.
952 @retval SHELL_SUCCESS The operation was successful.
953 @retval SHELL_NOT_FOUND The protocol was not found.
954 @retval SHELL_INVALID_PARAMETER Protocol is invalid parameter.
958 IN CONST CHAR16
*Protocol
,
959 IN CONST BOOLEAN Verbose
,
960 IN CONST BOOLEAN Sfo
,
961 IN CONST CHAR8
*Language
,
962 IN CONST BOOLEAN DriverInfo
969 if (Protocol
== NULL
) {
970 return DoDhByProtocolGuid (NULL
, Verbose
, Sfo
, Language
, DriverInfo
);
972 Status
= ConvertStrToGuid (Protocol
, &Guid
);
973 if (!EFI_ERROR (Status
)) {
977 // Protocol is a Name, convert it to GUID
979 Status
= GetGuidFromStringName (Protocol
, Language
, &GuidPtr
);
980 if (EFI_ERROR(Status
)) {
981 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_NAME_FOUND
), gShellDriver1HiiHandle
, Protocol
);
982 return (SHELL_NOT_FOUND
);
986 return DoDhByProtocolGuid (GuidPtr
, Verbose
, Sfo
, Language
, DriverInfo
);
991 Function to display decode information by Protocol.
992 The parameter Protocol is either a GUID or the name of protocol.
993 If the parameter Protocol is NULL, the function will print all
996 @param[in] Protocol The pointer to the name or GUID of protocol.
997 @param[in] Language Language string per UEFI specification.
999 @retval SHELL_SUCCESS The operation was successful.
1000 @retval SHELL_OUT_OT_RESOURCES A memory allocation failed.
1004 IN CONST CHAR16
*Protocol
,
1005 IN CONST CHAR8
*Language
1015 if (Protocol
== NULL
) {
1017 Status
= GetAllMappingGuids (NULL
, &Counts
);
1018 if (Status
== EFI_BUFFER_TOO_SMALL
) {
1019 Guids
= AllocatePool (Counts
* sizeof(EFI_GUID
));
1020 if (Guids
== NULL
) {
1021 return SHELL_OUT_OF_RESOURCES
;
1024 Status
= GetAllMappingGuids (Guids
, &Counts
);
1025 if (Status
== EFI_SUCCESS
) {
1026 for (Index
= 0; Index
< Counts
; Index
++) {
1027 Name
= GetStringNameFromGuid (&Guids
[Index
], Language
);
1029 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DECODE
), gShellDriver1HiiHandle
, Name
, &Guids
[Index
]);
1031 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_GUID_FOUND
), gShellDriver1HiiHandle
, &Guids
[Index
]);
1033 SHELL_FREE_NON_NULL (Name
);
1039 if (ConvertStrToGuid (Protocol
, &Guid
) == EFI_SUCCESS
) {
1040 Name
= GetStringNameFromGuid (&Guid
, Language
);
1042 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DECODE
), gShellDriver1HiiHandle
, Name
, &Guid
);
1044 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_GUID_FOUND
), gShellDriver1HiiHandle
, &Guid
);
1046 SHELL_FREE_NON_NULL(Name
);
1048 Status
= GetGuidFromStringName (Protocol
, Language
, &Guids
);
1049 if (Status
== EFI_SUCCESS
) {
1050 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DECODE
), gShellDriver1HiiHandle
, Protocol
, Guids
);
1052 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_NAME_FOUND
), gShellDriver1HiiHandle
, Protocol
);
1057 return SHELL_SUCCESS
;
1061 Function for 'dh' command.
1063 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1064 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1069 IN EFI_HANDLE ImageHandle
,
1070 IN EFI_SYSTEM_TABLE
*SystemTable
1074 LIST_ENTRY
*Package
;
1075 CHAR16
*ProblemParam
;
1076 SHELL_STATUS ShellStatus
;
1079 CONST CHAR16
*RawValue
;
1080 CONST CHAR16
*ProtocolVal
;
1083 BOOLEAN VerboseFlag
;
1084 UINT64 Intermediate
;
1087 ShellStatus
= SHELL_SUCCESS
;
1088 Status
= EFI_SUCCESS
;
1092 // initialize the shell lib (we must be in non-auto-init...)
1094 Status
= ShellInitialize();
1095 ASSERT_EFI_ERROR(Status
);
1097 Status
= CommandInit();
1098 ASSERT_EFI_ERROR(Status
);
1101 // parse the command line
1103 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
1104 if (EFI_ERROR(Status
)) {
1105 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1106 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"dh", ProblemParam
);
1107 FreePool(ProblemParam
);
1108 ShellStatus
= SHELL_INVALID_PARAMETER
;
1113 if (ShellCommandLineGetCount(Package
) > 2) {
1114 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"dh");
1115 ShellCommandLineFreeVarList (Package
);
1116 return (SHELL_INVALID_PARAMETER
);
1119 if (ShellCommandLineGetFlag(Package
, L
"-l")) {
1120 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1122 Language
= AllocateZeroPool(StrSize(Lang
));
1123 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1125 ASSERT(Language
== NULL
);
1126 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN(STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"dh", L
"-l");
1127 ShellCommandLineFreeVarList(Package
);
1128 return (SHELL_INVALID_PARAMETER
);
1131 Language
= AllocateZeroPool(10);
1132 AsciiSPrint(Language
, 10, "en-us");
1135 SfoFlag
= ShellCommandLineGetFlag (Package
, L
"-sfo");
1136 DriverFlag
= ShellCommandLineGetFlag (Package
, L
"-d");
1137 VerboseFlag
= (BOOLEAN
)(ShellCommandLineGetFlag (Package
, L
"-v") || ShellCommandLineGetFlag (Package
, L
"-verbose"));
1138 RawValue
= ShellCommandLineGetRawValue (Package
, 1);
1139 ProtocolVal
= ShellCommandLineGetValue (Package
, L
"-p");
1141 if (RawValue
== NULL
) {
1142 if (ShellCommandLineGetFlag (Package
, L
"-p") && (ProtocolVal
== NULL
)) {
1143 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"dh", L
"-p");
1144 ShellStatus
= SHELL_INVALID_PARAMETER
;
1147 // Print information by protocol, The ProtocolVal maybe is name or GUID or NULL.
1149 ShellStatus
= DoDhByProtocol (ProtocolVal
, VerboseFlag
, SfoFlag
, Language
, DriverFlag
);
1151 } else if ((RawValue
!= NULL
) &&
1152 (gUnicodeCollation
->StriColl(gUnicodeCollation
, L
"decode", (CHAR16
*) RawValue
) == 0)) {
1153 if (ShellCommandLineGetFlag (Package
, L
"-p") && (ProtocolVal
== NULL
)) {
1154 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"dh", L
"-p");
1155 ShellStatus
= SHELL_INVALID_PARAMETER
;
1158 // Print decode informatino by protocol.
1160 ShellStatus
= DoDecodeByProtocol (ProtocolVal
, Language
);
1163 if (ShellCommandLineGetFlag (Package
, L
"-p")) {
1164 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"dh");
1165 ShellStatus
= SHELL_INVALID_PARAMETER
;
1167 Status
= ShellConvertStringToUint64 (RawValue
, &Intermediate
, TRUE
, FALSE
);
1168 if (EFI_ERROR(Status
)) {
1169 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"dh", RawValue
);
1170 ShellStatus
= SHELL_INVALID_PARAMETER
;
1172 Handle
= ConvertHandleIndexToHandle ((UINTN
) Intermediate
);
1173 if (Handle
== NULL
) {
1174 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"dh", RawValue
);
1175 ShellStatus
= SHELL_INVALID_PARAMETER
;
1178 // Print information by handle.
1180 DoDhByHandle (Handle
, VerboseFlag
, SfoFlag
, Language
, DriverFlag
, FALSE
);
1186 ShellCommandLineFreeVarList (Package
);
1187 SHELL_FREE_NON_NULL(Language
);
1190 return (ShellStatus
);