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