2 Main file for Drivers shell Driver1 function.
4 (C) Copyright 2012-2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2015, 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 #define MAX_LEN_DRIVER_NAME 35
20 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
27 Get a device path (in text format) for a given handle.
29 @param[in] TheHandle The handle to get the device path for.
31 @retval NULL An error occured.
32 @return A pointer to the driver path as a string. The callee must
36 GetDevicePathTextForHandle(
37 IN EFI_HANDLE TheHandle
41 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
42 EFI_DEVICE_PATH_PROTOCOL
*ImageDevicePath
;
43 EFI_DEVICE_PATH_PROTOCOL
*FinalPath
;
48 Status
= gBS
->OpenProtocol (
50 &gEfiLoadedImageProtocolGuid
,
54 EFI_OPEN_PROTOCOL_GET_PROTOCOL
56 if (!EFI_ERROR (Status
)) {
57 Status
= gBS
->OpenProtocol (
58 LoadedImage
->DeviceHandle
,
59 &gEfiDevicePathProtocolGuid
,
60 (VOID
**)&ImageDevicePath
,
63 EFI_OPEN_PROTOCOL_GET_PROTOCOL
65 if (!EFI_ERROR (Status
)) {
66 FinalPath
= AppendDevicePath (ImageDevicePath
, LoadedImage
->FilePath
);
68 LoadedImage
->DeviceHandle
,
69 &gEfiDevicePathProtocolGuid
,
75 &gEfiLoadedImageProtocolGuid
,
80 if (FinalPath
== NULL
) {
83 RetVal
= gEfiShellProtocol
->GetFilePathFromDevicePath(FinalPath
);
85 RetVal
= ConvertDevicePathToText(FinalPath
, TRUE
, TRUE
);
92 Determine if the given handle has Driver Configuration protocol.
94 @param[in] TheHandle The handle to the driver to test.
96 @retval TRUE The driver does have Driver Configuration.
97 @retval FALSE The driver does not have Driver Configuration.
101 IN CONST EFI_HANDLE TheHandle
105 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverConfigurationProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
106 if (EFI_ERROR(Status
)) {
113 Determine if the given handle has DriverDiagnostics protocol.
115 @param[in] TheHandle The handle to the driver to test.
117 @retval TRUE The driver does have Driver Diasgnostics.
118 @retval FALSE The driver does not have Driver Diagnostics.
122 IN CONST EFI_HANDLE TheHandle
126 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
127 if (EFI_ERROR(Status
)) {
128 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverDiagnosticsProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
129 if (EFI_ERROR(Status
)) {
137 Finds and returns the version of the driver specified by TheHandle.
139 @param[in] TheHandle The driver handle to get the version of.
141 @return The version of the driver.
142 @retval 0xFFFFFFFF An error ocurred.
146 IN CONST EFI_HANDLE TheHandle
149 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
155 Status
= gBS
->OpenProtocol((EFI_HANDLE
)TheHandle
, &gEfiDriverBindingProtocolGuid
, (VOID
**)&DriverBinding
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
156 if (!EFI_ERROR(Status
)) {
157 RetVal
= DriverBinding
->Version
;
158 gBS
->CloseProtocol(TheHandle
, &gEfiDriverBindingProtocolGuid
, gImageHandle
, NULL
);
164 Function for 'drivers' command.
166 @param[in] ImageHandle Handle to the Image (NULL if Internal).
167 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
171 ShellCommandRunDrivers (
172 IN EFI_HANDLE ImageHandle
,
173 IN EFI_SYSTEM_TABLE
*SystemTable
178 CHAR16
*ProblemParam
;
179 SHELL_STATUS ShellStatus
;
182 EFI_HANDLE
*HandleList
;
183 EFI_HANDLE
*HandleWalker
;
187 CONST CHAR16
*FullDriverName
;
188 CHAR16
*TruncatedDriverName
;
189 CHAR16
*FormatString
;
190 UINT32 DriverVersion
;
191 BOOLEAN DriverConfig
;
195 ShellStatus
= SHELL_SUCCESS
;
196 Status
= EFI_SUCCESS
;
202 // initialize the shell lib (we must be in non-auto-init...)
204 Status
= ShellInitialize();
205 ASSERT_EFI_ERROR(Status
);
207 Status
= CommandInit();
208 ASSERT_EFI_ERROR(Status
);
211 // parse the command line
213 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
214 if (EFI_ERROR(Status
)) {
215 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
216 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"drivers", ProblemParam
);
217 FreePool(ProblemParam
);
218 ShellStatus
= SHELL_INVALID_PARAMETER
;
223 if (ShellCommandLineGetCount(Package
) > 1) {
224 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"drivers");
225 ShellStatus
= SHELL_INVALID_PARAMETER
;
227 if (ShellCommandLineGetFlag(Package
, L
"-l")){
228 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
230 Language
= AllocateZeroPool(StrSize(Lang
));
231 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
233 ASSERT(Language
== NULL
);
234 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drivers", L
"-l");
235 ShellCommandLineFreeVarList (Package
);
236 return (SHELL_INVALID_PARAMETER
);
240 if (ShellCommandLineGetFlag (Package
, L
"-sfo")) {
242 FormatString
= HiiGetString (gShellDriver1HiiHandle
, STRING_TOKEN (STR_DRIVERS_ITEM_LINE_SFO
), Language
);
244 // print the SFO header
250 STRING_TOKEN (STR_GEN_SFO_HEADER
),
251 gShellDriver1HiiHandle
,
254 FormatString
= HiiGetString (gShellDriver1HiiHandle
, STRING_TOKEN (STR_DRIVERS_ITEM_LINE
), Language
);
256 // print the header row
262 STRING_TOKEN (STR_DRIVERS_HEADER_LINES
),
263 gShellDriver1HiiHandle
);
266 HandleList
= GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid
);
267 for (HandleWalker
= HandleList
; HandleWalker
!= NULL
&& *HandleWalker
!= NULL
; HandleWalker
++){
270 Status
= ParseHandleDatabaseForChildDevices (*HandleWalker
, &ChildCount
, NULL
);
271 Status
= PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker
, &DeviceCount
, NULL
);
272 Temp2
= GetDevicePathTextForHandle(*HandleWalker
);
273 DriverVersion
= ReturnDriverVersion(*HandleWalker
);
274 DriverConfig
= ReturnDriverConfig(*HandleWalker
);
275 DriverDiag
= ReturnDriverDiag (*HandleWalker
);
276 FullDriverName
= GetStringNameFromHandle(*HandleWalker
, Language
);
278 TruncatedDriverName
= NULL
;
279 if (!SfoFlag
&& (FullDriverName
!= NULL
)) {
280 TruncatedDriverName
= AllocateZeroPool ((MAX_LEN_DRIVER_NAME
+ 1) * sizeof (CHAR16
));
281 StrnCpyS (TruncatedDriverName
, MAX_LEN_DRIVER_NAME
+ 1, FullDriverName
, MAX_LEN_DRIVER_NAME
);
288 ConvertHandleToHandleIndex(*HandleWalker
),
290 ChildCount
> 0?L
'B':(DeviceCount
> 0?L
'D':L
'?'),
291 DriverConfig
?L
'Y':L
'N',
292 DriverDiag
?L
'Y':L
'N',
295 SfoFlag
?FullDriverName
:TruncatedDriverName
,
296 Temp2
==NULL
?L
"":Temp2
298 if (TruncatedDriverName
!= NULL
) {
299 FreePool (TruncatedDriverName
);
305 if (ShellGetExecutionBreakFlag ()) {
306 ShellStatus
= SHELL_ABORTED
;
311 SHELL_FREE_NON_NULL(Language
);
312 ShellCommandLineFreeVarList (Package
);
313 SHELL_FREE_NON_NULL(FormatString
);
316 return (ShellStatus
);