2 Main file for Dh shell Driver1 function.
4 Copyright (c) 2014, 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.
58 IN EFI_HANDLE TheHandle
,
59 IN CONST CHAR8
*Language
,
65 EFI_COMPONENT_NAME2_PROTOCOL
*CompName2
;
68 // Go through those handles until we get one that passes for GetComponentName
70 Status
= gBS
->OpenProtocol(
72 &gEfiComponentName2ProtocolGuid
,
76 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
77 if (EFI_ERROR(Status
)) {
78 Status
= gBS
->OpenProtocol(
80 &gEfiComponentNameProtocolGuid
,
84 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
87 if (EFI_ERROR(Status
)) {
88 return (EFI_NOT_FOUND
);
90 Lang
= GetBestLanguageForDriver (CompName2
->SupportedLanguages
, Language
, FALSE
);
91 Status
= CompName2
->GetDriverName(CompName2
, Lang
, &NameToReturn
);
94 if (!EFI_ERROR(Status
) && NameToReturn
!= NULL
) {
96 StrnCatGrow(NameFound
, NULL
, NameToReturn
, 0);
102 Discover if a protocol guid is one of the UEFI Driver Model Protocols.
104 @param[in] Guid The guid to test.
106 @retval TRUE The guid does represent a driver model protocol.
107 @retval FALSE The guid does not represent a driver model protocol.
112 IN CONST EFI_GUID
*Guid
115 CONST EFI_GUID
**GuidWalker
;
118 for (GuidWalker
= UefiDriverModelProtocolsGuidArray
119 ; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
122 if (CompareGuid(*GuidWalker
, Guid
)) {
131 Get information for a handle.
133 @param[in] TheHandle The handles to show info on.
134 @param[in] Language Language string per UEFI specification.
135 @param[in] Seperator Separator string between information blocks.
136 @param[in] Verbose TRUE for extra info, FALSE otherwise.
137 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.
139 @retval SHELL_SUCCESS The operation was successful.
140 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
144 GetProtocolInfoString(
145 IN CONST EFI_HANDLE TheHandle
,
146 IN CONST CHAR8
*Language
,
147 IN CONST CHAR16
*Seperator
,
148 IN CONST BOOLEAN Verbose
,
149 IN CONST BOOLEAN ExtraInfo
152 EFI_GUID
**ProtocolGuidArray
;
160 ProtocolGuidArray
= NULL
;
164 Status
= gBS
->ProtocolsPerHandle (
169 if (!EFI_ERROR (Status
)) {
170 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
171 Temp
= GetStringNameFromGuid(ProtocolGuidArray
[ProtocolIndex
], Language
);
173 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
175 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
177 StrnCatGrow(&RetVal
, &Size
, L
"%H", 0);
178 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
179 StrnCatGrow(&RetVal
, &Size
, L
"%N", 0);
183 Temp
= GetProtocolInformationDump(TheHandle
, ProtocolGuidArray
[ProtocolIndex
], Verbose
);
185 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
187 StrnCatGrow(&RetVal
, &Size
, L
"(", 0);
188 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
189 StrnCatGrow(&RetVal
, &Size
, L
")\r\n", 0);
191 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
192 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
200 SHELL_FREE_NON_NULL(ProtocolGuidArray
);
202 if (RetVal
== NULL
) {
206 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
207 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
212 Gets the name of the loaded image.
214 @param[in] TheHandle The handle of the driver to get info on.
215 @param[out] Name The pointer to the pointer. Valid upon a successful return.
217 @retval EFI_SUCCESS The operation was successful.
222 IN EFI_HANDLE TheHandle
,
226 // get loaded image and devicepathtotext on image->Filepath
227 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
229 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
231 if (TheHandle
== NULL
|| Name
== NULL
) {
232 return (EFI_INVALID_PARAMETER
);
235 Status
= gBS
->OpenProtocol (
237 &gEfiLoadedImageProtocolGuid
,
238 (VOID
**) &LoadedImage
,
241 EFI_OPEN_PROTOCOL_GET_PROTOCOL
243 if (EFI_ERROR(Status
)) {
246 DevicePath
= LoadedImage
->FilePath
;
247 *Name
= ConvertDevicePathToText(DevicePath
, TRUE
, TRUE
);
248 return (EFI_SUCCESS
);
252 Display driver model information for a given handle.
254 @param[in] Handle The handle to display info on.
255 @param[in] BestName Use the best name?
256 @param[in] Language The language to output in.
260 DisplayDriverModelHandle (
261 IN EFI_HANDLE Handle
,
263 IN CONST CHAR8
*Language OPTIONAL
267 BOOLEAN ConfigurationStatus
;
268 BOOLEAN DiagnosticsStatus
;
269 UINTN DriverBindingHandleCount
;
270 EFI_HANDLE
*DriverBindingHandleBuffer
;
271 UINTN ParentControllerHandleCount
;
272 EFI_HANDLE
*ParentControllerHandleBuffer
;
273 UINTN ChildControllerHandleCount
;
274 EFI_HANDLE
*ChildControllerHandleBuffer
;
275 CHAR16
*TempStringPointer
;
276 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
279 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
280 UINTN NumberOfChildren
;
282 UINTN ControllerHandleCount
;
283 EFI_HANDLE
*ControllerHandleBuffer
;
290 // See if Handle is a device handle and display its details.
292 DriverBindingHandleBuffer
= NULL
;
293 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
295 &DriverBindingHandleCount
,
296 &DriverBindingHandleBuffer
299 ParentControllerHandleBuffer
= NULL
;
300 Status
= PARSE_HANDLE_DATABASE_PARENTS (
302 &ParentControllerHandleCount
,
303 &ParentControllerHandleBuffer
306 ChildControllerHandleBuffer
= NULL
;
307 Status
= ParseHandleDatabaseForChildControllers (
309 &ChildControllerHandleCount
,
310 &ChildControllerHandleBuffer
313 DiagnosticsStatus
= FALSE
;
314 ConfigurationStatus
= FALSE
;
316 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
317 ConfigurationStatus
= TRUE
;
319 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
320 ConfigurationStatus
= TRUE
;
322 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
323 DiagnosticsStatus
= TRUE
;
325 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
326 DiagnosticsStatus
= TRUE
;
329 Status
= EFI_SUCCESS
;
331 if (DriverBindingHandleCount
> 0 || ParentControllerHandleCount
> 0 || ChildControllerHandleCount
> 0) {
336 TempStringPointer
= NULL
;
337 Status
= gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevicePath
);
339 Status
= gEfiShellProtocol
->GetDeviceName(Handle
, EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
340 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1
), gShellDriver1HiiHandle
, TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>");
341 SHELL_FREE_NON_NULL(TempStringPointer
);
343 TempStringPointer
= ConvertDevicePathToText(DevicePath
, TRUE
, FALSE
);
348 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2
),
349 gShellDriver1HiiHandle
,
350 TempStringPointer
!=NULL
?TempStringPointer
:L
"<None>",
351 ParentControllerHandleCount
== 0?L
"ROOT":(ChildControllerHandleCount
> 0)?L
"BUS":L
"DEVICE",
352 ConfigurationStatus
?L
"YES":L
"NO",
353 DiagnosticsStatus
?L
"YES":L
"NO"
356 SHELL_FREE_NON_NULL(TempStringPointer
);
358 if (DriverBindingHandleCount
== 0) {
363 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
364 gShellDriver1HiiHandle
,
372 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
373 gShellDriver1HiiHandle
,
376 for (Index
= 0; Index
< DriverBindingHandleCount
; Index
++) {
378 Status
= GetDriverName (
379 DriverBindingHandleBuffer
[Index
],
383 if (EFI_ERROR (Status
)) {
384 Status
= GetDriverImageName (
385 DriverBindingHandleBuffer
[Index
],
388 if (EFI_ERROR (Status
)) {
398 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A
),
399 gShellDriver1HiiHandle
,
400 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
401 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
408 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B
),
409 gShellDriver1HiiHandle
,
410 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
411 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
414 SHELL_FREE_NON_NULL(DriverName
);
418 if (ParentControllerHandleCount
== 0) {
423 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
424 gShellDriver1HiiHandle
,
432 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
433 gShellDriver1HiiHandle
,
436 for (Index
= 0; Index
< ParentControllerHandleCount
; Index
++) {
437 Status
= gEfiShellProtocol
->GetDeviceName(ParentControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
442 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B
),
443 gShellDriver1HiiHandle
,
444 ConvertHandleToHandleIndex (ParentControllerHandleBuffer
[Index
]),
445 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
447 SHELL_FREE_NON_NULL(TempStringPointer
);
451 if (ChildControllerHandleCount
== 0) {
456 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
457 gShellDriver1HiiHandle
,
465 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
466 gShellDriver1HiiHandle
,
469 for (Index
= 0; Index
< ChildControllerHandleCount
; Index
++) {
470 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
475 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
476 gShellDriver1HiiHandle
,
477 ConvertHandleToHandleIndex (ChildControllerHandleBuffer
[Index
]),
478 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
480 SHELL_FREE_NON_NULL(TempStringPointer
);
485 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer
);
487 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer
);
489 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer
);
491 if (EFI_ERROR (Status
)) {
495 // See if Handle is a driver binding handle and display its details.
497 Status
= gBS
->OpenProtocol (
499 &gEfiDriverBindingProtocolGuid
,
500 (VOID
**) &DriverBinding
,
503 EFI_OPEN_PROTOCOL_GET_PROTOCOL
505 if (EFI_ERROR (Status
)) {
509 NumberOfChildren
= 0;
510 ControllerHandleBuffer
= NULL
;
511 Status
= PARSE_HANDLE_DATABASE_DEVICES (
513 &ControllerHandleCount
,
514 &ControllerHandleBuffer
516 if (ControllerHandleCount
> 0) {
517 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
518 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
520 ControllerHandleBuffer
[HandleIndex
],
521 &ChildControllerHandleCount
,
524 NumberOfChildren
+= ChildControllerHandleCount
;
528 Status
= GetDriverName (Handle
, Language
, &DriverName
);
529 if (EFI_ERROR (Status
)) {
537 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
538 gShellDriver1HiiHandle
,
539 ConvertHandleToHandleIndex(Handle
),
540 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
542 SHELL_FREE_NON_NULL(DriverName
);
543 Status
= GetDriverImageName (
547 if (EFI_ERROR (Status
)) {
554 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B
),
555 gShellDriver1HiiHandle
,
556 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
558 SHELL_FREE_NON_NULL(DriverName
);
564 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8
),
565 gShellDriver1HiiHandle
,
566 DriverBinding
->Version
,
567 NumberOfChildren
> 0?L
"Bus":ControllerHandleCount
> 0?L
"Device":L
"<Unknown>",
568 ConfigurationStatus
?L
"YES":L
"NO",
569 DiagnosticsStatus
?L
"YES":L
"NO"
572 if (ControllerHandleCount
== 0) {
577 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
578 gShellDriver1HiiHandle
,
586 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
587 gShellDriver1HiiHandle
,
590 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
591 Status
= gEfiShellProtocol
->GetDeviceName(ControllerHandleBuffer
[HandleIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
597 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B
),
598 gShellDriver1HiiHandle
,
599 ConvertHandleToHandleIndex(ControllerHandleBuffer
[HandleIndex
]),
600 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
602 SHELL_FREE_NON_NULL(TempStringPointer
);
604 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
606 ControllerHandleBuffer
[HandleIndex
],
607 &ChildControllerHandleCount
,
608 &ChildControllerHandleBuffer
610 if (!EFI_ERROR (Status
)) {
611 for (ChildIndex
= 0; ChildIndex
< ChildControllerHandleCount
; ChildIndex
++) {
612 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[ChildIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
618 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
619 gShellDriver1HiiHandle
,
620 ConvertHandleToHandleIndex(ChildControllerHandleBuffer
[ChildIndex
]),
621 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
623 SHELL_FREE_NON_NULL(TempStringPointer
);
626 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer
);
630 SHELL_FREE_NON_NULL (ControllerHandleBuffer
);
637 Display information for a handle.
639 @param[in] TheHandle The handles to show info on.
640 @param[in] Verbose TRUE for extra info, FALSE otherwise.
641 @param[in] Sfo TRUE to output in standard format output (spec).
642 @param[in] Language Language string per UEFI specification.
643 @param[in] DriverInfo TRUE to show all info about the handle.
644 @param[in] Multiple TRUE indicates more than will be output,
645 FALSE for a single one.
647 @retval SHELL_SUCCESS The operation was successful.
648 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
653 IN CONST EFI_HANDLE TheHandle
,
654 IN CONST BOOLEAN Verbose
,
655 IN CONST BOOLEAN Sfo
,
656 IN CONST CHAR8
*Language
,
657 IN CONST BOOLEAN DriverInfo
,
658 IN CONST BOOLEAN Multiple
661 CHAR16
*ProtocolInfoString
;
662 SHELL_STATUS ShellStatus
;
664 ShellStatus
= SHELL_SUCCESS
;
665 ProtocolInfoString
= NULL
;
669 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
" ", Verbose
, TRUE
);
674 STRING_TOKEN (STR_DH_OUTPUT
),
675 gShellDriver1HiiHandle
,
676 ConvertHandleToHandleIndex(TheHandle
),
677 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
679 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
"\r\n", Verbose
, TRUE
);
684 STRING_TOKEN (STR_DH_OUTPUT_SINGLE
),
685 gShellDriver1HiiHandle
,
686 ConvertHandleToHandleIndex(TheHandle
),
688 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
692 DisplayDriverModelHandle ((EFI_HANDLE
)TheHandle
, TRUE
, Language
);
695 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
";", FALSE
, FALSE
);
700 STRING_TOKEN (STR_DH_OUTPUT_SFO
),
701 gShellDriver1HiiHandle
,
702 Multiple
?L
"HandlesInfo":L
"HandleInfo",
705 ConvertHandleToHandleIndex(TheHandle
),
707 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
713 if (ProtocolInfoString
!= NULL
) {
714 FreePool(ProtocolInfoString
);
716 return (ShellStatus
);
720 Display information for all handles on a list.
722 @param[in] HandleList The NULL-terminated list of handles.
723 @param[in] Verbose TRUE for extra info, FALSE otherwise.
724 @param[in] Sfo TRUE to output in standard format output (spec).
725 @param[in] Language Language string per UEFI specification.
726 @param[in] DriverInfo TRUE to show all info about the handle.
728 @retval SHELL_SUCCESS The operation was successful.
729 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
734 IN CONST EFI_HANDLE
*HandleList
,
735 IN CONST BOOLEAN Verbose
,
736 IN CONST BOOLEAN Sfo
,
737 IN CONST CHAR8
*Language
,
738 IN CONST BOOLEAN DriverInfo
741 CONST EFI_HANDLE
*HandleWalker
;
742 SHELL_STATUS ShellStatus
;
744 ShellStatus
= SHELL_SUCCESS
;
746 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
&& ShellStatus
== SHELL_SUCCESS
; HandleWalker
++) {
747 ShellStatus
= DoDhByHandle(
755 if (ShellGetExecutionBreakFlag ()) {
756 ShellStatus
= SHELL_ABORTED
;
760 return (ShellStatus
);
764 Display information for all handles.
766 @param[in] Sfo TRUE to output in standard format output (spec).
767 @param[in] Verbose TRUE for extra info, FALSE otherwise.
768 @param[in] Language Language string per UEFI specification.
769 @param[in] DriverInfo TRUE to show all info about the handle.
771 @retval SHELL_SUCCESS The operation was successful.
772 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
777 IN CONST BOOLEAN Sfo
,
778 IN CONST BOOLEAN Verbose
,
779 IN CONST CHAR8
*Language
,
780 IN CONST BOOLEAN DriverInfo
783 EFI_HANDLE
*HandleList
;
784 SHELL_STATUS ShellStatus
;
786 HandleList
= GetHandleListByProtocol(NULL
);
788 ShellStatus
= DoDhForHandleList(
795 FreePool(HandleList
);
797 return (ShellStatus
);
801 Display information for all handles which have a specific protocol.
803 @param[in] ProtocolName The pointer to the name of the protocol.
804 @param[in] Verbose TRUE for extra info, FALSE otherwise.
805 @param[in] Sfo TRUE to output in standard format output (spec).
806 @param[in] Language Language string per UEFI specification.
807 @param[in] DriverInfo TRUE to show all info about the handle.
809 @retval SHELL_SUCCESS The operation was successful.
810 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
815 IN CONST CHAR16
*ProtocolName
,
816 IN CONST BOOLEAN Verbose
,
817 IN CONST BOOLEAN Sfo
,
818 IN CONST CHAR8
*Language
,
819 IN CONST BOOLEAN DriverInfo
824 EFI_HANDLE
*HandleList
;
825 SHELL_STATUS ShellStatus
;
827 if (ProtocolName
== NULL
) {
828 return (SHELL_INVALID_PARAMETER
);
831 Status
= GetGuidFromStringName(ProtocolName
, Language
, &Guid
);
832 if (EFI_ERROR(Status
)) {
833 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_GUID_FOUND
), gShellDriver1HiiHandle
, ProtocolName
);
834 return (SHELL_INVALID_PARAMETER
);
837 HandleList
= GetHandleListByProtocol(Guid
);
839 ShellStatus
= DoDhForHandleList(
846 SHELL_FREE_NON_NULL(HandleList
);
848 return (ShellStatus
);
852 Function for 'dh' command.
854 @param[in] ImageHandle Handle to the Image (NULL if Internal).
855 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
860 IN EFI_HANDLE ImageHandle
,
861 IN EFI_SYSTEM_TABLE
*SystemTable
866 CHAR16
*ProblemParam
;
867 SHELL_STATUS ShellStatus
;
876 ShellStatus
= SHELL_SUCCESS
;
877 Status
= EFI_SUCCESS
;
881 // initialize the shell lib (we must be in non-auto-init...)
883 Status
= ShellInitialize();
884 ASSERT_EFI_ERROR(Status
);
886 Status
= CommandInit();
887 ASSERT_EFI_ERROR(Status
);
890 // parse the command line
892 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
893 if (EFI_ERROR(Status
)) {
894 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
895 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
896 FreePool(ProblemParam
);
897 ShellStatus
= SHELL_INVALID_PARAMETER
;
902 if (ShellCommandLineGetCount(Package
) > 2) {
903 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
904 ShellCommandLineFreeVarList (Package
);
905 return (SHELL_INVALID_PARAMETER
);
908 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
910 Language
= AllocateZeroPool(StrSize(Lang
));
911 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
912 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
913 Language
= AllocateZeroPool(10);
914 AsciiSPrint(Language
, 10, "en-us");
916 ASSERT(Language
== NULL
);
917 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
918 ShellCommandLineFreeVarList (Package
);
919 return (SHELL_INVALID_PARAMETER
);
922 SfoMode
= ShellCommandLineGetFlag(Package
, L
"-sfo");
923 FlagD
= ShellCommandLineGetFlag(Package
, L
"-d");
924 Verbose
= (BOOLEAN
)(ShellCommandLineGetFlag(Package
, L
"-v") || ShellCommandLineGetFlag(Package
, L
"-verbose"));
926 if (ShellCommandLineGetFlag(Package
, L
"-p")) {
927 if (ShellCommandLineGetCount(Package
) > 1) {
928 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
929 ShellStatus
= SHELL_INVALID_PARAMETER
;
930 } else if (ShellCommandLineGetValue(Package
, L
"-p") == NULL
) {
931 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-p");
932 ShellStatus
= SHELL_INVALID_PARAMETER
;
937 ShellStatus
= DoDhByProtocol(
938 ShellCommandLineGetValue(Package
, L
"-p"),
941 Lang
==NULL
?NULL
:Language
,
946 Temp2
= ShellCommandLineGetRawValue(Package
, 1);
951 ShellStatus
= DoDhForAll(
954 Lang
==NULL
?NULL
:Language
,
958 Status
= ShellConvertStringToUint64(Temp2
, &Intermediate
, TRUE
, FALSE
);
959 if (EFI_ERROR(Status
) || ConvertHandleIndexToHandle((UINTN
)Intermediate
) == NULL
) {
960 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Temp2
);
961 ShellStatus
= SHELL_INVALID_PARAMETER
;
966 ShellStatus
= DoDhByHandle(
967 ConvertHandleIndexToHandle((UINTN
)Intermediate
),
970 Lang
==NULL
?NULL
:Language
,
979 ShellCommandLineFreeVarList (Package
);
980 SHELL_FREE_NON_NULL(Language
);
983 return (ShellStatus
);