]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
Update all the code to consume the ConvertDevicePathToText, ConvertDevicePathNodeToTe...
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Drivers.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Drivers shell Driver1 function.\r
3\r
863986b3 4 Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
4ba49616 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDriver1CommandsLib.h"\r
16\r
17STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
18 {L"-sfo", TypeFlag},\r
19 {L"-l", TypeValue},\r
20 {NULL, TypeMax}\r
21 };\r
22\r
361a8267 23/**\r
24 Get a device path (in text format) for a given handle.\r
25\r
26 @param[in] TheHandle The handle to get the device path for.\r
27\r
28 @retval NULL An error occured.\r
29 @return A pointer to the driver path as a string. The callee must \r
30 free this memory.\r
31**/\r
4ba49616 32CHAR16*\r
33EFIAPI\r
34GetDevicePathTextForHandle(\r
35 IN EFI_HANDLE TheHandle\r
36 )\r
37{\r
38 EFI_STATUS Status;\r
39 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
40 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
41 EFI_DEVICE_PATH_PROTOCOL *FinalPath;\r
42 CHAR16 *RetVal;\r
43\r
44 FinalPath = NULL;\r
45\r
46 Status = gBS->OpenProtocol (\r
47 TheHandle,\r
48 &gEfiLoadedImageProtocolGuid,\r
49 (VOID**)&LoadedImage,\r
50 gImageHandle,\r
51 NULL,\r
52 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
53 );\r
54 if (!EFI_ERROR (Status)) {\r
55 Status = gBS->OpenProtocol (\r
56 LoadedImage->DeviceHandle,\r
57 &gEfiDevicePathProtocolGuid,\r
58 (VOID**)&ImageDevicePath,\r
59 gImageHandle,\r
60 NULL,\r
61 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
62 );\r
63 if (!EFI_ERROR (Status)) {\r
64 FinalPath = AppendDevicePath (ImageDevicePath, LoadedImage->FilePath);\r
65 gBS->CloseProtocol(\r
66 LoadedImage->DeviceHandle,\r
67 &gEfiDevicePathProtocolGuid,\r
68 gImageHandle,\r
69 NULL);\r
70 }\r
71 gBS->CloseProtocol(\r
72 TheHandle,\r
73 &gEfiLoadedImageProtocolGuid,\r
74 gImageHandle,\r
75 NULL);\r
76 }\r
77\r
78 if (FinalPath == NULL) {\r
79 return (NULL);\r
80 }\r
81 RetVal = gEfiShellProtocol->GetFilePathFromDevicePath(FinalPath);\r
82 if (RetVal == NULL) {\r
863986b3 83 RetVal = ConvertDevicePathToText(FinalPath, TRUE, TRUE);\r
4ba49616 84 }\r
85 FreePool(FinalPath);\r
86 return (RetVal);\r
87}\r
88\r
361a8267 89/**\r
90 Determine if the given handle has Driver Configuration protocol.\r
91\r
92 @param[in] TheHandle The handle to the driver to test.\r
93\r
94 @retval TRUE The driver does have Driver Configuration.\r
95 @retval FALSE The driver does not have Driver Configuration.\r
96**/\r
4ba49616 97BOOLEAN\r
98EFIAPI\r
99ReturnDriverConfig(\r
100 IN CONST EFI_HANDLE TheHandle\r
101 )\r
102{\r
103 EFI_STATUS Status;\r
104 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverConfigurationProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
105 if (EFI_ERROR(Status)) {\r
106 return (FALSE);\r
107 }\r
108 return (TRUE);\r
109}\r
110\r
361a8267 111/**\r
112 Determine if the given handle has DriverDiagnostics protocol.\r
113\r
114 @param[in] TheHandle The handle to the driver to test.\r
115\r
116 @retval TRUE The driver does have Driver Diasgnostics.\r
117 @retval FALSE The driver does not have Driver Diagnostics.\r
118**/\r
4ba49616 119BOOLEAN\r
120EFIAPI\r
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
145EFIAPI\r
146ReturnDriverVersion(\r
147 IN CONST EFI_HANDLE TheHandle\r
148 )\r
149{\r
150 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
151 EFI_STATUS Status;\r
152 UINT32 RetVal;\r
153\r
154 RetVal = (UINT32)-1;\r
155\r
156 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverBindingProtocolGuid, (VOID**)&DriverBinding, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
157 if (!EFI_ERROR(Status)) {\r
158 RetVal = DriverBinding->Version;\r
159 gBS->CloseProtocol(TheHandle, &gEfiDriverBindingProtocolGuid, gImageHandle, NULL);\r
160 }\r
161 return (RetVal);\r
162}\r
163\r
361a8267 164/**\r
165 Function for 'drivers' command.\r
166\r
167 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
168 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
169**/\r
4ba49616 170SHELL_STATUS\r
171EFIAPI\r
172ShellCommandRunDrivers (\r
173 IN EFI_HANDLE ImageHandle,\r
174 IN EFI_SYSTEM_TABLE *SystemTable\r
175 )\r
176{\r
177 EFI_STATUS Status;\r
178 LIST_ENTRY *Package;\r
179 CHAR16 *ProblemParam;\r
180 SHELL_STATUS ShellStatus;\r
181 CHAR8 *Language;\r
182 CONST CHAR16 *Lang;\r
183 EFI_HANDLE *HandleList;\r
184 EFI_HANDLE *HandleWalker;\r
185 UINTN ChildCount;\r
186 UINTN DeviceCount;\r
187 CHAR16 *Temp2;\r
188 CHAR16 *FormatString;\r
189 UINT32 DriverVersion;\r
190 BOOLEAN DriverConfig;\r
191 BOOLEAN DriverDiag;\r
192\r
193 ShellStatus = SHELL_SUCCESS;\r
194 Status = EFI_SUCCESS;\r
195 Language = NULL;\r
196 FormatString = NULL;\r
197\r
198 //\r
199 // initialize the shell lib (we must be in non-auto-init...)\r
200 //\r
201 Status = ShellInitialize();\r
202 ASSERT_EFI_ERROR(Status);\r
203\r
204 Status = CommandInit();\r
205 ASSERT_EFI_ERROR(Status);\r
206\r
207 //\r
208 // parse the command line\r
209 //\r
210 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
211 if (EFI_ERROR(Status)) {\r
212 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
213 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
214 FreePool(ProblemParam);\r
215 ShellStatus = SHELL_INVALID_PARAMETER;\r
216 } else {\r
217 ASSERT(FALSE);\r
218 }\r
219 } else {\r
220 if (ShellCommandLineGetCount(Package) > 1) {\r
221 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
222 ShellStatus = SHELL_INVALID_PARAMETER;\r
223 } else {\r
36384ceb
ED
224 if (ShellCommandLineGetFlag(Package, L"-l")){\r
225 Lang = ShellCommandLineGetValue(Package, L"-l");\r
226 if (Lang != NULL) {\r
227 Language = AllocateZeroPool(StrSize(Lang));\r
228 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
229 } else {\r
230 ASSERT(Language == NULL);\r
231 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
232 ShellCommandLineFreeVarList (Package);\r
233 return (SHELL_INVALID_PARAMETER);\r
234 }\r
4ba49616 235 }\r
236\r
237 if (ShellCommandLineGetFlag(Package, L"-sfo")) {\r
238 FormatString = HiiGetString(gShellDriver1HiiHandle, STRING_TOKEN(STR_DRIVERS_ITEM_LINE_SFO), Language);\r
239 } else {\r
240 FormatString = HiiGetString(gShellDriver1HiiHandle, STRING_TOKEN(STR_DRIVERS_ITEM_LINE), Language);\r
241 //\r
242 // print the header row\r
243 //\r
244 ShellPrintHiiEx(\r
245 -1,\r
246 -1,\r
247 Language,\r
248 STRING_TOKEN(STR_DRIVERS_HEADER_LINES),\r
249 gShellDriver1HiiHandle);\r
250 }\r
251\r
252 HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
253 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){\r
254 ChildCount = 0;\r
255 DeviceCount = 0;\r
256 Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL);\r
257 Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL);\r
258 Temp2 = GetDevicePathTextForHandle(*HandleWalker);\r
259 DriverVersion = ReturnDriverVersion(*HandleWalker);\r
260 DriverConfig = ReturnDriverConfig(*HandleWalker);\r
261 DriverDiag = ReturnDriverDiag (*HandleWalker);\r
36384ceb 262 Lang = GetStringNameFromHandle(*HandleWalker, Language);\r
4ba49616 263\r
264 ShellPrintEx(\r
265 -1,\r
266 -1,\r
267 FormatString,\r
268 ConvertHandleToHandleIndex(*HandleWalker),\r
269 DriverVersion,\r
270 ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'),\r
271 DriverConfig?L'Y':L'N',\r
272 DriverDiag?L'Y':L'N',\r
273 DeviceCount,\r
274 ChildCount,\r
275 Lang,\r
276 Temp2==NULL?L"":Temp2\r
277 );\r
278 if (Temp2 != NULL) {\r
279 FreePool(Temp2);\r
280 }\r
281 }\r
282 }\r
283 SHELL_FREE_NON_NULL(Language);\r
284 ShellCommandLineFreeVarList (Package);\r
285 SHELL_FREE_NON_NULL(FormatString);\r
286 }\r
287\r
288 return (ShellStatus);\r
289}\r