2 Main file for Dh shell Driver1 function.
4 (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "UefiShellDriver1CommandsLib.h"
18 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
22 {L
"-verbose", TypeFlag
},
28 STATIC CONST EFI_GUID
*UefiDriverModelProtocolsGuidArray
[] = {
29 &gEfiDriverBindingProtocolGuid
,
30 &gEfiPlatformDriverOverrideProtocolGuid
,
31 &gEfiBusSpecificDriverOverrideProtocolGuid
,
32 &gEfiDriverDiagnosticsProtocolGuid
,
33 &gEfiDriverDiagnostics2ProtocolGuid
,
34 &gEfiComponentNameProtocolGuid
,
35 &gEfiComponentName2ProtocolGuid
,
36 &gEfiPlatformToDriverConfigurationProtocolGuid
,
37 &gEfiDriverSupportedEfiVersionProtocolGuid
,
38 &gEfiDriverFamilyOverrideProtocolGuid
,
39 &gEfiDriverHealthProtocolGuid
,
40 &gEfiLoadedImageProtocolGuid
,
45 Get the name of a driver by it's handle.
47 If a name is found the memory must be callee freed.
49 @param[in] TheHandle The driver's handle.
50 @param[in] Language The language to use.
51 @param[in] NameFound Upon a successful return the name found.
53 @retval EFI_SUCCESS The name was found.
57 IN EFI_HANDLE TheHandle
,
58 IN CONST CHAR8
*Language
,
64 EFI_COMPONENT_NAME2_PROTOCOL
*CompName2
;
67 // Go through those handles until we get one that passes for GetComponentName
69 Status
= gBS
->OpenProtocol(
71 &gEfiComponentName2ProtocolGuid
,
75 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
76 if (EFI_ERROR(Status
)) {
77 Status
= gBS
->OpenProtocol(
79 &gEfiComponentNameProtocolGuid
,
83 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
86 if (EFI_ERROR(Status
)) {
87 return (EFI_NOT_FOUND
);
89 Lang
= GetBestLanguageForDriver (CompName2
->SupportedLanguages
, Language
, FALSE
);
90 Status
= CompName2
->GetDriverName(CompName2
, Lang
, &NameToReturn
);
93 if (!EFI_ERROR(Status
) && NameToReturn
!= NULL
) {
95 StrnCatGrow(NameFound
, NULL
, NameToReturn
, 0);
101 Discover if a protocol guid is one of the UEFI Driver Model Protocols.
103 @param[in] Guid The guid to test.
105 @retval TRUE The guid does represent a driver model protocol.
106 @retval FALSE The guid does not represent a driver model protocol.
110 IN CONST EFI_GUID
*Guid
113 CONST EFI_GUID
**GuidWalker
;
116 for (GuidWalker
= UefiDriverModelProtocolsGuidArray
117 ; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
120 if (CompareGuid(*GuidWalker
, Guid
)) {
129 Get information for a handle.
131 @param[in] TheHandle The handles to show info on.
132 @param[in] Language Language string per UEFI specification.
133 @param[in] Separator Separator string between information blocks.
134 @param[in] Verbose TRUE for extra info, FALSE otherwise.
135 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.
137 @retval SHELL_SUCCESS The operation was successful.
138 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
141 GetProtocolInfoString(
142 IN CONST EFI_HANDLE TheHandle
,
143 IN CONST CHAR8
*Language
,
144 IN CONST CHAR16
*Separator
,
145 IN CONST BOOLEAN Verbose
,
146 IN CONST BOOLEAN ExtraInfo
149 EFI_GUID
**ProtocolGuidArray
;
157 ProtocolGuidArray
= NULL
;
161 Status
= gBS
->ProtocolsPerHandle (
166 if (!EFI_ERROR (Status
)) {
167 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
168 Temp
= GetStringNameFromGuid(ProtocolGuidArray
[ProtocolIndex
], Language
);
170 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
172 StrnCatGrow(&RetVal
, &Size
, Separator
, 0);
174 StrnCatGrow(&RetVal
, &Size
, L
"%H", 0);
175 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
176 StrnCatGrow(&RetVal
, &Size
, L
"%N", 0);
180 Temp
= GetProtocolInformationDump(TheHandle
, ProtocolGuidArray
[ProtocolIndex
], Verbose
);
182 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
184 StrnCatGrow(&RetVal
, &Size
, L
"(", 0);
185 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
186 StrnCatGrow(&RetVal
, &Size
, L
")\r\n", 0);
188 StrnCatGrow(&RetVal
, &Size
, Separator
, 0);
189 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
197 SHELL_FREE_NON_NULL(ProtocolGuidArray
);
199 if (RetVal
== NULL
) {
203 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
204 StrnCatGrow(&RetVal
, &Size
, Separator
, 0);
209 Gets the name of the loaded image.
211 @param[in] TheHandle The handle of the driver to get info on.
212 @param[out] Name The pointer to the pointer. Valid upon a successful return.
214 @retval EFI_SUCCESS The operation was successful.
218 IN EFI_HANDLE TheHandle
,
222 // get loaded image and devicepathtotext on image->Filepath
223 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
225 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
227 if (TheHandle
== NULL
|| Name
== NULL
) {
228 return (EFI_INVALID_PARAMETER
);
231 Status
= gBS
->OpenProtocol (
233 &gEfiLoadedImageProtocolGuid
,
234 (VOID
**) &LoadedImage
,
237 EFI_OPEN_PROTOCOL_GET_PROTOCOL
239 if (EFI_ERROR(Status
)) {
242 DevicePath
= LoadedImage
->FilePath
;
243 *Name
= ConvertDevicePathToText(DevicePath
, TRUE
, TRUE
);
244 return (EFI_SUCCESS
);
248 Display driver model information for a given handle.
250 @param[in] Handle The handle to display info on.
251 @param[in] BestName Use the best name?
252 @param[in] Language The language to output in.
255 DisplayDriverModelHandle (
256 IN EFI_HANDLE Handle
,
258 IN CONST CHAR8
*Language OPTIONAL
262 BOOLEAN ConfigurationStatus
;
263 BOOLEAN DiagnosticsStatus
;
264 UINTN DriverBindingHandleCount
;
265 EFI_HANDLE
*DriverBindingHandleBuffer
;
266 UINTN ParentControllerHandleCount
;
267 EFI_HANDLE
*ParentControllerHandleBuffer
;
268 UINTN ChildControllerHandleCount
;
269 EFI_HANDLE
*ChildControllerHandleBuffer
;
270 CHAR16
*TempStringPointer
;
271 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
274 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
275 UINTN NumberOfChildren
;
277 UINTN ControllerHandleCount
;
278 EFI_HANDLE
*ControllerHandleBuffer
;
285 // See if Handle is a device handle and display its details.
287 DriverBindingHandleBuffer
= NULL
;
288 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
290 &DriverBindingHandleCount
,
291 &DriverBindingHandleBuffer
294 ParentControllerHandleBuffer
= NULL
;
295 Status
= PARSE_HANDLE_DATABASE_PARENTS (
297 &ParentControllerHandleCount
,
298 &ParentControllerHandleBuffer
301 ChildControllerHandleBuffer
= NULL
;
302 Status
= ParseHandleDatabaseForChildControllers (
304 &ChildControllerHandleCount
,
305 &ChildControllerHandleBuffer
308 DiagnosticsStatus
= FALSE
;
309 ConfigurationStatus
= FALSE
;
311 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
312 ConfigurationStatus
= TRUE
;
314 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
315 ConfigurationStatus
= TRUE
;
317 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
318 DiagnosticsStatus
= TRUE
;
320 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
321 DiagnosticsStatus
= TRUE
;
324 Status
= EFI_SUCCESS
;
326 if (DriverBindingHandleCount
> 0 || ParentControllerHandleCount
> 0 || ChildControllerHandleCount
> 0) {
331 TempStringPointer
= NULL
;
332 Status
= gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevicePath
);
334 Status
= gEfiShellProtocol
->GetDeviceName(Handle
, EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
335 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1
), gShellDriver1HiiHandle
, TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>");
336 SHELL_FREE_NON_NULL(TempStringPointer
);
338 TempStringPointer
= ConvertDevicePathToText(DevicePath
, TRUE
, FALSE
);
343 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2
),
344 gShellDriver1HiiHandle
,
345 TempStringPointer
!=NULL
?TempStringPointer
:L
"<None>",
346 ParentControllerHandleCount
== 0?L
"ROOT":(ChildControllerHandleCount
> 0)?L
"BUS":L
"DEVICE",
347 ConfigurationStatus
?L
"YES":L
"NO",
348 DiagnosticsStatus
?L
"YES":L
"NO"
351 SHELL_FREE_NON_NULL(TempStringPointer
);
353 if (DriverBindingHandleCount
== 0) {
358 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
359 gShellDriver1HiiHandle
,
367 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
368 gShellDriver1HiiHandle
,
371 for (Index
= 0; Index
< DriverBindingHandleCount
; Index
++) {
373 Status
= GetDriverName (
374 DriverBindingHandleBuffer
[Index
],
378 if (EFI_ERROR (Status
)) {
379 Status
= GetDriverImageName (
380 DriverBindingHandleBuffer
[Index
],
383 if (EFI_ERROR (Status
)) {
393 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A
),
394 gShellDriver1HiiHandle
,
395 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
396 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
403 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B
),
404 gShellDriver1HiiHandle
,
405 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
406 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
409 SHELL_FREE_NON_NULL(DriverName
);
413 if (ParentControllerHandleCount
== 0) {
418 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
419 gShellDriver1HiiHandle
,
427 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
428 gShellDriver1HiiHandle
,
431 for (Index
= 0; Index
< ParentControllerHandleCount
; Index
++) {
432 Status
= gEfiShellProtocol
->GetDeviceName(ParentControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
437 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B
),
438 gShellDriver1HiiHandle
,
439 ConvertHandleToHandleIndex (ParentControllerHandleBuffer
[Index
]),
440 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
442 SHELL_FREE_NON_NULL(TempStringPointer
);
446 if (ChildControllerHandleCount
== 0) {
451 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
452 gShellDriver1HiiHandle
,
460 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
461 gShellDriver1HiiHandle
,
464 for (Index
= 0; Index
< ChildControllerHandleCount
; Index
++) {
465 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
470 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
471 gShellDriver1HiiHandle
,
472 ConvertHandleToHandleIndex (ChildControllerHandleBuffer
[Index
]),
473 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
475 SHELL_FREE_NON_NULL(TempStringPointer
);
480 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer
);
482 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer
);
484 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer
);
486 if (EFI_ERROR (Status
)) {
490 // See if Handle is a driver binding handle and display its details.
492 Status
= gBS
->OpenProtocol (
494 &gEfiDriverBindingProtocolGuid
,
495 (VOID
**) &DriverBinding
,
498 EFI_OPEN_PROTOCOL_GET_PROTOCOL
500 if (EFI_ERROR (Status
)) {
504 NumberOfChildren
= 0;
505 ControllerHandleBuffer
= NULL
;
506 Status
= PARSE_HANDLE_DATABASE_DEVICES (
508 &ControllerHandleCount
,
509 &ControllerHandleBuffer
511 if (ControllerHandleCount
> 0) {
512 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
513 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
515 ControllerHandleBuffer
[HandleIndex
],
516 &ChildControllerHandleCount
,
519 NumberOfChildren
+= ChildControllerHandleCount
;
523 Status
= GetDriverName (Handle
, Language
, &DriverName
);
524 if (EFI_ERROR (Status
)) {
532 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
533 gShellDriver1HiiHandle
,
534 ConvertHandleToHandleIndex(Handle
),
535 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
537 SHELL_FREE_NON_NULL(DriverName
);
538 Status
= GetDriverImageName (
542 if (EFI_ERROR (Status
)) {
549 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B
),
550 gShellDriver1HiiHandle
,
551 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
553 SHELL_FREE_NON_NULL(DriverName
);
559 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8
),
560 gShellDriver1HiiHandle
,
561 DriverBinding
->Version
,
562 NumberOfChildren
> 0?L
"Bus":ControllerHandleCount
> 0?L
"Device":L
"<Unknown>",
563 ConfigurationStatus
?L
"YES":L
"NO",
564 DiagnosticsStatus
?L
"YES":L
"NO"
567 if (ControllerHandleCount
== 0) {
572 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
573 gShellDriver1HiiHandle
,
581 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
582 gShellDriver1HiiHandle
,
585 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
586 Status
= gEfiShellProtocol
->GetDeviceName(ControllerHandleBuffer
[HandleIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
592 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B
),
593 gShellDriver1HiiHandle
,
594 ConvertHandleToHandleIndex(ControllerHandleBuffer
[HandleIndex
]),
595 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
597 SHELL_FREE_NON_NULL(TempStringPointer
);
599 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
601 ControllerHandleBuffer
[HandleIndex
],
602 &ChildControllerHandleCount
,
603 &ChildControllerHandleBuffer
605 if (!EFI_ERROR (Status
)) {
606 for (ChildIndex
= 0; ChildIndex
< ChildControllerHandleCount
; ChildIndex
++) {
607 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[ChildIndex
], 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
[ChildIndex
]),
616 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
618 SHELL_FREE_NON_NULL(TempStringPointer
);
621 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer
);
625 SHELL_FREE_NON_NULL (ControllerHandleBuffer
);
632 Display information for a handle.
634 @param[in] TheHandle The handles to show info on.
635 @param[in] Verbose TRUE for extra info, FALSE otherwise.
636 @param[in] Sfo TRUE to output in standard format output (spec).
637 @param[in] Language Language string per UEFI specification.
638 @param[in] DriverInfo TRUE to show all info about the handle.
639 @param[in] Multiple TRUE indicates more than will be output,
640 FALSE for a single one.
642 @retval SHELL_SUCCESS The operation was successful.
643 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
647 IN CONST EFI_HANDLE TheHandle
,
648 IN CONST BOOLEAN Verbose
,
649 IN CONST BOOLEAN Sfo
,
650 IN CONST CHAR8
*Language
,
651 IN CONST BOOLEAN DriverInfo
,
652 IN CONST BOOLEAN Multiple
655 CHAR16
*ProtocolInfoString
;
656 SHELL_STATUS ShellStatus
;
658 ShellStatus
= SHELL_SUCCESS
;
659 ProtocolInfoString
= NULL
;
663 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
" ", Verbose
, TRUE
);
668 STRING_TOKEN (STR_DH_OUTPUT
),
669 gShellDriver1HiiHandle
,
670 ConvertHandleToHandleIndex(TheHandle
),
671 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
673 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
"\r\n", Verbose
, TRUE
);
678 STRING_TOKEN (STR_DH_OUTPUT_SINGLE
),
679 gShellDriver1HiiHandle
,
680 ConvertHandleToHandleIndex(TheHandle
),
682 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
686 DisplayDriverModelHandle ((EFI_HANDLE
)TheHandle
, TRUE
, Language
);
689 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
";", FALSE
, FALSE
);
694 STRING_TOKEN (STR_DH_OUTPUT_SFO
),
695 gShellDriver1HiiHandle
,
696 Multiple
?L
"HandlesInfo":L
"HandleInfo",
699 ConvertHandleToHandleIndex(TheHandle
),
701 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
707 if (ProtocolInfoString
!= NULL
) {
708 FreePool(ProtocolInfoString
);
710 return (ShellStatus
);
714 Display information for all handles on a list.
716 @param[in] HandleList The NULL-terminated list of handles.
717 @param[in] Verbose TRUE for extra info, FALSE otherwise.
718 @param[in] Sfo TRUE to output in standard format output (spec).
719 @param[in] Language Language string per UEFI specification.
720 @param[in] DriverInfo TRUE to show all info about the handle.
722 @retval SHELL_SUCCESS The operation was successful.
723 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
727 IN CONST EFI_HANDLE
*HandleList
,
728 IN CONST BOOLEAN Verbose
,
729 IN CONST BOOLEAN Sfo
,
730 IN CONST CHAR8
*Language
,
731 IN CONST BOOLEAN DriverInfo
734 CONST EFI_HANDLE
*HandleWalker
;
735 SHELL_STATUS ShellStatus
;
737 ShellStatus
= SHELL_SUCCESS
;
739 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
&& ShellStatus
== SHELL_SUCCESS
; HandleWalker
++) {
740 ShellStatus
= DoDhByHandle(
748 if (ShellGetExecutionBreakFlag ()) {
749 ShellStatus
= SHELL_ABORTED
;
753 return (ShellStatus
);
757 Display information for all handles.
759 @param[in] Sfo TRUE to output in standard format output (spec).
760 @param[in] Verbose TRUE for extra info, FALSE otherwise.
761 @param[in] Language Language string per UEFI specification.
762 @param[in] DriverInfo TRUE to show all info about the handle.
764 @retval SHELL_SUCCESS The operation was successful.
765 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
769 IN CONST BOOLEAN Sfo
,
770 IN CONST BOOLEAN Verbose
,
771 IN CONST CHAR8
*Language
,
772 IN CONST BOOLEAN DriverInfo
775 EFI_HANDLE
*HandleList
;
776 SHELL_STATUS ShellStatus
;
778 HandleList
= GetHandleListByProtocol(NULL
);
780 ShellStatus
= DoDhForHandleList(
787 FreePool(HandleList
);
789 return (ShellStatus
);
793 Display information for all handles which have a specific protocol.
795 @param[in] ProtocolName The pointer to the name of the protocol.
796 @param[in] Verbose TRUE for extra info, FALSE otherwise.
797 @param[in] Sfo TRUE to output in standard format output (spec).
798 @param[in] Language Language string per UEFI specification.
799 @param[in] DriverInfo TRUE to show all info about the handle.
801 @retval SHELL_SUCCESS The operation was successful.
802 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
806 IN CONST CHAR16
*ProtocolName
,
807 IN CONST BOOLEAN Verbose
,
808 IN CONST BOOLEAN Sfo
,
809 IN CONST CHAR8
*Language
,
810 IN CONST BOOLEAN DriverInfo
815 EFI_HANDLE
*HandleList
;
816 SHELL_STATUS ShellStatus
;
818 if (ProtocolName
== NULL
) {
819 return (SHELL_INVALID_PARAMETER
);
822 Status
= GetGuidFromStringName(ProtocolName
, Language
, &Guid
);
823 if (EFI_ERROR(Status
)) {
824 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_GUID_FOUND
), gShellDriver1HiiHandle
, ProtocolName
);
825 return (SHELL_INVALID_PARAMETER
);
828 HandleList
= GetHandleListByProtocol(Guid
);
830 ShellStatus
= DoDhForHandleList(
837 SHELL_FREE_NON_NULL(HandleList
);
839 return (ShellStatus
);
843 Function for 'dh' command.
845 @param[in] ImageHandle Handle to the Image (NULL if Internal).
846 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
851 IN EFI_HANDLE ImageHandle
,
852 IN EFI_SYSTEM_TABLE
*SystemTable
857 CHAR16
*ProblemParam
;
858 SHELL_STATUS ShellStatus
;
867 ShellStatus
= SHELL_SUCCESS
;
868 Status
= EFI_SUCCESS
;
872 // initialize the shell lib (we must be in non-auto-init...)
874 Status
= ShellInitialize();
875 ASSERT_EFI_ERROR(Status
);
877 Status
= CommandInit();
878 ASSERT_EFI_ERROR(Status
);
881 // parse the command line
883 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
884 if (EFI_ERROR(Status
)) {
885 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
886 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"dh", ProblemParam
);
887 FreePool(ProblemParam
);
888 ShellStatus
= SHELL_INVALID_PARAMETER
;
893 if (ShellCommandLineGetCount(Package
) > 2) {
894 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"dh");
895 ShellCommandLineFreeVarList (Package
);
896 return (SHELL_INVALID_PARAMETER
);
899 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
901 Language
= AllocateZeroPool(StrSize(Lang
));
902 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
903 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
904 Language
= AllocateZeroPool(10);
905 AsciiSPrint(Language
, 10, "en-us");
907 ASSERT(Language
== NULL
);
908 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"dh", L
"-l");
909 ShellCommandLineFreeVarList (Package
);
910 return (SHELL_INVALID_PARAMETER
);
913 SfoMode
= ShellCommandLineGetFlag(Package
, L
"-sfo");
914 FlagD
= ShellCommandLineGetFlag(Package
, L
"-d");
915 Verbose
= (BOOLEAN
)(ShellCommandLineGetFlag(Package
, L
"-v") || ShellCommandLineGetFlag(Package
, L
"-verbose"));
917 if (ShellCommandLineGetFlag(Package
, L
"-p")) {
918 if (ShellCommandLineGetCount(Package
) > 1) {
919 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"dh");
920 ShellStatus
= SHELL_INVALID_PARAMETER
;
921 } else if (ShellCommandLineGetValue(Package
, L
"-p") == NULL
) {
922 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"dh", L
"-p");
923 ShellStatus
= SHELL_INVALID_PARAMETER
;
928 ShellStatus
= DoDhByProtocol(
929 ShellCommandLineGetValue(Package
, L
"-p"),
932 Lang
==NULL
?NULL
:Language
,
937 Temp2
= ShellCommandLineGetRawValue(Package
, 1);
942 ShellStatus
= DoDhForAll(
945 Lang
==NULL
?NULL
:Language
,
949 Status
= ShellConvertStringToUint64(Temp2
, &Intermediate
, TRUE
, FALSE
);
950 if (EFI_ERROR(Status
) || ConvertHandleIndexToHandle((UINTN
)Intermediate
) == NULL
) {
951 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"dh", Temp2
);
952 ShellStatus
= SHELL_INVALID_PARAMETER
;
957 ShellStatus
= DoDhByHandle(
958 ConvertHandleIndexToHandle((UINTN
)Intermediate
),
961 Lang
==NULL
?NULL
:Language
,
970 ShellCommandLineFreeVarList (Package
);
971 SHELL_FREE_NON_NULL(Language
);
974 return (ShellStatus
);