]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
ShellPkg/dh: Support dump from GUID and "decode" parameter
[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
e75390f0 5 Copyright (c) 2010 - 2015, 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
361a8267 163/**\r
164 Function for 'drivers' command.\r
165\r
166 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
167 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
168**/\r
4ba49616 169SHELL_STATUS\r
170EFIAPI\r
171ShellCommandRunDrivers (\r
172 IN EFI_HANDLE ImageHandle,\r
173 IN EFI_SYSTEM_TABLE *SystemTable\r
174 )\r
175{\r
176 EFI_STATUS Status;\r
177 LIST_ENTRY *Package;\r
178 CHAR16 *ProblemParam;\r
179 SHELL_STATUS ShellStatus;\r
180 CHAR8 *Language;\r
181 CONST CHAR16 *Lang;\r
182 EFI_HANDLE *HandleList;\r
183 EFI_HANDLE *HandleWalker;\r
184 UINTN ChildCount;\r
185 UINTN DeviceCount;\r
186 CHAR16 *Temp2;\r
a29117bf
CP
187 CONST CHAR16 *FullDriverName;\r
188 CHAR16 *TruncatedDriverName;\r
4ba49616 189 CHAR16 *FormatString;\r
190 UINT32 DriverVersion;\r
191 BOOLEAN DriverConfig;\r
192 BOOLEAN DriverDiag;\r
a29117bf 193 BOOLEAN SfoFlag;\r
4ba49616 194\r
195 ShellStatus = SHELL_SUCCESS;\r
196 Status = EFI_SUCCESS;\r
197 Language = NULL;\r
198 FormatString = NULL;\r
a29117bf 199 SfoFlag = FALSE;\r
4ba49616 200\r
201 //\r
202 // initialize the shell lib (we must be in non-auto-init...)\r
203 //\r
204 Status = ShellInitialize();\r
205 ASSERT_EFI_ERROR(Status);\r
206\r
207 Status = CommandInit();\r
208 ASSERT_EFI_ERROR(Status);\r
209\r
210 //\r
211 // parse the command line\r
212 //\r
213 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
214 if (EFI_ERROR(Status)) {\r
215 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 216 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drivers", ProblemParam); \r
4ba49616 217 FreePool(ProblemParam);\r
218 ShellStatus = SHELL_INVALID_PARAMETER;\r
219 } else {\r
220 ASSERT(FALSE);\r
221 }\r
222 } else {\r
223 if (ShellCommandLineGetCount(Package) > 1) {\r
bc280720 224 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drivers"); \r
4ba49616 225 ShellStatus = SHELL_INVALID_PARAMETER;\r
226 } else {\r
36384ceb
ED
227 if (ShellCommandLineGetFlag(Package, L"-l")){\r
228 Lang = ShellCommandLineGetValue(Package, L"-l");\r
229 if (Lang != NULL) {\r
230 Language = AllocateZeroPool(StrSize(Lang));\r
231 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
232 } else {\r
233 ASSERT(Language == NULL);\r
bc280720 234 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drivers", L"-l"); \r
36384ceb
ED
235 ShellCommandLineFreeVarList (Package);\r
236 return (SHELL_INVALID_PARAMETER);\r
237 }\r
4ba49616 238 }\r
239\r
a29117bf
CP
240 if (ShellCommandLineGetFlag (Package, L"-sfo")) {\r
241 SfoFlag = TRUE;\r
242 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE_SFO), Language);\r
243 //\r
244 // print the SFO header\r
245 //\r
246 ShellPrintHiiEx (\r
247 -1,\r
248 -1,\r
249 Language,\r
250 STRING_TOKEN (STR_GEN_SFO_HEADER),\r
251 gShellDriver1HiiHandle,\r
252 L"drivers");\r
4ba49616 253 } else {\r
a29117bf 254 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE), Language);\r
4ba49616 255 //\r
256 // print the header row\r
257 //\r
258 ShellPrintHiiEx(\r
259 -1,\r
260 -1,\r
261 Language,\r
a29117bf 262 STRING_TOKEN (STR_DRIVERS_HEADER_LINES),\r
4ba49616 263 gShellDriver1HiiHandle);\r
264 }\r
265\r
266 HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
267 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){\r
a29117bf
CP
268 ChildCount = 0;\r
269 DeviceCount = 0;\r
270 Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL);\r
271 Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL);\r
272 Temp2 = GetDevicePathTextForHandle(*HandleWalker);\r
273 DriverVersion = ReturnDriverVersion(*HandleWalker);\r
274 DriverConfig = ReturnDriverConfig(*HandleWalker);\r
275 DriverDiag = ReturnDriverDiag (*HandleWalker);\r
276 FullDriverName = GetStringNameFromHandle(*HandleWalker, Language);\r
277\r
278 TruncatedDriverName = NULL;\r
279 if (!SfoFlag && (FullDriverName != NULL)) {\r
280 TruncatedDriverName = AllocateZeroPool ((MAX_LEN_DRIVER_NAME + 1) * sizeof (CHAR16));\r
a8d6ea0d 281 StrnCpyS (TruncatedDriverName, MAX_LEN_DRIVER_NAME + 1, FullDriverName, MAX_LEN_DRIVER_NAME);\r
a29117bf 282 }\r
4ba49616 283\r
284 ShellPrintEx(\r
285 -1,\r
286 -1,\r
287 FormatString,\r
288 ConvertHandleToHandleIndex(*HandleWalker),\r
289 DriverVersion,\r
290 ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'),\r
291 DriverConfig?L'Y':L'N',\r
292 DriverDiag?L'Y':L'N',\r
293 DeviceCount,\r
294 ChildCount,\r
a29117bf 295 SfoFlag?FullDriverName:TruncatedDriverName,\r
4ba49616 296 Temp2==NULL?L"":Temp2\r
297 );\r
a29117bf
CP
298 if (TruncatedDriverName != NULL) {\r
299 FreePool (TruncatedDriverName);\r
300 }\r
4ba49616 301 if (Temp2 != NULL) {\r
302 FreePool(Temp2);\r
303 }\r
54206ae7
TS
304 \r
305 if (ShellGetExecutionBreakFlag ()) {\r
306 ShellStatus = SHELL_ABORTED;\r
307 break;\r
308 }\r
4ba49616 309 }\r
310 }\r
311 SHELL_FREE_NON_NULL(Language);\r
312 ShellCommandLineFreeVarList (Package);\r
313 SHELL_FREE_NON_NULL(FormatString);\r
314 }\r
315\r
316 return (ShellStatus);\r
317}\r