2 Main file for Dh shell Driver1 function.
4 Copyright (c) 2010 - 2013, 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
,
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.
111 IN CONST EFI_GUID
*Guid
114 CONST EFI_GUID
**GuidWalker
;
117 for (GuidWalker
= UefiDriverModelProtocolsGuidArray
118 ; GuidWalker
!= NULL
&& *GuidWalker
!= NULL
121 if (CompareGuid(*GuidWalker
, Guid
)) {
130 Get information for a handle.
132 @param[in] TheHandle The handles to show info on.
133 @param[in] Language Language string per UEFI specification.
134 @param[in] Seperator Separator string between information blocks.
135 @param[in] Verbose TRUE for extra info, FALSE otherwise.
136 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.
138 @retval SHELL_SUCCESS The operation was successful.
139 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
143 GetProtocolInfoString(
144 IN CONST EFI_HANDLE TheHandle
,
145 IN CONST CHAR8
*Language
,
146 IN CONST CHAR16
*Seperator
,
147 IN CONST BOOLEAN Verbose
,
148 IN CONST BOOLEAN ExtraInfo
151 EFI_GUID
**ProtocolGuidArray
;
159 ProtocolGuidArray
= NULL
;
163 Status
= gBS
->ProtocolsPerHandle (
168 if (!EFI_ERROR (Status
)) {
169 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
170 Temp
= GetStringNameFromGuid(ProtocolGuidArray
[ProtocolIndex
], Language
);
172 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
174 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
176 StrnCatGrow(&RetVal
, &Size
, L
"%H", 0);
177 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
178 StrnCatGrow(&RetVal
, &Size
, L
"%N", 0);
182 Temp
= GetProtocolInformationDump(TheHandle
, ProtocolGuidArray
[ProtocolIndex
], Verbose
);
184 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
186 StrnCatGrow(&RetVal
, &Size
, L
"(", 0);
187 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
188 StrnCatGrow(&RetVal
, &Size
, L
")\r\n", 0);
190 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
191 StrnCatGrow(&RetVal
, &Size
, Temp
, 0);
199 SHELL_FREE_NON_NULL(ProtocolGuidArray
);
201 if (RetVal
== NULL
) {
205 ASSERT((RetVal
== NULL
&& Size
== 0) || (RetVal
!= NULL
));
206 StrnCatGrow(&RetVal
, &Size
, Seperator
, 0);
211 Gets the name of the loaded image.
213 @param[in] TheHandle The handle of the driver to get info on.
214 @param[out] Name The pointer to the pointer. Valid upon a successful return.
216 @retval EFI_SUCCESS The operation was successful.
221 IN EFI_HANDLE TheHandle
,
225 // get loaded image and devicepathtotext on image->Filepath
226 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
228 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
230 if (TheHandle
== NULL
|| Name
== NULL
) {
231 return (EFI_INVALID_PARAMETER
);
234 Status
= gBS
->OpenProtocol (
236 &gEfiLoadedImageProtocolGuid
,
237 (VOID
**) &LoadedImage
,
240 EFI_OPEN_PROTOCOL_GET_PROTOCOL
242 if (EFI_ERROR(Status
)) {
245 DevicePath
= LoadedImage
->FilePath
;
246 *Name
= ConvertDevicePathToText(DevicePath
, TRUE
, TRUE
);
247 return (EFI_SUCCESS
);
251 Display driver model information for a given handle.
253 @param[in] Handle The handle to display info on.
254 @param[in] BestName Use the best name?
255 @param[in] Language The language to output in.
259 DisplayDriverModelHandle (
260 IN EFI_HANDLE Handle
,
262 IN CONST CHAR8
*Language OPTIONAL
266 BOOLEAN ConfigurationStatus
;
267 BOOLEAN DiagnosticsStatus
;
268 UINTN DriverBindingHandleCount
;
269 EFI_HANDLE
*DriverBindingHandleBuffer
;
270 UINTN ParentControllerHandleCount
;
271 EFI_HANDLE
*ParentControllerHandleBuffer
;
272 UINTN ChildControllerHandleCount
;
273 EFI_HANDLE
*ChildControllerHandleBuffer
;
274 CHAR16
*TempStringPointer
;
275 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
278 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
279 UINTN NumberOfChildren
;
281 UINTN ControllerHandleCount
;
282 EFI_HANDLE
*ControllerHandleBuffer
;
287 // See if Handle is a device handle and display its details.
289 DriverBindingHandleBuffer
= NULL
;
290 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
292 &DriverBindingHandleCount
,
293 &DriverBindingHandleBuffer
296 ParentControllerHandleBuffer
= NULL
;
297 Status
= PARSE_HANDLE_DATABASE_PARENTS (
299 &ParentControllerHandleCount
,
300 &ParentControllerHandleBuffer
303 ChildControllerHandleBuffer
= NULL
;
304 Status
= ParseHandleDatabaseForChildControllers (
306 &ChildControllerHandleCount
,
307 &ChildControllerHandleBuffer
310 DiagnosticsStatus
= FALSE
;
311 ConfigurationStatus
= FALSE
;
313 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
314 ConfigurationStatus
= TRUE
;
316 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
317 ConfigurationStatus
= TRUE
;
319 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
320 DiagnosticsStatus
= TRUE
;
322 if (!EFI_ERROR(gBS
->OpenProtocol(Handle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
323 DiagnosticsStatus
= TRUE
;
326 Status
= EFI_SUCCESS
;
328 if (DriverBindingHandleCount
> 0 || ParentControllerHandleCount
> 0 || ChildControllerHandleCount
> 0) {
333 TempStringPointer
= NULL
;
334 Status
= gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevicePath
);
336 Status
= gEfiShellProtocol
->GetDeviceName(Handle
, EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
337 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1
), gShellDriver1HiiHandle
, TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>");
338 SHELL_FREE_NON_NULL(TempStringPointer
);
340 TempStringPointer
= ConvertDevicePathToText(DevicePath
, TRUE
, FALSE
);
345 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2
),
346 gShellDriver1HiiHandle
,
347 TempStringPointer
!=NULL
?TempStringPointer
:L
"<None>",
348 ParentControllerHandleCount
== 0?L
"ROOT":(ChildControllerHandleCount
> 0)?L
"BUS":L
"DEVICE",
349 ConfigurationStatus
?L
"YES":L
"NO",
350 DiagnosticsStatus
?L
"YES":L
"NO"
353 SHELL_FREE_NON_NULL(TempStringPointer
);
355 if (DriverBindingHandleCount
== 0) {
360 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
361 gShellDriver1HiiHandle
,
369 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3
),
370 gShellDriver1HiiHandle
,
373 for (Index
= 0; Index
< DriverBindingHandleCount
; Index
++) {
375 Status
= GetDriverName (
376 DriverBindingHandleBuffer
[Index
],
380 if (EFI_ERROR (Status
)) {
381 Status
= GetDriverImageName (
382 DriverBindingHandleBuffer
[Index
],
385 if (EFI_ERROR (Status
)) {
395 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A
),
396 gShellDriver1HiiHandle
,
397 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
398 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
405 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B
),
406 gShellDriver1HiiHandle
,
407 ConvertHandleToHandleIndex (DriverBindingHandleBuffer
[Index
]),
408 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
411 SHELL_FREE_NON_NULL(DriverName
);
415 if (ParentControllerHandleCount
== 0) {
420 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
421 gShellDriver1HiiHandle
,
429 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5
),
430 gShellDriver1HiiHandle
,
433 for (Index
= 0; Index
< ParentControllerHandleCount
; Index
++) {
434 Status
= gEfiShellProtocol
->GetDeviceName(ParentControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
439 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B
),
440 gShellDriver1HiiHandle
,
441 ConvertHandleToHandleIndex (ParentControllerHandleBuffer
[Index
]),
442 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
444 SHELL_FREE_NON_NULL(TempStringPointer
);
448 if (ChildControllerHandleCount
== 0) {
453 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
454 gShellDriver1HiiHandle
,
462 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
463 gShellDriver1HiiHandle
,
466 for (Index
= 0; Index
< ChildControllerHandleCount
; Index
++) {
467 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[Index
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
472 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
473 gShellDriver1HiiHandle
,
474 ConvertHandleToHandleIndex (ChildControllerHandleBuffer
[Index
]),
475 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
477 SHELL_FREE_NON_NULL(TempStringPointer
);
482 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer
);
484 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer
);
486 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer
);
488 if (EFI_ERROR (Status
)) {
492 // See if Handle is a driver binding handle and display its details.
494 Status
= gBS
->OpenProtocol (
496 &gEfiDriverBindingProtocolGuid
,
497 (VOID
**) &DriverBinding
,
500 EFI_OPEN_PROTOCOL_GET_PROTOCOL
502 if (EFI_ERROR (Status
)) {
506 NumberOfChildren
= 0;
507 ControllerHandleBuffer
= NULL
;
508 Status
= PARSE_HANDLE_DATABASE_DEVICES (
510 &ControllerHandleCount
,
511 &ControllerHandleBuffer
513 if (ControllerHandleCount
> 0) {
514 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
515 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
517 ControllerHandleBuffer
[HandleIndex
],
518 &ChildControllerHandleCount
,
521 NumberOfChildren
+= ChildControllerHandleCount
;
525 Status
= GetDriverName (Handle
, Language
, &DriverName
);
526 if (EFI_ERROR (Status
)) {
534 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
535 gShellDriver1HiiHandle
,
536 ConvertHandleToHandleIndex(Handle
),
537 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
539 SHELL_FREE_NON_NULL(DriverName
);
540 Status
= GetDriverImageName (
544 if (EFI_ERROR (Status
)) {
551 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B
),
552 gShellDriver1HiiHandle
,
553 DriverName
!=NULL
?DriverName
:L
"<Unknown>"
555 SHELL_FREE_NON_NULL(DriverName
);
561 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8
),
562 gShellDriver1HiiHandle
,
563 DriverBinding
->Version
,
564 NumberOfChildren
> 0?L
"Bus":ControllerHandleCount
> 0?L
"Device":L
"<Unknown>",
565 ConfigurationStatus
?L
"YES":L
"NO",
566 DiagnosticsStatus
?L
"YES":L
"NO"
569 if (ControllerHandleCount
== 0) {
574 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
575 gShellDriver1HiiHandle
,
583 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6
),
584 gShellDriver1HiiHandle
,
587 for (HandleIndex
= 0; HandleIndex
< ControllerHandleCount
; HandleIndex
++) {
588 Status
= gEfiShellProtocol
->GetDeviceName(ControllerHandleBuffer
[HandleIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
594 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B
),
595 gShellDriver1HiiHandle
,
596 ConvertHandleToHandleIndex(ControllerHandleBuffer
[HandleIndex
]),
597 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
599 SHELL_FREE_NON_NULL(TempStringPointer
);
601 Status
= PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
603 ControllerHandleBuffer
[HandleIndex
],
604 &ChildControllerHandleCount
,
605 &ChildControllerHandleBuffer
607 if (!EFI_ERROR (Status
)) {
608 for (ChildIndex
= 0; ChildIndex
< ChildControllerHandleCount
; ChildIndex
++) {
609 Status
= gEfiShellProtocol
->GetDeviceName(ChildControllerHandleBuffer
[ChildIndex
], EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, &TempStringPointer
);
615 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B
),
616 gShellDriver1HiiHandle
,
617 ConvertHandleToHandleIndex(ChildControllerHandleBuffer
[ChildIndex
]),
618 TempStringPointer
!=NULL
?TempStringPointer
:L
"<Unknown>"
620 SHELL_FREE_NON_NULL(TempStringPointer
);
623 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer
);
627 SHELL_FREE_NON_NULL (ControllerHandleBuffer
);
634 Display information for a handle.
636 @param[in] TheHandle The handles to show info on.
637 @param[in] Verbose TRUE for extra info, FALSE otherwise.
638 @param[in] Sfo TRUE to output in standard format output (spec).
639 @param[in] Language Language string per UEFI specification.
640 @param[in] DriverInfo TRUE to show all info about the handle.
641 @param[in] Multiple TRUE indicates more than will be output,
642 FALSE for a single one.
644 @retval SHELL_SUCCESS The operation was successful.
645 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
650 IN CONST EFI_HANDLE TheHandle
,
651 IN CONST BOOLEAN Verbose
,
652 IN CONST BOOLEAN Sfo
,
653 IN CONST CHAR8
*Language
,
654 IN CONST BOOLEAN DriverInfo
,
655 IN CONST BOOLEAN Multiple
658 CHAR16
*ProtocolInfoString
;
659 SHELL_STATUS ShellStatus
;
661 ShellStatus
= SHELL_SUCCESS
;
662 ProtocolInfoString
= NULL
;
666 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
" ", Verbose
, TRUE
);
671 STRING_TOKEN (STR_DH_OUTPUT
),
672 gShellDriver1HiiHandle
,
673 ConvertHandleToHandleIndex(TheHandle
),
674 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
676 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
"\r\n", Verbose
, TRUE
);
681 STRING_TOKEN (STR_DH_OUTPUT_SINGLE
),
682 gShellDriver1HiiHandle
,
683 ConvertHandleToHandleIndex(TheHandle
),
685 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
689 DisplayDriverModelHandle ((EFI_HANDLE
)TheHandle
, TRUE
, Language
);
692 ProtocolInfoString
= GetProtocolInfoString(TheHandle
, Language
, L
";", FALSE
, FALSE
);
697 STRING_TOKEN (STR_DH_OUTPUT_SFO
),
698 gShellDriver1HiiHandle
,
699 Multiple
?L
"HandlesInfo":L
"HandleInfo",
702 ConvertHandleToHandleIndex(TheHandle
),
704 ProtocolInfoString
==NULL
?L
"":ProtocolInfoString
);
710 if (ProtocolInfoString
!= NULL
) {
711 FreePool(ProtocolInfoString
);
713 return (ShellStatus
);
717 Display information for all handles on a list.
719 @param[in] HandleList The NULL-terminated list of handles.
720 @param[in] Verbose TRUE for extra info, FALSE otherwise.
721 @param[in] Sfo TRUE to output in standard format output (spec).
722 @param[in] Language Language string per UEFI specification.
723 @param[in] DriverInfo TRUE to show all info about the handle.
725 @retval SHELL_SUCCESS The operation was successful.
726 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
731 IN CONST EFI_HANDLE
*HandleList
,
732 IN CONST BOOLEAN Verbose
,
733 IN CONST BOOLEAN Sfo
,
734 IN CONST CHAR8
*Language
,
735 IN CONST BOOLEAN DriverInfo
738 CONST EFI_HANDLE
*HandleWalker
;
739 SHELL_STATUS ShellStatus
;
741 ShellStatus
= SHELL_SUCCESS
;
743 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
&& ShellStatus
== SHELL_SUCCESS
; HandleWalker
++) {
744 ShellStatus
= DoDhByHandle(
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.
770 IN CONST BOOLEAN Sfo
,
771 IN CONST BOOLEAN Verbose
,
772 IN CONST CHAR8
*Language
,
773 IN CONST BOOLEAN DriverInfo
776 EFI_HANDLE
*HandleList
;
777 SHELL_STATUS ShellStatus
;
779 HandleList
= GetHandleListByProtocol(NULL
);
781 ShellStatus
= DoDhForHandleList(
788 FreePool(HandleList
);
790 return (ShellStatus
);
794 Display information for all handles which have a specific protocol.
796 @param[in] ProtocolName The pointer to the name of the protocol.
797 @param[in] Verbose TRUE for extra info, FALSE otherwise.
798 @param[in] Sfo TRUE to output in standard format output (spec).
799 @param[in] Language Language string per UEFI specification.
800 @param[in] DriverInfo TRUE to show all info about the handle.
802 @retval SHELL_SUCCESS The operation was successful.
803 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.
808 IN CONST CHAR16
*ProtocolName
,
809 IN CONST BOOLEAN Verbose
,
810 IN CONST BOOLEAN Sfo
,
811 IN CONST CHAR8
*Language
,
812 IN CONST BOOLEAN DriverInfo
817 EFI_HANDLE
*HandleList
;
818 SHELL_STATUS ShellStatus
;
820 if (ProtocolName
== NULL
) {
821 return (SHELL_INVALID_PARAMETER
);
824 Status
= GetGuidFromStringName(ProtocolName
, Language
, &Guid
);
825 if (EFI_ERROR(Status
)) {
826 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DH_NO_GUID_FOUND
), gShellDriver1HiiHandle
, ProtocolName
);
827 return (SHELL_INVALID_PARAMETER
);
830 HandleList
= GetHandleListByProtocol(Guid
);
832 ShellStatus
= DoDhForHandleList(
839 SHELL_FREE_NON_NULL(HandleList
);
841 return (ShellStatus
);
845 Function for 'dh' command.
847 @param[in] ImageHandle Handle to the Image (NULL if Internal).
848 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
853 IN EFI_HANDLE ImageHandle
,
854 IN EFI_SYSTEM_TABLE
*SystemTable
859 CHAR16
*ProblemParam
;
860 SHELL_STATUS ShellStatus
;
869 ShellStatus
= SHELL_SUCCESS
;
870 Status
= EFI_SUCCESS
;
874 // initialize the shell lib (we must be in non-auto-init...)
876 Status
= ShellInitialize();
877 ASSERT_EFI_ERROR(Status
);
879 Status
= CommandInit();
880 ASSERT_EFI_ERROR(Status
);
883 // parse the command line
885 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
886 if (EFI_ERROR(Status
)) {
887 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
888 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
889 FreePool(ProblemParam
);
890 ShellStatus
= SHELL_INVALID_PARAMETER
;
895 if (ShellCommandLineGetCount(Package
) > 2) {
896 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
897 ShellCommandLineFreeVarList (Package
);
898 return (SHELL_INVALID_PARAMETER
);
901 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
903 Language
= AllocateZeroPool(StrSize(Lang
));
904 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
905 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
906 Language
= AllocateZeroPool(10);
907 AsciiSPrint(Language
, 10, "en-us");
909 ASSERT(Language
== NULL
);
910 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
911 ShellCommandLineFreeVarList (Package
);
912 return (SHELL_INVALID_PARAMETER
);
915 SfoMode
= ShellCommandLineGetFlag(Package
, L
"-sfo");
916 FlagD
= ShellCommandLineGetFlag(Package
, L
"-d");
917 Verbose
= (BOOLEAN
)(ShellCommandLineGetFlag(Package
, L
"-v") || ShellCommandLineGetFlag(Package
, L
"-verbose"));
919 if (ShellCommandLineGetFlag(Package
, L
"-p")) {
920 if (ShellCommandLineGetCount(Package
) > 1) {
921 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
922 ShellStatus
= SHELL_INVALID_PARAMETER
;
923 } else if (ShellCommandLineGetValue(Package
, L
"-p") == NULL
) {
924 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-p");
925 ShellStatus
= SHELL_INVALID_PARAMETER
;
930 ShellStatus
= DoDhByProtocol(
931 ShellCommandLineGetValue(Package
, L
"-p"),
934 Lang
==NULL
?NULL
:Language
,
939 Temp2
= ShellCommandLineGetRawValue(Package
, 1);
944 ShellStatus
= DoDhForAll(
947 Lang
==NULL
?NULL
:Language
,
951 Status
= ShellConvertStringToUint64(Temp2
, &Intermediate
, TRUE
, FALSE
);
952 if (EFI_ERROR(Status
) || ConvertHandleIndexToHandle((UINTN
)Intermediate
) == NULL
) {
953 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Temp2
);
954 ShellStatus
= SHELL_INVALID_PARAMETER
;
959 ShellStatus
= DoDhByHandle(
960 ConvertHandleIndexToHandle((UINTN
)Intermediate
),
963 Lang
==NULL
?NULL
:Language
,
972 ShellCommandLineFreeVarList (Package
);
973 SHELL_FREE_NON_NULL(Language
);
976 return (ShellStatus
);