2 Main file for Dh shell Driver1 function.
4 Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDriver1CommandsLib.h"
17 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
21 {L
"-verbose", TypeFlag
},
27 STATIC CONST EFI_GUID
*UefiDriverModelProtocolsGuidArray
[] = {
28 &gEfiDriverBindingProtocolGuid
,
29 &gEfiPlatformDriverOverrideProtocolGuid
,
30 &gEfiBusSpecificDriverOverrideProtocolGuid
,
31 &gEfiDriverDiagnosticsProtocolGuid
,
32 &gEfiDriverDiagnostics2ProtocolGuid
,
33 &gEfiComponentNameProtocolGuid
,
34 &gEfiComponentName2ProtocolGuid
,
35 &gEfiPlatformToDriverConfigurationProtocolGuid
,
36 &gEfiDriverSupportedEfiVersionProtocolGuid
,
37 &gEfiDriverFamilyOverrideProtocolGuid
,
38 &gEfiDriverHealthProtocolGuid
,
39 &gEfiLoadedImageProtocolGuid
,
44 Get the name of a driver by it's handle.
46 If a name is found the memory must be callee freed.
48 @param[in] TheHandle The driver's handle.
49 @param[in] Language The language to use.
50 @param[in] NameFound Upon a successful return the name found.
52 @retval EFI_SUCCESS The name was found.
57 IN EFI_HANDLE TheHandle
,
58 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 if (Language
== NULL
) {
91 Lang
= AllocateZeroPool(AsciiStrSize(CompName2
->SupportedLanguages
));
93 return (EFI_OUT_OF_RESOURCES
);
95 AsciiStrCpy(Lang
, CompName2
->SupportedLanguages
);
96 TempChar
= AsciiStrStr(Lang
, ";");
97 if (TempChar
!= NULL
){
98 *TempChar
= CHAR_NULL
;
101 Lang
= AllocateZeroPool(AsciiStrSize(Language
));
103 return (EFI_OUT_OF_RESOURCES
);
105 AsciiStrCpy(Lang
, Language
);
107 Status
= CompName2
->GetDriverName(CompName2
, Lang
, &NameToReturn
);
110 if (!EFI_ERROR(Status
) && NameToReturn
!= NULL
) {
112 StrnCatGrow(NameFound
, NULL
, NameToReturn
, 0);
118 Discover if a protocol guid is one of the UEFI Driver Model Protocols.
120 @param[in] Guid The guid to test.
122 @retval TRUE The guid does represent a driver model protocol.
123 @retval FALSE The guid does not represent a driver model protocol.
128 IN CONST EFI_GUID
*Guid
131 CONST EFI_GUID
**GuidWalker
;
134 for (GuidWalker
= UefiDriverModelProtocolsGuidArray
135 ; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
138 if (CompareGuid(*GuidWalker
, Guid
)) {
147 Get information for a handle.
149 @param[in] TheHandle The handles to show info on.
150 @param[in] Language Language string per UEFI specification.
151 @param[in] Seperator Separator string between information blocks.
152 @param[in] Verbose TRUE for extra info, FALSE otherwise.
153 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.
155 @retval SHELL_SUCCESS The operation was successful.
156 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
160 GetProtocolInfoString(
161 IN CONST EFI_HANDLE TheHandle
,
162 IN CONST CHAR8
*Language
,
163 IN CONST CHAR16
*Seperator
,
164 IN CONST BOOLEAN Verbose
,
165 IN CONST BOOLEAN ExtraInfo
168 EFI_GUID
**ProtocolGuidArray
;
176 ProtocolGuidArray
= NULL
;
180 Status
= gBS
->ProtocolsPerHandle (
185 if (!EFI_ERROR (Status
)) {
186 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
187 Temp
= GetStringNameFromGuid(ProtocolGuidArray
[ProtocolIndex
], Language
);
189 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
191 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
193 StrnCatGrow(&RetVal
, &Size
, L
"%H", 0);
194 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
195 StrnCatGrow(&RetVal
, &Size
, L
"%N", 0);
199 Temp
= GetProtocolInformationDump(TheHandle
, ProtocolGuidArray
[ProtocolIndex
], Verbose
);
201 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
203 StrnCatGrow(&RetVal
, &Size
, L
"(", 0);
204 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
205 StrnCatGrow(&RetVal
, &Size
, L
")\r\n", 0);
207 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
208 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
216 SHELL_FREE_NON_NULL(ProtocolGuidArray
);
218 if (RetVal
== NULL
) {
222 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
223 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
228 Gets the name of the loaded image.
230 @param[in] TheHandle The handle of the driver to get info on.
231 @param[out] Name The pointer to the pointer. Valid upon a successful return.
233 @retval EFI_SUCCESS The operation was successful.
238 IN EFI_HANDLE TheHandle
,
242 // get loaded image and devicepathtotext on image->Filepath
243 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
245 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
247 if (TheHandle
== NULL
|| Name
== NULL
) {
248 return (EFI_INVALID_PARAMETER
);
251 Status
= gBS
->OpenProtocol (
253 &gEfiLoadedImageProtocolGuid
,
254 (VOID
**) &LoadedImage
,
257 EFI_OPEN_PROTOCOL_GET_PROTOCOL
259 if (EFI_ERROR(Status
)) {
262 DevicePath
= LoadedImage
->FilePath
;
263 *Name
= gDevPathToText
->ConvertDevicePathToText(DevicePath
, TRUE
, TRUE
);
264 return (EFI_SUCCESS
);
268 Display driver model information for a given handle.
270 @param[in] Handle The handle to display info on.
271 @param[in] BestName Use the best name?
272 @param[in] Language The language to output in.
276 DisplayDriverModelHandle (
277 IN EFI_HANDLE Handle
,
279 IN CONST CHAR8
*Language OPTIONAL
283 BOOLEAN ConfigurationStatus
;
284 BOOLEAN DiagnosticsStatus
;
285 UINTN DriverBindingHandleCount
;
286 EFI_HANDLE
*DriverBindingHandleBuffer
;
287 UINTN ParentControllerHandleCount
;
288 EFI_HANDLE
*ParentControllerHandleBuffer
;
289 UINTN ChildControllerHandleCount
;
290 EFI_HANDLE
*ChildControllerHandleBuffer
;
291 CHAR16
*TempStringPointer
;
292 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
295 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
296 UINTN NumberOfChildren
;
298 UINTN ControllerHandleCount
;
299 EFI_HANDLE
*ControllerHandleBuffer
;
304 // See if Handle is a device handle and display its details.
306 DriverBindingHandleBuffer
= NULL
;
307 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
309 &DriverBindingHandleCount
,
310 &DriverBindingHandleBuffer
313 ParentControllerHandleBuffer
= NULL
;
314 Status
= PARSE_HANDLE_DATABASE_PARENTS (
316 &ParentControllerHandleCount
,
317 &ParentControllerHandleBuffer
320 ChildControllerHandleBuffer
= NULL
;
321 Status
= ParseHandleDatabaseForChildControllers (
323 &ChildControllerHandleCount
,
324 &ChildControllerHandleBuffer
327 DiagnosticsStatus
= FALSE
;
328 ConfigurationStatus
= FALSE
;
330 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
331 ConfigurationStatus
= TRUE
;
333 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
334 ConfigurationStatus
= TRUE
;
336 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
337 DiagnosticsStatus
= TRUE
;
339 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
340 DiagnosticsStatus
= TRUE
;
343 Status
= EFI_SUCCESS
;
345 if (DriverBindingHandleCount
> 0 || ParentControllerHandleCount
> 0 || ChildControllerHandleCount
> 0) {
350 TempStringPointer
= NULL
;
351 Status
= gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevicePath
);
353 Status
= gEfiShellProtocol
->GetDeviceName(Handle
, EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
354 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1
), gShellDriver1HiiHandle
, TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>");
355 SHELL_FREE_NON_NULL(TempStringPointer
);
357 TempStringPointer
= gDevPathToText
->ConvertDevicePathToText(DevicePath
, TRUE
, FALSE
);
362 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2
),
363 gShellDriver1HiiHandle
,
364 TempStringPointer
!=NULL
?TempStringPointer
:L
"<None>",
365 ParentControllerHandleCount
== 0?L
"ROOT":(ChildControllerHandleCount
> 0)?L
"BUS":L
"DEVICE",
366 ConfigurationStatus
?L
"YES":L
"NO",
367 DiagnosticsStatus
?L
"YES":L
"NO"
370 SHELL_FREE_NON_NULL(TempStringPointer
);
372 if (DriverBindingHandleCount
== 0) {
377 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
378 gShellDriver1HiiHandle
,
386 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
387 gShellDriver1HiiHandle
,
390 for (Index
= 0; Index
< DriverBindingHandleCount
; Index
++) {
392 Status
= GetDriverName (
393 DriverBindingHandleBuffer
[Index
],
397 if (EFI_ERROR (Status
)) {
398 Status
= GetDriverImageName (
399 DriverBindingHandleBuffer
[Index
],
402 if (EFI_ERROR (Status
)) {
412 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A
),
413 gShellDriver1HiiHandle
,
414 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
415 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
422 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B
),
423 gShellDriver1HiiHandle
,
424 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
425 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
428 SHELL_FREE_NON_NULL(DriverName
);
432 if (ParentControllerHandleCount
== 0) {
437 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
438 gShellDriver1HiiHandle
,
446 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
447 gShellDriver1HiiHandle
,
450 for (Index
= 0; Index
< ParentControllerHandleCount
; Index
++) {
451 Status
= gEfiShellProtocol
->GetDeviceName(ParentControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
456 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B
),
457 gShellDriver1HiiHandle
,
458 ConvertHandleToHandleIndex (ParentControllerHandleBuffer
[Index
]),
459 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
461 SHELL_FREE_NON_NULL(TempStringPointer
);
465 if (ChildControllerHandleCount
== 0) {
470 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
471 gShellDriver1HiiHandle
,
479 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
480 gShellDriver1HiiHandle
,
483 for (Index
= 0; Index
< ChildControllerHandleCount
; Index
++) {
484 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
489 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
490 gShellDriver1HiiHandle
,
491 ConvertHandleToHandleIndex (ChildControllerHandleBuffer
[Index
]),
492 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
494 SHELL_FREE_NON_NULL(TempStringPointer
);
499 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer
);
501 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer
);
503 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer
);
505 if (EFI_ERROR (Status
)) {
509 // See if Handle is a driver binding handle and display its details.
511 Status
= gBS
->OpenProtocol (
513 &gEfiDriverBindingProtocolGuid
,
514 (VOID
**) &DriverBinding
,
517 EFI_OPEN_PROTOCOL_GET_PROTOCOL
519 if (EFI_ERROR (Status
)) {
523 NumberOfChildren
= 0;
524 ControllerHandleBuffer
= NULL
;
525 Status
= PARSE_HANDLE_DATABASE_DEVICES (
527 &ControllerHandleCount
,
528 &ControllerHandleBuffer
530 if (ControllerHandleCount
> 0) {
531 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
532 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
534 ControllerHandleBuffer
[HandleIndex
],
535 &ChildControllerHandleCount
,
538 NumberOfChildren
+= ChildControllerHandleCount
;
542 Status
= GetDriverName (Handle
, Language
, &DriverName
);
543 if (EFI_ERROR (Status
)) {
551 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
552 gShellDriver1HiiHandle
,
553 ConvertHandleToHandleIndex(Handle
),
554 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
556 SHELL_FREE_NON_NULL(DriverName
);
557 Status
= GetDriverImageName (
561 if (EFI_ERROR (Status
)) {
568 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B
),
569 gShellDriver1HiiHandle
,
570 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
572 SHELL_FREE_NON_NULL(DriverName
);
578 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8
),
579 gShellDriver1HiiHandle
,
580 DriverBinding
->Version
,
581 NumberOfChildren
> 0?L
"Bus":ControllerHandleCount
> 0?L
"Device":L
"<Unknown>",
582 ConfigurationStatus
?L
"YES":L
"NO",
583 DiagnosticsStatus
?L
"YES":L
"NO"
586 if (ControllerHandleCount
== 0) {
591 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
592 gShellDriver1HiiHandle
,
600 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
601 gShellDriver1HiiHandle
,
604 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
605 Status
= gEfiShellProtocol
->GetDeviceName(ControllerHandleBuffer
[HandleIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
611 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B
),
612 gShellDriver1HiiHandle
,
613 ConvertHandleToHandleIndex(ControllerHandleBuffer
[HandleIndex
]),
614 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
616 SHELL_FREE_NON_NULL(TempStringPointer
);
618 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
620 ControllerHandleBuffer
[HandleIndex
],
621 &ChildControllerHandleCount
,
622 &ChildControllerHandleBuffer
624 if (!EFI_ERROR (Status
)) {
625 for (ChildIndex
= 0; ChildIndex
< ChildControllerHandleCount
; ChildIndex
++) {
626 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[ChildIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
632 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
633 gShellDriver1HiiHandle
,
634 ConvertHandleToHandleIndex(ChildControllerHandleBuffer
[ChildIndex
]),
635 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
637 SHELL_FREE_NON_NULL(TempStringPointer
);
640 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer
);
644 SHELL_FREE_NON_NULL (ControllerHandleBuffer
);
651 Display information for a handle.
653 @param[in] TheHandle The handles to show info on.
654 @param[in] Verbose TRUE for extra info, FALSE otherwise.
655 @param[in] Sfo TRUE to output in standard format output (spec).
656 @param[in] Language Language string per UEFI specification.
657 @param[in] DriverInfo TRUE to show all info about the handle.
658 @param[in] Multiple TRUE indicates more than will be output,
659 FALSE for a single one.
661 @retval SHELL_SUCCESS The operation was successful.
662 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
667 IN CONST EFI_HANDLE TheHandle
,
668 IN CONST BOOLEAN Verbose
,
669 IN CONST BOOLEAN Sfo
,
670 IN CONST CHAR8
*Language
,
671 IN CONST BOOLEAN DriverInfo
,
672 IN CONST BOOLEAN Multiple
675 CHAR16
*ProtocolInfoString
;
676 SHELL_STATUS ShellStatus
;
679 Status
= EFI_SUCCESS
;
680 ShellStatus
= SHELL_SUCCESS
;
681 ProtocolInfoString
= NULL
;
685 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
" ", Verbose
, TRUE
);
690 STRING_TOKEN (STR_DH_OUTPUT
),
691 gShellDriver1HiiHandle
,
692 ConvertHandleToHandleIndex(TheHandle
),
693 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
695 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
"\r\n", Verbose
, TRUE
);
700 STRING_TOKEN (STR_DH_OUTPUT_SINGLE
),
701 gShellDriver1HiiHandle
,
702 ConvertHandleToHandleIndex(TheHandle
),
704 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
708 DisplayDriverModelHandle ((EFI_HANDLE
)TheHandle
, TRUE
, Language
);
711 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
";", FALSE
, FALSE
);
716 STRING_TOKEN (STR_DH_OUTPUT_SFO
),
717 gShellDriver1HiiHandle
,
718 Multiple
?L
"HandlesInfo":L
"HandleInfo",
721 ConvertHandleToHandleIndex(TheHandle
),
723 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
729 if (ProtocolInfoString
!= NULL
) {
730 FreePool(ProtocolInfoString
);
732 return (ShellStatus
);
736 Display information for all handles on a list.
738 @param[in] HandleList The NULL-terminated list of handles.
739 @param[in] Verbose TRUE for extra info, FALSE otherwise.
740 @param[in] Sfo TRUE to output in standard format output (spec).
741 @param[in] Language Language string per UEFI specification.
742 @param[in] DriverInfo TRUE to show all info about the handle.
744 @retval SHELL_SUCCESS The operation was successful.
745 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
750 IN CONST EFI_HANDLE
*HandleList
,
751 IN CONST BOOLEAN Verbose
,
752 IN CONST BOOLEAN Sfo
,
753 IN CONST CHAR8
*Language
,
754 IN CONST BOOLEAN DriverInfo
757 CONST EFI_HANDLE
*HandleWalker
;
758 SHELL_STATUS ShellStatus
;
760 ShellStatus
= SHELL_SUCCESS
;
762 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
&& ShellStatus
== SHELL_SUCCESS
; HandleWalker
++) {
763 ShellStatus
= DoDhByHandle(
772 return (ShellStatus
);
776 Display information for all handles.
778 @param[in] Sfo TRUE to output in standard format output (spec).
779 @param[in] Verbose TRUE for extra info, FALSE otherwise.
780 @param[in] Language Language string per UEFI specification.
781 @param[in] DriverInfo TRUE to show all info about the handle.
783 @retval SHELL_SUCCESS The operation was successful.
784 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
789 IN CONST BOOLEAN Sfo
,
790 IN CONST BOOLEAN Verbose
,
791 IN CONST CHAR8
*Language
,
792 IN CONST BOOLEAN DriverInfo
795 EFI_HANDLE
*HandleList
;
796 SHELL_STATUS ShellStatus
;
798 HandleList
= GetHandleListByProtocol(NULL
);
800 ShellStatus
= DoDhForHandleList(
807 FreePool(HandleList
);
809 return (ShellStatus
);
813 Display information for all handles which have a specific protocol.
815 @param[in] ProtocolName The pointer to the name of the protocol.
816 @param[in] Verbose TRUE for extra info, FALSE otherwise.
817 @param[in] Sfo TRUE to output in standard format output (spec).
818 @param[in] Language Language string per UEFI specification.
819 @param[in] DriverInfo TRUE to show all info about the handle.
821 @retval SHELL_SUCCESS The operation was successful.
822 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
827 IN CONST CHAR16
*ProtocolName
,
828 IN CONST BOOLEAN Verbose
,
829 IN CONST BOOLEAN Sfo
,
830 IN CONST CHAR8
*Language
,
831 IN CONST BOOLEAN DriverInfo
836 EFI_HANDLE
*HandleList
;
837 SHELL_STATUS ShellStatus
;
839 if (ProtocolName
== NULL
) {
840 return (SHELL_INVALID_PARAMETER
);
843 Status
= GetGuidFromStringName(ProtocolName
, Language
, &Guid
);
844 if (EFI_ERROR(Status
)) {
845 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_GUID_FOUND
), gShellDriver1HiiHandle
, ProtocolName
);
846 return (SHELL_INVALID_PARAMETER
);
849 HandleList
= GetHandleListByProtocol(Guid
);
851 ShellStatus
= DoDhForHandleList(
858 SHELL_FREE_NON_NULL(HandleList
);
860 return (ShellStatus
);
864 Function for 'dh' command.
866 @param[in] ImageHandle Handle to the Image (NULL if Internal).
867 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
872 IN EFI_HANDLE ImageHandle
,
873 IN EFI_SYSTEM_TABLE
*SystemTable
878 CHAR16
*ProblemParam
;
879 SHELL_STATUS ShellStatus
;
888 ShellStatus
= SHELL_SUCCESS
;
889 Status
= EFI_SUCCESS
;
893 // initialize the shell lib (we must be in non-auto-init...)
895 Status
= ShellInitialize();
896 ASSERT_EFI_ERROR(Status
);
898 Status
= CommandInit();
899 ASSERT_EFI_ERROR(Status
);
902 // parse the command line
904 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
905 if (EFI_ERROR(Status
)) {
906 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
907 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
908 FreePool(ProblemParam
);
909 ShellStatus
= SHELL_INVALID_PARAMETER
;
914 if (ShellCommandLineGetCount(Package
) > 2) {
915 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
916 ShellCommandLineFreeVarList (Package
);
917 return (SHELL_INVALID_PARAMETER
);
920 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
922 Language
= AllocateZeroPool(StrSize(Lang
));
923 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
924 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
925 Language
= AllocateZeroPool(10);
926 AsciiSPrint(Language
, 10, "en-us");
928 ASSERT(Language
== NULL
);
929 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
930 ShellCommandLineFreeVarList (Package
);
931 return (SHELL_INVALID_PARAMETER
);
934 SfoMode
= ShellCommandLineGetFlag(Package
, L
"-sfo");
935 FlagD
= ShellCommandLineGetFlag(Package
, L
"-d");
936 Verbose
= (BOOLEAN
)(ShellCommandLineGetFlag(Package
, L
"-v") || ShellCommandLineGetFlag(Package
, L
"-verbose"));
938 if (ShellCommandLineGetFlag(Package
, L
"-p")) {
939 if (ShellCommandLineGetCount(Package
) > 1) {
940 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
941 ShellStatus
= SHELL_INVALID_PARAMETER
;
942 } else if (ShellCommandLineGetValue(Package
, L
"-p") == NULL
) {
943 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-p");
944 ShellStatus
= SHELL_INVALID_PARAMETER
;
949 ShellStatus
= DoDhByProtocol(
950 ShellCommandLineGetValue(Package
, L
"-p"),
953 Lang
==NULL
?NULL
:Language
,
958 Temp2
= ShellCommandLineGetRawValue(Package
, 1);
963 ShellStatus
= DoDhForAll(
966 Lang
==NULL
?NULL
:Language
,
970 Status
= ShellConvertStringToUint64(Temp2
, &Intermediate
, TRUE
, FALSE
);
971 if (EFI_ERROR(Status
) || ConvertHandleIndexToHandle((UINTN
)Intermediate
) == NULL
) {
972 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Temp2
);
973 ShellStatus
= SHELL_INVALID_PARAMETER
;
978 ShellStatus
= DoDhByHandle(
979 ConvertHandleIndexToHandle((UINTN
)Intermediate
),
982 Lang
==NULL
?NULL
:Language
,
991 ShellCommandLineFreeVarList (Package
);
992 SHELL_FREE_NON_NULL(Language
);
995 return (ShellStatus
);