2 Main file for devices shell Driver1 function.
4 Copyright (c) 2010, 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"
20 IN EFI_HANDLE TheHandle
,
28 IN CONST CHAR8
*Language
32 EFI_HANDLE
*HandleBuffer
;
43 return (EFI_INVALID_PARAMETER
);
56 gEfiShellProtocol
->GetDeviceName(TheHandle
, EFI_DEVICE_NAME_USE_COMPONENT_NAME
|EFI_DEVICE_NAME_USE_DEVICE_PATH
, (CHAR8
*)Language
, Name
);
58 Status
= ParseHandleDatabaseForChildControllers(TheHandle
, Children
, NULL
);
59 if (!EFI_ERROR(Status
)) {
60 Status
= PARSE_HANDLE_DATABASE_PARENTS(TheHandle
, Parents
, NULL
);
61 if (/*!EFI_ERROR(Status) && */Parents
!= NULL
&& Children
!= NULL
) {
64 } else if (*Children
> 0) {
71 Status
= PARSE_HANDLE_DATABASE_UEFI_DRIVERS(TheHandle
, Devices
, &HandleBuffer
);
72 if (!EFI_ERROR(Status
) && Devices
!= NULL
&& HandleBuffer
!= NULL
) {
73 for (Count
= 0 ; Count
< *Devices
; Count
++) {
74 if (!EFI_ERROR(gBS
->OpenProtocol(HandleBuffer
[Count
], &gEfiDriverConfigurationProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
77 if (!EFI_ERROR(gBS
->OpenProtocol(HandleBuffer
[Count
], &gEfiDriverDiagnosticsProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
80 if (!EFI_ERROR(gBS
->OpenProtocol(HandleBuffer
[Count
], &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, NULL
, gImageHandle
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
84 SHELL_FREE_NON_NULL(HandleBuffer
);
90 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
96 Function for 'devices' command.
98 @param[in] ImageHandle Handle to the Image (NULL if Internal).
99 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
103 ShellCommandRunDevices (
104 IN EFI_HANDLE ImageHandle
,
105 IN EFI_SYSTEM_TABLE
*SystemTable
110 CHAR16
*ProblemParam
;
111 SHELL_STATUS ShellStatus
;
113 EFI_HANDLE
*HandleList
;
114 EFI_HANDLE
*HandleListWalker
;
124 ShellStatus
= SHELL_SUCCESS
;
128 // initialize the shell lib (we must be in non-auto-init...)
130 Status
= ShellInitialize();
131 ASSERT_EFI_ERROR(Status
);
133 Status
= CommandInit();
134 ASSERT_EFI_ERROR(Status
);
137 // parse the command line
139 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
140 if (EFI_ERROR(Status
)) {
141 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
142 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
143 FreePool(ProblemParam
);
144 ShellStatus
= SHELL_INVALID_PARAMETER
;
150 // if more than 0 'value' parameters we have too many parameters
152 if (ShellCommandLineGetRawValue(Package
, 1) != NULL
){
154 // error for too many parameters
156 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
157 ShellStatus
= SHELL_INVALID_PARAMETER
;
160 // get the language if necessary
162 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
164 Language
= AllocateZeroPool(StrSize(Lang
));
165 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
166 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
167 ASSERT(Language
== NULL
);
168 // Language = AllocateZeroPool(10);
169 // AsciiSPrint(Language, 10, "en-us");
171 ASSERT(Language
== NULL
);
172 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
173 ShellCommandLineFreeVarList (Package
);
174 return (SHELL_INVALID_PARAMETER
);
181 ShellPrintHiiEx(-1, -1, Language
, STRING_TOKEN (STR_DEVICES_HEADER_LINES
), gShellDriver1HiiHandle
);
184 // loop through each handle
186 HandleList
= GetHandleListByProtocol(NULL
);
187 ASSERT(HandleList
!= NULL
);
188 for (HandleListWalker
= HandleList
189 ; HandleListWalker
!= NULL
&& *HandleListWalker
!= NULL
/*&& !EFI_ERROR(Status)*/
194 // get all the info on each handle
197 Status
= GetDeviceHandleInfo(*HandleListWalker
, &Type
, &Cfg
, &Diag
, &Parents
, &Devices
, &Children
, &Name
, Language
);
198 if (Parents
!= 0 || Devices
!= 0 || Children
!= 0) {
203 STRING_TOKEN (STR_DEVICES_ITEM_LINE
),
204 gShellDriver1HiiHandle
,
205 ConvertHandleToHandleIndex(*HandleListWalker
),
212 Name
!=NULL
?Name
:L
"<UNKNOWN>");
219 if (HandleList
!= NULL
) {
220 FreePool(HandleList
);
224 SHELL_FREE_NON_NULL(Language
);
225 ShellCommandLineFreeVarList (Package
);
227 return (ShellStatus
);