]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
ShellPkg/drivers: Show Image Name in non-SFO mode
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Drivers.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Drivers shell Driver1 function.\r
3\r
c011b6c9 4 (C) Copyright 2012-2015 Hewlett-Packard Development Company, L.P.<BR>\r
416d48f7 5 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
4ba49616 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellDriver1CommandsLib.h"\r
17\r
a29117bf
CP
18#define MAX_LEN_DRIVER_NAME 35\r
19\r
4ba49616 20STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
21 {L"-sfo", TypeFlag},\r
22 {L"-l", TypeValue},\r
23 {NULL, TypeMax}\r
24 };\r
25\r
361a8267 26/**\r
27 Get a device path (in text format) for a given handle.\r
28\r
29 @param[in] TheHandle The handle to get the device path for.\r
30\r
31 @retval NULL An error occured.\r
32 @return A pointer to the driver path as a string. The callee must \r
33 free this memory.\r
34**/\r
4ba49616 35CHAR16*\r
4ba49616 36GetDevicePathTextForHandle(\r
37 IN EFI_HANDLE TheHandle\r
38 )\r
39{\r
40 EFI_STATUS Status;\r
41 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
42 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
43 EFI_DEVICE_PATH_PROTOCOL *FinalPath;\r
44 CHAR16 *RetVal;\r
45\r
46 FinalPath = NULL;\r
47\r
48 Status = gBS->OpenProtocol (\r
49 TheHandle,\r
50 &gEfiLoadedImageProtocolGuid,\r
51 (VOID**)&LoadedImage,\r
52 gImageHandle,\r
53 NULL,\r
54 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
55 );\r
56 if (!EFI_ERROR (Status)) {\r
57 Status = gBS->OpenProtocol (\r
58 LoadedImage->DeviceHandle,\r
59 &gEfiDevicePathProtocolGuid,\r
60 (VOID**)&ImageDevicePath,\r
61 gImageHandle,\r
62 NULL,\r
63 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
64 );\r
65 if (!EFI_ERROR (Status)) {\r
66 FinalPath = AppendDevicePath (ImageDevicePath, LoadedImage->FilePath);\r
67 gBS->CloseProtocol(\r
68 LoadedImage->DeviceHandle,\r
69 &gEfiDevicePathProtocolGuid,\r
70 gImageHandle,\r
71 NULL);\r
72 }\r
73 gBS->CloseProtocol(\r
74 TheHandle,\r
75 &gEfiLoadedImageProtocolGuid,\r
76 gImageHandle,\r
77 NULL);\r
78 }\r
79\r
80 if (FinalPath == NULL) {\r
81 return (NULL);\r
82 }\r
83 RetVal = gEfiShellProtocol->GetFilePathFromDevicePath(FinalPath);\r
84 if (RetVal == NULL) {\r
863986b3 85 RetVal = ConvertDevicePathToText(FinalPath, TRUE, TRUE);\r
4ba49616 86 }\r
87 FreePool(FinalPath);\r
88 return (RetVal);\r
89}\r
90\r
361a8267 91/**\r
92 Determine if the given handle has Driver Configuration protocol.\r
93\r
94 @param[in] TheHandle The handle to the driver to test.\r
95\r
96 @retval TRUE The driver does have Driver Configuration.\r
97 @retval FALSE The driver does not have Driver Configuration.\r
98**/\r
4ba49616 99BOOLEAN\r
4ba49616 100ReturnDriverConfig(\r
101 IN CONST EFI_HANDLE TheHandle\r
102 )\r
103{\r
104 EFI_STATUS Status;\r
105 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverConfigurationProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
106 if (EFI_ERROR(Status)) {\r
107 return (FALSE);\r
108 }\r
109 return (TRUE);\r
110}\r
111\r
361a8267 112/**\r
113 Determine if the given handle has DriverDiagnostics protocol.\r
114\r
115 @param[in] TheHandle The handle to the driver to test.\r
116\r
117 @retval TRUE The driver does have Driver Diasgnostics.\r
118 @retval FALSE The driver does not have Driver Diagnostics.\r
119**/\r
4ba49616 120BOOLEAN\r
4ba49616 121ReturnDriverDiag(\r
122 IN CONST EFI_HANDLE TheHandle\r
123 )\r
124{\r
125 EFI_STATUS Status;\r
126 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
127 if (EFI_ERROR(Status)) {\r
128 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnosticsProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
129 if (EFI_ERROR(Status)) {\r
130 return (FALSE);\r
131 }\r
132 }\r
133 return (TRUE);\r
134}\r
135\r
361a8267 136/**\r
137 Finds and returns the version of the driver specified by TheHandle.\r
138\r
139 @param[in] TheHandle The driver handle to get the version of.\r
140\r
141 @return The version of the driver.\r
142 @retval 0xFFFFFFFF An error ocurred.\r
143**/\r
4ba49616 144UINT32\r
4ba49616 145ReturnDriverVersion(\r
146 IN CONST EFI_HANDLE TheHandle\r
147 )\r
148{\r
149 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
150 EFI_STATUS Status;\r
151 UINT32 RetVal;\r
152\r
153 RetVal = (UINT32)-1;\r
154\r
155 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverBindingProtocolGuid, (VOID**)&DriverBinding, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
156 if (!EFI_ERROR(Status)) {\r
157 RetVal = DriverBinding->Version;\r
158 gBS->CloseProtocol(TheHandle, &gEfiDriverBindingProtocolGuid, gImageHandle, NULL);\r
159 }\r
160 return (RetVal);\r
161}\r
162\r
416d48f7
HL
163/**\r
164 Get image name from Image Handle.\r
165\r
166 @param[in] Handle Image Handle\r
167\r
168 @return A pointer to the image name as a string.\r
169**/\r
170CHAR16 *\r
171GetImageNameFromHandle (\r
172 IN CONST EFI_HANDLE Handle\r
173 )\r
174{\r
175 EFI_STATUS Status;\r
176 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
177 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
178 EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
179 EFI_GUID *NameGuid;\r
180 CHAR16 *ImageName;\r
181 UINTN BufferSize;\r
182 UINT32 AuthenticationStatus;\r
183 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv2;\r
184\r
185 LoadedImage = NULL;\r
186 DriverBinding = NULL;\r
187 ImageName = NULL;\r
188\r
189 Status = gBS->OpenProtocol (\r
190 Handle,\r
191 &gEfiDriverBindingProtocolGuid,\r
192 (VOID **) &DriverBinding,\r
193 NULL,\r
194 NULL,\r
195 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
196 );\r
197 if (EFI_ERROR (Status)) {\r
198 return NULL;\r
199 }\r
200 Status = gBS->OpenProtocol (\r
201 DriverBinding->ImageHandle,\r
202 &gEfiLoadedImageProtocolGuid,\r
203 (VOID**)&LoadedImage,\r
204 gImageHandle,\r
205 NULL,\r
206 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
207 );\r
208 if (!EFI_ERROR (Status)) {\r
209 DevPathNode = LoadedImage->FilePath;\r
210 if (DevPathNode == NULL) {\r
211 return NULL;\r
212 }\r
213 while (!IsDevicePathEnd (DevPathNode)) {\r
214 NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevPathNode);\r
215 if (NameGuid != NULL) {\r
216 Status = gBS->HandleProtocol (\r
217 LoadedImage->DeviceHandle,\r
218 &gEfiFirmwareVolume2ProtocolGuid,\r
219 &Fv2\r
220 );\r
221 if (!EFI_ERROR (Status)) {\r
222 Status = Fv2->ReadSection (\r
223 Fv2,\r
224 NameGuid,\r
225 EFI_SECTION_USER_INTERFACE,\r
226 0,\r
227 (VOID **)&ImageName,\r
228 &BufferSize,\r
229 &AuthenticationStatus\r
230 );\r
231 if (!EFI_ERROR (Status)) {\r
232 break;\r
233 }\r
234 ImageName = NULL;\r
235 }\r
236 }\r
237 //\r
238 // Next device path node\r
239 //\r
240 DevPathNode = NextDevicePathNode (DevPathNode);\r
241 }\r
242 if (ImageName == NULL) {\r
243 ImageName = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);\r
244 }\r
245 }\r
246 return ImageName;\r
247}\r
248\r
361a8267 249/**\r
250 Function for 'drivers' command.\r
251\r
252 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
253 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
254**/\r
4ba49616 255SHELL_STATUS\r
256EFIAPI\r
257ShellCommandRunDrivers (\r
258 IN EFI_HANDLE ImageHandle,\r
259 IN EFI_SYSTEM_TABLE *SystemTable\r
260 )\r
261{\r
262 EFI_STATUS Status;\r
263 LIST_ENTRY *Package;\r
264 CHAR16 *ProblemParam;\r
265 SHELL_STATUS ShellStatus;\r
266 CHAR8 *Language;\r
267 CONST CHAR16 *Lang;\r
268 EFI_HANDLE *HandleList;\r
269 EFI_HANDLE *HandleWalker;\r
270 UINTN ChildCount;\r
271 UINTN DeviceCount;\r
272 CHAR16 *Temp2;\r
a29117bf
CP
273 CONST CHAR16 *FullDriverName;\r
274 CHAR16 *TruncatedDriverName;\r
416d48f7 275 CHAR16 *ImageName;\r
4ba49616 276 CHAR16 *FormatString;\r
277 UINT32 DriverVersion;\r
278 BOOLEAN DriverConfig;\r
279 BOOLEAN DriverDiag;\r
a29117bf 280 BOOLEAN SfoFlag;\r
4ba49616 281\r
282 ShellStatus = SHELL_SUCCESS;\r
283 Status = EFI_SUCCESS;\r
284 Language = NULL;\r
285 FormatString = NULL;\r
a29117bf 286 SfoFlag = FALSE;\r
4ba49616 287\r
288 //\r
289 // initialize the shell lib (we must be in non-auto-init...)\r
290 //\r
291 Status = ShellInitialize();\r
292 ASSERT_EFI_ERROR(Status);\r
293\r
294 Status = CommandInit();\r
295 ASSERT_EFI_ERROR(Status);\r
296\r
297 //\r
298 // parse the command line\r
299 //\r
300 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
301 if (EFI_ERROR(Status)) {\r
302 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 303 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drivers", ProblemParam); \r
4ba49616 304 FreePool(ProblemParam);\r
305 ShellStatus = SHELL_INVALID_PARAMETER;\r
306 } else {\r
307 ASSERT(FALSE);\r
308 }\r
309 } else {\r
310 if (ShellCommandLineGetCount(Package) > 1) {\r
bc280720 311 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drivers"); \r
4ba49616 312 ShellStatus = SHELL_INVALID_PARAMETER;\r
313 } else {\r
36384ceb
ED
314 if (ShellCommandLineGetFlag(Package, L"-l")){\r
315 Lang = ShellCommandLineGetValue(Package, L"-l");\r
316 if (Lang != NULL) {\r
317 Language = AllocateZeroPool(StrSize(Lang));\r
318 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
319 } else {\r
320 ASSERT(Language == NULL);\r
bc280720 321 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drivers", L"-l"); \r
36384ceb
ED
322 ShellCommandLineFreeVarList (Package);\r
323 return (SHELL_INVALID_PARAMETER);\r
324 }\r
4ba49616 325 }\r
326\r
a29117bf
CP
327 if (ShellCommandLineGetFlag (Package, L"-sfo")) {\r
328 SfoFlag = TRUE;\r
329 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE_SFO), Language);\r
330 //\r
331 // print the SFO header\r
332 //\r
333 ShellPrintHiiEx (\r
334 -1,\r
335 -1,\r
336 Language,\r
337 STRING_TOKEN (STR_GEN_SFO_HEADER),\r
338 gShellDriver1HiiHandle,\r
339 L"drivers");\r
4ba49616 340 } else {\r
a29117bf 341 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE), Language);\r
4ba49616 342 //\r
343 // print the header row\r
344 //\r
345 ShellPrintHiiEx(\r
346 -1,\r
347 -1,\r
348 Language,\r
a29117bf 349 STRING_TOKEN (STR_DRIVERS_HEADER_LINES),\r
4ba49616 350 gShellDriver1HiiHandle);\r
351 }\r
352\r
353 HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
354 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){\r
a29117bf
CP
355 ChildCount = 0;\r
356 DeviceCount = 0;\r
357 Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL);\r
358 Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL);\r
359 Temp2 = GetDevicePathTextForHandle(*HandleWalker);\r
360 DriverVersion = ReturnDriverVersion(*HandleWalker);\r
361 DriverConfig = ReturnDriverConfig(*HandleWalker);\r
362 DriverDiag = ReturnDriverDiag (*HandleWalker);\r
363 FullDriverName = GetStringNameFromHandle(*HandleWalker, Language);\r
416d48f7 364 ImageName = GetImageNameFromHandle (*HandleWalker);\r
a29117bf
CP
365\r
366 TruncatedDriverName = NULL;\r
367 if (!SfoFlag && (FullDriverName != NULL)) {\r
368 TruncatedDriverName = AllocateZeroPool ((MAX_LEN_DRIVER_NAME + 1) * sizeof (CHAR16));\r
a8d6ea0d 369 StrnCpyS (TruncatedDriverName, MAX_LEN_DRIVER_NAME + 1, FullDriverName, MAX_LEN_DRIVER_NAME);\r
a29117bf 370 }\r
4ba49616 371\r
372 ShellPrintEx(\r
373 -1,\r
374 -1,\r
375 FormatString,\r
376 ConvertHandleToHandleIndex(*HandleWalker),\r
377 DriverVersion,\r
378 ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'),\r
379 DriverConfig?L'Y':L'N',\r
380 DriverDiag?L'Y':L'N',\r
381 DeviceCount,\r
382 ChildCount,\r
a29117bf 383 SfoFlag?FullDriverName:TruncatedDriverName,\r
416d48f7
HL
384 SfoFlag ? (Temp2 == NULL ? L"" : Temp2) : (ImageName == NULL ? L"" : ImageName)\r
385 );\r
a29117bf
CP
386 if (TruncatedDriverName != NULL) {\r
387 FreePool (TruncatedDriverName);\r
388 }\r
4ba49616 389 if (Temp2 != NULL) {\r
390 FreePool(Temp2);\r
391 }\r
416d48f7
HL
392 if (ImageName != NULL) {\r
393 FreePool (ImageName);\r
394 }\r
395\r
54206ae7
TS
396 if (ShellGetExecutionBreakFlag ()) {\r
397 ShellStatus = SHELL_ABORTED;\r
398 break;\r
399 }\r
4ba49616 400 }\r
401 }\r
402 SHELL_FREE_NON_NULL(Language);\r
403 ShellCommandLineFreeVarList (Package);\r
404 SHELL_FREE_NON_NULL(FormatString);\r
405 }\r
406\r
407 return (ShellStatus);\r
408}\r