]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
Update return value.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Drivers.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Drivers shell Driver1 function.\r
3\r
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
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
23CHAR16*\r
24EFIAPI\r
25GetDevicePathTextForHandle(\r
26 IN EFI_HANDLE TheHandle\r
27 )\r
28{\r
29 EFI_STATUS Status;\r
30 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
31 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
32 EFI_DEVICE_PATH_PROTOCOL *FinalPath;\r
33 CHAR16 *RetVal;\r
34\r
35 FinalPath = NULL;\r
36\r
37 Status = gBS->OpenProtocol (\r
38 TheHandle,\r
39 &gEfiLoadedImageProtocolGuid,\r
40 (VOID**)&LoadedImage,\r
41 gImageHandle,\r
42 NULL,\r
43 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
44 );\r
45 if (!EFI_ERROR (Status)) {\r
46 Status = gBS->OpenProtocol (\r
47 LoadedImage->DeviceHandle,\r
48 &gEfiDevicePathProtocolGuid,\r
49 (VOID**)&ImageDevicePath,\r
50 gImageHandle,\r
51 NULL,\r
52 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
53 );\r
54 if (!EFI_ERROR (Status)) {\r
55 FinalPath = AppendDevicePath (ImageDevicePath, LoadedImage->FilePath);\r
56 gBS->CloseProtocol(\r
57 LoadedImage->DeviceHandle,\r
58 &gEfiDevicePathProtocolGuid,\r
59 gImageHandle,\r
60 NULL);\r
61 }\r
62 gBS->CloseProtocol(\r
63 TheHandle,\r
64 &gEfiLoadedImageProtocolGuid,\r
65 gImageHandle,\r
66 NULL);\r
67 }\r
68\r
69 if (FinalPath == NULL) {\r
70 return (NULL);\r
71 }\r
72 RetVal = gEfiShellProtocol->GetFilePathFromDevicePath(FinalPath);\r
73 if (RetVal == NULL) {\r
74 RetVal = gDevPathToText->ConvertDevicePathToText(FinalPath, TRUE, TRUE);\r
75 }\r
76 FreePool(FinalPath);\r
77 return (RetVal);\r
78}\r
79\r
80BOOLEAN\r
81EFIAPI\r
82ReturnDriverConfig(\r
83 IN CONST EFI_HANDLE TheHandle\r
84 )\r
85{\r
86 EFI_STATUS Status;\r
87 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverConfigurationProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
88 if (EFI_ERROR(Status)) {\r
89 return (FALSE);\r
90 }\r
91 return (TRUE);\r
92}\r
93\r
94BOOLEAN\r
95EFIAPI\r
96ReturnDriverDiag(\r
97 IN CONST EFI_HANDLE TheHandle\r
98 )\r
99{\r
100 EFI_STATUS Status;\r
101 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
102 if (EFI_ERROR(Status)) {\r
103 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnosticsProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
104 if (EFI_ERROR(Status)) {\r
105 return (FALSE);\r
106 }\r
107 }\r
108 return (TRUE);\r
109}\r
110\r
111UINT32\r
112EFIAPI\r
113ReturnDriverVersion(\r
114 IN CONST EFI_HANDLE TheHandle\r
115 )\r
116{\r
117 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
118 EFI_STATUS Status;\r
119 UINT32 RetVal;\r
120\r
121 RetVal = (UINT32)-1;\r
122\r
123 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverBindingProtocolGuid, (VOID**)&DriverBinding, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
124 if (!EFI_ERROR(Status)) {\r
125 RetVal = DriverBinding->Version;\r
126 gBS->CloseProtocol(TheHandle, &gEfiDriverBindingProtocolGuid, gImageHandle, NULL);\r
127 }\r
128 return (RetVal);\r
129}\r
130\r
131SHELL_STATUS\r
132EFIAPI\r
133ShellCommandRunDrivers (\r
134 IN EFI_HANDLE ImageHandle,\r
135 IN EFI_SYSTEM_TABLE *SystemTable\r
136 )\r
137{\r
138 EFI_STATUS Status;\r
139 LIST_ENTRY *Package;\r
140 CHAR16 *ProblemParam;\r
141 SHELL_STATUS ShellStatus;\r
142 CHAR8 *Language;\r
143 CONST CHAR16 *Lang;\r
144 EFI_HANDLE *HandleList;\r
145 EFI_HANDLE *HandleWalker;\r
146 UINTN ChildCount;\r
147 UINTN DeviceCount;\r
148 CHAR16 *Temp2;\r
149 CHAR16 *FormatString;\r
150 UINT32 DriverVersion;\r
151 BOOLEAN DriverConfig;\r
152 BOOLEAN DriverDiag;\r
153\r
154 ShellStatus = SHELL_SUCCESS;\r
155 Status = EFI_SUCCESS;\r
156 Language = NULL;\r
157 FormatString = NULL;\r
158\r
159 //\r
160 // initialize the shell lib (we must be in non-auto-init...)\r
161 //\r
162 Status = ShellInitialize();\r
163 ASSERT_EFI_ERROR(Status);\r
164\r
165 Status = CommandInit();\r
166 ASSERT_EFI_ERROR(Status);\r
167\r
168 //\r
169 // parse the command line\r
170 //\r
171 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
172 if (EFI_ERROR(Status)) {\r
173 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
174 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
175 FreePool(ProblemParam);\r
176 ShellStatus = SHELL_INVALID_PARAMETER;\r
177 } else {\r
178 ASSERT(FALSE);\r
179 }\r
180 } else {\r
181 if (ShellCommandLineGetCount(Package) > 1) {\r
182 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
183 ShellStatus = SHELL_INVALID_PARAMETER;\r
184 } else {\r
185 Lang = ShellCommandLineGetValue(Package, L"-l");\r
186 if (Lang != NULL) {\r
187 Language = AllocateZeroPool(StrSize(Lang));\r
188 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
189 } else if (!ShellCommandLineGetFlag(Package, L"-l")){\r
190 ASSERT(Language == NULL);\r
191 // Language = AllocateZeroPool(10);\r
192 // AsciiSPrint(Language, 10, "en-us");\r
193 } else {\r
194 ASSERT(Language == NULL);\r
195 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
196 ShellCommandLineFreeVarList (Package);\r
197 return (SHELL_INVALID_PARAMETER);\r
198 }\r
199\r
200 if (ShellCommandLineGetFlag(Package, L"-sfo")) {\r
201 FormatString = HiiGetString(gShellDriver1HiiHandle, STRING_TOKEN(STR_DRIVERS_ITEM_LINE_SFO), Language);\r
202 } else {\r
203 FormatString = HiiGetString(gShellDriver1HiiHandle, STRING_TOKEN(STR_DRIVERS_ITEM_LINE), Language);\r
204 //\r
205 // print the header row\r
206 //\r
207 ShellPrintHiiEx(\r
208 -1,\r
209 -1,\r
210 Language,\r
211 STRING_TOKEN(STR_DRIVERS_HEADER_LINES),\r
212 gShellDriver1HiiHandle);\r
213 }\r
214\r
215 HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
216 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){\r
217 ChildCount = 0;\r
218 DeviceCount = 0;\r
219 Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL);\r
220 Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL);\r
221 Temp2 = GetDevicePathTextForHandle(*HandleWalker);\r
222 DriverVersion = ReturnDriverVersion(*HandleWalker);\r
223 DriverConfig = ReturnDriverConfig(*HandleWalker);\r
224 DriverDiag = ReturnDriverDiag (*HandleWalker);\r
225 Lang = GetStringNameFromHandle(*HandleWalker, Language==NULL?"en":Language);\r
226\r
227 ShellPrintEx(\r
228 -1,\r
229 -1,\r
230 FormatString,\r
231 ConvertHandleToHandleIndex(*HandleWalker),\r
232 DriverVersion,\r
233 ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'),\r
234 DriverConfig?L'Y':L'N',\r
235 DriverDiag?L'Y':L'N',\r
236 DeviceCount,\r
237 ChildCount,\r
238 Lang,\r
239 Temp2==NULL?L"":Temp2\r
240 );\r
241 if (Temp2 != NULL) {\r
242 FreePool(Temp2);\r
243 }\r
244 }\r
245 }\r
246 SHELL_FREE_NON_NULL(Language);\r
247 ShellCommandLineFreeVarList (Package);\r
248 SHELL_FREE_NON_NULL(FormatString);\r
249 }\r
250\r
251 return (ShellStatus);\r
252}\r