2 Main file for Drivers 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"
17 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
25 GetDevicePathTextForHandle(
26 IN EFI_HANDLE TheHandle
30 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
31 EFI_DEVICE_PATH_PROTOCOL
*ImageDevicePath
;
32 EFI_DEVICE_PATH_PROTOCOL
*FinalPath
;
37 Status
= gBS
->OpenProtocol (
39 &gEfiLoadedImageProtocolGuid
,
43 EFI_OPEN_PROTOCOL_GET_PROTOCOL
45 if (!EFI_ERROR (Status
)) {
46 Status
= gBS
->OpenProtocol (
47 LoadedImage
->DeviceHandle
,
48 &gEfiDevicePathProtocolGuid
,
49 (VOID
**)&ImageDevicePath
,
52 EFI_OPEN_PROTOCOL_GET_PROTOCOL
54 if (!EFI_ERROR (Status
)) {
55 FinalPath
= AppendDevicePath (ImageDevicePath
, LoadedImage
->FilePath
);
57 LoadedImage
->DeviceHandle
,
58 &gEfiDevicePathProtocolGuid
,
64 &gEfiLoadedImageProtocolGuid
,
69 if (FinalPath
== NULL
) {
72 RetVal
= gEfiShellProtocol
->GetFilePathFromDevicePath(FinalPath
);
74 RetVal
= gDevPathToText
->ConvertDevicePathToText(FinalPath
, TRUE
, TRUE
);
83 IN CONST EFI_HANDLE TheHandle
87 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
88 if (EFI_ERROR(Status
)) {
97 IN CONST EFI_HANDLE TheHandle
101 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
102 if (EFI_ERROR(Status
)) {
103 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
104 if (EFI_ERROR(Status
)) {
114 IN CONST EFI_HANDLE TheHandle
117 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
123 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverBindingProtocolGuid
, (VOID
**)&DriverBinding
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
124 if (!EFI_ERROR(Status
)) {
125 RetVal
= DriverBinding
->Version
;
126 gBS
->CloseProtocol(TheHandle
, &gEfiDriverBindingProtocolGuid
, gImageHandle
, NULL
);
133 ShellCommandRunDrivers (
134 IN EFI_HANDLE ImageHandle
,
135 IN EFI_SYSTEM_TABLE
*SystemTable
140 CHAR16
*ProblemParam
;
141 SHELL_STATUS ShellStatus
;
144 EFI_HANDLE
*HandleList
;
145 EFI_HANDLE
*HandleWalker
;
149 CHAR16
*FormatString
;
150 UINT32 DriverVersion
;
151 BOOLEAN DriverConfig
;
154 ShellStatus
= SHELL_SUCCESS
;
155 Status
= EFI_SUCCESS
;
160 // initialize the shell lib (we must be in non-auto-init...)
162 Status
= ShellInitialize();
163 ASSERT_EFI_ERROR(Status
);
165 Status
= CommandInit();
166 ASSERT_EFI_ERROR(Status
);
169 // parse the command line
171 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
172 if (EFI_ERROR(Status
)) {
173 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
174 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
175 FreePool(ProblemParam
);
176 ShellStatus
= SHELL_INVALID_PARAMETER
;
181 if (ShellCommandLineGetCount(Package
) > 1) {
182 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
183 ShellStatus
= SHELL_INVALID_PARAMETER
;
185 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
187 Language
= AllocateZeroPool(StrSize(Lang
));
188 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
189 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
190 ASSERT(Language
== NULL
);
191 // Language = AllocateZeroPool(10);
192 // AsciiSPrint(Language, 10, "en-us");
194 ASSERT(Language
== NULL
);
195 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
196 ShellCommandLineFreeVarList (Package
);
197 return (SHELL_INVALID_PARAMETER
);
200 if (ShellCommandLineGetFlag(Package
, L
"-sfo")) {
201 FormatString
= HiiGetString(gShellDriver1HiiHandle
, STRING_TOKEN(STR_DRIVERS_ITEM_LINE_SFO
), Language
);
203 FormatString
= HiiGetString(gShellDriver1HiiHandle
, STRING_TOKEN(STR_DRIVERS_ITEM_LINE
), Language
);
205 // print the header row
211 STRING_TOKEN(STR_DRIVERS_HEADER_LINES
),
212 gShellDriver1HiiHandle
);
215 HandleList
= GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid
);
216 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
; HandleWalker
++){
219 Status
= ParseHandleDatabaseForChildDevices (*HandleWalker
, &ChildCount
, NULL
);
220 Status
= PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker
, &DeviceCount
, NULL
);
221 Temp2
= GetDevicePathTextForHandle(*HandleWalker
);
222 DriverVersion
= ReturnDriverVersion(*HandleWalker
);
223 DriverConfig
= ReturnDriverConfig(*HandleWalker
);
224 DriverDiag
= ReturnDriverDiag (*HandleWalker
);
225 Lang
= GetStringNameFromHandle(*HandleWalker
, Language
==NULL
?"en":Language
);
231 ConvertHandleToHandleIndex(*HandleWalker
),
233 ChildCount
> 0?L
'B':(DeviceCount
> 0?L
'D':L
'?'),
234 DriverConfig
?L
'Y':L
'N',
235 DriverDiag
?L
'Y':L
'N',
239 Temp2
==NULL
?L
"":Temp2
246 SHELL_FREE_NON_NULL(Language
);
247 ShellCommandLineFreeVarList (Package
);
248 SHELL_FREE_NON_NULL(FormatString
);
251 return (ShellStatus
);