]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
ShellPkg: Fixes and updates for the 'devices' command
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Drivers.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Drivers shell Driver1 function.\r
3\r
a29117bf 4 (C) Copyright 2012-2014, Hewlett-Packard Development Company, L.P.\r
863986b3 5 Copyright (c) 2010 - 2013, 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
36EFIAPI\r
37GetDevicePathTextForHandle(\r
38 IN EFI_HANDLE TheHandle\r
39 )\r
40{\r
41 EFI_STATUS Status;\r
42 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
43 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
44 EFI_DEVICE_PATH_PROTOCOL *FinalPath;\r
45 CHAR16 *RetVal;\r
46\r
47 FinalPath = NULL;\r
48\r
49 Status = gBS->OpenProtocol (\r
50 TheHandle,\r
51 &gEfiLoadedImageProtocolGuid,\r
52 (VOID**)&LoadedImage,\r
53 gImageHandle,\r
54 NULL,\r
55 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
56 );\r
57 if (!EFI_ERROR (Status)) {\r
58 Status = gBS->OpenProtocol (\r
59 LoadedImage->DeviceHandle,\r
60 &gEfiDevicePathProtocolGuid,\r
61 (VOID**)&ImageDevicePath,\r
62 gImageHandle,\r
63 NULL,\r
64 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
65 );\r
66 if (!EFI_ERROR (Status)) {\r
67 FinalPath = AppendDevicePath (ImageDevicePath, LoadedImage->FilePath);\r
68 gBS->CloseProtocol(\r
69 LoadedImage->DeviceHandle,\r
70 &gEfiDevicePathProtocolGuid,\r
71 gImageHandle,\r
72 NULL);\r
73 }\r
74 gBS->CloseProtocol(\r
75 TheHandle,\r
76 &gEfiLoadedImageProtocolGuid,\r
77 gImageHandle,\r
78 NULL);\r
79 }\r
80\r
81 if (FinalPath == NULL) {\r
82 return (NULL);\r
83 }\r
84 RetVal = gEfiShellProtocol->GetFilePathFromDevicePath(FinalPath);\r
85 if (RetVal == NULL) {\r
863986b3 86 RetVal = ConvertDevicePathToText(FinalPath, TRUE, TRUE);\r
4ba49616 87 }\r
88 FreePool(FinalPath);\r
89 return (RetVal);\r
90}\r
91\r
361a8267 92/**\r
93 Determine if the given handle has Driver Configuration protocol.\r
94\r
95 @param[in] TheHandle The handle to the driver to test.\r
96\r
97 @retval TRUE The driver does have Driver Configuration.\r
98 @retval FALSE The driver does not have Driver Configuration.\r
99**/\r
4ba49616 100BOOLEAN\r
101EFIAPI\r
102ReturnDriverConfig(\r
103 IN CONST EFI_HANDLE TheHandle\r
104 )\r
105{\r
106 EFI_STATUS Status;\r
107 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverConfigurationProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
108 if (EFI_ERROR(Status)) {\r
109 return (FALSE);\r
110 }\r
111 return (TRUE);\r
112}\r
113\r
361a8267 114/**\r
115 Determine if the given handle has DriverDiagnostics protocol.\r
116\r
117 @param[in] TheHandle The handle to the driver to test.\r
118\r
119 @retval TRUE The driver does have Driver Diasgnostics.\r
120 @retval FALSE The driver does not have Driver Diagnostics.\r
121**/\r
4ba49616 122BOOLEAN\r
123EFIAPI\r
124ReturnDriverDiag(\r
125 IN CONST EFI_HANDLE TheHandle\r
126 )\r
127{\r
128 EFI_STATUS Status;\r
129 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
130 if (EFI_ERROR(Status)) {\r
131 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnosticsProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
132 if (EFI_ERROR(Status)) {\r
133 return (FALSE);\r
134 }\r
135 }\r
136 return (TRUE);\r
137}\r
138\r
361a8267 139/**\r
140 Finds and returns the version of the driver specified by TheHandle.\r
141\r
142 @param[in] TheHandle The driver handle to get the version of.\r
143\r
144 @return The version of the driver.\r
145 @retval 0xFFFFFFFF An error ocurred.\r
146**/\r
4ba49616 147UINT32\r
148EFIAPI\r
149ReturnDriverVersion(\r
150 IN CONST EFI_HANDLE TheHandle\r
151 )\r
152{\r
153 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
154 EFI_STATUS Status;\r
155 UINT32 RetVal;\r
156\r
157 RetVal = (UINT32)-1;\r
158\r
159 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverBindingProtocolGuid, (VOID**)&DriverBinding, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
160 if (!EFI_ERROR(Status)) {\r
161 RetVal = DriverBinding->Version;\r
162 gBS->CloseProtocol(TheHandle, &gEfiDriverBindingProtocolGuid, gImageHandle, NULL);\r
163 }\r
164 return (RetVal);\r
165}\r
166\r
361a8267 167/**\r
168 Function for 'drivers' command.\r
169\r
170 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
171 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
172**/\r
4ba49616 173SHELL_STATUS\r
174EFIAPI\r
175ShellCommandRunDrivers (\r
176 IN EFI_HANDLE ImageHandle,\r
177 IN EFI_SYSTEM_TABLE *SystemTable\r
178 )\r
179{\r
180 EFI_STATUS Status;\r
181 LIST_ENTRY *Package;\r
182 CHAR16 *ProblemParam;\r
183 SHELL_STATUS ShellStatus;\r
184 CHAR8 *Language;\r
185 CONST CHAR16 *Lang;\r
186 EFI_HANDLE *HandleList;\r
187 EFI_HANDLE *HandleWalker;\r
188 UINTN ChildCount;\r
189 UINTN DeviceCount;\r
190 CHAR16 *Temp2;\r
a29117bf
CP
191 CONST CHAR16 *FullDriverName;\r
192 CHAR16 *TruncatedDriverName;\r
4ba49616 193 CHAR16 *FormatString;\r
194 UINT32 DriverVersion;\r
195 BOOLEAN DriverConfig;\r
196 BOOLEAN DriverDiag;\r
a29117bf 197 BOOLEAN SfoFlag;\r
4ba49616 198\r
199 ShellStatus = SHELL_SUCCESS;\r
200 Status = EFI_SUCCESS;\r
201 Language = NULL;\r
202 FormatString = NULL;\r
a29117bf 203 SfoFlag = FALSE;\r
4ba49616 204\r
205 //\r
206 // initialize the shell lib (we must be in non-auto-init...)\r
207 //\r
208 Status = ShellInitialize();\r
209 ASSERT_EFI_ERROR(Status);\r
210\r
211 Status = CommandInit();\r
212 ASSERT_EFI_ERROR(Status);\r
213\r
214 //\r
215 // parse the command line\r
216 //\r
217 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
218 if (EFI_ERROR(Status)) {\r
219 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
220 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
221 FreePool(ProblemParam);\r
222 ShellStatus = SHELL_INVALID_PARAMETER;\r
223 } else {\r
224 ASSERT(FALSE);\r
225 }\r
226 } else {\r
227 if (ShellCommandLineGetCount(Package) > 1) {\r
228 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
229 ShellStatus = SHELL_INVALID_PARAMETER;\r
230 } else {\r
36384ceb
ED
231 if (ShellCommandLineGetFlag(Package, L"-l")){\r
232 Lang = ShellCommandLineGetValue(Package, L"-l");\r
233 if (Lang != NULL) {\r
234 Language = AllocateZeroPool(StrSize(Lang));\r
235 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
236 } else {\r
237 ASSERT(Language == NULL);\r
238 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
239 ShellCommandLineFreeVarList (Package);\r
240 return (SHELL_INVALID_PARAMETER);\r
241 }\r
4ba49616 242 }\r
243\r
a29117bf
CP
244 if (ShellCommandLineGetFlag (Package, L"-sfo")) {\r
245 SfoFlag = TRUE;\r
246 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE_SFO), Language);\r
247 //\r
248 // print the SFO header\r
249 //\r
250 ShellPrintHiiEx (\r
251 -1,\r
252 -1,\r
253 Language,\r
254 STRING_TOKEN (STR_GEN_SFO_HEADER),\r
255 gShellDriver1HiiHandle,\r
256 L"drivers");\r
4ba49616 257 } else {\r
a29117bf 258 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE), Language);\r
4ba49616 259 //\r
260 // print the header row\r
261 //\r
262 ShellPrintHiiEx(\r
263 -1,\r
264 -1,\r
265 Language,\r
a29117bf 266 STRING_TOKEN (STR_DRIVERS_HEADER_LINES),\r
4ba49616 267 gShellDriver1HiiHandle);\r
268 }\r
269\r
270 HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
271 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){\r
a29117bf
CP
272 ChildCount = 0;\r
273 DeviceCount = 0;\r
274 Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL);\r
275 Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL);\r
276 Temp2 = GetDevicePathTextForHandle(*HandleWalker);\r
277 DriverVersion = ReturnDriverVersion(*HandleWalker);\r
278 DriverConfig = ReturnDriverConfig(*HandleWalker);\r
279 DriverDiag = ReturnDriverDiag (*HandleWalker);\r
280 FullDriverName = GetStringNameFromHandle(*HandleWalker, Language);\r
281\r
282 TruncatedDriverName = NULL;\r
283 if (!SfoFlag && (FullDriverName != NULL)) {\r
284 TruncatedDriverName = AllocateZeroPool ((MAX_LEN_DRIVER_NAME + 1) * sizeof (CHAR16));\r
285 StrnCpy (TruncatedDriverName, FullDriverName, MAX_LEN_DRIVER_NAME);\r
286 }\r
4ba49616 287\r
288 ShellPrintEx(\r
289 -1,\r
290 -1,\r
291 FormatString,\r
292 ConvertHandleToHandleIndex(*HandleWalker),\r
293 DriverVersion,\r
294 ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'),\r
295 DriverConfig?L'Y':L'N',\r
296 DriverDiag?L'Y':L'N',\r
297 DeviceCount,\r
298 ChildCount,\r
a29117bf 299 SfoFlag?FullDriverName:TruncatedDriverName,\r
4ba49616 300 Temp2==NULL?L"":Temp2\r
301 );\r
a29117bf
CP
302 if (TruncatedDriverName != NULL) {\r
303 FreePool (TruncatedDriverName);\r
304 }\r
4ba49616 305 if (Temp2 != NULL) {\r
306 FreePool(Temp2);\r
307 }\r
308 }\r
309 }\r
310 SHELL_FREE_NON_NULL(Language);\r
311 ShellCommandLineFreeVarList (Package);\r
312 SHELL_FREE_NON_NULL(FormatString);\r
313 }\r
314\r
315 return (ShellStatus);\r
316}\r